diff --git a/.clang-format-ignore b/.clang-format-ignore new file mode 100644 index 000000000..ed705ff78 --- /dev/null +++ b/.clang-format-ignore @@ -0,0 +1,19 @@ +./test/tools/libtesteth/* +./test/tools/fuzzTesting/* +./test/tools/libtestutils/* +./test/tools/jsontests/* +./test/unittests/external-dependencies/* +./test/unittests/libskutils/* +./test/unittests/libdevcrypto/* +./test/unittests/libethcore/* +./test/unittests/libethereum/* +./test/unittests/libweb3core/* +./test/unittests/libweb3jsonrpc/* +./test/unittests/libtesteth/* +./test/unittests/libdevcore/* +./test/unittests/libethashseal/* +./test/unittests/mapreduce_consensus/* +./test/unittests/libevm/* +./test/unittests/libskale/* +./storage_benchmark/* +./skale-vm/* \ No newline at end of file diff --git a/README.md b/README.md index c5d0defbd..14966537a 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,9 @@ The SKALE network supports an unlimited number of independent blockchains with z ## Forklessness -Skaled is forkless, meaning that blockchain a linear chain (and not a tree of forks as with ETH 1.0). Every block is provably finalized within finite time. +Skaled is forkless, meaning that blockchain a linear chain (and not a tree of forks as with ETH 1.0). Every block is provably finalized immediately after creation. +Therefore, finalization time for skaled is equal to block time, which is +much faster than 13 minutes for Eth main net. ## Asynchronous block production diff --git a/libbatched-io/batched_db.cpp b/libbatched-io/batched_db.cpp index 4168ca41f..7dee39e38 100644 --- a/libbatched-io/batched_db.cpp +++ b/libbatched-io/batched_db.cpp @@ -4,11 +4,6 @@ namespace batched_io { using namespace dev::db; -batched_db::~batched_db() { - // all batches should be either commit()'ted or revert()'ed! - assert( !m_batch ); -} - db_operations_face* db_splitter::new_interface() { assert( this->m_interfaces.size() < 256 ); diff --git a/libbatched-io/batched_db.h b/libbatched-io/batched_db.h index e2465d087..7ee710055 100644 --- a/libbatched-io/batched_db.h +++ b/libbatched-io/batched_db.h @@ -3,6 +3,7 @@ #include "batched_io.h" +#include #include #include @@ -39,23 +40,23 @@ class batched_db : public db_face { public: void open( std::shared_ptr< dev::db::DatabaseFace > _db ) { m_db = _db; } bool is_open() const { return !!m_db; } - void insert( dev::db::Slice _key, dev::db::Slice _value ) { + void insert( dev::db::Slice _key, dev::db::Slice _value ) override { std::lock_guard< std::mutex > batch_lock( m_batch_mutex ); ensure_batch(); m_batch->insert( _key, _value ); } - void kill( dev::db::Slice _key ) { + void kill( dev::db::Slice _key ) override { std::lock_guard< std::mutex > batch_lock( m_batch_mutex ); ensure_batch(); m_batch->kill( _key ); } - virtual void revert() { + void revert() override { std::lock_guard< std::mutex > batch_lock( m_batch_mutex ); if ( m_batch ) m_batch.reset(); m_db->discardCreatedBatches(); } - virtual void commit( const std::string& test_crash_string = std::string() ) { + void commit( const std::string& test_crash_string = std::string() ) override { std::lock_guard< std::mutex > batch_lock( m_batch_mutex ); ensure_batch(); test_crash_before_commit( test_crash_string ); @@ -63,26 +64,89 @@ class batched_db : public db_face { } // readonly - virtual std::string lookup( dev::db::Slice _key ) const { return m_db->lookup( _key ); } - virtual bool exists( dev::db::Slice _key ) const { return m_db->exists( _key ); } - virtual void forEach( std::function< bool( dev::db::Slice, dev::db::Slice ) > f ) const { + std::string lookup( dev::db::Slice _key ) const override { return m_db->lookup( _key ); } + + bool exists( dev::db::Slice _key ) const override { return m_db->exists( _key ); } + + void forEach( std::function< bool( dev::db::Slice, dev::db::Slice ) > f ) const override { std::lock_guard< std::mutex > foreach_lock( m_batch_mutex ); m_db->forEach( f ); } - virtual void forEachWithPrefix( - std::string& _prefix, std::function< bool( dev::db::Slice, dev::db::Slice ) > f ) const { + void forEachWithPrefix( std::string& _prefix, + std::function< bool( dev::db::Slice, dev::db::Slice ) > f ) const override { std::lock_guard< std::mutex > foreach_lock( m_batch_mutex ); m_db->forEachWithPrefix( _prefix, f ); } - virtual ~batched_db(); + ~batched_db() override { + // all batches should be either commit()'ted or revert()'ed! + assert( !m_batch ); + } protected: - void recover() { /*nothing*/ + void recover() override { /*nothing*/ } }; + +class read_only_snap_based_batched_db : public db_face { +private: + std::shared_ptr< dev::db::DBImpl > m_db; + std::shared_ptr< dev::db::LevelDBSnap > m_snap; + +public: + read_only_snap_based_batched_db( + std::shared_ptr< dev::db::DBImpl > _db, std::shared_ptr< dev::db::LevelDBSnap > _snap ) { + LDB_CHECK( _db ); + LDB_CHECK( _snap ); + m_db = _db; + m_snap = _snap; + } + + bool is_open() const { return !!m_db; }; + + void insert( dev::db::Slice, dev::db::Slice ) override { + throw std::runtime_error( "Function not implemented:" + std::string( __FUNCTION__ ) ); + } + + void kill( dev::db::Slice ) override { + throw std::runtime_error( "Function not implemented:" + std::string( __FUNCTION__ ) ); + } + + void revert() override { + throw std::runtime_error( "Function not implemented:" + std::string( __FUNCTION__ ) ); + } + + void commit( const std::string& ) override { + throw std::runtime_error( "Function not implemented:" + std::string( __FUNCTION__ ) ); + } + + // readonly + std::string lookup( dev::db::Slice _key ) const override { + return m_db->lookup( _key, m_snap ); + } + + bool exists( dev::db::Slice _key ) const override { return m_db->exists( _key, m_snap ); } + + void forEach( std::function< bool( dev::db::Slice, dev::db::Slice ) > _f ) const override { + static std::string emptyString; + return forEachWithPrefix( emptyString, _f ); + } + + void forEachWithPrefix( std::string& _prefix, + std::function< bool( dev::db::Slice, dev::db::Slice ) > _f ) const override { + m_db->forEachWithPrefix( _prefix, _f, m_snap ); + } + + virtual ~read_only_snap_based_batched_db() = default; + +protected: + void recover() override { /*nothing*/ + } +}; + + class db_splitter { private: std::shared_ptr< db_face > m_backend; diff --git a/libconsensus b/libconsensus index fda7a2ff8..3b83e8980 160000 --- a/libconsensus +++ b/libconsensus @@ -1 +1 @@ -Subproject commit fda7a2ff89e34e924920a5b3682d93757cc4b0e3 +Subproject commit 3b83e8980f7246b46f08353ba3371cf2cd4e9d76 diff --git a/libdevcore/LevelDB.cpp b/libdevcore/LevelDB.cpp index ba019a426..012c3e319 100644 --- a/libdevcore/LevelDB.cpp +++ b/libdevcore/LevelDB.cpp @@ -20,6 +20,7 @@ #include "LevelDB.h" #include "Assertions.h" +#include "LevelDBSnap.h" #include "Log.h" #include @@ -29,8 +30,6 @@ namespace dev::db { unsigned c_maxOpenLeveldbFiles = 25; -const size_t LevelDB::BATCH_CHUNK_SIZE = 10000; - namespace { inline leveldb::Slice toLDBSlice( Slice _slice ) { return leveldb::Slice( _slice.data(), _slice.size() ); @@ -144,6 +143,7 @@ void LevelDB::openDBInstanceUnsafe() { m_db.reset( db ); m_lastDBOpenTimeMs = getCurrentTimeMs(); + m_dbReopenId++; cnote << "LEVELDB_OPENED:TIME_MS:" << m_lastDBOpenTimeMs - startTimeMs; } uint64_t LevelDB::getCurrentTimeMs() { @@ -159,14 +159,15 @@ LevelDB::~LevelDB() { } std::string LevelDB::lookup( Slice _key ) const { + return lookup( _key, nullptr ); +} + +std::string LevelDB::lookup( Slice _key, const std::shared_ptr< LevelDBSnap >& _snap ) const { leveldb::Slice const key( _key.data(), _key.size() ); std::string value; - leveldb::Status status; - { - SharedDBGuard readLock( *this ); - status = m_db->Get( m_readOptions, key, &value ); - } + auto status = getValue( m_readOptions, key, value, _snap ); + if ( status.IsNotFound() ) return std::string(); @@ -175,13 +176,15 @@ std::string LevelDB::lookup( Slice _key ) const { } bool LevelDB::exists( Slice _key ) const { + return exists( _key, nullptr ); +} + +bool LevelDB::exists( Slice _key, const std::shared_ptr< LevelDBSnap >& _snap ) const { std::string value; leveldb::Slice const key( _key.data(), _key.size() ); - leveldb::Status status; - { - SharedDBGuard lock( *this ); - status = m_db->Get( m_readOptions, key, &value ); - } + + auto status = getValue( m_readOptions, key, value, _snap ); + if ( status.IsNotFound() ) return false; @@ -189,12 +192,25 @@ bool LevelDB::exists( Slice _key ) const { return true; } +leveldb::Status LevelDB::getValue( leveldb::ReadOptions _readOptions, const leveldb::Slice& _key, + std::string& _value, const std::shared_ptr< LevelDBSnap >& _snap ) const { + SharedDBGuard lock( *this ); // protect so db is not reopened during get call + if ( _snap ) { + // sanity check to make sure that the snap was created for this particular + // db handle + LDB_CHECK( m_dbReopenId == _snap->getParentDbReopenId() ); + return _snap->getValue( m_db, _readOptions, _key, _value ); + } else { + return m_db->Get( _readOptions, _key, &_value ); + } +} + void LevelDB::insert( Slice _key, Slice _value ) { leveldb::Slice const key( _key.data(), _key.size() ); leveldb::Slice const value( _value.data(), _value.size() ); leveldb::Status status; { - SharedDBGuard lock( *this ); + SharedDBGuard lock( *this ); // protect so db is not reopened during Put() call status = m_db->Put( m_writeOptions, key, value ); } checkStatus( status ); @@ -224,7 +240,7 @@ void LevelDB::commit( std::unique_ptr< WriteBatchFace > _batch ) { } leveldb::Status status; { - SharedDBGuard lock( *this ); + SharedDBGuard lock( *this ); // protect so db is not reopened during Write() call status = m_db->Write( m_writeOptions, &batchPtr->writeBatch() ); } // Commit happened. This means the keys actually got deleted in LevelDB. Increment key deletes @@ -247,17 +263,25 @@ void LevelDB::reopenDataBaseIfNeeded() { auto currentTimeMs = getCurrentTimeMs(); if ( currentTimeMs - m_lastDBOpenTimeMs >= ( uint64_t ) m_reopenPeriodMs ) { - ExclusiveDBGuard lock( *this ); - // releasing unique pointer will cause database destructor to be called that will close db - m_db.reset(); - // now open db while holding the exclusive lock - openDBInstanceUnsafe(); + reopen(); } } +void LevelDB::reopen() { + ExclusiveDBGuard lock( *this ); + // close all current snaps by passing max lifetime as zero + auto aliveSnaps = m_snapManager.garbageCollectUnusedOldSnaps( m_db, m_dbReopenId, 0 ); + LDB_CHECK( aliveSnaps == 0 ); + + // releasing unique pointer will cause database destructor to be called that will close db + LDB_CHECK( m_db ); + m_db.reset(); + // now open db while holding the exclusive lock + openDBInstanceUnsafe(); +} void LevelDB::forEach( std::function< bool( Slice, Slice ) > f ) const { cwarn << "Iterating over the entire LevelDB database: " << this->m_path; - SharedDBGuard lock( *this ); + SharedDBGuard lock( *this ); // protect so db is not reopened during iteration std::unique_ptr< leveldb::Iterator > itr( m_db->NewIterator( m_readOptions ) ); if ( itr == nullptr ) { BOOST_THROW_EXCEPTION( DatabaseError() << errinfo_comment( "null iterator" ) ); @@ -273,10 +297,22 @@ void LevelDB::forEach( std::function< bool( Slice, Slice ) > f ) const { } void LevelDB::forEachWithPrefix( - std::string& _prefix, std::function< bool( Slice, Slice ) > f ) const { - cnote << "Iterating over the LevelDB prefix: " << _prefix; - SharedDBGuard lock( *this ); - std::unique_ptr< leveldb::Iterator > itr( m_db->NewIterator( m_readOptions ) ); + std::string& _prefix, std::function< bool( Slice, Slice ) > _f ) const { + forEachWithPrefix( _prefix, _f, nullptr ); +} + +void LevelDB::forEachWithPrefix( std::string& _prefix, std::function< bool( Slice, Slice ) > f, + const std::shared_ptr< LevelDBSnap >& _snap ) const { + SharedDBGuard lock( *this ); // protect so DB is not reopened during iteration + + std::unique_ptr< leveldb::Iterator > itr; + + if ( _snap ) { + LDB_CHECK( m_dbReopenId == _snap->getParentDbReopenId() ); + itr = _snap->getIterator( m_db, m_readOptions ); + } else { + itr.reset( m_db->NewIterator( m_readOptions ) ); + } if ( itr == nullptr ) { BOOST_THROW_EXCEPTION( DatabaseError() << errinfo_comment( "null iterator" ) ); } @@ -293,7 +329,7 @@ void LevelDB::forEachWithPrefix( } h256 LevelDB::hashBase() const { - SharedDBGuard lock( *this ); + SharedDBGuard lock( *this ); // protect so db is not reopened during iteration std::unique_ptr< leveldb::Iterator > it( m_db->NewIterator( m_readOptions ) ); if ( it == nullptr ) { BOOST_THROW_EXCEPTION( DatabaseError() << errinfo_comment( "null iterator" ) ); @@ -321,7 +357,7 @@ h256 LevelDB::hashBase() const { } h256 LevelDB::hashBaseWithPrefix( char _prefix ) const { - SharedDBGuard lock( *this ); + SharedDBGuard lock( *this ); // protect so db is not reopened during iteration std::unique_ptr< leveldb::Iterator > it( m_db->NewIterator( m_readOptions ) ); if ( it == nullptr ) { BOOST_THROW_EXCEPTION( DatabaseError() << errinfo_comment( "null iterator" ) ); @@ -345,7 +381,7 @@ h256 LevelDB::hashBaseWithPrefix( char _prefix ) const { } bool LevelDB::hashBasePartially( secp256k1_sha256_t* ctx, std::string& lastHashedKey ) const { - SharedDBGuard lock( *this ); + SharedDBGuard lock( *this ); // protect so db is not reopened during iteration std::unique_ptr< leveldb::Iterator > it( m_db->NewIterator( m_readOptions ) ); if ( it == nullptr ) { BOOST_THROW_EXCEPTION( DatabaseError() << errinfo_comment( "null iterator" ) ); @@ -379,10 +415,23 @@ bool LevelDB::hashBasePartially( secp256k1_sha256_t* ctx, std::string& lastHashe } void LevelDB::doCompaction() const { - SharedDBGuard lock( *this ); + SharedDBGuard lock( *this ); // protect so db is not reopened during compaction m_db->CompactRange( nullptr, nullptr ); } + +void LevelDB::createBlockSnap( uint64_t _blockNumber ) { + SharedDBGuard lock( *this ); // protect so db is not reopened during snap creation + m_snapManager.addSnapForBlock( _blockNumber, m_db, m_dbReopenId ); +} + +std::shared_ptr< LevelDBSnap > LevelDB::getLastBlockSnap() const { + SharedDBGuard lock( *this ); // protect so db is not reopened when while we get snap + auto snap = m_snapManager.getLastBlockSnap(); + LDB_CHECK( snap ); + return snap; +} + std::atomic< uint64_t > LevelDB::g_keysToBeDeletedStats = 0; std::atomic< uint64_t > LevelDB::g_keyDeletesStats = 0; @@ -390,4 +439,5 @@ uint64_t LevelDB::getKeyDeletesStats() { return g_keyDeletesStats; } + } // namespace dev::db diff --git a/libdevcore/LevelDB.h b/libdevcore/LevelDB.h index 5aa1f7df0..e943273f0 100644 --- a/libdevcore/LevelDB.h +++ b/libdevcore/LevelDB.h @@ -19,6 +19,7 @@ #pragma once +#include "LevelDBSnapManager.h" #include "db.h" #include @@ -29,7 +30,17 @@ #include #include +#define LDB_CHECK( _EXPRESSION_ ) \ + if ( !( _EXPRESSION_ ) ) { \ + auto __msg__ = std::string( "State check failed::" ) + #_EXPRESSION_ + " " + \ + std::string( __FILE__ ) + ":" + std::to_string( __LINE__ ); \ + BOOST_THROW_EXCEPTION( dev::db::DatabaseError() << dev::errinfo_comment( __msg__ ) ); \ + } + namespace dev::db { + +class LevelDBSnap; + class LevelDB : public DatabaseFace { public: static leveldb::ReadOptions defaultReadOptions(); @@ -47,6 +58,11 @@ class LevelDB : public DatabaseFace { std::string lookup( Slice _key ) const override; bool exists( Slice _key ) const override; + + std::string lookup( Slice _key, const std::shared_ptr< LevelDBSnap >& _snap ) const; + bool exists( Slice _key, const std::shared_ptr< LevelDBSnap >& _snap ) const; + + void insert( Slice _key, Slice _value ) override; void kill( Slice _key ) override; @@ -58,6 +74,9 @@ class LevelDB : public DatabaseFace { void forEachWithPrefix( std::string& _prefix, std::function< bool( Slice, Slice ) > f ) const override; + void forEachWithPrefix( std::string& _prefix, std::function< bool( Slice, Slice ) > f, + const std::shared_ptr< LevelDBSnap >& _snap ) const; + h256 hashBase() const override; h256 hashBaseWithPrefix( char _prefix ) const; @@ -65,6 +84,8 @@ class LevelDB : public DatabaseFace { void doCompaction() const; + void createBlockSnap( uint64_t _blockNumber ); + // Return the total count of key deletes since the start static uint64_t getKeyDeletesStats(); // count of the keys that were deleted since the start of skaled @@ -72,9 +93,15 @@ class LevelDB : public DatabaseFace { // count of the keys that are scheduled to be deleted but are not yet deleted static std::atomic< uint64_t > g_keysToBeDeletedStats; static uint64_t getCurrentTimeMs(); + std::shared_ptr< LevelDBSnap > getLastBlockSnap() const; private: std::unique_ptr< leveldb::DB > m_db; + // this is incremented each time this LevelDB instance is reopened + // we reopen states LevelDB every day on archive nodes to avoid + // meta file getting too large + // in other cases LevelDB is never reopened to this stays zero + std::atomic< uint64_t > m_dbReopenId = 0; leveldb::ReadOptions const m_readOptions; leveldb::WriteOptions const m_writeOptions; leveldb::Options m_options; @@ -85,8 +112,11 @@ class LevelDB : public DatabaseFace { uint64_t m_lastDBOpenTimeMs; mutable std::shared_mutex m_dbMutex; + LevelDBSnapManager m_snapManager; + + + static constexpr size_t BATCH_CHUNK_SIZE = 10000; - static const size_t BATCH_CHUNK_SIZE; class SharedDBGuard { const LevelDB& m_levedlDB; @@ -125,6 +155,9 @@ class LevelDB : public DatabaseFace { }; void openDBInstanceUnsafe(); void reopenDataBaseIfNeeded(); + leveldb::Status getValue( leveldb::ReadOptions _readOptions, const leveldb::Slice& _key, + std::string& _value, const std::shared_ptr< LevelDBSnap >& _snap ) const; + void reopen(); }; } // namespace dev::db diff --git a/libdevcore/LevelDBSnap.cpp b/libdevcore/LevelDBSnap.cpp new file mode 100644 index 000000000..f3965aed8 --- /dev/null +++ b/libdevcore/LevelDBSnap.cpp @@ -0,0 +1,109 @@ +/* + Modifications Copyright (C) 2024- SKALE Labs + + This file is part of cpp-ethereum. + + cpp-ethereum is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + cpp-ethereum is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with cpp-ethereum. If not, see . +*/ + + +#include "LevelDBSnap.h" +#include "Assertions.h" +#include "LevelDB.h" + +using std::string, std::runtime_error; + +namespace dev::db { + +bool LevelDBSnap::isClosed() const { + return m_isClosed; +} + +// construct a snap object that can be used to read snapshot of a state +LevelDBSnap::LevelDBSnap( + uint64_t _blockId, const leveldb::Snapshot* _snap, uint64_t _parentLevelDBReopenId ) + : m_blockId( _blockId ), m_snap( _snap ), m_parentDBReopenId( _parentLevelDBReopenId ) { + LDB_CHECK( m_snap ) + m_creationTimeMs = LevelDB::getCurrentTimeMs(); + m_instanceId = objectCounter.fetch_add( 1 ); +} + + +// close LevelDB snap. This will happen when all eth_calls using this snap +// complete, so it is not needed anymore +// reopen the DB +void LevelDBSnap::close( std::unique_ptr< leveldb::DB >& _parentDB, uint64_t _parentDBReopenId ) { + // do an write lock to make sure all on-going read calls from this snap complete before + // this to make the snap is not being used in a levelb call + std::unique_lock< std::shared_mutex > lock( m_usageMutex ); + if ( m_isClosed ) { + cerror << "Close called twice on a snap" << std::endl; + return; + } + + m_isClosed = true; + + LDB_CHECK( _parentDB ); + LDB_CHECK( m_snap ); + // sanity check. We should use the same DB handle that was used to open this snap + LDB_CHECK( _parentDBReopenId == m_parentDBReopenId ); + // do an exclusive lock on the usage mutex + // this to make the snap is not being used in a levelb call + _parentDB->ReleaseSnapshot( m_snap ); + m_snap = nullptr; +} +LevelDBSnap::~LevelDBSnap() { + if ( !m_isClosed ) { + cnote << "LevelDB: destroying active snap." << std::endl; + } +} + + +uint64_t LevelDBSnap::getInstanceId() const { + return m_instanceId; +} + +std::atomic< uint64_t > LevelDBSnap::objectCounter = 0; + +uint64_t LevelDBSnap::getCreationTimeMs() const { + return m_creationTimeMs; +} + +// this is used primary in eth_calls +leveldb::Status LevelDBSnap::getValue( const std::unique_ptr< leveldb::DB >& _db, + leveldb::ReadOptions _readOptions, const leveldb::Slice& _key, std::string& _value ) { + LDB_CHECK( _db ); + // lock to make sure snap is not concurrently closed while reading from it + std::shared_lock< std::shared_mutex > lock( m_usageMutex ); + LDB_CHECK( !isClosed() ) + _readOptions.snapshot = m_snap; + return _db->Get( _readOptions, _key, &_value ); +} + +std::unique_ptr< leveldb::Iterator > LevelDBSnap::getIterator( + const std::unique_ptr< leveldb::DB >& _db, leveldb::ReadOptions _readOptions ) { + LDB_CHECK( _db ); + // lock to make sure snap is not concurrently closed while reading from it + std::shared_lock< std::shared_mutex > lock( m_usageMutex ); + LDB_CHECK( !isClosed() ) + _readOptions.snapshot = m_snap; + auto iterator = _db->NewIterator( _readOptions ); + return std::unique_ptr< leveldb::Iterator >( iterator ); +} + +uint64_t LevelDBSnap::getParentDbReopenId() const { + return m_parentDBReopenId; +} + +} // namespace dev::db diff --git a/libdevcore/LevelDBSnap.h b/libdevcore/LevelDBSnap.h new file mode 100644 index 000000000..5dd4d224a --- /dev/null +++ b/libdevcore/LevelDBSnap.h @@ -0,0 +1,92 @@ +/* + Modifications Copyright (C) 2024- SKALE Labs + + This file is part of cpp-ethereum. + + cpp-ethereum is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + cpp-ethereum is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with cpp-ethereum. If not, see . +*/ + +#pragma once + +#include "db.h" + +#include +#include +#include +#include + +#include +#include + +namespace dev::db { + +class LevelDB; + +// internal class of LevelDB that represents the +// this class represents a LevelDB snap corresponding to the point immediately +// after processing of a particular block id. +class LevelDBSnap { +public: + LevelDBSnap( + uint64_t _blockId, const leveldb::Snapshot* _snap, uint64_t _parentLevelDBReopenId ); + + // close this snapshot. Use after close will cause an exception + void close( std::unique_ptr< leveldb::DB >& _parentDB, uint64_t _parentDBReopenId ); + + virtual ~LevelDBSnap(); + + leveldb::Status getValue( const std::unique_ptr< leveldb::DB >& _db, + leveldb::ReadOptions _readOptions, const leveldb::Slice& _key, std::string& _value ); + + leveldb::Status getValue( const std::unique_ptr< leveldb::DB >& _db, + leveldb::ReadOptions _readOptions, std::string& _value ); + + std::unique_ptr< leveldb::Iterator > getIterator( + const std::unique_ptr< leveldb::DB >& _db, leveldb::ReadOptions _readOptions ); + + uint64_t getInstanceId() const; + + uint64_t getParentDbReopenId() const; + + uint64_t getCreationTimeMs() const; + + bool isClosed() const; + +private: + const uint64_t m_blockId; + + const leveldb::Snapshot* m_snap = nullptr; + + std::atomic< bool > m_isClosed = false; + // this mutex is shared=locked everytime a LevedLB API read call is done on the + // snapshot, and unique-locked when the snapshot is to be closed + // This is to prevent closing snapshot handle while concurrently executing a LevelDB call + std::shared_mutex m_usageMutex; + + uint64_t m_creationTimeMs; + + // LevelDB identifier for which this snapShot has been // created + // this is used to match snaps to leveldb handles + // the reopen id of the parent database handle. When a database is reopened + // the database handle and all snap handles are invalidated + // we use this field to make sure that we never use a stale snap handle for which + // the database handle already does not exist + uint64_t m_parentDBReopenId; + + std::atomic< uint64_t > m_instanceId; // unique id of this snap object instance + + static std::atomic< uint64_t > objectCounter; +}; + +} // namespace dev::db diff --git a/libdevcore/LevelDBSnapManager.cpp b/libdevcore/LevelDBSnapManager.cpp new file mode 100644 index 000000000..d585994ab --- /dev/null +++ b/libdevcore/LevelDBSnapManager.cpp @@ -0,0 +1,115 @@ +/* + Modifications Copyright (C) 2024- SKALE Labs + + This file is part of cpp-ethereum. + + cpp-ethereum is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + cpp-ethereum is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with cpp-ethereum. If not, see . +*/ + + +#include "LevelDBSnapManager.h" +#include "Assertions.h" +#include "LevelDB.h" +#include "LevelDBSnap.h" + + +using std::string, std::runtime_error; + +namespace dev::db { + +// this function will close snaps that are not used in on-going eth_calls, +// meaning that no one has a reference +// to the shared pointer except the oldSnaps map itself +// It will also close snaps that are used but that are older than _maxSnapLifetimeMs +// this closure will cause the corresponding eth_calls return with an error. +// this should only happen to eth_calls that hang for a long time +// this function returns the size of oldSnaps after cleanup +uint64_t LevelDBSnapManager::garbageCollectUnusedOldSnaps( + std::unique_ptr< leveldb::DB >& _db, uint64_t _dbReopenId, uint64_t _maxSnapLifetimeMs ) { + std::vector< std::shared_ptr< LevelDBSnap > > unusedOldSnaps; + + uint64_t mapSizeAfterCleanup; + + auto currentTimeMs = LevelDB::getCurrentTimeMs(); + + { + // find all old snaps and remove them from the map + // this needs to be done write lock so the map is not concurrently modified + std::unique_lock< std::shared_mutex > snapLock( m_snapMutex ); + for ( auto it = oldSnaps.begin(); it != oldSnaps.end(); ) { + // a snap is unused if no one using this snap anymore except the map itself + if ( it->second.use_count() == 1 || + it->second->getCreationTimeMs() + _maxSnapLifetimeMs <= currentTimeMs ) { + // erase this snap from the map + // note that push back needs to happen before erase since erase will + // destroy the snap object if there ar no more references + unusedOldSnaps.push_back( it->second ); + it = oldSnaps.erase( it ); + } else { + ++it; // Only increment if not erasing + } + } + mapSizeAfterCleanup = oldSnaps.size(); + } + + // now we removed unused snaps from the map. Close them + + for ( auto&& snap : unusedOldSnaps ) { + LDB_CHECK( snap ); + snap->close( _db, _dbReopenId ); + } + return mapSizeAfterCleanup; +} + + +// this will be called from EVM processing thread just after the block is processed +void LevelDBSnapManager::addSnapForBlock( + uint64_t _blockNumber, std::unique_ptr< leveldb::DB >& _db, uint64_t _dbInstanceId ) { + createNewSnap( _blockNumber, _db, _dbInstanceId ); + + // we garbage-collect unused old snaps that no-one used or that exist for more that max + // lifetime we give for eth_calls to complete + garbageCollectUnusedOldSnaps( _db, _dbInstanceId, OLD_SNAP_LIFETIME_MS ); +} + + +// this will create new last block snap and move previous last block snap into old snaps map +void LevelDBSnapManager::createNewSnap( + uint64_t _blockId, std::unique_ptr< leveldb::DB >& _db, uint64_t _dbInstanceId ) { + // hold the write lock during the update so snap manager does not return inconsistent value + // snap creation in LevelDB should happen really fast + std::unique_lock< std::shared_mutex > lock( m_snapMutex ); + + LDB_CHECK( _db ); + auto newSnapHandle = _db->GetSnapshot(); + LDB_CHECK( newSnapHandle ); + + auto newSnap = std::make_shared< LevelDBSnap >( _blockId, newSnapHandle, _dbInstanceId ); + LDB_CHECK( newSnap ); + + auto oldSnap = m_lastBlockSnap; + m_lastBlockSnap = newSnap; + if ( oldSnap ) { + oldSnaps.emplace( oldSnap->getInstanceId(), oldSnap ); + } +} +const std::shared_ptr< LevelDBSnap >& LevelDBSnapManager::getLastBlockSnap() const { + // read lock briefly to make no snap is concurrently created. + // Note: shared pointer is not thread safe + std::shared_lock< std::shared_mutex > lock( m_snapMutex ); + return m_lastBlockSnap; +} + + +} // namespace dev::db diff --git a/libdevcore/LevelDBSnapManager.h b/libdevcore/LevelDBSnapManager.h new file mode 100644 index 000000000..168ab765a --- /dev/null +++ b/libdevcore/LevelDBSnapManager.h @@ -0,0 +1,75 @@ +/* + Modifications Copyright (C) 2024- SKALE Labs + + This file is part of cpp-ethereum. + + cpp-ethereum is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + cpp-ethereum is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with cpp-ethereum. If not, see . +*/ + +#pragma once + +#include "db.h" + +#include +#include +#include +#include + +#include +#include + +namespace dev::db { + +class LevelDB; +class LevelDBSnap; + +// internal class of LevelDB that represents the +// this class represents a LevelDB snap corresponding to the point immediately +// after processing of a particular block id. +class LevelDBSnapManager { +public: + const std::shared_ptr< LevelDBSnap >& getLastBlockSnap() const; + + + LevelDBSnapManager(){}; + + void addSnapForBlock( + uint64_t _blockNumber, std::unique_ptr< leveldb::DB >& _db, uint64_t _dbInstanceId ); + + void closeAllOpenSnaps( std::unique_ptr< leveldb::DB >& _db, uint64_t _dbInstanceId ); + + // this function should be called while holding database reopen lock + uint64_t garbageCollectUnusedOldSnaps( + std::unique_ptr< leveldb::DB >& _db, uint64_t _dbReopenId, uint64_t _maxSnapLifetimeMs ); + +private: + // old snaps contains snap objects for older blocks + // these objects are alive untils the + // corresponding eth_calls complete + std::map< std::uint64_t, std::shared_ptr< LevelDBSnap > > oldSnaps; + std::shared_ptr< LevelDBSnap > m_lastBlockSnap; + // mutex to protect snaps and m_lastBlockSnap; + mutable std::shared_mutex m_snapMutex; + + // time after an existing old snap will be closed if no-one is using it + static const size_t OLD_SNAP_LIFETIME_MS = 30000; + // time after an existing old snap will be closed it is used in eth_call + // this will cause the eth_call to return an error + static const size_t FORCE_SNAP_CLOSE_TIME_MS = 3000; + + void createNewSnap( + uint64_t _blockId, std::unique_ptr< leveldb::DB >& _db, uint64_t _dbInstanceId ); +}; + +} // namespace dev::db diff --git a/libethcore/Exceptions.h b/libethcore/Exceptions.h index a39c33a00..861c6156a 100644 --- a/libethcore/Exceptions.h +++ b/libethcore/Exceptions.h @@ -48,6 +48,7 @@ DEV_SIMPLE_EXCEPTION( NotEnoughAvailableSpace ); DEV_SIMPLE_EXCEPTION( NotEnoughCash ); DEV_SIMPLE_EXCEPTION( GasPriceTooLow ); DEV_SIMPLE_EXCEPTION( SameNonceAlreadyInQueue ); +DEV_SIMPLE_EXCEPTION( NonceTooMuchInTheFuture ); DEV_SIMPLE_EXCEPTION( BlockGasLimitReached ); DEV_SIMPLE_EXCEPTION( FeeTooSmall ); DEV_SIMPLE_EXCEPTION( TooMuchGasUsed ); diff --git a/libethcore/TransactionBase.cpp b/libethcore/TransactionBase.cpp index 55dbeb154..ae1c047b1 100644 --- a/libethcore/TransactionBase.cpp +++ b/libethcore/TransactionBase.cpp @@ -165,7 +165,7 @@ void TransactionBase::fillFromBytesLegacy( _e << errinfo_name( "invalid transaction format: " + toString( rlp ) + " RLP: " + toHex( rlp.data() ) ); m_type = Type::Invalid; - m_rawData = _rlpData.toBytes(); + m_rawData = std::make_shared< bytes >( _rlpData.toBytes() ); if ( !_allowInvalid ) throw; @@ -226,7 +226,7 @@ void TransactionBase::fillFromBytesType1( _e << errinfo_name( "invalid transaction format: " + toString( rlp ) + " RLP: " + toHex( rlp.data() ) ); m_type = Type::Invalid; - m_rawData = _rlpData.toBytes(); + m_rawData = std::make_shared< bytes >( _rlpData.toBytes() ); if ( !_allowInvalid ) throw; @@ -294,7 +294,7 @@ void TransactionBase::fillFromBytesType2( _e << errinfo_name( "invalid transaction format: " + toString( rlp ) + " RLP: " + toHex( rlp.data() ) ); m_type = Type::Invalid; - m_rawData = _rlpData.toBytes(); + m_rawData = std::make_shared< bytes >( _rlpData.toBytes() ); if ( !_allowInvalid ) throw; @@ -341,11 +341,21 @@ TransactionBase::TransactionBase( } else { fillFromBytesLegacy( _rlpData, _checkSig, _allowInvalid ); } + } catch ( std::exception& e ) { + m_type = Type::Invalid; + RLPStream s; + s.append( _rlpData.toBytes() ); // add "string" header + m_rawData = std::make_shared< bytes >( s.out() ); + + if ( !_allowInvalid ) { + cerror << "Got invalid transaction." << e.what(); + throw; + } } catch ( ... ) { m_type = Type::Invalid; RLPStream s; s.append( _rlpData.toBytes() ); // add "string" header - m_rawData = s.out(); + m_rawData = std::make_shared< bytes >( s.out() ); if ( !_allowInvalid ) { cerror << "Got invalid transaction."; @@ -456,7 +466,7 @@ void TransactionBase::streamType2Transaction( RLPStream& _s, IncludeSignature _s void TransactionBase::streamRLP( RLPStream& _s, IncludeSignature _sig, bool _forEip155hash ) const { if ( isInvalid() ) { - _s.appendRaw( m_rawData ); + _s.appendRaw( *m_rawData ); return; } @@ -526,7 +536,7 @@ h256 TransactionBase::sha3( IncludeSignature _sig ) const { if ( m_txType != TransactionType::Legacy ) input.insert( input.begin(), m_txType ); } else { - RLP data( m_rawData ); + RLP data( *m_rawData ); input = dev::bytes( data.payload().begin(), data.payload().end() ); } diff --git a/libethcore/TransactionBase.h b/libethcore/TransactionBase.h index 36a3cd192..e2ca73d72 100644 --- a/libethcore/TransactionBase.h +++ b/libethcore/TransactionBase.h @@ -132,6 +132,20 @@ class TransactionBase { /// Force the chainId to a particular value. This will result in an invalid transaction RLP. void forceChainId( uint64_t _chainID ) { m_chainId = _chainID; } + /// Force type. This is used in tests + void forceType( TransactionType _type ) { m_txType = _type; } + + + /// Force Type2 fees. This is used in tests + void forceType2Fees( const u256& _maxFeePerGas, const u256& _maxPriorityFeePerGas ) { + m_maxFeePerGas = _maxFeePerGas; + m_maxPriorityFeePerGas = _maxPriorityFeePerGas; + } + + /// Force gas limit. This is used in tests + void forceGasPrice( const u256& _gasPrice ) { m_gasPrice = _gasPrice; } + + /// @throws TransactionIsUnsigned if signature was not initialized /// @throws InvalidSValue if the signature has an invalid S value. void checkLowS() const; @@ -291,7 +305,8 @@ class TransactionBase { ///< refunded once the contract is ended. bytes m_data; ///< The data associated with the transaction, or the initialiser if it's a ///< creation transaction. - bytes m_rawData; + std::shared_ptr< bytes > m_rawData = + std::make_shared< bytes >(); ///< Raw data, not owned by this object.> std::vector< bytes > m_accessList; ///< The access list. see more ///< https://eips.ethereum.org/EIPS/eip-2930. Not valid for ///< legacy txns diff --git a/libethereum/Block.cpp b/libethereum/Block.cpp index de58e2406..731d656f8 100644 --- a/libethereum/Block.cpp +++ b/libethereum/Block.cpp @@ -61,6 +61,7 @@ namespace { class DummyLastBlockHashes : public eth::LastBlockHashesFace { public: h256s precedingHashes( h256 const& /* _mostRecentHash */ ) const override { return {}; } + void clear() override {} }; @@ -145,6 +146,24 @@ Block& Block::operator=( Block const& _s ) { return *this; } + +// make a lightweight read only copy +// we only copy the fields we need for eth_call +// in particular we do not copy receipts and transactions +// as well as raw bytes +Block Block::getReadOnlyCopy() const { + Block copy( Null ); + copy.m_state = m_state.createReadOnlySnapBasedCopy(); + copy.m_author = m_author; + copy.m_sealEngine = m_sealEngine; + copy.m_committedToSeal = false; + copy.m_precommit = m_state; + copy.m_currentBlock = m_currentBlock; + copy.m_previousBlock = m_previousBlock; + return copy; +}; + + void Block::resetCurrent( int64_t _timestamp ) { m_transactions.clear(); m_receipts.clear(); @@ -152,7 +171,7 @@ void Block::resetCurrent( int64_t _timestamp ) { m_currentBlock = BlockHeader(); m_currentBlock.setAuthor( m_author ); m_currentBlock.setTimestamp( _timestamp ); // max( m_previousBlock.timestamp() + 1, _timestamp - // ) ); + // ) ); m_currentBytes.clear(); sealEngine()->populateFromParent( m_currentBlock, m_previousBlock ); @@ -163,8 +182,8 @@ void Block::resetCurrent( int64_t _timestamp ) { performIrregularModifications(); updateBlockhashContract(); - // if ( !m_state.checkVersion() ) - m_state = m_state.createNewCopyWithLocks(); + + m_state = m_state.createStateCopyAndClearCaches(); } SealEngineFace* Block::sealEngine() const { @@ -328,12 +347,12 @@ bool Block::sync( BlockChain const& _bc, h256 const& _block, BlockHeader const& ret = true; } #endif - // m_state = m_state.startNew(); resetCurrent( m_currentBlock.timestamp() ); - assert( m_state.checkVersion() ); return ret; } + +// Note - this function is only used in tests pair< TransactionReceipts, bool > Block::sync( BlockChain const& _bc, TransactionQueue& _tq, GasPricer const& _gp, unsigned msTimeout ) { MICROPROFILE_SCOPEI( "Block", "sync tq", MP_BURLYWOOD ); @@ -348,7 +367,7 @@ pair< TransactionReceipts, bool > Block::sync( Transactions transactions = _tq.topTransactions( c_maxSyncTransactions, m_transactionSet ); ret.second = ( transactions.size() == c_maxSyncTransactions ); // say there's more to the - // caller if we hit the limit + // caller if we hit the limit for ( Transaction& transaction : transactions ) { transaction.checkOutExternalGas( _bc.chainParams(), _bc.info().timestamp(), _bc.number() ); @@ -430,56 +449,76 @@ pair< TransactionReceipts, bool > Block::sync( return ret; } -tuple< TransactionReceipts, unsigned > Block::syncEveryone( - BlockChain const& _bc, const Transactions& _transactions, uint64_t _timestamp, u256 _gasPrice, - Transactions* vecMissing // it's non-null only for PARTIAL CATCHUP -) { +inline void Block::doPartialCatchupTestIfRequested( unsigned i ) { + static const char* FAIL_AT_TX_NUM = std::getenv( "TEST_FAIL_AT_TX_NUM" ); + static int64_t transactionCount = 0; + + if ( FAIL_AT_TX_NUM ) { + if ( transactionCount == std::stoi( FAIL_AT_TX_NUM ) ) { + // fail hard for test + cerror << "Test: crashing skaled on purpose after processing " << i + << " transactions in block"; + exit( -1 ); + } + + transactionCount++; + } +} + +tuple< TransactionReceipts, unsigned > Block::syncEveryone( BlockChain const& _bc, + const Transactions& _transactions, uint64_t _timestamp, u256 _gasPrice ) { if ( isSealed() ) BOOST_THROW_EXCEPTION( InvalidOperationOnSealedBlock() ); noteChain( _bc ); - // TRANSACTIONS - TransactionReceipts receipts; assert( _bc.currentHash() == m_currentBlock.parentHash() ); - // m_currentBlock.setTimestamp( _timestamp ); this->resetCurrent( _timestamp ); - m_state = m_state.createStateModifyCopyAndPassLock(); // mainly for debugging - TransactionReceipts saved_receipts = this->m_state.safePartialTransactionReceipts(); - if ( vecMissing ) { - assert( saved_receipts.size() == _transactions.size() - vecMissing->size() ); - } else - // NB! Not commit! Commit will be after 1st transaction! - m_state.clearPartialTransactionReceipts(); + m_state = m_state.createStateCopyAndClearCaches(); // mainly for debugging + + TransactionReceipts saved_receipts = + + m_receipts = m_state.safePartialTransactionReceipts( info().number() ); + TransactionReceipts receipts = m_receipts; + + unsigned countBad = 0; + + if ( m_receipts.size() > 0 ) { + cwarn << "Recovering from a previous crash while processing TRANSACTION:" + << m_receipts.size() << ":BLOCK:" << info().number(); + // count bad transactions in previously executed transactions + // a bad transaction is in the block but does not use any gas + u256 cumulativeGas = 0; + for ( auto const& receipt : m_receipts ) { + if ( receipt.cumulativeGasUsed() == cumulativeGas ) { + countBad++; + } + cumulativeGas = receipt.cumulativeGasUsed(); + } + } - unsigned count_bad = 0; for ( unsigned i = 0; i < _transactions.size(); ++i ) { Transaction const& tr = _transactions[i]; try { - if ( vecMissing != nullptr ) { // it's non-null only for PARTIAL CATCHUP + if ( i < saved_receipts.size() ) { + // this transaction has already been executed and we have a + // receipt for it. We do not need to execute it again + m_transactions.push_back( tr ); + m_transactionSet.insert( tr.sha3() ); + continue; + ; + } - auto iterMissing = std::find_if( vecMissing->begin(), vecMissing->end(), - [&tr]( const Transaction& trMissing ) -> bool { - return trMissing.sha3() == tr.sha3(); - } ); - if ( iterMissing == vecMissing->end() ) { - m_transactions.push_back( tr ); - m_transactionSet.insert( tr.sha3() ); - // HACK TODO We assume but don't check that accumulated receipts contain - // exactly receipts of first n txns! - m_receipts.push_back( saved_receipts[i] ); - receipts.push_back( saved_receipts[i] ); - continue; // skip this transaction, it was already executed before PARTIAL - // CATCHUP - } // if - } + // Tell skaled to fail in a middle of blog processing + // this is used in partial catchup tests + doPartialCatchupTestIfRequested( i ); + - // TODO Move this checking logic into some single place - not in execute, of course if ( !tr.isInvalid() && !tr.hasExternalGas() && tr.gasPrice() < _gasPrice ) { LOG( m_logger ) << "Transaction " << tr.sha3() << " WouldNotBeInBlock: gasPrice " << tr.gasPrice() << " < " << _gasPrice; @@ -498,15 +537,17 @@ tuple< TransactionReceipts, unsigned > Block::syncEveryone( m_receipts.push_back( null_receipt ); receipts.push_back( null_receipt ); - - ++count_bad; + // we need to record the receipt in case we crash + m_state.safeSetAndCommitPartialTransactionReceipt( + null_receipt.rlp(), info().number(), i ); + ++countBad; } continue; } ExecutionResult res = - execute( _bc.lastBlockHashes(), tr, Permanence::Committed, OnOpFunc() ); + execute( _bc.lastBlockHashes(), tr, Permanence::Committed, OnOpFunc(), i ); if ( !SkipInvalidTransactionsPatch::isEnabledInWorkingBlock() || res.excepted != TransactionException::WouldNotBeInBlock ) { @@ -514,25 +555,12 @@ tuple< TransactionReceipts, unsigned > Block::syncEveryone( // if added but bad if ( res.excepted == TransactionException::WouldNotBeInBlock ) - ++count_bad; + ++countBad; } - // - // Debug only, related SKALE-2814 partial catchup testing - // - // if ( i == 3 ) { - // std::cout << "\n\n" - // << cc::warn( "--- EXITING AS CRASH EMULATION AT TX# " ) << cc::num10( i ) - // << cc::warn( " with hash " ) << cc::info( tr.sha3().hex() ) << "\n\n\n"; - // std::cout.flush(); - //_exit( 200 ); - //} - } catch ( Exception& ex ) { ex << errinfo_transactionIndex( i ); - // throw; - // just ignore invalid transactions clog( VerbosityError, "block" ) << "FAILED transaction after consensus! " << ex.what(); } } @@ -541,8 +569,24 @@ tuple< TransactionReceipts, unsigned > Block::syncEveryone( m_state.mutableHistoricState().saveRootForBlock( m_currentBlock.number() ); #endif - m_state.releaseWriteLock(); - return make_tuple( receipts, receipts.size() - count_bad ); + // we got to the end of the block so we do not need partial transaction receipts anymore + m_state.safeRemoveAllPartialTransactionReceipts(); + + + // since we committed changes corresponding to a particular block + // we need to create a new readonly snap + LDB_CHECK( m_state.getOriginalDb() ); + m_state.getOriginalDb()->createBlockSnap( info().number() ); + + // do a simple sanity check from time to time + static uint64_t sanityCheckCounter = 0; + if ( sanityCheckCounter++ % 10000 == 0 ) { + LDB_CHECK( m_state.safePartialTransactionReceipts( info().number() ).empty() ); + } + + LDB_CHECK( receipts.size() >= countBad ); + + return make_tuple( receipts, receipts.size() - countBad ); } u256 Block::enactOn( VerifiedBlockRef const& _block, BlockChain const& _bc ) { @@ -579,7 +623,7 @@ u256 Block::enactOn( VerifiedBlockRef const& _block, BlockChain const& _bc ) { sync( _bc, _block.info.parentHash(), BlockHeader() ); resetCurrent(); - m_state = m_state.createStateModifyCopy(); + m_state = m_state.createStateCopyAndClearCaches(); #if ETH_TIMED_ENACTMENTS syncReset = t.elapsed(); @@ -598,6 +642,8 @@ u256 Block::enactOn( VerifiedBlockRef const& _block, BlockChain const& _bc ) { return ret; } + +// note :: this is only used in tests u256 Block::enact( VerifiedBlockRef const& _block, BlockChain const& _bc ) { noteChain( _bc ); @@ -624,19 +670,11 @@ u256 Block::enact( VerifiedBlockRef const& _block, BlockChain const& _bc ) { // All ok with the block generally. Play back the transactions now... unsigned i = 0; - DEV_TIMED_ABOVE( "txExec", 500 ) - for ( Transaction const& tr : _block.transactions ) { + DEV_TIMED_ABOVE( "txExec", 500 ) for ( Transaction const& tr : _block.transactions ) { try { - // cerr << "Enacting transaction: #" << tr.nonce() << " from " << tr.from() - // << " (state #" - // << state().getNonce( tr.from() ) << ") value = " << tr.value() << - // endl; const_cast< Transaction& >( tr ).checkOutExternalGas( _bc.chainParams(), _bc.info().timestamp(), _bc.number() ); - execute( _bc.lastBlockHashes(), tr ); - // cerr << "Now: " - // << "State #" << state().getNonce( tr.from() ) << endl; - // cnote << m_state; + execute( _bc.lastBlockHashes(), tr, skale::Permanence::Committed, OnOpFunc(), i ); } catch ( Exception& ex ) { ex << errinfo_transactionIndex( i ); throw; @@ -649,8 +687,7 @@ u256 Block::enact( VerifiedBlockRef const& _block, BlockChain const& _bc ) { } h256 receiptsRoot; - DEV_TIMED_ABOVE( ".receiptsRoot()", 500 ) - receiptsRoot = orderedTrieRoot( receipts ); + DEV_TIMED_ABOVE( ".receiptsRoot()", 500 ) receiptsRoot = orderedTrieRoot( receipts ); if ( receiptsRoot != m_currentBlock.receiptsRoot() ) { InvalidReceiptsStateRoot ex; @@ -686,13 +723,11 @@ u256 Block::enact( VerifiedBlockRef const& _block, BlockChain const& _bc ) { vector< BlockHeader > rewarded; h256Hash excluded; - DEV_TIMED_ABOVE( "allKin", 500 ) - excluded = _bc.allKinFrom( m_currentBlock.parentHash(), 6 ); + DEV_TIMED_ABOVE( "allKin", 500 ) excluded = _bc.allKinFrom( m_currentBlock.parentHash(), 6 ); excluded.insert( m_currentBlock.hash() ); unsigned ii = 0; - DEV_TIMED_ABOVE( "uncleCheck", 500 ) - for ( auto const& i : rlp[2] ) { + DEV_TIMED_ABOVE( "uncleCheck", 500 ) for ( auto const& i : rlp[2] ) { try { auto h = sha3( i.data() ); if ( excluded.count( h ) ) { @@ -779,16 +814,6 @@ u256 Block::enact( VerifiedBlockRef const& _block, BlockChain const& _bc ) { m_state.commit( removeEmptyAccounts ? dev::eth::CommitBehaviour::RemoveEmptyAccounts : dev::eth::CommitBehaviour::KeepEmptyAccounts ); - // // Hash the state trie and check against the state_root hash in m_currentBlock. - // if (m_currentBlock.stateRoot() != m_previousBlock.stateRoot() && - // m_currentBlock.stateRoot() != globalRoot()) - // { - // auto r = globalRoot(); - // m_state.db().rollback(); // TODO: API in State for this? - // BOOST_THROW_EXCEPTION( - // InvalidStateRoot() << Hash256RequirementError(m_currentBlock.stateRoot(), r)); - // } - return tdIncrease; } @@ -853,8 +878,8 @@ ExecutionResult Block::executeHistoricCall( LastBlockHashesFace const& _lh, Tran #endif -ExecutionResult Block::execute( - LastBlockHashesFace const& _lh, Transaction const& _t, Permanence _p, OnOpFunc const& _onOp ) { +ExecutionResult Block::execute( LastBlockHashesFace const& _lh, Transaction const& _t, + Permanence _p, OnOpFunc const& _onOp, int64_t _transactionIndex ) { MICROPROFILE_SCOPEI( "Block", "execute transaction", MP_CORNFLOWERBLUE ); if ( isSealed() ) BOOST_THROW_EXCEPTION( InvalidOperationOnSealedBlock() ); @@ -863,11 +888,6 @@ ExecutionResult Block::execute( // transaction as possible. uncommitToSeal(); - // HACK! TODO! Permanence::Reverted should be passed ONLY from Client::call - because there - // startRead() is called - // TODO add here startRead! (but it clears cache - so write in Client::call() is ignored... - State stateSnapshot = - _p != Permanence::Reverted ? m_state.createStateModifyCopyAndPassLock() : m_state; EnvInfo envInfo = EnvInfo( info(), _lh, previousInfo().timestamp(), gasUsed(), m_sealEngine->chainParams().chainID ); @@ -885,8 +905,8 @@ ExecutionResult Block::execute( if ( _t.isInvalid() ) throw -1; // will catch below - resultReceipt = - stateSnapshot.execute( envInfo, m_sealEngine->chainParams(), _t, _p, _onOp ); + resultReceipt = m_state.execute( + envInfo, m_sealEngine->chainParams(), _t, _p, _onOp, _transactionIndex ); // use fake receipt created above if execution throws!! } catch ( const TransactionException& ex ) { @@ -917,8 +937,16 @@ ExecutionResult Block::execute( m_transactionSet.insert( _t.sha3() ); } } - if ( _p == Permanence::Committed || _p == Permanence::Uncommitted ) { - m_state = stateSnapshot.createStateModifyCopyAndPassLock(); + + + // if we are doing real block processing with commit, we currently clear cache + // on each transaction. This can be done safely because state changes are committed to + // disk. In other cases we do not clear cache. This is specifically handy for tests + // because we do not commit to disk in some of the tests + // In the future we can test performance of not clearing + // cache on each commit + if ( _p == Permanence::Committed ) { + m_state = m_state.createStateCopyAndClearCaches(); } return resultReceipt.first; @@ -953,7 +981,7 @@ void Block::updateBlockhashContract() { if ( blockNumber == forkBlock ) { if ( m_state.addressInUse( c_blockhashContractAddress ) ) { if ( m_state.code( c_blockhashContractAddress ) != c_blockhashContractCode ) { - State state = m_state.createStateModifyCopy(); + State state = m_state.createStateCopyAndClearCaches(); state.setCode( c_blockhashContractAddress, bytes( c_blockhashContractCode ), m_sealEngine->evmSchedule( this->m_previousBlock.timestamp(), blockNumber ) .accountVersion ); @@ -970,7 +998,7 @@ void Block::updateBlockhashContract() { if ( blockNumber >= forkBlock ) { DummyLastBlockHashes lastBlockHashes; // assuming blockhash contract won't need BLOCKHASH - // itself + // itself // HACK 0 here is for gasPrice Executive e( *this, lastBlockHashes, 0 ); h256 const parentHash = m_previousBlock.hash(); @@ -1101,9 +1129,6 @@ bool Block::sealBlock( bytesConstRef _header ) { return true; } -void Block::startReadState() { - m_state = m_state.createStateReadOnlyCopy(); -} h256 Block::stateRootBeforeTx( unsigned _i ) const { _i = min< unsigned >( _i, m_transactions.size() ); diff --git a/libethereum/Block.h b/libethereum/Block.h index 4164b73e9..bccfd8a77 100644 --- a/libethereum/Block.h +++ b/libethereum/Block.h @@ -112,6 +112,8 @@ class Block { /// Copy state object. Block& operator=( Block const& _s ); + Block getReadOnlyCopy() const; + /// Get the author address for any transactions we do and rewards we get. Address author() const { return m_author; } @@ -217,7 +219,8 @@ class Block { /// Execute a given transaction. /// This will append @a _t to the transaction list and change the state accordingly. ExecutionResult execute( LastBlockHashesFace const& _lh, Transaction const& _t, - skale::Permanence _p = skale::Permanence::Committed, OnOpFunc const& _onOp = OnOpFunc() ); + skale::Permanence _p = skale::Permanence::Committed, OnOpFunc const& _onOp = OnOpFunc(), + int64_t _transactionIndex = -1 ); #ifdef HISTORIC_STATE ExecutionResult executeHistoricCall( LastBlockHashesFace const& _lh, Transaction const& _t, @@ -231,6 +234,7 @@ class Block { /// and bool, true iff there are more transactions to be processed. std::pair< TransactionReceipts, bool > sync( BlockChain const& _bc, TransactionQueue& _tq, GasPricer const& _gp, unsigned _msTimeout = 100 ); + static void doPartialCatchupTestIfRequested( unsigned _i ); /// Sync our state with the block chain. /// This basically involves wiping ourselves if we've been superceded and rebuilding from the @@ -246,9 +250,7 @@ class Block { /// Sync all transactions unconditionally std::tuple< TransactionReceipts, unsigned > syncEveryone( BlockChain const& _bc, - const Transactions& _transactions, uint64_t _timestamp, u256 _gasPrice, - Transactions* vecMissing = nullptr // it's non-null only for PARTIAL CATCHUP - ); + const Transactions& _transactions, uint64_t _timestamp, u256 _gasPrice ); /// Execute all transactions within a given block. /// @returns the additional total difficulty. diff --git a/libethereum/BlockChain.cpp b/libethereum/BlockChain.cpp index e2339685e..788c5454d 100644 --- a/libethereum/BlockChain.cpp +++ b/libethereum/BlockChain.cpp @@ -549,7 +549,7 @@ ImportRoute BlockChain::import( VerifiedBlockRef const& _block, State& _state, b s.cleanup(); - _state = _state.createNewCopyWithLocks(); + _state = _state.createStateCopyAndClearCaches(); totalDifficulty = pd.totalDifficulty + tdIncrease; diff --git a/libethereum/ChainParams.cpp b/libethereum/ChainParams.cpp index 4b2be0789..ac36ad46d 100644 --- a/libethereum/ChainParams.cpp +++ b/libethereum/ChainParams.cpp @@ -227,10 +227,19 @@ void ChainParams::processSkaleConfigItems( ChainParams& cp, json_spirit::mObject array< string, 4 > BLSPublicKeys; array< string, 4 > commonBLSPublicKeys; if ( !testSignatures ) { + if ( infoObj.count( "ecdsaKeyName" ) == 0 ) { + throw std::runtime_error( + "No ecdsaKeyName in config, and testSignatures is not set to true" ); + } + ecdsaKeyName = infoObj.at( "ecdsaKeyName" ).get_str(); - js::mObject ima = infoObj.at( "wallets" ).get_obj().at( "ima" ).get_obj(); + if ( infoObj.count( "wallets" ) == 0 ) { + throw std::runtime_error( + "No wallets section in test config, and testSignatures is not set to true" ); + } + js::mObject ima = infoObj.at( "wallets" ).get_obj().at( "ima" ).get_obj(); commonBLSPublicKeys[0] = ima["commonBLSPublicKey0"].get_str(); commonBLSPublicKeys[1] = ima["commonBLSPublicKey1"].get_str(); commonBLSPublicKeys[2] = ima["commonBLSPublicKey2"].get_str(); diff --git a/libethereum/Client.cpp b/libethereum/Client.cpp index 8c01d137f..96a6bb8a7 100644 --- a/libethereum/Client.cpp +++ b/libethereum/Client.cpp @@ -71,6 +71,7 @@ using namespace skale::error; static_assert( BOOST_VERSION >= 106400, "Wrong boost headers version" ); + namespace { std::string filtersToString( h256Hash const& _fs ) { std::stringstream str; @@ -220,20 +221,27 @@ void Client::injectSkaleHost( std::shared_ptr< SkaleHost > _skaleHost ) { } void Client::populateNewChainStateFromGenesis() { + // make sure no block processing happens while we are + // initing the state. This is probably never going to happen anyway + // since block processing happens very early in Client init + // but better safe than sorry + DEV_GUARDED( m_blockImportMutex ) #ifdef HISTORIC_STATE - m_state = m_state.createStateModifyCopy(); + m_state = m_state.createStateCopyAndClearCaches(); m_state.populateFrom( bc().chainParams().genesisState ); m_state.mutableHistoricState().saveRootForBlock( 0 ); m_state.mutableHistoricState().db().commit(); - m_state.releaseWriteLock(); #else - m_state.createStateModifyCopy().populateFrom( bc().chainParams().genesisState ); - m_state = m_state.createNewCopyWithLocks(); + m_state.populateFrom( bc().chainParams().genesisState ); + m_state = m_state.createStateCopyAndClearCaches(); #endif } void Client::initStateFromDiskOrGenesis() { + // write lock so transactions are not processed while state initialized + // state initialization happens very early at client init but better safe than sorry + DEV_WRITE_GUARDED( x_working ); #ifdef HISTORIC_STATE // Check if If the historic state databases do not yet exist bool historicStateExists = fs::exists( @@ -264,12 +272,7 @@ void Client::initStateFromDiskOrGenesis() { void Client::init( WithExisting _forceAction, u256 _networkId ) { DEV_TIMED_FUNCTION_ABOVE( 500 ); m_networkId = _networkId; - initStateFromDiskOrGenesis(); - - // LAZY. TODO: move genesis state construction/commiting to stateDB opening and have this - // just take the root from the genesis block. - m_preSeal = bc().genesisBlock( m_state ); m_postSeal = m_preSeal; @@ -277,13 +280,9 @@ void Client::init( WithExisting _forceAction, u256 _networkId ) { m_bq.setChain( bc() ); m_lastGetWork = std::chrono::system_clock::now() - chrono::seconds( 30 ); - m_tqReady = m_tq.onReady( [=]() { - this->onTransactionQueueReady(); - } ); // TODO: should read m_tq->onReady(thisThread, syncTransactionQueue); + m_tqReady = m_tq.onReady( [=]() { this->onTransactionQueueReady(); } ); m_tqReplaced = m_tq.onReplaced( [=]( h256 const& ) { m_needStateReset = true; } ); - m_bqReady = m_bq.onReady( [=]() { - this->onBlockQueueReady(); - } ); // TODO: should read m_bq->onReady(thisThread, syncBlockQueue); + m_bqReady = m_bq.onReady( [=]() { this->onBlockQueueReady(); } ); m_bq.setOnBad( [=]( Exception& ex ) { this->onBadBlock( ex ); } ); bc().setOnBad( [=]( Exception& ex ) { this->onBadBlock( ex ); } ); bc().setOnBlockImport( [=]( BlockHeader const& _info ) { @@ -313,6 +312,11 @@ void Client::init( WithExisting _forceAction, u256 _networkId ) { m_snapshotAgentInited = true; } + // when we start, we create a read only State DB snap to be used in eth calls + // after that, new snaps are created after each block is processed + + m_state.createReadOnlyStateDBSnap( number() ); + SchainPatch::init( chainParams() ); SchainPatch::useLatestBlockTimestamp( blockChain().info().timestamp() ); TotalStorageUsedPatch::init( this ); @@ -506,30 +510,9 @@ void Client::syncBlockQueue() { onChainChanged( ir ); } -static std::string stat_transactions2str( - const Transactions& _transactions, const std::string& strPrefix ) { - size_t cnt = _transactions.size(); - std::string s; - if ( !strPrefix.empty() ) - s += strPrefix; - s += cc::size10( cnt ) + " " + - cc::debug( - ( cnt > 1 ) ? "transactions: " : ( ( cnt == 1 ) ? "transaction: " : "transactions" ) ); - size_t i = 0; - for ( const Transactions::value_type& tx : _transactions ) { - if ( i > 0 ) - s += cc::normal( ", " ); - s += cc::debug( "#" ) + cc::size10( i ) + cc::debug( "/" ) + cc::info( tx.sha3().hex() ); - ++i; - } - return s; -} size_t Client::importTransactionsAsBlock( const Transactions& _transactions, u256 _gasPrice, uint64_t _timestamp ) { - // HACK here was m_blockImportMutex - but now it is acquired in SkaleHost!!! - // TODO decouple Client and SkaleHost - // on schain creation, SnapshotAgent needs timestamp of block 1 // so we use this HACK // pass block number 0 as for bigger BN it is initialized in init() @@ -539,52 +522,8 @@ size_t Client::importTransactionsAsBlock( } m_snapshotAgent->finishHashComputingAndUpdateHashesIfNeeded( _timestamp ); - // begin, detect partially executed block - bool bIsPartial = false; - dev::h256 shaLastTx = m_state.safeLastExecutedTransactionHash(); - - auto iterFound = std::find_if( _transactions.begin(), _transactions.end(), - [&shaLastTx]( const Transaction& txWalk ) { return txWalk.sha3() == shaLastTx; } ); - - // detect partial ONLY if this transaction is not known! - bIsPartial = iterFound != _transactions.end() && !isKnownTransaction( shaLastTx ); - - Transactions vecPassed, vecMissing; - if ( bIsPartial ) { - vecPassed.insert( vecPassed.end(), _transactions.begin(), iterFound + 1 ); - vecMissing.insert( vecMissing.end(), iterFound + 1, _transactions.end() ); - } - - size_t cntAll = _transactions.size(); - size_t cntPassed = vecPassed.size(); - size_t cntMissing = vecMissing.size(); - size_t cntExpected = cntMissing; - if ( bIsPartial ) { - LOG( m_logger ) << cc::fatal( "PARTIAL CATCHUP DETECTED:" ) - << cc::warn( " found partially executed block, have " ) - << cc::size10( cntAll ) << cc::warn( " transaction(s), " ) - << cc::size10( cntPassed ) << cc::warn( " passed, " ) - << cc::size10( cntMissing ) << cc::warn( " missing" ); - LOG( m_logger ).flush(); - LOG( m_logger ) << cc::info( "PARTIAL CATCHUP:" ) - << stat_transactions2str( _transactions, cc::notice( " All " ) ); - LOG( m_logger ).flush(); - LOG( m_logger ) << cc::info( "PARTIAL CATCHUP:" ) - << stat_transactions2str( vecPassed, cc::notice( " Passed " ) ); - LOG( m_logger ).flush(); - LOG( m_logger ) << cc::info( "PARTIAL CATCHUP:" ) - << stat_transactions2str( vecMissing, cc::notice( " Missing " ) ); - // LOG( m_logger ) << cc::info( "PARTIAL CATCHUP:" ) << cc::attention( " Found " ) - // << cc::size10( partialTransactionReceipts.size() ) - // << cc::attention( " partial transaction receipt(s) inside " ) - // << cc::notice( "SAFETY CACHE" ); - LOG( m_logger ).flush(); - } - // end, detect partially executed block - // size_t cntSucceeded = 0; - cntSucceeded = syncTransactions( - _transactions, _gasPrice, _timestamp, bIsPartial ? &vecMissing : nullptr ); + cntSucceeded = syncTransactions( _transactions, _gasPrice, _timestamp ); sealUnconditionally( false ); importWorkingBlock(); @@ -599,45 +538,21 @@ size_t Client::importTransactionsAsBlock( } else cwarn << "Warning: UnsafeRegion still active!"; - if ( bIsPartial ) - cntSucceeded += cntPassed; - if ( cntSucceeded != cntAll ) { - LOG( m_logger ) << cc::fatal( "TX EXECUTION WARNING:" ) << cc::warn( " expected " ) - << cc::size10( cntAll ) << cc::warn( " transaction(s) to pass, when " ) - << cc::size10( cntSucceeded ) << cc::warn( " passed with success," ) - << cc::size10( cntExpected ) << cc::warn( " expected to run and pass" ); - LOG( m_logger ).flush(); - } - if ( bIsPartial ) { - LOG( m_logger ) << cc::success( "PARTIAL CATCHUP SUCCESS: with " ) << cc::size10( cntAll ) - << cc::success( " transaction(s), " ) << cc::size10( cntPassed ) - << cc::success( " passed, " ) << cc::size10( cntMissing ) - << cc::success( " missing" ); - LOG( m_logger ).flush(); - } if ( chainParams().sChain.nodeGroups.size() > 0 ) updateHistoricGroupIndex(); m_snapshotAgent->doSnapshotIfNeeded( number(), _timestamp ); - // TEMPRORARY FIX! - // TODO: REVIEW tick(); return cntSucceeded; - assert( false ); - return 0; } size_t Client::syncTransactions( - const Transactions& _transactions, u256 _gasPrice, uint64_t _timestamp, - Transactions* vecMissing // it's non-null only for PARTIAL CATCHUP -) { + const Transactions& _transactions, u256 _gasPrice, uint64_t _timestamp ) { assert( m_skaleHost ); - // HACK remove block verification and put it directly in blockchain!! - // TODO remove block verification and put it directly in blockchain!! while ( m_working.isSealed() ) { cnote << "m_working.isSealed. sleeping"; usleep( 1000 ); @@ -652,11 +567,9 @@ size_t Client::syncTransactions( DEV_WRITE_GUARDED( x_working ) { assert( !m_working.isSealed() ); - - // assert(m_state.m_db_write_lock.has_value()); tie( newPendingReceipts, goodReceipts ) = - m_working.syncEveryone( bc(), _transactions, _timestamp, _gasPrice, vecMissing ); - m_state = m_state.createNewCopyWithLocks(); + m_working.syncEveryone( bc(), _transactions, _timestamp, _gasPrice ); + m_state = m_state.createStateCopyAndClearCaches(); #ifdef HISTORIC_STATE // make sure the trie in new state object points to the new state root m_state.mutableHistoricState().setRoot( @@ -724,8 +637,7 @@ void Client::restartMining() { DEV_READ_GUARDED( x_preSeal ) newPreMine = m_preSeal; - // TODO: use m_postSeal to avoid re-evaluating our own blocks. - m_state = m_state.createNewCopyWithLocks(); + m_state = m_state.createStateCopyAndClearCaches(); preChanged = newPreMine.sync( bc(), m_state ); if ( preChanged || m_postSeal.author() != m_preSeal.author() ) { @@ -770,16 +682,9 @@ void Client::setSchainExitTime( uint64_t _timestamp ) const { } void Client::onChainChanged( ImportRoute const& _ir ) { - // ctrace << "onChainChanged()"; h256Hash changeds; onDeadBlocks( _ir.deadBlocks, changeds ); - // this should be already done in SkaleHost::createBlock() - // for ( auto const& t : _ir.goodTranactions ) { - // LOG( m_loggerDetail ) << "Safely dropping transaction " << t.sha3(); - // m_tq.dropGood( t ); - // } - onNewBlocks( _ir.liveBlocks, changeds ); if ( !isMajorSyncing() ) resyncStateFromChain(); @@ -1076,8 +981,7 @@ Block Client::blockByNumber( BlockNumber _h ) const { } // blockByNumber is only used for reads - - auto readState = m_state.createStateReadOnlyCopy(); + auto readState = m_state.createStateCopyAndClearCaches(); readState.mutableHistoricState().setRootByBlockNumber( _h ); // removed m_blockImportMutex here // this function doesn't interact with latest block so the mutex isn't needed @@ -1114,8 +1018,7 @@ TransactionSkeleton Client::populateTransactionWithDefaults( TransactionSkeleton // value used by geth and testrpc. const u256 defaultTransactionGas = 90000; if ( ret.nonce == Invalid256 ) { - Block block = postSeal(); - block.startReadState(); + Block block = getReadOnlyLatestBlockCopy(); ret.nonce = max< u256 >( block.transactionsFrom( ret.from ), m_tq.maxNonce( ret.from ) ); } if ( ret.gasPrice == Invalid256 ) @@ -1149,11 +1052,12 @@ h256 Client::submitTransaction( TransactionSkeleton const& _t, Secret const& _se TransactionSkeleton ts = populateTransactionWithDefaults( _t ); ts.from = toAddress( _secret ); Transaction t( ts, _secret ); - return importTransaction( t ); + auto result = importTransaction( t, TransactionBroadcast::BroadcastToAll ); + + return result; } -// TODO: Check whether multiTransactionMode enabled on contracts -h256 Client::importTransaction( Transaction const& _t ) { +h256 Client::importTransaction( Transaction const& _t, TransactionBroadcast _txOrigin ) { prepareForTransaction(); // Use the Executive to perform basic validation of the transaction @@ -1165,15 +1069,15 @@ h256 Client::importTransaction( Transaction const& _t ) { State state; u256 gasBidPrice; - DEV_GUARDED( m_blockImportMutex ) { - state = this->state().createStateReadOnlyCopy(); - gasBidPrice = this->gasBidPrice(); + state = this->state().createReadOnlySnapBasedCopy(); + gasBidPrice = this->gasBidPrice(); + + + // We need to check external gas under mutex to be sure about current block number + // correctness + const_cast< Transaction& >( _t ).checkOutExternalGas( + chainParams(), bc().info().timestamp(), number() ); - // We need to check external gas under mutex to be sure about current block number - // correctness - const_cast< Transaction& >( _t ).checkOutExternalGas( - chainParams(), bc().info().timestamp(), number() ); - } Executive::verifyTransaction( _t, bc().info().timestamp(), bc().number() ? this->blockInfo( bc().currentHash() ) : bc().genesis(), state, @@ -1204,6 +1108,11 @@ h256 Client::importTransaction( Transaction const& _t ) { m_new_pending_transaction_watch.invoke( _t ); + // since the transaction was received fom the user, we broadcast it + if ( _txOrigin == TransactionBroadcast::BroadcastToAll && m_skaleHost ) { + m_skaleHost->pushToBroadcastQueue( _t ); + } + return _t.sha3(); } @@ -1219,8 +1128,9 @@ ExecutionResult Client::call( Address const& _from, u256 _value, Address _dest, ExecutionResult ret; try { #ifdef HISTORIC_STATE - Block historicBlock = blockByNumber( _blockNumber ); + if ( _blockNumber < bc().number() ) { + Block historicBlock = blockByNumber( _blockNumber ); // historic state try { u256 nonce = historicBlock.mutableState().mutableHistoricState().getNonce( _from ); @@ -1247,10 +1157,8 @@ ExecutionResult Client::call( Address const& _from, u256 _value, Address _dest, } #endif - Block temp = preSeal(); + Block temp = getReadOnlyLatestBlockCopy(); - // TODO there can be race conditions between prev and next line! - State readStateForLock = temp.mutableState().createStateReadOnlyCopy(); u256 nonce = max< u256 >( temp.transactionsFrom( _from ), m_tq.maxNonce( _from ) ); // if the user did not specify transaction gas limit, we give transaction block gas // limit of gas diff --git a/libethereum/Client.h b/libethereum/Client.h index 468aec177..4d450eb53 100644 --- a/libethereum/Client.h +++ b/libethereum/Client.h @@ -61,11 +61,13 @@ #include class ConsensusHost; + class SnapshotManager; namespace dev { namespace eth { class Client; + class DownloadMan; enum ClientWorkState { Active = 0, Deleting, Deleted }; @@ -83,6 +85,7 @@ constexpr size_t MAX_BLOCK_TRACES_CACHE_SIZE = 64 * 1024 * 1024; constexpr size_t MAX_BLOCK_TRACES_CACHE_ITEMS = 1024 * 1024; #endif + /** * @brief Main API hub for interfacing with Ethereum. */ @@ -97,6 +100,7 @@ class Client : public ClientBase, protected Worker { WithExisting _forceAction = WithExisting::Trust, TransactionQueue::Limits const& _l = TransactionQueue::Limits{ 1024, 1024, 12322916, 24645833 } ); + /// Destructor. virtual ~Client(); @@ -108,10 +112,12 @@ class Client : public ClientBase, protected Worker { ChainParams const& chainParams() const { return bc().chainParams(); } clock_t dbRotationPeriod() const { return bc().clockDbRotationPeriod_; } + void dbRotationPeriod( clock_t clockPeriod ) { bc().clockDbRotationPeriod_ = clockPeriod; } /// Resets the gas pricer to some other object. void setGasPricer( std::shared_ptr< GasPricer > _gp ) { m_gp = _gp; } + std::shared_ptr< GasPricer > gasPricer() const { return m_gp; } /// Submits the given transaction. @@ -119,7 +125,9 @@ class Client : public ClientBase, protected Worker { h256 submitTransaction( TransactionSkeleton const& _t, Secret const& _secret ) override; /// Imports the given transaction into the transaction queue - h256 importTransaction( Transaction const& _t ) override; + h256 importTransaction( Transaction const& _t, + TransactionBroadcast _txOrigin = TransactionBroadcast::DontBroadcast ) override; + /// Makes the given call. Nothing is recorded into the state. ExecutionResult call( Address const& _secret, u256 _value, Address _dest, bytes const& _data, @@ -130,12 +138,16 @@ class Client : public ClientBase, protected Worker { FudgeFactor _ff = FudgeFactor::Strict ) override; #ifdef HISTORIC_STATE + Json::Value traceCall( Address const& _from, u256 _value, Address _to, bytes const& _data, u256 _gas, u256 _gasPrice, BlockNumber _blockNumber, Json::Value const& _jsonTraceConfig ); + Json::Value traceBlock( BlockNumber _blockNumber, Json::Value const& _jsonTraceConfig ); + Transaction createTransactionForCallOrTraceCall( const Address& _from, const u256& _value, const Address& _to, const bytes& _data, const u256& _gasLimit, const u256& _gasPrice, const u256& nonce ) const; + #endif @@ -156,6 +168,7 @@ class Client : public ClientBase, protected Worker { /// Get the remaining gas limit in this block. u256 gasLimitRemaining() const override { return m_postSeal.gasLimitRemaining(); } + /// Get the gas bid price u256 gasBidPrice( unsigned _blockNumber = dev::eth::LatestBlock ) const override { return m_gp->bid( _blockNumber ); @@ -170,22 +183,31 @@ class Client : public ClientBase, protected Worker { ReadGuard l( x_postSeal ); return m_postSeal; } + /// Get the object representing the current canonical blockchain. BlockChain const& blockChain() const { return bc(); } + /// Get some information on the block queue. BlockQueueStatus blockQueueStatus() const { return m_bq.status(); } + /// Get some information on the block syncing. SyncStatus syncStatus() const override; + /// Populate the uninitialized fields in the supplied transaction with default values TransactionSkeleton populateTransactionWithDefaults( TransactionSkeleton const& _t ) const override; + /// Get the block queue. BlockQueue const& blockQueue() const { return m_bq; } + /// Get the state database. skale::State const& state() const { return m_state; } + /// Get some information on the transaction queue. TransactionQueue::Status transactionQueueStatus() const { return m_tq.status(); } + TransactionQueue::Limits transactionQueueLimits() const { return m_tq.limits(); } + TransactionQueue* debugGetTransactionQueue() { return &m_tq; } /// Freeze worker thread and sync some of the block queue. @@ -198,24 +220,28 @@ class Client : public ClientBase, protected Worker { ReadGuard l( x_preSeal ); return m_preSeal.author(); } + void setAuthor( Address const& _us ) override { - DEV_WRITE_GUARDED( x_preSeal ) - m_preSeal.setAuthor( _us ); + DEV_WRITE_GUARDED( x_preSeal ) m_preSeal.setAuthor( _us ); restartMining(); } /// Type of sealers available for this seal engine. strings sealers() const { return sealEngine()->sealers(); } + /// Current sealer in use. std::string sealer() const { return sealEngine()->sealer(); } + /// Change sealer. void setSealer( std::string const& _id ) { sealEngine()->setSealer( _id ); if ( wouldSeal() ) startSealing(); } + /// Review option for the sealer. bytes sealOption( std::string const& _name ) const { return sealEngine()->option( _name ); } + /// Set option for the sealer. bool setSealOption( std::string const& _name, bytes const& _value ) { auto ret = sealEngine()->setOption( _name, _value ); @@ -226,18 +252,22 @@ class Client : public ClientBase, protected Worker { /// Start sealing. void startSealing() override; + /// Stop sealing. void stopSealing() override { m_wouldSeal = false; } + /// Are we sealing now? bool wouldSeal() const override { return m_wouldSeal; } /// Are we updating the chain (syncing or importing a new block)? bool isSyncing() const override; + /// Are we syncing the chain? bool isMajorSyncing() const override; /// Gets the network id. u256 networkId() const override; + /// Sets the network id. void setNetworkId( u256 const& _n ) override; @@ -247,18 +277,23 @@ class Client : public ClientBase, protected Worker { // Debug stuff: DownloadMan const* downloadMan() const; + /// Clears pending transactions. Just for debug use. void clearPending(); + /// Retries all blocks with unknown parents. void retryUnknown() { m_bq.retryAllUnknown(); } + /// Get a report of activity. ActivityReport activityReport() { ActivityReport ret; std::swap( m_report, ret ); return ret; } + /// Set the extra data that goes into sealed blocks. void setExtraData( bytes const& _extraData ) { m_extraData = _extraData; } + /// Rescue the chain. void rescue() { bc().rescue( m_state ); } @@ -282,6 +317,7 @@ class Client : public ClientBase, protected Worker { std::function< void( BlockHeader const& ) > _handler ) { return m_onBlockImport.add( _handler ); } + /// Change the function that is called when a new block is sealed Handler< bytes const& > setOnBlockSealed( std::function< void( bytes const& ) > _handler ) { return m_onBlockSealed.add( _handler ); @@ -351,18 +387,25 @@ class Client : public ClientBase, protected Worker { std::pair< uint64_t, uint64_t > getStateDbUsage() const; #ifdef HISTORIC_STATE + uint64_t getHistoricStateDbUsage() const; + uint64_t getHistoricRootsDbUsage() const; + #endif // HISTORIC_STATE uint64_t submitOracleRequest( const string& _spec, string& _receipt, string& _errorMessage ); + uint64_t checkOracleResult( const string& _receipt, string& _result ); SkaleDebugInterface::handler getDebugHandler() const { return m_debugHandler; } #ifdef HISTORIC_STATE + OverlayDB const& historicStateDB() const { return m_historicStateDB; } + OverlayDB const& historicBlockToStateRootDB() const { return m_historicBlockToStateRootDB; } + #endif protected: @@ -370,9 +413,7 @@ class Client : public ClientBase, protected Worker { /// returns number of successfullty executed transactions /// thread unsafe!! size_t syncTransactions( const Transactions& _transactions, u256 _gasPrice, - uint64_t _timestamp = ( uint64_t ) utcTime(), - Transactions* vecMissing = nullptr // it's non-null only for PARTIAL CATCHUP - ); + uint64_t _timestamp = ( uint64_t ) utcTime() ); /// As rejigSealing - but stub /// thread unsafe!! @@ -387,6 +428,7 @@ class Client : public ClientBase, protected Worker { /// InterfaceStub methods BlockChain& bc() override { return m_bc; } + BlockChain const& bc() const override { return m_bc; } /// Returns the state object for the full block (i.e. the terminal state) for index _h. @@ -395,10 +437,15 @@ class Client : public ClientBase, protected Worker { ReadGuard l( x_preSeal ); return m_preSeal; } + + // get read only latest block copy + Block getReadOnlyLatestBlockCopy() const { return m_postSeal.getReadOnlyCopy(); } + Block postSeal() const override { ReadGuard l( x_postSeal ); return m_postSeal; } + void prepareForTransaction() override; /// Collate the changed filters for the bloom filter of the given pending transaction. @@ -419,7 +466,9 @@ class Client : public ClientBase, protected Worker { #ifdef HISTORIC_STATE + Block blockByNumber( BlockNumber _h ) const; + #endif protected: @@ -428,6 +477,7 @@ class Client : public ClientBase, protected Worker { /// Do some work. Handles blockchain maintenance and sealing. void doWork( bool _doWait ); + void doWork() override { doWork( true ); } /// Called when Worker is exiting. @@ -444,6 +494,7 @@ class Client : public ClientBase, protected Worker { /// Called after processing blocks by onChainChanged(_ir) void resyncStateFromChain(); + /// Update m_preSeal, m_working, m_postSeal blocks from the latest state of the chain void restartMining(); @@ -489,14 +540,14 @@ class Client : public ClientBase, protected Worker { BlockChain m_bc; ///< Maintains block database and owns the seal engine. BlockQueue m_bq; ///< Maintains a list of incoming blocks not yet on the blockchain (to be - ///< imported). + ///< imported). TransactionQueue m_tq; ///< Maintains a list of incoming transactions not yet in a block on the ///< blockchain. #ifdef HISTORIC_STATE OverlayDB m_historicStateDB; ///< Acts as the central point for the state database, so multiple - ///< States can share it. + ///< States can share it. OverlayDB m_historicBlockToStateRootDB; /// Maps hashes of block IDs to state roots #endif @@ -507,21 +558,21 @@ class Client : public ClientBase, protected Worker { Block m_preSeal; ///< The present state of the client. mutable SharedMutex x_postSeal; ///< Lock on m_postSeal. Block m_postSeal; ///< The state of the client which we're sealing (i.e. it'll have all the - ///< rewards added). + ///< rewards added). mutable SharedMutex x_working; ///< Lock on m_working. Block m_working; ///< The state of the client which we're sealing (i.e. it'll have all the - ///< rewards added), while we're actually working on it. + ///< rewards added), while we're actually working on it. BlockHeader m_sealingInfo; ///< The header we're attempting to seal on (derived from - ///< m_postSeal). + ///< m_postSeal). mutable Mutex m_blockImportMutex; /// synchronize state and latest block update bool remoteActive() const; ///< Is there an active and valid remote worker? bool m_remoteWorking = false; ///< Has the remote worker recently been reset? - std::atomic< bool > m_needStateReset = { false }; ///< Need reset working state to premin on - ///< next sync + std::atomic< bool > m_needStateReset = { false }; ///< Need reset working state to premin on + ///< next sync std::chrono::system_clock::time_point m_lastGetWork; ///< Is there an active and valid remote - ///< worker? + ///< worker? dev::u256 m_networkId; // TODO delegate this to someone? (like m_host) // TODO Add here m_isSyncing or use special BlockchainSync class (ask Stan) @@ -535,7 +586,7 @@ class Client : public ClientBase, protected Worker { bool m_wouldSeal = false; ///< True if we /should/ be sealing. bool m_wouldButShouldnot = false; ///< True if the last time we called rejigSealing wouldSeal() - ///< was true but sealer's shouldSeal() was false. + ///< was true but sealer's shouldSeal() was false. mutable std::chrono::system_clock::time_point m_lastGarbageCollection; ///< When did we last both doing GC on the watches? @@ -548,7 +599,7 @@ class Client : public ClientBase, protected Worker { SharedMutex x_functionQueue; std::queue< std::function< void() > > m_functionQueue; ///< Functions waiting to be executed in - ///< the main thread. + ///< the main thread. std::atomic< bool > m_syncTransactionQueue = { false }; std::atomic< bool > m_syncBlockQueue = { false }; @@ -556,8 +607,8 @@ class Client : public ClientBase, protected Worker { bytes m_extraData; Signal< BlockHeader const& > m_onBlockImport; ///< Called if we have imported a new block into - ///< the DB - Signal< bytes const& > m_onBlockSealed; ///< Called if we have sealed a new block + ///< the DB + Signal< bytes const& > m_onBlockSealed; ///< Called if we have sealed a new block Logger m_logger{ createLogger( VerbosityInfo, "client" ) }; Logger m_loggerDetail{ createLogger( VerbosityTrace, "client" ) }; @@ -578,6 +629,7 @@ class Client : public ClientBase, protected Worker { private: void initHistoricGroupIndex(); + void updateHistoricGroupIndex(); // which group corresponds to the current block timestamp on this node @@ -596,6 +648,7 @@ class Client : public ClientBase, protected Worker { private: typedef skutils::multithreading::recursive_mutex_type mutex_type; typedef std::lock_guard< mutex_type > lock_type; + static mutex_type& mtx() { return skutils::get_ref_mtx(); } typedef std::map< key_type, handler_type > map_type; @@ -605,14 +658,18 @@ class Client : public ClientBase, protected Worker { public: genericWatch() {} + virtual ~genericWatch() { uninstallAll(); } + key_type create_subscription_id() { return subscription_counter_++; } + virtual bool is_installed( const key_type& k ) const { lock_type lock( mtx() ); if ( map_.find( k ) == map_.end() ) return false; return true; } + virtual key_type install( handler_type& h ) { if ( !h ) return false; // not call-able @@ -621,6 +678,7 @@ class Client : public ClientBase, protected Worker { map_[k] = h; return k; } + virtual bool uninstall( const key_type& k ) { lock_type lock( mtx() ); auto itFind = map_.find( k ); @@ -629,10 +687,12 @@ class Client : public ClientBase, protected Worker { map_.erase( itFind ); return true; } + virtual void uninstallAll() { lock_type lock( mtx() ); map_.clear(); } + virtual void invoke( const parameter_type& p ) { map_type map2; { // block @@ -648,6 +708,7 @@ class Client : public ClientBase, protected Worker { } } }; + // new block watch typedef genericWatch< Block > blockWatch; blockWatch m_new_block_watch; @@ -659,22 +720,32 @@ class Client : public ClientBase, protected Worker { // new block watch virtual unsigned installNewBlockWatch( std::function< void( const unsigned&, const Block& ) >& ) override; + virtual bool uninstallNewBlockWatch( const unsigned& ) override; // new pending transation watch virtual unsigned installNewPendingTransactionWatch( std::function< void( const unsigned&, const Transaction& ) >& ) override; + virtual bool uninstallNewPendingTransactionWatch( const unsigned& ) override; #ifdef HISTORIC_STATE + u256 historicStateBalanceAt( Address _a, BlockNumber _block ) const override; + u256 historicStateCountAt( Address _a, BlockNumber _block ) const override; + u256 historicStateAt( Address _a, u256 _l, BlockNumber _block ) const override; + h256 historicStateRootAt( Address _a, BlockNumber _block ) const override; + bytes historicStateCodeAt( Address _a, BlockNumber _block ) const override; + #endif + void initStateFromDiskOrGenesis(); + void populateNewChainStateFromGenesis(); }; diff --git a/libethereum/ClientBase.cpp b/libethereum/ClientBase.cpp index 200fb295f..f17a2022e 100644 --- a/libethereum/ClientBase.cpp +++ b/libethereum/ClientBase.cpp @@ -40,6 +40,7 @@ using namespace dev::eth; using skale::Permanence; using skale::State; + static const int64_t c_maxGasEstimate = 50000000; ClientWatch::ClientWatch() : lastPoll( std::chrono::system_clock::now() ) {} @@ -79,6 +80,7 @@ void ClientWatch::append_changes( const LocalisedLogEntry& entry ) { fnOnNewChanges_( iw_ ); } + std::pair< bool, ExecutionResult > ClientBase::estimateGasStep( int64_t _gas, Block& _latestBlock, Block& _pendingBlock, Address const& _from, Address const& _destination, u256 const& _value, u256 const& _gasPrice, bytes const& _data ) { @@ -178,29 +180,6 @@ ImportResult ClientBase::injectBlock( bytes const& _block ) { return bc().attemptImport( _block, preSeal().mutableState() ).first; } -u256 ClientBase::balanceAt( Address _a ) const { - return latestBlock().balance( _a ); -} - -u256 ClientBase::countAt( Address _a ) const { - return latestBlock().transactionsFrom( _a ); -} - -u256 ClientBase::stateAt( Address _a, u256 _l ) const { - return latestBlock().storage( _a, _l ); -} - -bytes ClientBase::codeAt( Address _a ) const { - return latestBlock().code( _a ); -} - -h256 ClientBase::codeHashAt( Address _a ) const { - return latestBlock().codeHash( _a ); -} - -map< h256, pair< u256, u256 > > ClientBase::storageAt( Address _a ) const { - return latestBlock().storage( _a ); -} // TODO: remove try/catch, allow exceptions LocalisedLogEntries ClientBase::logs( unsigned _watchId ) const { @@ -585,10 +564,34 @@ bool ClientBase::isKnownTransaction( h256 const& _blockHash, unsigned _i ) const Block ClientBase::latestBlock() const { Block res = postSeal(); - res.startReadState(); return res; } uint64_t ClientBase::chainId() const { return bc().chainParams().chainID; } + + +u256 ClientBase::countAt( Address _a ) const { + return getReadOnlyLatestBlockCopy().state().getNonce( _a ); +} + +u256 ClientBase::balanceAt( Address _a ) const { + return getReadOnlyLatestBlockCopy().state().balance( _a ); +} + +u256 ClientBase::stateAt( Address _a, u256 _l ) const { + return getReadOnlyLatestBlockCopy().state().storage( _a, _l ); +} + +bytes ClientBase::codeAt( Address _a ) const { + return getReadOnlyLatestBlockCopy().state().code( _a ); +} + +h256 ClientBase::codeHashAt( Address _a ) const { + return getReadOnlyLatestBlockCopy().state().codeHash( _a ); +} + +map< h256, pair< u256, u256 > > ClientBase::storageAt( Address _a ) const { + return getReadOnlyLatestBlockCopy().state().storage( _a ); +} diff --git a/libethereum/ClientBase.h b/libethereum/ClientBase.h index 2790b4ee3..289ed3563 100644 --- a/libethereum/ClientBase.h +++ b/libethereum/ClientBase.h @@ -77,6 +77,7 @@ struct ClientWatch { bool isWS() const { return isWS_; }; }; + class ClientBase : public Interface { public: class CreationException : public std::exception { @@ -86,20 +87,6 @@ class ClientBase : public Interface { ClientBase() {} virtual ~ClientBase() {} - /// Estimate gas usage for call/create. - /// @param _maxGas An upper bound value for estimation, if not provided default value of - /// c_maxGasEstimate will be used. - /// @param _callback Optional callback function for progress reporting - std::pair< u256, ExecutionResult > estimateGas( Address const& _from, u256 _value, - Address _dest, bytes const& _data, int64_t _maxGas, u256 _gasPrice, - GasEstimationCallback const& _callback = GasEstimationCallback() ) override; - - u256 balanceAt( Address _a ) const override; - u256 countAt( Address _a ) const override; - u256 stateAt( Address _a, u256 _l ) const override; - bytes codeAt( Address _a ) const override; - h256 codeHashAt( Address _a ) const override; - std::map< h256, std::pair< u256, u256 > > storageAt( Address _a ) const override; LocalisedLogEntries logs( unsigned _watchId ) const override; LocalisedLogEntries logs( LogFilter const& _filter ) const override; @@ -196,6 +183,20 @@ class ClientBase : public Interface { uint64_t chainId() const override; + u256 countAt( Address _a ) const override; + u256 balanceAt( Address _a ) const override; + u256 stateAt( Address _a, u256 _l ) const override; + bytes codeAt( Address _a ) const override; + h256 codeHashAt( Address _a ) const override; + std::map< h256, std::pair< u256, u256 > > storageAt( Address _a ) const override; + std::pair< u256, ExecutionResult > estimateGas( Address const& _from, u256 _value, + Address _dest, bytes const& _data, int64_t _maxGas, u256 _gasPrice, + GasEstimationCallback const& _callback = GasEstimationCallback() ) override; + std::pair< bool, ExecutionResult > estimateGasStep( int64_t _gas, Block& _latestBlock, + Block& _pendingBlock, Address const& _from, Address const& _destination, u256 const& _value, + u256 const& _gasPrice, bytes const& _data ); + + protected: /// The interface that must be implemented in any class deriving this. /// { @@ -219,11 +220,11 @@ class ClientBase : public Interface { Logger m_loggerWatch{ createLogger( VerbosityDebug, "watch" ) }; -private: - std::pair< bool, ExecutionResult > estimateGasStep( int64_t _gas, Block& _latestBlock, - Block& _pendingBlock, Address const& _from, Address const& _destination, u256 const& _value, - u256 const& _gasPrice, bytes const& _data ); + + // get read only latest block copy + Block getReadOnlyLatestBlockCopy() const { return postSeal().getReadOnlyCopy(); } }; + } // namespace eth } // namespace dev diff --git a/libethereum/ClientTest.h b/libethereum/ClientTest.h index f80023031..c58aeb76f 100644 --- a/libethereum/ClientTest.h +++ b/libethereum/ClientTest.h @@ -52,7 +52,7 @@ class ClientTest : public Client { h256 importRawBlock( std::string const& _blockRLP ); protected: - unsigned const m_singleBlockMaxMiningTimeInSeconds = 5; + unsigned const m_singleBlockMaxMiningTimeInSeconds = 10; }; ClientTest& asClientTest( Interface& _c ); diff --git a/libethereum/Interface.h b/libethereum/Interface.h index 018ccb934..f0ae1090a 100644 --- a/libethereum/Interface.h +++ b/libethereum/Interface.h @@ -59,6 +59,10 @@ using fnClientWatchHandlerMulti_t = skutils::multifunction< void( unsigned iw ) /** * @brief Main API hub for interfacing with Ethereum. */ + + +enum TransactionBroadcast { BroadcastToAll, DontBroadcast }; + class Interface { public: /// Constructor. @@ -79,7 +83,7 @@ class Interface { u256 const& _gasPrice = DefaultGasPrice, u256 const& _nonce = Invalid256 ); /// Imports the given transaction into the transaction queue - virtual h256 importTransaction( Transaction const& _t ) = 0; + virtual h256 importTransaction( Transaction const& _t, TransactionBroadcast _txOrigin ) = 0; /// Blocks until all pending transactions have been processed. virtual void flushTransactions() = 0; diff --git a/libethereum/SkaleHost.cpp b/libethereum/SkaleHost.cpp index b2d05bd99..6d630ac8c 100644 --- a/libethereum/SkaleHost.cpp +++ b/libethereum/SkaleHost.cpp @@ -55,7 +55,6 @@ using namespace std; #include #include -#include #include using namespace dev; @@ -267,10 +266,6 @@ SkaleHost::SkaleHost( dev::eth::Client& _client, const ConsensusFactory* _consFa }; m_debugTracer.call_on_tracepoint( [this]( const std::string& name ) { - skutils::task::performance::action action( - "trace/" + name, std::to_string( m_debugTracer.get_tracepoint_count( name ) ) ); - - // HACK reduce TRACEPOINT log output static uint64_t last_block_when_log = -1; if ( name == "fetch_transactions" || name == "drop_bad_transactions" ) { uint64_t current_block = this->m_client.number(); @@ -323,11 +318,28 @@ SkaleHost::~SkaleHost() {} void SkaleHost::logState() { LOG( m_traceLogger ) << cc::debug( " sent_to_consensus = " ) << total_sent << cc::debug( " got_from_consensus = " ) << total_arrived - << cc::debug( " m_transaction_cache = " ) << m_m_transaction_cache.size() << cc::debug( " m_tq = " ) << m_tq.status().current << cc::debug( " m_bcast_counter = " ) << m_bcast_counter; } +constexpr uint64_t MAX_BROADCAST_QUEUE_SIZE = 2048; + +void SkaleHost::pushToBroadcastQueue( const Transaction& _t ) { + { + std::lock_guard< std::mutex > lock( m_broadcastQueueMutex ); + this->m_broadcastQueue.push_back( _t ); + // normally broadcast queue will never be large since + // it is an intermediate queue on the way to zeromq + // and zeromq writes do not block + // we still keep its size limited + while ( m_broadcastQueue.size() > MAX_BROADCAST_QUEUE_SIZE ) { + // behavior on overflow similar to ZeroMQ - erase the latest + m_broadcastQueue.erase( m_broadcastQueue.begin() ); + } + } + m_broadcastQueueCondition.notify_all(); // Notify the condition variable +} + h256 SkaleHost::receiveTransaction( std::string _rlp ) { // drop incoming transactions if skaled has an outdated state if ( m_client.bc().info().timestamp() + REJECT_OLD_TRANSACTION_THROUGH_BROADCAST_INTERVAL_SEC < @@ -340,25 +352,14 @@ h256 SkaleHost::receiveTransaction( std::string _rlp ) { EIP1559TransactionsPatch::isEnabledInWorkingBlock() ); h256 sha = transaction.sha3(); - // - static std::atomic_size_t g_nReceiveTransactionsTaskNumber = 0; - size_t nReceiveTransactionsTaskNumber = g_nReceiveTransactionsTaskNumber++; - std::string strPerformanceQueueName = "bc/receive_transaction"; - std::string strPerformanceActionName = - skutils::tools::format( "receive task %zu", nReceiveTransactionsTaskNumber ); - skutils::task::performance::action a( strPerformanceQueueName, strPerformanceActionName ); // m_debugTracer.tracepoint( "receive_transaction" ); - { - std::lock_guard< std::mutex > localGuard( m_receivedMutex ); - m_received.insert( sha ); - LOG( m_debugLogger ) << "m_received = " << m_received.size() << std::endl; - } + #if ( defined _DEBUG ) h256 sha2 = #endif - m_client.importTransaction( transaction ); + m_client.importTransaction( transaction, TransactionBroadcast::DontBroadcast ); #if ( defined _DEBUG ) assert( sha == sha2 ); #endif @@ -366,6 +367,7 @@ h256 SkaleHost::receiveTransaction( std::string _rlp ) { m_debugTracer.tracepoint( "receive_transaction_success" ); LOG( m_debugLogger ) << "Successfully received through broadcast " << sha; + return sha; } @@ -415,23 +417,10 @@ ConsensusExtFace::transactions_vector SkaleHost::pendingTransactions( MICROPROFILE_SCOPEI( "SkaleHost", "pendingTransactions", MP_LAWNGREEN ); - _stateRoot = dev::h256::Arith( this->m_client.latestBlock().info().stateRoot() ); + _stateRoot = dev::h256::Arith( m_client.getReadOnlyLatestBlockCopy().info().stateRoot() ); h256Hash to_delete; - // - static std::atomic_size_t g_nFetchTransactionsTaskNumber = 0; - size_t nFetchTransactionsTaskNumber = g_nFetchTransactionsTaskNumber++; - std::string strPerformanceQueueName_fetch_transactions = "bc/fetch_transactions"; - std::string strPerformanceActionName_fetch_transactions = - skutils::tools::format( "fetch task %zu", nFetchTransactionsTaskNumber ); - skutils::task::performance::json jsn = skutils::task::performance::json::object(); - jsn["limit"] = toJS( _limit ); - jsn["stateRoot"] = toJS( _stateRoot ); - skutils::task::performance::action a_fetch_transactions( - strPerformanceQueueName_fetch_transactions, strPerformanceActionName_fetch_transactions, - jsn ); - // m_debugTracer.tracepoint( "fetch_transactions" ); int counter = 0; @@ -439,36 +428,27 @@ ConsensusExtFace::transactions_vector SkaleHost::pendingTransactions( Transactions txns = m_tq.topTransactionsSync( _limit, [this, &to_delete, &counter, &latestInfo]( const Transaction& tx ) -> bool { - if ( m_tq.getCategory( tx.sha3() ) != 1 ) // take broadcasted - return false; - // XXX TODO Invent good way to do this if ( counter++ == 0 ) m_pending_createMutex.lock(); - if ( tx.verifiedOn < m_lastBlockWithBornTransactions ) - try { - bool isMtmEnabled = m_client.chainParams().sChain.multiTransactionMode; - Executive::verifyTransaction( tx, latestInfo.timestamp(), latestInfo, - m_client.state().createStateReadOnlyCopy(), m_client.chainParams(), 0, - getGasPrice(), isMtmEnabled ); - } catch ( const exception& ex ) { - if ( to_delete.count( tx.sha3() ) == 0 ) - clog( VerbosityInfo, "skale-host" ) - << "Dropped now-invalid transaction in pending queue " << tx.sha3() - << ":" << ex.what(); - to_delete.insert( tx.sha3() ); - return false; - } + try { + bool isMtmEnabled = m_client.chainParams().sChain.multiTransactionMode; + Executive::verifyTransaction( tx, latestInfo.timestamp(), latestInfo, + m_client.state().createReadOnlySnapBasedCopy(), m_client.chainParams(), 0, + getGasPrice(), isMtmEnabled ); + } catch ( const exception& ex ) { + if ( to_delete.count( tx.sha3() ) == 0 ) + clog( VerbosityInfo, "skale-host" ) + << "Dropped now-invalid transaction in pending queue " << tx.sha3() << ":" + << ex.what(); + to_delete.insert( tx.sha3() ); + return false; + } return true; } ); - - // - a_fetch_transactions.finish(); - // - if ( counter++ == 0 ) m_pending_createMutex.lock(); @@ -487,28 +467,6 @@ ConsensusExtFace::transactions_vector SkaleHost::pendingTransactions( m_debugTracer.tracepoint( "drop_bad_transactions" ); - { - std::lock_guard< std::mutex > localGuard( m_receivedMutex ); - // - static std::atomic_size_t g_nDropBadTransactionsTaskNumber = 0; - size_t nDropBadTransactionsTaskNumber = g_nDropBadTransactionsTaskNumber++; - std::string strPerformanceQueueName_drop_bad_transactions = "bc/fetch_transactions"; - std::string strPerformanceActionName_drop_bad_transactions = - skutils::tools::format( "fetch task %zu", nDropBadTransactionsTaskNumber ); - - skutils::task::performance::action a_drop_bad_transactions( - strPerformanceQueueName_drop_bad_transactions, - strPerformanceActionName_drop_bad_transactions, jsn ); - // - for ( auto sha : to_delete ) { - m_debugTracer.tracepoint( "drop_bad" ); - m_tq.drop( sha ); - if ( m_received.count( sha ) != 0 ) - m_received.erase( sha ); - LOG( m_debugLogger ) << "m_received = " << m_received.size() << std::endl; - } - } - if ( this->emptyBlockIntervalMsForRestore.has_value() ) need_restore_emptyBlockInterval = true; @@ -521,13 +479,6 @@ ConsensusExtFace::transactions_vector SkaleHost::pendingTransactions( h256 sha = txn.sha3(); - if ( m_m_transaction_cache.find( sha.asArray() ) != m_m_transaction_cache.cend() ) - m_debugTracer.tracepoint( "sent_txn_again" ); - else { - m_debugTracer.tracepoint( "sent_txn_new" ); - m_m_transaction_cache[sha.asArray()] = txn; - } - out_vector.push_back( txn.toBytes() ); ++total_sent; @@ -563,21 +514,8 @@ ConsensusExtFace::transactions_vector SkaleHost::pendingTransactions( void SkaleHost::createBlock( const ConsensusExtFace::transactions_vector& _approvedTransactions, uint64_t _timeStamp, uint64_t _blockID, u256 _gasPrice, u256 _stateRoot, uint64_t _winningNodeIndex ) try { - // boost::chrono::high_resolution_clock::time_point skaledTimeStart; skaledTimeStart = boost::chrono::high_resolution_clock::now(); - static std::atomic_size_t g_nCreateBlockTaskNumber = 0; - size_t nCreateBlockTaskNumber = g_nCreateBlockTaskNumber++; - std::string strPerformanceQueueName_create_block = "bc/create_block"; - std::string strPerformanceActionName_create_block = - skutils::tools::format( "b-create %zu", nCreateBlockTaskNumber ); - skutils::task::performance::json jsn_create_block = skutils::task::performance::json::object(); - jsn_create_block["blockID"] = toJS( _blockID ); - jsn_create_block["timeStamp"] = toJS( _timeStamp ); - jsn_create_block["gasPrice"] = toJS( _gasPrice ); - jsn_create_block["stateRoot"] = toJS( _stateRoot ); - skutils::task::performance::action a_create_block( strPerformanceQueueName_create_block, - strPerformanceActionName_create_block, jsn_create_block ); std::lock_guard< std::recursive_mutex > lock( m_pending_createMutex ); @@ -625,10 +563,6 @@ void SkaleHost::createBlock( const ConsensusExtFace::transactions_vector& _appro std::vector< Transaction > out_txns; // resultant Transaction vector - std::atomic_bool haveConsensusBorn = false; // means we need to re-verify old txns - - // HACK this is for not allowing new transactions in tq between deletion and block creation! - // TODO decouple SkaleHost and Client!!! size_t n_succeeded; BlockHeader latestInfo = static_cast< const Interface& >( m_client ).blockInfo( LatestBlock ); @@ -636,76 +570,37 @@ void SkaleHost::createBlock( const ConsensusExtFace::transactions_vector& _appro DEV_GUARDED( m_client.m_blockImportMutex ) { m_debugTracer.tracepoint( "drop_good_transactions" ); - skutils::task::performance::json jarrProcessedTxns = - skutils::task::performance::json::array(); for ( auto it = _approvedTransactions.begin(); it != _approvedTransactions.end(); ++it ) { const bytes& data = *it; h256 sha = sha3( data ); LOG( m_traceLogger ) << "Arrived txn: " << sha; - jarrProcessedTxns.push_back( toJS( sha ) ); -#ifdef DEBUG_TX_BALANCE - if ( sent.count( sha ) != m_transaction_cache.count( sha.asArray() ) ) { - LOG( m_errorLogger ) << "createBlock assert"; - // sleep(200); - assert( sent.count( sha ) == m_transaction_cache.count( sha.asArray() ) ); - } - assert( arrived.count( sha ) == 0 ); - arrived.insert( sha ); -#endif - // if already known - // TODO clear occasionally this cache?! - if ( m_m_transaction_cache.find( sha.asArray() ) != m_m_transaction_cache.cend() ) { - Transaction t = m_m_transaction_cache.at( sha.asArray() ); - t.checkOutExternalGas( - m_client.chainParams(), latestInfo.timestamp(), m_client.number() ); - out_txns.push_back( t ); - LOG( m_debugLogger ) << "Dropping good txn " << sha << std::endl; - m_debugTracer.tracepoint( "drop_good" ); - m_tq.dropGood( t ); - MICROPROFILE_SCOPEI( "SkaleHost", "erase from caches", MP_GAINSBORO ); - m_m_transaction_cache.erase( sha.asArray() ); - std::lock_guard< std::mutex > localGuard( m_receivedMutex ); - m_received.erase( sha ); - LOG( m_debugLogger ) << "m_received = " << m_received.size() << std::endl; - // for test std::thread( [t, this]() { m_client.importTransaction( t ); } - // ).detach(); - } else { - Transaction t( data, CheckTransaction::Everything, true, - EIP1559TransactionsPatch::isEnabledInWorkingBlock() ); - t.checkOutExternalGas( - m_client.chainParams(), latestInfo.timestamp(), m_client.number() ); - out_txns.push_back( t ); - LOG( m_debugLogger ) << "Will import consensus-born txn"; - m_debugTracer.tracepoint( "import_consensus_born" ); - haveConsensusBorn = true; - } - if ( m_tq.knownTransactions().count( sha ) != 0 ) { + Transaction t( data, CheckTransaction::Everything, true, + EIP1559TransactionsPatch::isEnabledInWorkingBlock() ); + t.checkOutExternalGas( + m_client.chainParams(), latestInfo.timestamp(), m_client.number() ); + out_txns.push_back( t ); + m_debugTracer.tracepoint( "drop_good" ); + m_tq.dropGood( t ); + + if ( SkaleDebugInterface::g_isEnabled && m_tq.isTransactionKnown( sha ) != 0 ) { + // this trace is expensive since it will aquire a read lock on transaction queue LOG( m_traceLogger ) << "Consensus returned future transaction that we didn't yet send"; m_debugTracer.tracepoint( "import_future" ); } - - } // for - // TODO Monitor somehow m_transaction_cache and delete long-lasting elements? + } total_arrived += out_txns.size(); - assert( _blockID == m_client.number() + 1 ); - - // - a_create_block.finish(); - // - static std::atomic_size_t g_nImportBlockTaskNumber = 0; - size_t nImportBlockTaskNumber = g_nImportBlockTaskNumber++; - std::string strPerformanceQueueName_import_block = "bc/import_block"; - std::string strPerformanceActionName_import_block = - skutils::tools::format( "b-import %zu", nImportBlockTaskNumber ); - skutils::task::performance::action a_import_block( - strPerformanceQueueName_import_block, strPerformanceActionName_import_block ); - // + if ( _blockID != m_client.number() + 1 ) { + LOG( m_errorLogger ) << "Mismatch in block number:SKALED_NUMBER:" << m_client.number() + << ":CONSENSUS_NUMBER:" << _blockID; + assert( false ); + } + m_debugTracer.tracepoint( "import_block" ); n_succeeded = m_client.importTransactionsAsBlock( out_txns, _gasPrice, _timeStamp ); @@ -736,9 +631,6 @@ void SkaleHost::createBlock( const ConsensusExtFace::transactions_vector& _appro LOG( m_debugLogger ) << "Successfully imported " << n_succeeded << " of " << out_txns.size() << " transactions"; - if ( haveConsensusBorn ) - this->m_lastBlockWithBornTransactions = _blockID; - logState(); LOG( m_infoLogger ) << "TQBYTES:CTQ:" << m_tq.status().currentBytes @@ -755,6 +647,8 @@ void SkaleHost::createBlock( const ConsensusExtFace::transactions_vector& _appro LOG( m_infoLogger ) << "Rotation is completed. Instance is exiting"; } } + + } catch ( const std::exception& ex ) { LOG( m_errorLogger ) << "CRITICAL " << ex.what() << " (in createBlock)"; LOG( m_errorLogger ) << "\n" << skutils::signal::generate_stack_trace() << "\n"; @@ -872,58 +766,48 @@ void SkaleHost::stopWorking() { void SkaleHost::broadcastFunc() { dev::setThreadName( "broadcastFunc" ); - size_t nBroadcastTaskNumber = 0; while ( !m_exitNeeded ) { try { - m_broadcaster->broadcast( "" ); // HACK this is just to initialize sockets - - dev::eth::Transactions txns = m_tq.topTransactionsSync( 1, 0, 1 ); - if ( txns.empty() ) // means timeout - continue; + m_broadcaster->initSocket(); this->logState(); MICROPROFILE_SCOPEI( "SkaleHost", "broadcastFunc", MP_BISQUE ); - assert( txns.size() == 1 ); - Transaction& txn = txns[0]; - h256 sha = txn.sha3(); - // TODO XXX such blocks are bad :( - size_t received; + // Wait for the queue to have transactions + + static auto MAX_WAIT_TIME = std::chrono::milliseconds( 100 ); + + std::list< Transaction > queueCopy; + { - std::lock_guard< std::mutex > lock( m_receivedMutex ); - received = m_received.count( sha ); + std::unique_lock< std::mutex > lock( m_broadcastQueueMutex ); + + m_broadcastQueueCondition.wait_for( lock, MAX_WAIT_TIME ); + + + if ( m_broadcastPauseFlag ) { + continue; + } + + queueCopy = m_broadcastQueue; + m_broadcastQueue = std::list< Transaction >(); } - if ( received == 0 ) { + + for ( auto&& txn : queueCopy ) { try { - if ( !m_broadcastPauseFlag ) { - MICROPROFILE_SCOPEI( - "SkaleHost", "broadcastFunc.broadcast", MP_CHARTREUSE1 ); - std::string rlp = toJS( txn.toBytes() ); - std::string h = toJS( txn.sha3() ); - // - std::string strPerformanceQueueName = "bc/broadcast"; - std::string strPerformanceActionName = - skutils::tools::format( "broadcast %zu", nBroadcastTaskNumber++ ); - skutils::task::performance::json jsn = - skutils::task::performance::json::object(); - jsn["hash"] = h; - skutils::task::performance::action a( - strPerformanceQueueName, strPerformanceActionName, jsn ); - // - m_debugTracer.tracepoint( "broadcast" ); - m_broadcaster->broadcast( rlp ); - } + MICROPROFILE_SCOPEI( "SkaleHost", "broadcastFunc.broadcast", MP_CHARTREUSE1 ); + std::string rlp = toJS( txn.toBytes() ); + std::string h = toJS( txn.sha3() ); + m_debugTracer.tracepoint( "broadcast" ); + m_broadcaster->broadcast( rlp ); } catch ( const std::exception& ex ) { cwarn << "BROADCAST EXCEPTION CAUGHT"; cwarn << ex.what(); } // catch - - } // if - else - m_debugTracer.tracepoint( "broadcast_already_have" ); + } ++m_bcast_counter; diff --git a/libethereum/SkaleHost.h b/libethereum/SkaleHost.h index 598bf47ad..f99e70294 100644 --- a/libethereum/SkaleHost.h +++ b/libethereum/SkaleHost.h @@ -122,6 +122,8 @@ class SkaleHost { dev::h256 receiveTransaction( std::string ); + void pushToBroadcastQueue( const dev::eth::Transaction& _transaction ); + dev::u256 getGasPrice( unsigned _blockNumber = dev::eth::LatestBlock ) const; dev::u256 getBlockRandom() const; dev::eth::SyncStatus syncStatus() const; @@ -172,8 +174,11 @@ class SkaleHost { std::thread m_broadcastThread; void broadcastFunc(); - dev::h256Hash m_received; - std::mutex m_receivedMutex; + + + list< dev::eth::Transaction > m_broadcastQueue; + std::mutex m_broadcastQueueMutex; + std::condition_variable m_broadcastQueueCondition; // TODO implement more nicely and more fine-grained! std::recursive_mutex m_pending_createMutex; // for race conditions between @@ -183,8 +188,6 @@ class SkaleHost { void penalizePeer(){}; // fake function for now - int64_t m_lastBlockWithBornTransactions = -1; // to track txns need re-verification - std::thread m_consensusThread; std::atomic_bool m_exitNeeded = false; @@ -193,9 +196,6 @@ class SkaleHost { std::atomic_bool m_consensusPaused = false; std::atomic_bool m_broadcastPauseFlag = false; // not pause - just ignore - std::map< std::array< uint8_t, 32 >, dev::eth::Transaction > - m_m_transaction_cache; // used to find Transaction objects when - // creating block dev::eth::Client& m_client; dev::eth::TransactionQueue& m_tq; // transactions ready to go to consensus diff --git a/libethereum/TransactionQueue.cpp b/libethereum/TransactionQueue.cpp index 16e726e76..8ac11585d 100644 --- a/libethereum/TransactionQueue.cpp +++ b/libethereum/TransactionQueue.cpp @@ -173,41 +173,33 @@ Transactions TransactionQueue::topTransactions_WITH_LOCK( _limit, [&]( const Transaction& t ) -> bool { return _avoid.count( t.sha3() ) == 0; } ); } -Transactions TransactionQueue::topTransactions( - unsigned _limit, int _maxCategory, int _setCategory ) { +Transactions TransactionQueue::topTransactions( unsigned _limit ) { ReadGuard l( m_lock ); - return topTransactions_WITH_LOCK( _limit, _maxCategory, _setCategory ); + return topTransactions_WITH_LOCK( _limit ); } -Transactions TransactionQueue::topTransactions_WITH_LOCK( - unsigned _limit, int _maxCategory, int _setCategory ) { +Transactions TransactionQueue::topTransactions_WITH_LOCK( unsigned _limit ) { MICROPROFILE_SCOPEI( "TransactionQueue", "topTransactions_WITH_LOCK_cat", MP_PAPAYAWHIP ); Transactions top_transactions; std::vector< PriorityQueue::node_type > found; VerifiedTransaction dummy = VerifiedTransaction( Transaction() ); - dummy.category = _maxCategory; - PriorityQueue::iterator my_begin = m_current.lower_bound( dummy ); - for ( PriorityQueue::iterator transaction_ptr = my_begin; + for ( PriorityQueue::iterator transaction_ptr = m_current.begin(); top_transactions.size() < _limit && transaction_ptr != m_current.end(); ++transaction_ptr ) { top_transactions.push_back( transaction_ptr->transaction ); - if ( _setCategory >= 0 ) { - found.push_back( m_current.extract( transaction_ptr ) ); - } + found.push_back( m_current.extract( transaction_ptr ) ); } // set all at once - if ( _setCategory >= 0 ) { - for ( PriorityQueue::node_type& queue_node : found ) { - queue_node.value().category = _setCategory; - m_current.insert( std::move( queue_node ) ); - } + for ( PriorityQueue::node_type& queue_node : found ) { + m_current.insert( std::move( queue_node ) ); } + // HACK For IS-348 auto saved_txns = top_transactions; std::stable_sort( top_transactions.begin(), top_transactions.end(), @@ -230,6 +222,17 @@ Transactions TransactionQueue::topTransactions_WITH_LOCK( return top_transactions; } +// note - this function is currently only used when tracing is enabled +bool TransactionQueue::isTransactionKnown( h256& _hash ) const { + h256Hash rv; + { // block + ReadGuard l( m_lock ); + return m_known.count( _hash ) > 0; + } +} + + +// note - this function is heavy and is only used in tests const h256Hash TransactionQueue::knownTransactions() const { h256Hash rv; { // block @@ -313,7 +316,7 @@ u256 TransactionQueue::maxCurrentNonce_WITH_LOCK( Address const& _a ) const { void TransactionQueue::insertCurrent_WITH_LOCK( std::pair< h256, Transaction > const& _p ) { if ( m_currentByHash.count( _p.first ) ) { - cwarn << "Transaction hash" << _p.first << "already in current?!"; + cwarn << "Transaction hash" << _p.first << "already in current"; return; } @@ -406,6 +409,7 @@ void TransactionQueue::setFuture_WITH_LOCK( h256 const& _txHash ) { } } +// Note - this function is only used for tests void TransactionQueue::setFuture( h256 const& _txHash ) { WriteGuard l( m_lock ); return setFuture_WITH_LOCK( _txHash ); diff --git a/libethereum/TransactionQueue.h b/libethereum/TransactionQueue.h index d089c4004..827935f37 100644 --- a/libethereum/TransactionQueue.h +++ b/libethereum/TransactionQueue.h @@ -97,8 +97,6 @@ class TransactionQueue { /// @param _txHash Transaction hash void drop( h256 const& _txHash ); - int getCategory( const h256& hash ) { return m_currentByHash[hash]->category; } - /// Get number of pending transactions for account. /// @returns Pending transaction count. unsigned waiting( Address const& _a ) const; @@ -111,7 +109,7 @@ class TransactionQueue { Transactions topTransactions( unsigned _limit, h256Hash const& _avoid = h256Hash() ) const; // same with categories - Transactions topTransactions( unsigned _limit, int _maxCategory = 0, int _setCategory = -1 ); + Transactions topTransactions( unsigned _limit ); // generalization of previous template < class Pred > @@ -127,8 +125,12 @@ class TransactionQueue { /// Get a hash set of transactions in the queue /// @returns A hash set of all transactions in the queue + // this is really heavy operation and should be used with caution const h256Hash knownTransactions() const; + // Check if transaction is in the queue + bool isTransactionKnown( h256& _hash ) const; + /// Get max nonce for an account /// @returns Max transaction nonce for account in the queue u256 maxNonce( Address const& _a ) const; @@ -211,7 +213,6 @@ class TransactionQueue { VerifiedTransaction& operator=( VerifiedTransaction const& ) = delete; Transaction transaction; ///< Transaction data - int category = 0; // for sorting Counter< VerifiedTransaction > c; @@ -253,17 +254,15 @@ class TransactionQueue { /// Compare transaction by nonce height and gas price. bool operator()( VerifiedTransaction const& _first, VerifiedTransaction const& _second ) const { - int cat1 = _first.category; - int cat2 = _second.category; - // HACK special case for "dummy" transaction - it is always to the left of others with // the same category + if ( !_first.transaction && _second.transaction ) - return cat1 >= cat2; + return false; else if ( _first.transaction && !_second.transaction ) - return cat1 > cat2; + return true; else if ( !_first.transaction && !_second.transaction ) - return cat1 < cat2; + return false; u256 const& height1 = _first.transaction.nonce() - @@ -273,11 +272,9 @@ class TransactionQueue { _second.transaction.nonce() - queue.m_currentByAddressAndNonce[_second.transaction.sender()].begin()->first; - return cat1 > cat2 || - ( cat1 == cat2 && - ( height1 < height2 || - ( height1 == height2 && - _first.transaction.gasPrice() > _second.transaction.gasPrice() ) ) ); + return ( height1 < height2 || + ( height1 == height2 && + _first.transaction.gasPrice() > _second.transaction.gasPrice() ) ); } }; @@ -295,8 +292,7 @@ class TransactionQueue { unsigned _limit, h256Hash const& _avoid = h256Hash() ) const; template < class Pred > Transactions topTransactions_WITH_LOCK( unsigned _limit, Pred _pred ) const; - Transactions topTransactions_WITH_LOCK( - unsigned _limit, int _maxCategory = 0, int _setCategory = -1 ); + Transactions topTransactions_WITH_LOCK( unsigned _limit ); void insertCurrent_WITH_LOCK( std::pair< h256, Transaction > const& _p ); void makeCurrent_WITH_LOCK( Transaction const& _t ); diff --git a/libskale/OverlayDB.cpp b/libskale/OverlayDB.cpp index 113cb9987..c24902885 100644 --- a/libskale/OverlayDB.cpp +++ b/libskale/OverlayDB.cpp @@ -26,6 +26,8 @@ #include "libhistoric/HistoricState.h" #include +#include + #include using std::string; @@ -36,7 +38,7 @@ using std::vector; #include #include -//#include "SHA3.h" +// #include "SHA3.h" using dev::bytes; using dev::bytesConstRef; @@ -95,49 +97,74 @@ dev::h256 OverlayDB::getLastExecutedTransactionHash() const { return shaLastTx; } -dev::bytes OverlayDB::getPartialTransactionReceipts() const { - if ( lastExecutedTransactionReceipts.has_value() ) - return lastExecutedTransactionReceipts.value(); +std::vector< dev::bytes > OverlayDB::getPartialTransactionReceipts( + dev::eth::BlockNumber _blockNumber ) const { + std::vector< dev::bytes > partialTransactionReceipts; + + string prefix( "safeLastTransactionReceipts." + + uint64ToFixedLengthHex( ( uint64_t ) _blockNumber ) + "." ); - dev::bytes partialTransactionReceipts; if ( m_db_face ) { - const std::string l = - m_db_face->lookup( skale::slicing::toSlice( "safeLastTransactionReceipts" ) ); - if ( !l.empty() ) - partialTransactionReceipts.insert( - partialTransactionReceipts.end(), l.begin(), l.end() ); + m_db_face->forEachWithPrefix( prefix, [&partialTransactionReceipts]( Slice, Slice value ) { + const std::string l( value.begin(), value.end() ); + if ( !l.empty() ) { + dev::bytes b( l.begin(), l.end() ); + partialTransactionReceipts.push_back( b ); + } + return true; + } ); } - - lastExecutedTransactionReceipts = partialTransactionReceipts; return partialTransactionReceipts; } + +void OverlayDB::removeAllPartialTransactionReceipts() { + // first we get all keys + + string prefix( "safeLastTransactionReceipts." ); + vector< string > keys; + if ( m_db_face ) { + m_db_face->forEachWithPrefix( prefix, [&keys]( Slice key, Slice ) { + const std::string keyStr( key.begin(), key.end() ); + keys.push_back( keyStr ); + return true; + } ); + + for ( auto&& key : keys ) { + // now remove all of them + m_db_face->kill( key ); + } + } + + m_db_face->commit( "Clean partial keys" ); +} + + void OverlayDB::setLastExecutedTransactionHash( const dev::h256& _newHash ) { this->lastExecutedTransactionHash = _newHash; } -void OverlayDB::setPartialTransactionReceipts( const dev::bytes& _newReceipts ) { - this->lastExecutedTransactionReceipts = _newReceipts; -} -void OverlayDB::addReceiptToPartials( const dev::eth::TransactionReceipt& _receipt ) { - auto rawTransactionReceipts = getPartialTransactionReceipts(); +// transform uin564_t to hex format of fixed length prepending zeros +// if needed. This is needed to put keys into LevelDB in lexicographic order +std::string OverlayDB::uint64ToFixedLengthHex( uint64_t value ) { + // Create a stringstream to hold the hex representation + std::stringstream res; - // TODO Temporary solution - do not (de)serialize forth and back! + // Set formatting options: hex, fill with zeros, and a width of 16 characters + // (uint64_t can have a maximum of 16 hex characters). + res << std::hex << std::setw( 16 ) << std::setfill( '0' ) << value; - dev::eth::BlockReceipts blockReceipts; - if ( !rawTransactionReceipts.empty() ) { - dev::RLP rlp( rawTransactionReceipts ); - blockReceipts = dev::eth::BlockReceipts( rlp ); - } // if + // Convert the stream to a string + return res.str(); +} - blockReceipts.receipts.push_back( _receipt ); +void OverlayDB::setPartialTransactionReceipt( const dev::bytes& _newReceipt, + dev::eth::BlockNumber _blockNumber, uint64_t _transactionIndex ) { + string key = "safeLastTransactionReceipts." + uint64ToFixedLengthHex( _blockNumber ) + "." + + uint64ToFixedLengthHex( _transactionIndex ); - setPartialTransactionReceipts( blockReceipts.rlp() ); -} -void OverlayDB::clearPartialTransactionReceipts() { - dev::eth::BlockReceipts blockReceipts; - setPartialTransactionReceipts( blockReceipts.rlp() ); + m_db_face->insert( skale::slicing::toSlice( key ), skale::slicing::toSlice( _newReceipt ) ); } @@ -168,7 +195,7 @@ void OverlayDB::commitStorageValues() { } -void OverlayDB::commit( const std::string& _debugCommitId ) { +void OverlayDB::commit() { if ( m_db_face ) { for ( unsigned commitTry = 0; commitTry < 10; ++commitTry ) { // cnote << "Committing nodes to disk DB:"; @@ -202,13 +229,10 @@ void OverlayDB::commit( const std::string& _debugCommitId ) { m_db_face->insert( skale::slicing::toSlice( "safeLastExecutedTransactionHash" ), skale::slicing::toSlice( getLastExecutedTransactionHash() ) ); - - m_db_face->insert( skale::slicing::toSlice( "safeLastTransactionReceipts" ), - skale::slicing::toSlice( getPartialTransactionReceipts() ) ); } try { - m_db_face->commit( "OverlayDB_commit_" + _debugCommitId ); + m_db_face->commit( "OverlayDB_commit" ); break; } catch ( boost::exception const& ex ) { if ( commitTry == 9 ) { diff --git a/libskale/OverlayDB.h b/libskale/OverlayDB.h index 9b88138de..2c504a7d1 100644 --- a/libskale/OverlayDB.h +++ b/libskale/OverlayDB.h @@ -63,16 +63,19 @@ class OverlayDB { OverlayDB& operator=( OverlayDB&& ) = default; dev::h256 getLastExecutedTransactionHash() const; - dev::bytes getPartialTransactionReceipts() const; + std::vector< dev::bytes > getPartialTransactionReceipts( + dev::eth::BlockNumber _blockNumber ) const; + + void removeAllPartialTransactionReceipts(); + void setLastExecutedTransactionHash( const dev::h256& ); - void setPartialTransactionReceipts( const dev::bytes& ); - void addReceiptToPartials( const dev::eth::TransactionReceipt& ); - void clearPartialTransactionReceipts(); + void setPartialTransactionReceipt( const dev::bytes& _newReceipt, + dev::eth::BlockNumber _blockNumber, uint64_t _transactionIndex ); // commit key-value pairs in storage void commitStorageValues(); - void commit( const std::string& _debugCommitId ); + void commit(); void rollback(); void clearDB(); bool connected() const; @@ -105,6 +108,8 @@ class OverlayDB { std::unordered_map< dev::u256, dev::u256 > storage( dev::h160 const& address ) const; + static std::string uint64ToFixedLengthHex( uint64_t value ); + private: std::unordered_map< dev::h160, dev::bytes > m_cache; std::unordered_map< dev::h160, std::unordered_map< _byte_, dev::bytes > > m_auxiliaryCache; @@ -116,9 +121,8 @@ class OverlayDB { dev::bytes getAuxiliaryKey( dev::h160 const& _address, _byte_ space ) const; dev::bytes getStorageKey( dev::h160 const& _address, dev::h256 const& _storageAddress ) const; - mutable std::optional< dev::h256 > lastExecutedTransactionHash; - mutable std::optional< dev::bytes > lastExecutedTransactionReceipts; + public: std::shared_ptr< batched_io::db_face > db() { return m_db_face; } diff --git a/libskale/SkaleDebug.cpp b/libskale/SkaleDebug.cpp index ed72fb46d..9863f825e 100644 --- a/libskale/SkaleDebug.cpp +++ b/libskale/SkaleDebug.cpp @@ -5,18 +5,39 @@ #include #include + +std::atomic< bool > SkaleDebugInterface::g_isEnabled = true; + +#define CHECK_ENABLED \ + if ( !SkaleDebugInterface::g_isEnabled ) { \ + return; \ + }; + +#define CHECK_ENABLED_STR \ + if ( !SkaleDebugInterface::g_isEnabled ) { \ + return ""; \ + }; + +#define CHECK_ENABLED_INT \ + if ( !SkaleDebugInterface::g_isEnabled ) { \ + return 0; \ + }; + SkaleDebugInterface::SkaleDebugInterface() {} int SkaleDebugInterface::add_handler( handler h ) { + CHECK_ENABLED_INT; handlers.push_back( h ); return handlers.size() - 1; } void SkaleDebugInterface::remove_handler( int pos ) { + CHECK_ENABLED handlers.erase( handlers.begin() + pos ); } std::string SkaleDebugInterface::call( const std::string& arg ) { + CHECK_ENABLED_STR; for ( auto handler : handlers ) { std::string res = handler( arg ); if ( !res.empty() ) @@ -27,11 +48,13 @@ std::string SkaleDebugInterface::call( const std::string& arg ) { void SkaleDebugTracer::call_on_tracepoint( const std::function< void( const std::string& ) >& callee ) { + CHECK_ENABLED; global_callbacks.push_back( callee ); } void SkaleDebugTracer::call_on_tracepoint( const std::string& name, const std::function< void( const std::string& ) >& callee ) { + CHECK_ENABLED; tracepoint_struct& tp_obj = find_by_name( name ); std::lock_guard< std::mutex > thread_lock( tp_obj.thread_mutex ); @@ -40,6 +63,7 @@ void SkaleDebugTracer::call_on_tracepoint( } void SkaleDebugTracer::break_on_tracepoint( const std::string& name, int count ) { + CHECK_ENABLED; tracepoint_struct& tp_obj = find_by_name( name ); std::lock_guard< std::mutex > thread_lock( tp_obj.thread_mutex ); @@ -51,6 +75,7 @@ void SkaleDebugTracer::break_on_tracepoint( const std::string& name, int count ) } void SkaleDebugTracer::wait_for_tracepoint( const std::string& name ) { + CHECK_ENABLED; tracepoint_struct& tp_obj = find_by_name( name ); std::unique_lock< std::mutex > lock2( tp_obj.caller_mutex ); @@ -58,6 +83,7 @@ void SkaleDebugTracer::wait_for_tracepoint( const std::string& name ) { } void SkaleDebugTracer::continue_on_tracepoint( const std::string& name ) { + CHECK_ENABLED; tracepoint_struct& tp_obj = find_by_name( name ); std::lock_guard< std::mutex > thread_lock( tp_obj.thread_mutex ); @@ -66,6 +92,7 @@ void SkaleDebugTracer::continue_on_tracepoint( const std::string& name ) { } void SkaleDebugTracer::tracepoint( const std::string& name ) { + CHECK_ENABLED; tracepoint_struct& tp_obj = find_by_name( name ); std::unique_lock< std::mutex > lock2( tp_obj.thread_mutex ); @@ -92,6 +119,7 @@ void SkaleDebugTracer::tracepoint( const std::string& name ) { } std::string DebugTracer_handler( const std::string& arg, SkaleDebugTracer& tracer ) { + CHECK_ENABLED_STR; using namespace std; if ( arg.find( "trace " ) == 0 ) { diff --git a/libskale/SkaleDebug.h b/libskale/SkaleDebug.h index 3d5dd6d8c..06e6d969e 100644 --- a/libskale/SkaleDebug.h +++ b/libskale/SkaleDebug.h @@ -21,6 +21,8 @@ class SkaleDebugInterface { std::string call( const std::string& arg ); + static std::atomic< bool > g_isEnabled; + private: std::vector< handler > handlers; @@ -72,4 +74,5 @@ class SkaleDebugTracer { std::string DebugTracer_handler( const std::string& arg, SkaleDebugTracer& tracer ); + #endif // SKALEDEBUG_H diff --git a/libskale/State.cpp b/libskale/State.cpp index 3fdfb4e19..1ffc4ac48 100644 --- a/libskale/State.cpp +++ b/libskale/State.cpp @@ -38,6 +38,7 @@ #include "libweb3jsonrpc/Eth.h" #include "libweb3jsonrpc/JsonHelper.h" +#include "test/tools/libtestutils/FixedClient.h" #include #include @@ -76,8 +77,6 @@ State::State( dev::u256 const& _accountStartNonce, boost::filesystem::path const dev::h256 const& _genesis, BaseState _bs, dev::u256 _initialFunds, dev::s256 _contractStorageLimit ) : x_db_ptr( make_shared< boost::shared_mutex >() ), - m_storedVersion( make_shared< size_t >( 0 ) ), - m_currentVersion( *m_storedVersion ), m_accountStartNonce( _accountStartNonce ), m_initial_funds( _initialFunds ), contractStorageLimit_( _contractStorageLimit ) @@ -101,7 +100,7 @@ State::State( dev::u256 const& _accountStartNonce, boost::filesystem::path const m_db_ptr = make_shared< OverlayDB >( openDB( _dbPath, _genesis, _bs == BaseState::PreExisting ? dev::WithExisting::Trust : dev::WithExisting::Kill ) ); - auto state = createStateReadOnlyCopy(); + auto state = createStateCopyAndClearCaches(); totalStorageUsed_ = state.storageUsedTotal(); #ifdef HISTORIC_STATE m_historicState.setRootFromDB(); @@ -125,8 +124,6 @@ State::State( u256 const& _accountStartNonce, OverlayDB const& _db, skale::BaseState _bs, u256 _initialFunds, s256 _contractStorageLimit ) : x_db_ptr( make_shared< boost::shared_mutex >() ), m_db_ptr( make_shared< OverlayDB >( _db ) ), - m_storedVersion( make_shared< size_t >( 0 ) ), - m_currentVersion( *m_storedVersion ), m_accountStartNonce( _accountStartNonce ), m_initial_funds( _initialFunds ), contractStorageLimit_( _contractStorageLimit ) @@ -135,7 +132,7 @@ State::State( u256 const& _accountStartNonce, OverlayDB const& _db, m_historicState( _accountStartNonce, _historicDb, _historicBlockToStateRootDb, _bs ) #endif { - auto state = createStateReadOnlyCopy(); + auto state = createStateCopyAndClearCaches(); totalStorageUsed_ = state.storageUsedTotal(); #ifdef HISTORIC_STATE m_historicState.setRootFromDB(); @@ -258,38 +255,24 @@ State::State( const State& _s ) #endif { x_db_ptr = _s.x_db_ptr; - if ( _s.m_db_read_lock ) { - m_db_read_lock.emplace( *x_db_ptr ); - } - if ( _s.m_db_write_lock ) { - std::logic_error( "Can't copy locked for writing state object" ); - } m_db_ptr = _s.m_db_ptr; m_orig_db = _s.m_orig_db; - m_storedVersion = _s.m_storedVersion; - m_currentVersion = _s.m_currentVersion; m_cache = _s.m_cache; m_unchangedCacheEntries = _s.m_unchangedCacheEntries; m_nonExistingAccountsCache = _s.m_nonExistingAccountsCache; m_accountStartNonce = _s.m_accountStartNonce; m_changeLog = _s.m_changeLog; m_initial_funds = _s.m_initial_funds; + m_snap = _s.m_snap; + m_isReadOnlySnapBasedState = _s.m_isReadOnlySnapBasedState; contractStorageLimit_ = _s.contractStorageLimit_; totalStorageUsed_ = _s.storageUsedTotal(); } State& State::operator=( const State& _s ) { x_db_ptr = _s.x_db_ptr; - if ( _s.m_db_read_lock ) { - m_db_read_lock.emplace( *x_db_ptr ); - } - if ( _s.m_db_write_lock ) { - std::logic_error( "Can't copy locked for writing state object" ); - } m_db_ptr = _s.m_db_ptr; m_orig_db = _s.m_orig_db; - m_storedVersion = _s.m_storedVersion; - m_currentVersion = _s.m_currentVersion; m_cache = _s.m_cache; m_unchangedCacheEntries = _s.m_unchangedCacheEntries; m_nonExistingAccountsCache = _s.m_nonExistingAccountsCache; @@ -302,6 +285,8 @@ State& State::operator=( const State& _s ) { m_historicState = _s.m_historicState; #endif m_fs_ptr = _s.m_fs_ptr; + m_snap = _s.m_snap; + m_isReadOnlySnapBasedState = _s.m_isReadOnlySnapBasedState; return *this; } @@ -313,25 +298,39 @@ dev::h256 State::safeLastExecutedTransactionHash() { return shaLastTx; } -dev::eth::TransactionReceipts State::safePartialTransactionReceipts() { +dev::eth::TransactionReceipts State::safePartialTransactionReceipts( + eth::BlockNumber _blockNumber ) { dev::eth::TransactionReceipts partialTransactionReceipts; if ( m_db_ptr ) { - dev::bytes rawTransactionReceipts = m_db_ptr->getPartialTransactionReceipts(); - if ( !rawTransactionReceipts.empty() ) { - dev::RLP rlp( rawTransactionReceipts ); - dev::eth::BlockReceipts blockReceipts( rlp ); - partialTransactionReceipts.insert( partialTransactionReceipts.end(), - blockReceipts.receipts.begin(), blockReceipts.receipts.end() ); + auto rawTransactionReceipts = m_db_ptr->getPartialTransactionReceipts( _blockNumber ); + for ( auto&& rawTransactionReceipt : rawTransactionReceipts ) { + dev::RLP rlp( rawTransactionReceipt ); + dev::eth::TransactionReceipt receipt( rlp.data() ); + partialTransactionReceipts.push_back( receipt ); } } + + return partialTransactionReceipts; } -void State::clearPartialTransactionReceipts() { - dev::eth::BlockReceipts blockReceipts; - m_db_ptr->setPartialTransactionReceipts( blockReceipts.rlp() ); + +void State::safeRemoveAllPartialTransactionReceipts() { + if ( m_db_ptr ) { + m_db_ptr->removeAllPartialTransactionReceipts(); + } +} + + +void State::safeSetAndCommitPartialTransactionReceipt( + const dev::bytes& _receipt, dev::eth::BlockNumber _blockNumber, uint64_t _transactionIndex ) { + if ( m_db_ptr ) { + m_db_ptr->setPartialTransactionReceipt( _receipt, _blockNumber, _transactionIndex ); + m_db_ptr->commit(); + } } + void State::populateFrom( eth::AccountMap const& _map ) { for ( auto const& addressAccountPair : _map ) { const Address& address = addressAccountPair.first; @@ -361,12 +360,7 @@ void State::populateFrom( eth::AccountMap const& _map ) { } std::unordered_map< Address, u256 > State::addresses() const { - boost::shared_lock< boost::shared_mutex > lock( *x_db_ptr ); - if ( !checkVersion() ) { - cerror << "Current state version is " << m_currentVersion << " but stored version is " - << *m_storedVersion; - BOOST_THROW_EXCEPTION( AttemptToReadFromStateInThePast() ); - } + SharedDBGuard lock( *this ); std::unordered_map< Address, u256 > addresses; for ( auto const& h160StringPair : m_db_ptr->accounts() ) { @@ -442,13 +436,7 @@ eth::Account* State::account( Address const& _address ) { // Populate basic info. bytes stateBack; { - boost::shared_lock< boost::shared_mutex > lock( *x_db_ptr ); - - if ( !checkVersion() ) { - cerror << "Current state version is " << m_currentVersion << " but stored version is " - << *m_storedVersion; - BOOST_THROW_EXCEPTION( AttemptToReadFromStateInThePast() ); - } + SharedDBGuard lock( *this ); stateBack = asBytes( m_db_ptr->lookup( _address ) ); } @@ -498,13 +486,9 @@ void State::commit( dev::eth::CommitBehaviour _commitBehaviour ) { removeEmptyAccounts(); { - if ( !m_db_write_lock ) { - BOOST_THROW_EXCEPTION( AttemptToWriteToNotLockedStateObject() ); - } - boost::upgrade_to_unique_lock< boost::shared_mutex > lock( *m_db_write_lock ); - if ( !checkVersion() ) { - BOOST_THROW_EXCEPTION( AttemptToWriteToStateInThePast() ); - } + LDB_CHECK( !m_isReadOnlySnapBasedState ); + + boost::unique_lock< boost::shared_mutex > lock( *x_db_ptr ); for ( auto const& addressAccountPair : m_cache ) { const Address& address = addressAccountPair.first; @@ -543,8 +527,7 @@ void State::commit( dev::eth::CommitBehaviour _commitBehaviour ) { } } m_db_ptr->updateStorageUsage( totalStorageUsed_ ); - m_db_ptr->commit( std::to_string( ++*m_storedVersion ) ); - m_currentVersion = *m_storedVersion; + m_db_ptr->commit(); } @@ -553,8 +536,15 @@ void State::commit( dev::eth::CommitBehaviour _commitBehaviour ) { #endif m_changeLog.clear(); - m_cache.clear(); - m_unchangedCacheEntries.clear(); + // normally we clear caches after commit, since the data goes to the db + // during commit + // for testeth GeneralState tests, though, there is no db connected to the + // State , so we do not clear caches + // since they play the role of the db + if ( m_db_ptr->connected() ) { + m_cache.clear(); + m_unchangedCacheEntries.clear(); + } } @@ -665,19 +655,13 @@ void State::kill( Address _addr ) { std::map< h256, std::pair< u256, u256 > > State::storage( const Address& _contract ) const { - boost::shared_lock< boost::shared_mutex > lock( *x_db_ptr ); + SharedDBGuard lock( *this ); return storage_WITHOUT_LOCK( _contract ); } std::map< h256, std::pair< u256, u256 > > State::storage_WITHOUT_LOCK( const Address& _contract ) const { - if ( !checkVersion() ) { - cerror << "Current state version is " << m_currentVersion << " but stored version is " - << *m_storedVersion; - BOOST_THROW_EXCEPTION( AttemptToReadFromStateInThePast() ); - } - std::map< h256, std::pair< u256, u256 > > storage; for ( auto const& addressValuePair : m_db_ptr->storage( _contract ) ) { u256 const& address = addressValuePair.first; @@ -717,10 +701,7 @@ u256 State::storage( Address const& _id, u256 const& _key ) const { return memoryIterator->second; // Not in the storage cache - go to the DB. - boost::shared_lock< boost::shared_mutex > lock( *x_db_ptr ); - if ( !checkVersion() ) { - BOOST_THROW_EXCEPTION( AttemptToReadFromStateInThePast() ); - } + SharedDBGuard lock( *this ); u256 value = m_db_ptr->lookup( _id, _key ); acc->setStorageCache( _key, value ); return value; @@ -775,10 +756,7 @@ u256 State::originalStorageValue( Address const& _contract, u256 const& _key ) c return memoryPtr->second; } - boost::shared_lock< boost::shared_mutex > lock( *x_db_ptr ); - if ( !checkVersion() ) { - BOOST_THROW_EXCEPTION( AttemptToReadFromStateInThePast() ); - } + SharedDBGuard lock( *this ); u256 value = m_db_ptr->lookup( _contract, _key ); acc->setStorageCache( _key, value ); return value; @@ -833,10 +811,7 @@ bytes const& State::code( Address const& _addr ) const { if ( a->code().empty() ) { // Load the code from the backend. eth::Account* mutableAccount = const_cast< eth::Account* >( a ); - boost::shared_lock< boost::shared_mutex > lock( *x_db_ptr ); - if ( !checkVersion() ) { - BOOST_THROW_EXCEPTION( AttemptToReadFromStateInThePast() ); - } + SharedDBGuard lock( *this ); mutableAccount->noteCode( m_db_ptr->lookupAuxiliary( _addr, Auxiliary::CODE ) ); eth::CodeSizeCache::instance().store( a->codeHash(), a->code().size() ); } @@ -935,60 +910,42 @@ void State::rollback( size_t _savepoint ) { } } -void State::updateToLatestVersion() { +void State::clearCaches() { + clearAllCaches(); +} + +void State::clearAllCaches() { m_changeLog.clear(); m_cache.clear(); m_unchangedCacheEntries.clear(); m_nonExistingAccountsCache.clear(); - - { - boost::shared_lock< boost::shared_mutex > lock( *x_db_ptr ); - m_currentVersion = *m_storedVersion; - } } -State State::createStateReadOnlyCopy() const { - State stateCopy = State( *this ); - stateCopy.m_db_read_lock.emplace( *stateCopy.x_db_ptr ); - stateCopy.updateToLatestVersion(); - return stateCopy; -} -State State::createStateModifyCopy() const { +State State::createStateCopyAndClearCaches() const { + LDB_CHECK( !m_isReadOnlySnapBasedState ); State stateCopy = State( *this ); - stateCopy.m_db_write_lock.emplace( *stateCopy.x_db_ptr ); - stateCopy.updateToLatestVersion(); + stateCopy.clearCaches(); return stateCopy; } -State State::createStateModifyCopyAndPassLock() { - if ( m_db_write_lock ) { - boost::upgrade_lock< boost::shared_mutex > lock; - lock.swap( *m_db_write_lock ); - m_db_write_lock = boost::none; - State stateCopy = State( *this ); - stateCopy.m_db_write_lock = boost::upgrade_lock< boost::shared_mutex >(); - stateCopy.m_db_write_lock->swap( lock ); - return stateCopy; - } else { - return createStateModifyCopy(); - } -} -void State::releaseWriteLock() { - m_db_write_lock = boost::none; -} - -State State::createNewCopyWithLocks() { - State copy; - if ( m_db_write_lock ) - copy = createStateModifyCopyAndPassLock(); - else - copy = State( *this ); - if ( m_db_read_lock ) - copy.m_db_read_lock.emplace( *copy.x_db_ptr ); - copy.updateToLatestVersion(); - return copy; +State State::createReadOnlySnapBasedCopy() const { + LDB_CHECK( !m_isReadOnlySnapBasedState ); + State stateCopy = *this; + stateCopy.m_isReadOnlySnapBasedState = true; + stateCopy.clearAllCaches(); + // get the snap for the latest block + LDB_CHECK( m_orig_db ); + stateCopy.m_orig_db = m_orig_db; + stateCopy.m_snap = m_orig_db->getLastBlockSnap(); + LDB_CHECK( stateCopy.m_snap ) + // the state does not use any locking since it is based on db snapshot + stateCopy.x_db_ptr = nullptr; + stateCopy.m_db_ptr = + make_shared< OverlayDB >( make_unique< batched_io::read_only_snap_based_batched_db >( + stateCopy.m_orig_db, stateCopy.m_snap ) ); + return stateCopy; } bool State::connected() const { @@ -1001,7 +958,7 @@ bool State::connected() const { bool State::empty() const { if ( m_cache.empty() ) { if ( m_db_ptr ) { - boost::shared_lock< boost::shared_mutex > lock( *x_db_ptr ); + SharedDBGuard lock( *this ); if ( m_db_ptr->empty() ) { return true; } @@ -1022,7 +979,7 @@ uint64_t State::getGasUsedForSkippedTransaction( uint64_t _chainId, const dev::h std::pair< ExecutionResult, TransactionReceipt > State::execute( EnvInfo const& _envInfo, eth::ChainOperationParams const& _chainParams, Transaction const& _t, Permanence _p, - OnOpFunc const& _onOp ) { + OnOpFunc const& _onOp, int64_t _transactionIndex ) { // Create and initialize the executive. This will throw fairly cheaply and quickly if the // transaction is bad in any way. // HACK 0 here is for gasPrice @@ -1071,13 +1028,10 @@ std::pair< ExecutionResult, TransactionReceipt > State::execute( EnvInfo const& totalStorageUsed_ += currentStorageUsed_; updateStorageUsage(); } - // TODO: review logic|^ - h256 shaLastTx = _t.sha3(); // _t.hasSignature() ? _t.sha3() : _t.sha3( - // dev::eth::WithoutSignature ); + h256 shaLastTx = _t.sha3(); + this->m_db_ptr->setLastExecutedTransactionHash( shaLastTx ); - // std::cout << "--- saving \"safeLastExecutedTransactionHash\" = " << - // shaLastTx.hex() << "\n"; TransactionReceipt receipt = TransactionReceipt( statusCode, startGasUsed + e.gasUsed(), e.logs() ); @@ -1092,13 +1046,39 @@ std::pair< ExecutionResult, TransactionReceipt > State::execute( EnvInfo const& TransactionReceipt( EmptyTrie, startGasUsed + e.gasUsed(), e.logs() ); } receipt.setRevertReason( strRevertReason ); - m_db_ptr->addReceiptToPartials( receipt ); + + // if we are committing we need to know transaction index in block since + // to save the receipt + LDB_CHECK( _transactionIndex >= 0 ); + RLPStream stream; + receipt.streamRLP( stream ); + m_db_ptr->setPartialTransactionReceipt( + stream.out(), ( BlockNumber ) _envInfo.number(), ( uint64_t ) _transactionIndex ); + m_fs_ptr->commit(); removeEmptyAccounts = _envInfo.number() >= _chainParams.EIP158ForkBlock; commit( removeEmptyAccounts ? dev::eth::CommitBehaviour::RemoveEmptyAccounts : dev::eth::CommitBehaviour::KeepEmptyAccounts ); + + // do a simple sanity check each millions transactions that we correctly + // saved partial transaction receipt + // at 1000 tps and 1 sec block time this means that we are doing this roughly each 1000 + // blocks so we are not slowing down the system by doing a check + static uint64_t sanityCheckCounter = 0; + sanityCheckCounter++; + if ( sanityCheckCounter % 1000000 == 0 ) { + auto receipts = safePartialTransactionReceipts( _envInfo.number() ); + if ( receipts.back().rlp() != receipt.rlp() ) { + cerr << "Found incorrect deserialization of partial receipts at sanity check:" + << sanityCheckCounter << endl + << receipts.back() << endl + << receipt; + } + } + + break; } case Permanence::Uncommitted: @@ -1172,9 +1152,6 @@ dev::s256 State::storageUsed( const dev::Address& _addr ) const { } } -bool State::checkVersion() const { - return *m_storedVersion == m_currentVersion; -} std::ostream& skale::operator<<( std::ostream& _out, State const& _s ) { _out << cc::debug( "--- Cache ---" ) << std::endl; @@ -1241,3 +1218,8 @@ std::ostream& skale::operator<<( std::ostream& _out, State const& _s ) { } return _out; } + +void State::createReadOnlyStateDBSnap( uint64_t _blockNumber ) { + LDB_CHECK( m_orig_db ); + m_orig_db->createBlockSnap( _blockNumber ); +} \ No newline at end of file diff --git a/libskale/State.h b/libskale/State.h index 4e8d7b476..31e09f577 100644 --- a/libskale/State.h +++ b/libskale/State.h @@ -43,6 +43,9 @@ #include "OverlayFS.h" #include +#include +#include + namespace std { template <> @@ -154,11 +157,34 @@ using ChangeLog = std::vector< Change >; * * Any atomic change to any account is registered and appended in the changelog. * In case some changes must be reverted, the changes are popped from the + * In case some changes must be reverted, the changes are popped from the * changelog and undone. For possible atomic changes list @see Change::Kind. * The changelog is managed by savepoint(), rollback() and commit() methods. */ class State { public: + class SharedDBGuard { + const State& m_state; + + + public: + explicit SharedDBGuard( const State& _state ) : m_state( _state ) { + if ( m_state.m_isReadOnlySnapBasedState ) + return; + if ( !m_state.x_db_ptr ) { + throw std::logic_error( "Null pointer in SharedDBGuard" ); + }; + m_state.x_db_ptr->lock_shared(); + } + + ~SharedDBGuard() { + if ( m_state.m_isReadOnlySnapBasedState ) + return; + m_state.x_db_ptr->unlock_shared(); + } + }; + + using AddressMap = std::map< dev::h256, dev::Address >; /// Default constructor; creates with a blank database prepopulated with the genesis block. @@ -181,6 +207,27 @@ class State { dev::u256 _initialFunds = 0, dev::s256 _contractStorageLimit = 32 ); /// which uses it. If you have no preexisting database then set BaseState to something other + std::string createRandomString() { + // random string + std::vector< uint8_t > randomBytes( 16 ); + if ( RAND_bytes( randomBytes.data(), static_cast< int >( randomBytes.size() ) ) != 1 ) { + throw std::runtime_error( "Failed to generate random number" ); + } + std::ostringstream oss; + for ( auto byte : randomBytes ) { + oss << std::hex << std::setw( 2 ) << std::setfill( '0' ) << static_cast< int >( byte ); + } + return oss.str(); + } + void initStateWithRandomTestDb() { + std::string path = "/tmp/skaled_test_state_db_" + createRandomString(); + dev::u256 ZERO( 0 ); + openDB( path, ZERO, dev::WithExisting::Kill ); + LDB_CHECK( m_orig_db ); + m_orig_db->createBlockSnap( 0 ); + } + // this conswtructor is used for tests + // we need to create temp stattedb in the /tmp dir State() : State( dev::Invalid256, skale::OverlayDB(), #ifdef HISTORIC_STATE @@ -200,8 +247,13 @@ class State { State& operator=( State&& ) = default; dev::h256 safeLastExecutedTransactionHash(); - dev::eth::TransactionReceipts safePartialTransactionReceipts(); - void clearPartialTransactionReceipts(); + dev::eth::TransactionReceipts safePartialTransactionReceipts( + dev::eth::BlockNumber _blockNumber ); + void safeRemoveAllPartialTransactionReceipts(); + + + void safeSetAndCommitPartialTransactionReceipt( const dev::bytes& _receipt, + dev::eth::BlockNumber _blockNumber, uint64_t _transactionIndex ); /// Populate the state from the given AccountMap. Just uses dev::eth::commit(). void populateFrom( dev::eth::AccountMap const& _map ); @@ -340,7 +392,7 @@ class State { std::pair< dev::eth::ExecutionResult, dev::eth::TransactionReceipt > execute( dev::eth::EnvInfo const& _envInfo, dev::eth::ChainOperationParams const& _chainParams, dev::eth::Transaction const& _t, Permanence _p = Permanence::Committed, - dev::eth::OnOpFunc const& _onOp = dev::eth::OnOpFunc() ); + dev::eth::OnOpFunc const& _onOp = dev::eth::OnOpFunc(), int64_t _transactionIndex = -1 ); /// Get the account start nonce. May be required. dev::u256 const& accountStartNonce() const { return m_accountStartNonce; } @@ -356,22 +408,11 @@ class State { ChangeLog const& changeLog() const { return m_changeLog; } - /// Create State copy to get access to data. - /// Different copies can be safely used in different threads - /// but single object is not thread safe. - /// No one can change state while returned object exists. - State createStateReadOnlyCopy() const; - /// Create State copy to modify data. - State createStateModifyCopy() const; - - /// Create State copy to modify data and pass writing lock to it - State createStateModifyCopyAndPassLock(); - + State createStateCopyAndClearCaches() const; - void releaseWriteLock(); - - State createNewCopyWithLocks(); + /// Create State copy based on LevedlDB snaps that does not use any locking + State createReadOnlySnapBasedCopy() const; /** * @brief connected returns true if state is connected to database @@ -381,7 +422,7 @@ class State { /// Check if state is empty bool empty() const; - const dev::db::DBImpl* getOriginalDb() const { return m_orig_db.get(); } + dev::db::DBImpl* getOriginalDb() const { return m_orig_db.get(); } void resetStorageChanges() { storageUsage.clear(); @@ -391,7 +432,7 @@ class State { dev::s256 storageUsed( const dev::Address& _addr ) const; dev::s256 storageUsedTotal() const { - boost::shared_lock< boost::shared_mutex > lock( *x_db_ptr ); + SharedDBGuard( *this ); return m_db_ptr->storageUsed(); } @@ -400,8 +441,10 @@ class State { }; // only for tests + void createReadOnlyStateDBSnap( uint64_t _blockNumber ); + private: - void updateToLatestVersion(); + void clearCaches(); explicit State( dev::u256 const& _accountStartNonce, skale::OverlayDB const& _db, #ifdef HISTORIC_STATE @@ -455,8 +498,6 @@ class State { static uint64_t getGasUsedForSkippedTransaction( uint64_t _chainId, const dev::h256& _hash ); public: - bool checkVersion() const; - #ifdef HISTORIC_STATE void populateHistoricStateFromSkaleState(); void populateHistoricStateBatchFromSkaleState( @@ -467,16 +508,10 @@ class State { private: enum Auxiliary { CODE = 1 }; - boost::optional< boost::shared_lock< boost::shared_mutex > > m_db_read_lock; - boost::optional< boost::upgrade_lock< boost::shared_mutex > > m_db_write_lock; - std::shared_ptr< boost::shared_mutex > x_db_ptr; std::shared_ptr< OverlayDB > m_db_ptr; ///< Our overlay for the state. std::shared_ptr< OverlayFS > m_fs_ptr; ///< Our overlay for the file system operations. - // TODO Implement DB-registry, remove it! std::shared_ptr< dev::db::DBImpl > m_orig_db; - std::shared_ptr< size_t > m_storedVersion; - size_t m_currentVersion; mutable std::unordered_map< dev::Address, dev::eth::Account > m_cache; ///< Our address cache. ///< This stores the ///< states of each @@ -499,6 +534,9 @@ class State { std::map< dev::Address, dev::s256 > storageUsage; dev::s256 totalStorageUsed_ = 0; dev::s256 currentStorageUsed_ = 0; + // if the state is based on a LevelDB snap, the instance of the snap goes here + std::shared_ptr< dev::db::LevelDBSnap > m_snap = nullptr; + bool m_isReadOnlySnapBasedState = false; #ifdef HISTORIC_STATE dev::eth::HistoricState m_historicState; @@ -522,6 +560,8 @@ class State { return pDB; } std::shared_ptr< OverlayFS > fs() { return m_fs_ptr; } + + void clearAllCaches(); }; std::ostream& operator<<( std::ostream& _out, State const& _s ); diff --git a/libskale/broadcaster.cpp b/libskale/broadcaster.cpp index ee625536d..ef7650b33 100644 --- a/libskale/broadcaster.cpp +++ b/libskale/broadcaster.cpp @@ -90,7 +90,8 @@ void* ZmqBroadcaster::server_socket() const { if ( !m_zmq_server_socket ) { m_zmq_server_socket = zmq_socket( m_zmq_context, ZMQ_PUB ); - int val = 16; + // it was 16 before, this caused messages lost during performance tests + int val = 1024; zmq_setsockopt( m_zmq_server_socket, ZMQ_SNDHWM, &val, sizeof( val ) ); const dev::eth::ChainParams& ch = m_client.chainParams(); @@ -232,12 +233,13 @@ void ZmqBroadcaster::stopService() { m_thread.join(); } -void ZmqBroadcaster::broadcast( const std::string& _rlp ) { - if ( _rlp.empty() ) { - server_socket(); - return; - } +void ZmqBroadcaster::initSocket() { + server_socket(); +} + + +void ZmqBroadcaster::broadcast( const std::string& _rlp ) { int res = zmq_send( server_socket(), const_cast< char* >( _rlp.c_str() ), _rlp.size(), 0 ); if ( res <= 0 ) { clog( dev::VerbosityWarning, "zmq-broadcaster" ) diff --git a/libskale/broadcaster.h b/libskale/broadcaster.h index 0e563d8cc..bb4381de3 100644 --- a/libskale/broadcaster.h +++ b/libskale/broadcaster.h @@ -52,6 +52,7 @@ class Broadcaster { Broadcaster() {} virtual ~Broadcaster(); + virtual void initSocket(){}; virtual void broadcast( const std::string& _rlp ) = 0; virtual void startService() = 0; @@ -81,6 +82,7 @@ class ZmqBroadcaster : public Broadcaster { virtual ~ZmqBroadcaster(); virtual void broadcast( const std::string& _rlp ); + virtual void initSocket(); virtual void startService(); virtual void stopService(); diff --git a/libskale/httpserveroverride.cpp b/libskale/httpserveroverride.cpp index be29eecef..b550618ad 100644 --- a/libskale/httpserveroverride.cpp +++ b/libskale/httpserveroverride.cpp @@ -57,6 +57,9 @@ #undef MSIZE #endif +#include "libweb3jsonrpc/SkaleStats.h" + + #include #include #include @@ -68,6 +71,8 @@ #include #include +#include + #include @@ -95,6 +100,9 @@ namespace fs = boost::filesystem; +using nlohmann::json; +using skutils::unddos::e_high_load_detection_result_t; + namespace skale { namespace server { namespace helper { @@ -121,52 +129,53 @@ dev::Verbosity dv_from_ws_msg_type( skutils::ws::e_ws_log_message_type_t eWSLMT return dv; } -dev::eth::LogFilter toLogFilter( const nlohmann::json& jo ) { + +dev::eth::LogFilter toLogFilter( const json& jo ) { dev::eth::LogFilter filter; if ( ( !jo.is_object() ) || jo.size() == 0 ) return filter; // check only !empty. it should throw exceptions if input params are incorrect if ( jo.count( "fromBlock" ) > 0 ) - filter.withEarliest( dev::eth::jsToBlockNumber( jo["fromBlock"].get< std::string >() ) ); + filter.withEarliest( dev::eth::jsToBlockNumber( jo["fromBlock"].get< string >() ) ); if ( jo.count( "toBlock" ) > 0 ) - filter.withLatest( dev::eth::jsToBlockNumber( jo["toBlock"].get< std::string >() ) ); + filter.withLatest( dev::eth::jsToBlockNumber( jo["toBlock"].get< string >() ) ); if ( jo.count( "address" ) > 0 ) { if ( jo["address"].is_array() ) for ( auto i : jo["address"] ) - filter.address( dev::jsToAddress( i.get< std::string >() ) ); + filter.address( dev::jsToAddress( i.get< string >() ) ); else - filter.address( dev::jsToAddress( jo["address"].get< std::string >() ) ); + filter.address( dev::jsToAddress( jo["address"].get< string >() ) ); } if ( jo.count( "topics" ) > 0 ) for ( unsigned i = 0; i < jo["topics"].size(); i++ ) { if ( jo["topics"][i].is_array() ) { for ( auto t : jo["topics"][i] ) if ( !t.is_null() ) - filter.topic( i, dev::jsToFixed< 32 >( t.get< std::string >() ) ); + filter.topic( i, dev::jsToFixed< 32 >( t.get< string >() ) ); } else if ( !jo["topics"][i].is_null() ) // if it is anything else then string, it // should and will fail - filter.topic( i, dev::jsToFixed< 32 >( jo["topics"][i].get< std::string >() ) ); + filter.topic( i, dev::jsToFixed< 32 >( jo["topics"][i].get< string >() ) ); } return filter; } -nlohmann::json nljsBlockNumber( dev::eth::BlockNumber uBlockNumber ) { +json nljsBlockNumber( dev::eth::BlockNumber uBlockNumber ) { if ( uBlockNumber == dev::eth::LatestBlock ) - return nlohmann::json( "latest" ); + return json( "latest" ); if ( uBlockNumber == 0 ) - return nlohmann::json( "earliest" ); + return json( "earliest" ); if ( uBlockNumber == dev::eth::PendingBlock ) - return nlohmann::json( "pending" ); + return json( "pending" ); return dev::toJS( uBlockNumber ); } -nlohmann::json toJson( std::unordered_map< dev::h256, dev::eth::LocalisedLogEntries > const& eb, +json toJson( std::unordered_map< dev::h256, dev::eth::LocalisedLogEntries > const& eb, std::vector< dev::h256 > const& order ) { - nlohmann::json res = nlohmann::json::array(); + json res = json::array(); for ( auto const& i : order ) { auto entries = eb.at( i ); - nlohmann::json currentBlock = nlohmann::json::object(); + json currentBlock = json::object(); dev::eth::LocalisedLogEntry entry = entries[0]; if ( entry.mined ) { currentBlock["blockNumber"] = nljsBlockNumber( entry.blockNumber ); @@ -175,15 +184,15 @@ nlohmann::json toJson( std::unordered_map< dev::h256, dev::eth::LocalisedLogEntr } else currentBlock["type"] = "pending"; currentBlock["polarity"] = entry.polarity == dev::eth::BlockPolarity::Live ? true : false; - currentBlock["logs"] = nlohmann::json::array(); + currentBlock["logs"] = json::array(); for ( dev::eth::LocalisedLogEntry const& e : entries ) { - nlohmann::json log = nlohmann::json::object(); + json log = json::object(); log["logIndex"] = e.logIndex; log["transactionIndex"] = e.transactionIndex; log["transactionHash"] = toJS( e.transactionHash ); log["address"] = dev::toJS( e.address ); log["data"] = dev::toJS( e.data ); - log["topics"] = nlohmann::json::array(); + log["topics"] = json::array(); for ( auto const& t : e.topics ) log["topics"].push_back( dev::toJS( t ) ); currentBlock["logs"].push_back( log ); @@ -193,7 +202,7 @@ nlohmann::json toJson( std::unordered_map< dev::h256, dev::eth::LocalisedLogEntr return res; } -nlohmann::json toJsonByBlock( dev::eth::LocalisedLogEntries const& le ) { +json toJsonByBlock( dev::eth::LocalisedLogEntries const& le ) { std::vector< dev::h256 > order; std::unordered_map< dev::h256, dev::eth::LocalisedLogEntries > entriesByBlock; for ( dev::eth::LocalisedLogEntry const& e : le ) { @@ -208,60 +217,31 @@ nlohmann::json toJsonByBlock( dev::eth::LocalisedLogEntries const& le ) { return toJson( entriesByBlock, order ); } -bool checkParamsPresent( - const char* strMethodName, const nlohmann::json& joRequest, nlohmann::json& joResponse ) { +bool checkParamsPresent( const char* strMethodName, const json& joRequest, json& joResponse ) { if ( joRequest.count( "params" ) > 0 ) return true; - nlohmann::json joError = nlohmann::json::object(); + json joError = json::object(); joError["code"] = -32602; - joError["message"] = std::string( "error in \"" ) + strMethodName + - "\" rpc method, json entry \"params\" is missing"; + joError["message"] = + string( "error in \"" ) + strMethodName + "\" rpc method, json entry \"params\" is missing"; joResponse["error"] = joError; return false; } -bool checkParamsIsArray( - const char* strMethodName, const nlohmann::json& joRequest, nlohmann::json& joResponse ) { +bool checkParamsIsArray( const char* strMethodName, const json& joRequest, json& joResponse ) { if ( !checkParamsPresent( strMethodName, joRequest, joResponse ) ) return false; - const nlohmann::json& jarrParams = joRequest["params"]; + const json& jarrParams = joRequest["params"]; if ( jarrParams.is_array() ) return true; - nlohmann::json joError = nlohmann::json::object(); + json joError = json::object(); joError["code"] = -32602; - joError["message"] = std::string( "error in \"" ) + strMethodName + - "\" rpc method, json entry \"params\" must be array"; + joError["message"] = + string( "error in" ) + strMethodName + " rpc method, json entry \"params\" must be array"; joResponse["error"] = joError; return false; } -bool checkParamsIsObject( const char* strMethodName, const rapidjson::Document& joRequest, - rapidjson::Document& joResponse ) { - rapidjson::StringBuffer buffer; - rapidjson::Writer< rapidjson::StringBuffer > writer( buffer ); - joRequest.Accept( writer ); - std::string strRequest = buffer.GetString(); - nlohmann::json objRequest = nlohmann::json::parse( strRequest ); - - nlohmann::json objResponse; - if ( !checkParamsPresent( strMethodName, objRequest, objResponse ) ) { - std::string strResponse = objResponse.dump(); - joResponse.Parse( strResponse.data() ); - return false; - } - if ( joRequest["params"].IsObject() ) - return true; - rapidjson::Value joError; - joError.SetObject(); - joError.AddMember( "code", -32602, joResponse.GetAllocator() ); - joError.AddMember( "message", - rapidjson::StringRef( std::string( std::string( "error in \"" ) + strMethodName + - "\" rpc method, json entry \"params\" must be object" ) - .c_str() ), - joResponse.GetAllocator() ); - joError.AddMember( "error", joError, joResponse.GetAllocator() ); - return false; -} }; // namespace helper }; // namespace server @@ -270,240 +250,58 @@ bool checkParamsIsObject( const char* strMethodName, const rapidjson::Document& namespace stats { -typedef skutils::multithreading::recursive_mutex_type mutex_type_stats; -typedef std::lock_guard< mutex_type_stats > lock_type_stats; -static skutils::multithreading::recursive_mutex_type g_mtx_stats( "RMTX-NMA-PEER-ALL" ); - -struct map_method_call_stats_t - : public std::map< std::string, skutils::stats::named_event_stats* > { - typedef std::map< std::string, skutils::stats::named_event_stats* > my_base_t; - void clear() { - iterator itWalk = begin(), itEnd = end(); - for ( ; itWalk != itEnd; ++itWalk ) { - skutils::stats::named_event_stats* x = itWalk->second; - if ( x ) - delete x; - } - my_base_t::clear(); - } - map_method_call_stats_t() = default; - ~map_method_call_stats_t() { clear(); } - map_method_call_stats_t( const map_method_call_stats_t& ) = delete; - map_method_call_stats_t( map_method_call_stats_t&& ) = delete; - map_method_call_stats_t& operator=( const map_method_call_stats_t& ) = delete; - map_method_call_stats_t& operator=( map_method_call_stats_t&& ) = delete; -}; -map_method_call_stats_t g_map_method_call_stats; -map_method_call_stats_t g_map_method_answer_stats; -map_method_call_stats_t g_map_method_error_stats; -map_method_call_stats_t g_map_method_exception_stats; -map_method_call_stats_t g_map_method_traffic_stats_in; -map_method_call_stats_t g_map_method_traffic_stats_out; -static size_t g_nSizeDefaultOnQueueAdd = 10; - -static skutils::stats::named_event_stats& stat_subsystem_call_queue( const char* strSubSystem ) { - lock_type_stats lock( g_mtx_stats ); - map_method_call_stats_t::iterator itFind = g_map_method_call_stats.find( strSubSystem ), - itEnd = g_map_method_call_stats.end(); - if ( itFind != itEnd ) { - skutils::stats::named_event_stats* x = itFind->second; - if ( x ) - return ( *x ); - } - skutils::stats::named_event_stats* x = new skutils::stats::named_event_stats; - g_map_method_call_stats[strSubSystem] = x; - return ( *x ); -} -static skutils::stats::named_event_stats& stat_subsystem_answer_queue( const char* strSubSystem ) { - lock_type_stats lock( g_mtx_stats ); - map_method_call_stats_t::iterator itFind = g_map_method_answer_stats.find( strSubSystem ), - itEnd = g_map_method_answer_stats.end(); - if ( itFind != itEnd ) { - skutils::stats::named_event_stats* x = itFind->second; - if ( x ) - return ( *x ); - } - skutils::stats::named_event_stats* x = new skutils::stats::named_event_stats; - g_map_method_answer_stats[strSubSystem] = x; - return ( *x ); -} -static skutils::stats::named_event_stats& stat_subsystem_error_queue( const char* strSubSystem ) { - lock_type_stats lock( g_mtx_stats ); - map_method_call_stats_t::iterator itFind = g_map_method_error_stats.find( strSubSystem ), - itEnd = g_map_method_error_stats.end(); - if ( itFind != itEnd ) { - skutils::stats::named_event_stats* x = itFind->second; - if ( x ) - return ( *x ); - } - skutils::stats::named_event_stats* x = new skutils::stats::named_event_stats; - g_map_method_error_stats[strSubSystem] = x; - return ( *x ); -} -static skutils::stats::named_event_stats& stat_subsystem_exception_queue( - const char* strSubSystem ) { - lock_type_stats lock( g_mtx_stats ); - map_method_call_stats_t::iterator itFind = g_map_method_exception_stats.find( strSubSystem ), - itEnd = g_map_method_exception_stats.end(); - if ( itFind != itEnd ) { - skutils::stats::named_event_stats* x = itFind->second; - if ( x ) - return ( *x ); - } - skutils::stats::named_event_stats* x = new skutils::stats::named_event_stats; - g_map_method_exception_stats[strSubSystem] = x; - return ( *x ); -} - -static skutils::stats::named_event_stats& stat_subsystem_traffic_queue_in( - const char* strSubSystem ) { - lock_type_stats lock( g_mtx_stats ); - const auto itFind = g_map_method_traffic_stats_in.find( strSubSystem ); - if ( itFind != std::end( g_map_method_traffic_stats_in ) ) { - skutils::stats::named_event_stats* x = itFind->second; - if ( x ) - return ( *x ); - } - skutils::stats::named_event_stats* x = new skutils::stats::named_event_stats; - g_map_method_traffic_stats_in[strSubSystem] = x; - return ( *x ); -} -static skutils::stats::named_event_stats& stat_subsystem_traffic_queue_out( - const char* strSubSystem ) { - lock_type_stats lock( g_mtx_stats ); - const auto itFind = g_map_method_traffic_stats_out.find( strSubSystem ); - if ( itFind != std::end( g_map_method_traffic_stats_out ) ) { - skutils::stats::named_event_stats* x = itFind->second; - if ( x ) - return ( *x ); - } - skutils::stats::named_event_stats* x = new skutils::stats::named_event_stats; - g_map_method_traffic_stats_out[strSubSystem] = x; - return ( *x ); -} - - -void register_stats_message( - const char* strSubSystem, const char* strMethodName, const size_t nJsonSize ) { - lock_type_stats lock( g_mtx_stats ); - skutils::stats::named_event_stats& cq = stat_subsystem_call_queue( strSubSystem ); - cq.event_queue_add( strMethodName, g_nSizeDefaultOnQueueAdd ); - cq.event_add( strMethodName ); - skutils::stats::named_event_stats& tq = stat_subsystem_traffic_queue_in( strSubSystem ); - tq.event_queue_add( strMethodName, g_nSizeDefaultOnQueueAdd ); - tq.event_add( strMethodName, nJsonSize ); -} -void register_stats_answer( - const char* strSubSystem, const char* strMethodName, const size_t nJsonSize ) { - lock_type_stats lock( g_mtx_stats ); - skutils::stats::named_event_stats& aq = stat_subsystem_answer_queue( strSubSystem ); - aq.event_queue_add( strMethodName, g_nSizeDefaultOnQueueAdd ); - aq.event_add( strMethodName ); - - skutils::stats::named_event_stats& tq = stat_subsystem_traffic_queue_out( strSubSystem ); - tq.event_queue_add( strMethodName, g_nSizeDefaultOnQueueAdd ); - tq.event_add( strMethodName, nJsonSize ); -} -void register_stats_error( const char* strSubSystem, const char* strMethodName ) { - lock_type_stats lock( g_mtx_stats ); - skutils::stats::named_event_stats& eq = stat_subsystem_error_queue( strSubSystem ); - eq.event_queue_add( strMethodName, g_nSizeDefaultOnQueueAdd ); - eq.event_add( strMethodName ); -} -void register_stats_exception( const char* strSubSystem, const char* strMethodName ) { - lock_type_stats lock( g_mtx_stats ); - skutils::stats::named_event_stats& eq = stat_subsystem_exception_queue( strSubSystem ); - eq.event_queue_add( strMethodName, g_nSizeDefaultOnQueueAdd ); - eq.event_add( strMethodName ); -} - -void register_stats_message( const char* strSubSystem, const nlohmann::json& joMessage ) { - std::string strMethodName = skutils::tools::getFieldSafe< std::string >( joMessage, "method" ); - std::string txt = joMessage.dump(); - size_t txt_len = txt.length(); - register_stats_message( strSubSystem, strMethodName.c_str(), txt_len ); -} -void register_stats_answer( - const char* strSubSystem, const nlohmann::json& joMessage, const nlohmann::json& joAnswer ) { - std::string strMethodName = skutils::tools::getFieldSafe< std::string >( joMessage, "method" ); - std::string txt = joAnswer.dump(); - size_t txt_len = txt.length(); - register_stats_answer( strSubSystem, strMethodName.c_str(), txt_len ); -} -void register_stats_error( const char* strSubSystem, const nlohmann::json& joMessage ) { - std::string strMethodName = skutils::tools::getFieldSafe< std::string >( joMessage, "method" ); - register_stats_error( strSubSystem, strMethodName.c_str() ); -} -void register_stats_exception( const char* strSubSystem, const nlohmann::json& joMessage ) { - std::string strMethodName = skutils::tools::getFieldSafe< std::string >( joMessage, "method" ); - register_stats_exception( strSubSystem, strMethodName.c_str() ); -} - -static nlohmann::json generate_subsystem_stats( const char* strSubSystem ) { - lock_type_stats lock( g_mtx_stats ); +static nlohmann::json generate_subsystem_stats( string _subSystem ) { nlohmann::json jo = nlohmann::json::object(); - skutils::stats::named_event_stats& cq = stat_subsystem_call_queue( strSubSystem ); - skutils::stats::named_event_stats& aq = stat_subsystem_answer_queue( strSubSystem ); - skutils::stats::named_event_stats& erq = stat_subsystem_error_queue( strSubSystem ); - skutils::stats::named_event_stats& exq = stat_subsystem_exception_queue( strSubSystem ); - skutils::stats::named_event_stats& tq_in = stat_subsystem_traffic_queue_in( strSubSystem ); - skutils::stats::named_event_stats& tq_out = stat_subsystem_traffic_queue_out( strSubSystem ); - std::set< std::string > setNames = cq.all_queue_names(), setNames_aq = aq.all_queue_names(), - setNames_erq = erq.all_queue_names(), - setNames_exq = exq.all_queue_names(), - setNames_tq_in = tq_in.all_queue_names(), - setNames_tq_out = tq_out.all_queue_names(); - std::set< std::string >::const_iterator itNameWalk, itNameEnd; - for ( itNameWalk = setNames_aq.cbegin(), itNameEnd = setNames_aq.cend(); - itNameWalk != itNameEnd; ++itNameWalk ) - setNames.insert( *itNameWalk ); - for ( itNameWalk = setNames_erq.cbegin(), itNameEnd = setNames_erq.cend(); - itNameWalk != itNameEnd; ++itNameWalk ) - setNames.insert( *itNameWalk ); - for ( itNameWalk = setNames_exq.cbegin(), itNameEnd = setNames_exq.cend(); - itNameWalk != itNameEnd; ++itNameWalk ) - setNames.insert( *itNameWalk ); - for ( itNameWalk = setNames_tq_in.cbegin(), itNameEnd = setNames_tq_in.cend(); - itNameWalk != itNameEnd; ++itNameWalk ) - setNames.insert( *itNameWalk ); - for ( itNameWalk = setNames_tq_out.cbegin(), itNameEnd = setNames_tq_out.cend(); - itNameWalk != itNameEnd; ++itNameWalk ) - setNames.insert( *itNameWalk ); - for ( itNameWalk = setNames.cbegin(), itNameEnd = setNames.cend(); itNameWalk != itNameEnd; - ++itNameWalk ) { - const std::string& strMethodName = ( *itNameWalk ); - size_t nCalls = 0, nAnswers = 0, nErrors = 0, nExceptions = 0; - skutils::stats::bytes_count_t nBytesRecv = 0, nBytesSent = 0; - skutils::stats::time_point tpNow = skutils::stats::clock::now(); - double lfCallsPerSecond = cq.compute_eps_smooth( strMethodName, tpNow, nullptr, &nCalls ); - double lfAnswersPerSecond = - aq.compute_eps_smooth( strMethodName, tpNow, nullptr, &nAnswers ); - double lfErrorsPerSecond = - erq.compute_eps_smooth( strMethodName, tpNow, nullptr, &nErrors ); - double lfExceptionsPerSecond = - exq.compute_eps_smooth( strMethodName, tpNow, nullptr, &nExceptions ); - double lfBytesPerSecondRecv = tq_in.compute_eps_smooth( strMethodName, tpNow, &nBytesRecv ); - double lfBytesPerSecondSent = - tq_out.compute_eps_smooth( strMethodName, tpNow, &nBytesSent ); - nlohmann::json joMethod = nlohmann::json::object(); - joMethod["cps"] = lfCallsPerSecond / g_nSizeDefaultOnQueueAdd; - joMethod["aps"] = lfAnswersPerSecond / g_nSizeDefaultOnQueueAdd; - joMethod["erps"] = lfErrorsPerSecond / g_nSizeDefaultOnQueueAdd; - joMethod["exps"] = lfExceptionsPerSecond / g_nSizeDefaultOnQueueAdd; - joMethod["bps_recv"] = lfBytesPerSecondRecv; - joMethod["bps_sent"] = lfBytesPerSecondSent; - joMethod["calls"] = nCalls; - joMethod["answers"] = nAnswers; - joMethod["errors"] = nErrors; - joMethod["exceptions"] = nExceptions; - joMethod["bytes_recv"] = nBytesRecv; - joMethod["bytes_sent"] = nBytesSent; - jo[strMethodName] = joMethod; + + // note that no lock is needed here since the map is read only after being populated at init + // and we use atomic ints + + + for ( auto&& iterator : dev::rpc::SkaleStats::statsCounters ) { + auto strSubsystemAndMethodName = iterator.first; + if ( boost::algorithm::starts_with( strSubsystemAndMethodName, _subSystem ) ) { + nlohmann::json joMethod = nlohmann::json::object(); + auto methodName = strSubsystemAndMethodName.substr( _subSystem.size() ); + LDB_CHECK( methodName.find( ':' ) == string::npos ); + dev::rpc::StatsCounter& statsCounter = iterator.second; + joMethod["calls"] = ( uint64_t ) statsCounter.calls; + joMethod["answers"] = ( uint64_t ) statsCounter.answers; + joMethod["errors"] = ( uint64_t ) statsCounter.errors; + + if ( statsCounter.answers != 0 ) { + auto answersToProcess = std::min( + ( uint64_t ) statsCounter.answers, statsCounter.answerTimeHistory.size() ); + + uint64_t minAnswerTime = statsCounter.answerTimeHistory.front(); + uint64_t maxAnswerTime = minAnswerTime; + uint64_t totalAnswerTime = minAnswerTime; + + + for ( uint64_t i = 1; i < answersToProcess; i++ ) { + uint64_t answerTime = statsCounter.answerTimeHistory.at( i ); + totalAnswerTime += answerTime; + minAnswerTime = std::min( minAnswerTime, answerTime ); + maxAnswerTime = std::max( maxAnswerTime, answerTime ); + } + + joMethod["calls"] = ( uint64_t ) statsCounter.calls; + joMethod["answers"] = ( uint64_t ) statsCounter.answers; + joMethod["errors"] = ( uint64_t ) statsCounter.errors; + joMethod["maxAnswerTime"] = ( ( double ) maxAnswerTime ) / 1000000.0; + joMethod["minAnswerTime"] = ( ( double ) minAnswerTime ) / 1000000.0; + joMethod["avgAnswerTime"] = + ( ( double ) totalAnswerTime ) / ( 1000000.0 * answersToProcess ); + } + + + jo[methodName] = joMethod; + } } return jo; } + }; // namespace stats @@ -552,18 +350,18 @@ bool SkaleStatsSubscriptionManager::subscribe( subscriptionData.m_pPeer->m_strPeerQueueID, [=]() -> void { if ( subscriptionData.m_pPeer && subscriptionData.m_pPeer->isConnected() ) { - nlohmann::json joParams = nlohmann::json::object(); + json joParams = json::object(); joParams["subscription"] = dev::toJS( subscriptionData.m_idSubscription | SKALED_WS_SUBSCRIPTION_TYPE_SKALE_STATS ); joParams["stats"] = getSSO().provideSkaleStats(); - nlohmann::json joNotification = nlohmann::json::object(); + json joNotification = json::object(); joNotification["jsonrpc"] = "2.0"; joNotification["method"] = "eth_subscription"; joNotification["params"] = joParams; - std::string strNotification = joNotification.dump(); + string strNotification = joNotification.dump(); if ( getSSO().opts_.isTraceCalls_ ) - clog( dev::VerbosityDebug, - cc::info( subscriptionData.m_pPeer->getRelay().nfoGetSchemeUC() ) ) + clog( + dev::VerbosityDebug, subscriptionData.m_pPeer->getRelay().nfoGetSchemeUC() ) << ( cc::ws_tx_inv( " <<< " + subscriptionData.m_pPeer->getRelay().nfoGetSchemeUC() + "/TX <<< " ) + @@ -579,44 +377,16 @@ bool SkaleStatsSubscriptionManager::subscribe( if ( !bMessageSentOK ) throw std::runtime_error( "eth_subscription/skaleStats failed to sent message" ); - stats::register_stats_answer( - ( std::string( "RPC/" ) + - subscriptionData.m_pPeer->getRelay().nfoGetSchemeUC() ) - .c_str(), - "eth_subscription/skaleStats", strNotification.size() ); - stats::register_stats_answer( - "RPC", "eth_subscription/skaleStats", strNotification.size() ); } catch ( std::exception& ex ) { - clog( dev::Verbosity::VerbosityError, - cc::info( subscriptionData.m_pPeer->getRelay().nfoGetSchemeUC() ) + - cc::debug( "/" ) + - cc::num10( - subscriptionData.m_pPeer->getRelay().serverIndex() ) ) - << ( subscriptionData.m_pPeer->desc() + " " + - cc::error( "error in " ) + - cc::warn( "eth_subscription/skaleStats" ) + - cc::error( " will uninstall watcher callback because of " - "exception: " ) + - cc::warn( ex.what() ) ); + cerr << "eth_subscription/skaleStats" + << " will uninstall watcher callback because of " + << "exception: " << ex.what(); } catch ( ... ) { - clog( dev::Verbosity::VerbosityError, - cc::info( subscriptionData.m_pPeer->getRelay().nfoGetSchemeUC() ) + - cc::debug( "/" ) + - cc::num10( - subscriptionData.m_pPeer->getRelay().serverIndex() ) ) - << ( subscriptionData.m_pPeer->desc() + " " + - cc::error( "error in " ) + - cc::warn( "eth_subscription/skaleStats" ) + - cc::error( " will uninstall watcher callback because of " - "unknown exception" ) ); + cerr << "eth_subscription/skaleStats" + << " will uninstall watcher callback because of " + << "unknown exception"; } if ( !bMessageSentOK ) { - stats::register_stats_error( - ( std::string( "RPC/" ) + - subscriptionData.m_pPeer->getRelay().nfoGetSchemeUC() ) - .c_str(), - "eth_subscription/skaleStats" ); - stats::register_stats_error( "RPC", "eth_subscription/skaleStats" ); unsubscribe( idSubscription ); } } ); @@ -649,6 +419,7 @@ bool SkaleStatsSubscriptionManager::unsubscribe( } } + void SkaleStatsSubscriptionManager::unsubscribeAll() { lock_type lock( mtx_ ); std::list< subscription_id_t > lst; @@ -676,19 +447,8 @@ SkaleServerConnectionsTrackHelper::~SkaleServerConnectionsTrackHelper() { SkaleWsPeer::SkaleWsPeer( skutils::ws::server& srv, const skutils::ws::hdl_t& hdl ) : skutils::ws::peer( srv, hdl ), - m_strPeerQueueID( skutils::dispatch::generate_id( this, "relay_peer" ) ) { - SkaleServerOverride* pSO = pso(); - if ( pSO->opts_.isTraceCalls_ ) - clog( dev::VerbosityTrace, cc::info( getRelay().nfoGetSchemeUC() ) + cc::debug( "/" ) + - cc::num10( getRelay().serverIndex() ) ) - << ( desc() + cc::notice( " peer ctor" ) ); -} + m_strPeerQueueID( skutils::dispatch::generate_id( this, "relay_peer" ) ) {} SkaleWsPeer::~SkaleWsPeer() { - SkaleServerOverride* pSO = pso(); - if ( pSO->opts_.isTraceCalls_ ) - clog( dev::VerbosityTrace, cc::info( getRelay().nfoGetSchemeUC() ) + cc::debug( "/" ) + - cc::num10( getRelay().serverIndex() ) ) - << ( desc() + cc::notice( " peer dtor" ) ); uninstallAllWatches(); skutils::dispatch::remove( m_strPeerQueueID ); } @@ -707,11 +467,9 @@ void SkaleWsPeer::register_ws_conn_for_origin() { pSO->unddos_.register_ws_conn_for_origin( m_strUnDdosOrigin ); if ( ehldr != skutils::unddos::e_high_load_detection_result_t::ehldr_no_error ) { m_strUnDdosOrigin.clear(); - clog( dev::VerbosityError, cc::info( getRelay().nfoGetSchemeUC() ) + cc::debug( "/" ) + - cc::num10( getRelay().serverIndex() ) ) - << ( desc() + " " + cc::fatal( "UN-DDOS:" ) + " " + - cc::error( " cannot accept connection - UN-DDOS protection reported " - "connection count overflow" ) ); + cerror << __FUNCTION__ + << " cannot accept connection - UN-DDOS protection reported " + "connection count overflow"; close( "UN-DDOS protection reported connection count overflow" ); throw std::runtime_error( "Cannot accept " + getRelay().nfoGetSchemeUC() + " connection from " + url_unddos_origin.str() + @@ -730,12 +488,8 @@ void SkaleWsPeer::unregister_ws_conn_for_origin() { void SkaleWsPeer::onPeerRegister() { SkaleServerOverride* pSO = pso(); if ( pSO->opts_.isTraceCalls_ ) - clog( dev::VerbosityDebug, cc::info( getRelay().nfoGetSchemeUC() ) + cc::debug( "/" ) + - cc::num10( getRelay().serverIndex() ) ) - << ( desc() + cc::notice( " peer registered" ) ); + ctrace << "peer registered"; skutils::ws::peer::onPeerRegister(); - // - // unddos register_ws_conn_for_origin(); } void SkaleWsPeer::onPeerUnregister() { // peer will no longer receive onMessage after call to @@ -743,12 +497,10 @@ void SkaleWsPeer::onPeerUnregister() { // peer will no longer receive onMessage m_pSSCTH.reset(); SkaleServerOverride* pSO = pso(); if ( pSO->opts_.isTraceCalls_ ) - clog( dev::VerbosityDebug, cc::info( getRelay().nfoGetSchemeUC() ) + cc::debug( "/" ) + - cc::num10( getRelay().serverIndex() ) ) - << ( desc() + cc::notice( " peer unregistered" ) ); + ctrace << "peer unregistered"; skutils::ws::peer::onPeerUnregister(); uninstallAllWatches(); - std::string strQueueIdToRemove = m_strPeerQueueID; + string strQueueIdToRemove = m_strPeerQueueID; skutils::dispatch::async( "ws-queue-remover", [strQueueIdToRemove]() -> void { skutils::dispatch::remove( strQueueIdToRemove ); // remove queue earlier } ); @@ -756,52 +508,48 @@ void SkaleWsPeer::onPeerUnregister() { // peer will no longer receive onMessage unregister_ws_conn_for_origin(); } -void SkaleWsPeer::onMessage( const std::string& msg, skutils::ws::opcv eOpCode ) { +void SkaleWsPeer::onMessage( const string& msg, skutils::ws::opcv eOpCode ) { SkaleServerOverride* pSO = pso(); if ( pSO->isShutdownMode() ) { - clog( dev::VerbosityWarning, cc::info( getRelay().nfoGetSchemeUC() ) + cc::debug( "/" ) + - cc::num10( getRelay().serverIndex() ) ) - << ( cc::ws_rx_inv( " >>> " + getRelay().nfoGetSchemeUC() + "/" + - std::to_string( getRelay().serverIndex() ) + "/RX >>> " ) + - desc() + cc::ws_rx( " >>> " ) + cc::warn( "" ) ); + cwarn << getRelay().nfoGetSchemeUC() << "/" << getRelay().serverIndex() + << ( cc::ws_rx_inv( " >>> " + getRelay().nfoGetSchemeUC() + "/" + + std::to_string( getRelay().serverIndex() ) + "/RX >>> " ) + + desc() + cc::ws_rx( " >>> " ) + "" ); skutils::dispatch::remove( m_strPeerQueueID ); // remove queue earlier return; } if ( eOpCode != skutils::ws::opcv::text ) { // throw std::runtime_error( "only ws text messages are supported" ); - clog( dev::VerbosityWarning, cc::info( getRelay().nfoGetSchemeUC() ) + cc::debug( "/" ) + - cc::num10( getRelay().serverIndex() ) ) - << ( cc::ws_rx_inv( " >>> " + getRelay().nfoGetSchemeUC() + "/" + - std::to_string( getRelay().serverIndex() ) + "/RX >>> " ) + - desc() + cc::ws_rx( " >>> " ) + - cc::error( " got binary message and will try to interpret it as text: " ) + - cc::warn( msg ) ); + cwarn << getRelay().nfoGetSchemeUC() << "/" << getRelay().serverIndex() + << ( cc::ws_rx_inv( " >>> " + getRelay().nfoGetSchemeUC() + "/" + + std::to_string( getRelay().serverIndex() ) + "/RX >>> " ) + + desc() + cc::ws_rx( " >>> " ) + + " got binary message and will try to interpret it as text: " + msg ); } skutils::retain_release_ptr< SkaleWsPeer > pThis = this; - nlohmann::json jarrRequest; - std::string strMethod; - nlohmann::json joID = "-1"; + json jarrRequest; + string strMethod; + json joID = "-1"; bool isBatch = false; try { // fetch method name and id earlier - nlohmann::json joRequestOriginal = nlohmann::json::parse( msg ); + json joRequestOriginal = json::parse( msg ); if ( joRequestOriginal.is_array() ) { isBatch = true; jarrRequest = joRequestOriginal; } else { - jarrRequest = nlohmann::json::array(); + jarrRequest = json::array(); jarrRequest.push_back( joRequestOriginal ); } - for ( const nlohmann::json& joRequest : jarrRequest ) { - std::string strMethodWalk = - skutils::tools::getFieldSafe< std::string >( joRequest, "method" ); + for ( const json& joRequest : jarrRequest ) { + string strMethodWalk = skutils::tools::getFieldSafe< string >( joRequest, "method" ); if ( strMethodWalk.empty() ) throw std::runtime_error( "Bad JSON RPC request, \"method\" name is missing" ); strMethod = strMethodWalk; if ( joRequest.count( "id" ) == 0 ) throw std::runtime_error( "Bad JSON RPC request, \"id\" name is missing" ); joID = joRequest["id"]; - } // for( const nlohmann::json & joRequest : jarrRequest ) + } // for( const json & joRequest : jarrRequest ) if ( isBatch ) { size_t cntInBatch = jarrRequest.size(); if ( cntInBatch > pSO->maxCountInBatchJsonRpcRequest_ ) @@ -814,67 +562,43 @@ void SkaleWsPeer::onMessage( const std::string& msg, skutils::ws::opcv eOpCode ) else strMethod = "unknown_json_rpc_method"; } - std::string e = "Bad JSON RPC request: " + msg; - clog( dev::VerbosityError, cc::info( pThis->getRelay().nfoGetSchemeUC() ) + - cc::debug( "/" ) + - cc::num10( pThis->getRelay().serverIndex() ) ) - << ( cc::ws_tx_inv( " !!! " + pThis->getRelay().nfoGetSchemeUC() + "/" + - std::to_string( pThis->getRelay().serverIndex() ) + "/ERR !!! " ) + - pThis->desc() + cc::ws_tx( " !!! " ) + cc::warn( e ) ); - nlohmann::json joErrorResponce; + string e = "Bad JSON RPC request: " + msg; + cerror << pThis->getRelay().nfoGetSchemeUC() + "/" << pThis->getRelay().serverIndex() + << ( cc::ws_tx_inv( " !!! " + pThis->getRelay().nfoGetSchemeUC() + "/" + + std::to_string( pThis->getRelay().serverIndex() ) + + "/ERR !!! " ) + + pThis->desc() + cc::ws_tx( " !!! " ) + e ); + json joErrorResponce; joErrorResponce["id"] = joID; - nlohmann::json joErrorObj; + json joErrorObj; joErrorObj["code"] = -32000; - joErrorObj["message"] = std::string( e ); + joErrorObj["message"] = string( e ); joErrorResponce["error"] = joErrorObj; - std::string strResponse = joErrorResponce.dump(); - stats::register_stats_exception( - ( std::string( "RPC/" ) + pThis->getRelay().nfoGetSchemeUC() ).c_str(), "messages" ); - stats::register_stats_exception( pThis->getRelay().nfoGetSchemeUC().c_str(), "messages" ); + string strResponse = joErrorResponce.dump(); pThis.get_unconst()->sendMessage( skutils::tools::trim_copy( strResponse ) ); - stats::register_stats_answer( - pThis->getRelay().nfoGetSchemeUC().c_str(), "messages", strResponse.size() ); return; } - // - // unddos + skutils::unddos::e_high_load_detection_result_t ehldr = pSO->unddos_.register_call_from_origin( m_strUnDdosOrigin, strMethod ); switch ( ehldr ) { - case skutils::unddos::e_high_load_detection_result_t::ehldr_peak: // ban by too high load per - // minute - case skutils::unddos::e_high_load_detection_result_t::ehldr_lengthy: // ban by too high load - // per second - case skutils::unddos::e_high_load_detection_result_t::ehldr_ban: // still banned + case skutils::unddos::e_high_load_detection_result_t::ehldr_detected_ban_per_sec: // ban by too + // high load + // per minute + case skutils::unddos::e_high_load_detection_result_t::ehldr_detected_ban_per_min: // ban by too + // high load + // per second + case skutils::unddos::e_high_load_detection_result_t::ehldr_already_banned: // still banned case skutils::unddos::e_high_load_detection_result_t::ehldr_bad_origin: { - if ( strMethod.empty() ) - strMethod = isBatch ? "batch_json_rpc_request" : "unknown_json_rpc_method"; - std::string reason_part = - ( ehldr == skutils::unddos::e_high_load_detection_result_t::ehldr_bad_origin && - ( !m_strUnDdosOrigin.empty() ) ) ? - "bad origin" : - "high load"; - std::string e = "Banned due to " + reason_part + " JSON RPC request: " + msg; - clog( dev::VerbosityError, cc::info( pThis->getRelay().nfoGetSchemeUC() ) + - cc::debug( "/" ) + - cc::num10( pThis->getRelay().serverIndex() ) ) - << ( cc::ws_tx_inv( " !!! " + pThis->getRelay().nfoGetSchemeUC() + "/" + - std::to_string( pThis->getRelay().serverIndex() ) + "/ERR !!! " ) + - pThis->desc() + cc::ws_tx( " !!! " ) + cc::warn( e ) ); - nlohmann::json joErrorResponce; + json joErrorResponce; joErrorResponce["id"] = joID; - nlohmann::json joErrorObj; + json joErrorObj; joErrorObj["code"] = -32000; - joErrorObj["message"] = std::string( e ); + joErrorObj["message"] = "Too many request for this method from this IP address"; + ; joErrorResponce["error"] = joErrorObj; - std::string strResponse = joErrorResponce.dump(); - stats::register_stats_exception( - ( std::string( "RPC/" ) + pThis->getRelay().nfoGetSchemeUC() ).c_str(), "messages" ); - stats::register_stats_exception( pThis->getRelay().nfoGetSchemeUC().c_str(), "messages" ); - // stats::register_stats_exception( "RPC", strMethod.c_str() ); + string strResponse = joErrorResponce.dump(); pThis.get_unconst()->sendMessage( skutils::tools::trim_copy( strResponse ) ); - stats::register_stats_answer( - pThis->getRelay().nfoGetSchemeUC().c_str(), "messages", strResponse.size() ); } return; case skutils::unddos::e_high_load_detection_result_t::ehldr_no_error: @@ -886,48 +610,33 @@ void SkaleWsPeer::onMessage( const std::string& msg, skutils::ws::opcv eOpCode ) // WS-processing-lambda auto fnAsyncMessageHandler = [pThis, jarrRequest, pSO, isBatch]() -> void { // WS-processing-lambda - nlohmann::json jarrBatchAnswer; + json jarrBatchAnswer; if ( isBatch ) - jarrBatchAnswer = nlohmann::json::array(); - for ( const nlohmann::json& joRequest : jarrRequest ) { - std::string strRequest = joRequest.dump(); - std::string strMethod = - skutils::tools::getFieldSafe< std::string >( joRequest, "method" ); - nlohmann::json joID = joRequest["id"]; + jarrBatchAnswer = json::array(); + for ( const json& joRequest : jarrRequest ) { + string strRequest = joRequest.dump(); + string strMethod = skutils::tools::getFieldSafe< string >( joRequest, "method" ); + json joID = joRequest["id"]; // - std::string strPerformanceQueueName = + string strPerformanceQueueName = skutils::tools::format( "rpc/%s/%zu/%s", pThis->getRelay().nfoGetSchemeUC().c_str(), pThis->getRelay().serverIndex(), pThis->desc( false ).c_str() ); - std::string strPerformanceActionName = + string strPerformanceActionName = skutils::tools::format( "%s task %zu", pThis->getRelay().nfoGetSchemeUC().c_str(), pThis.get_unconst()->nTaskNumberInPeer_++ ); // - skutils::stats::time_tracker::element_ptr_t rttElement; - rttElement.emplace( "RPC", pThis->getRelay().nfoGetSchemeUC().c_str(), - strMethod.c_str(), pThis->getRelay().serverIndex(), -1 ); - size_t nRequestSize = strRequest.size(); - // - skutils::task::performance::action a( - strPerformanceQueueName, strPerformanceActionName ); + auto beginTime = chrono::system_clock::now(); if ( pSO->methodTraceVerbosity( strMethod ) != dev::VerbositySilent ) clog( pSO->methodTraceVerbosity( strMethod ), cc::info( pThis->getRelay().nfoGetSchemeUC() ) + cc::debug( "/" ) + - cc::num10( pThis->getRelay().serverIndex() ) ) + to_string( pThis->getRelay().serverIndex() ) ) << ( cc::ws_rx_inv( " >>> " + pThis->getRelay().nfoGetSchemeUC() + "/" + std::to_string( pThis->getRelay().serverIndex() ) + "/RX >>> " ) + pThis->desc() + cc::ws_rx( " >>> " ) + pThis->implPreformatTrafficJsonMessage( joRequest, true ) ); - std::string strResponse; - bool bPassed = false; + string strResponse; try { - stats::register_stats_message( - pThis->getRelay().nfoGetSchemeUC().c_str(), "messages", nRequestSize ); - stats::register_stats_message( - ( std::string( "RPC/" ) + pThis->getRelay().nfoGetSchemeUC() ).c_str(), - joRequest ); - stats::register_stats_message( "RPC", joRequest ); - if ( !pThis.get_unconst()->handleWebSocketSpecificRequest( pThis->getRelay().esm_, joRequest, strResponse ) ) { jsonrpc::IClientConnectionHandler* handler = pSO->GetHandler( "/" ); @@ -936,92 +645,60 @@ void SkaleWsPeer::onMessage( const std::string& msg, skutils::ws::opcv eOpCode ) handler->HandleRequest( strRequest, strResponse ); } - nlohmann::json joResponse = nlohmann::json::parse( strResponse ); - stats::register_stats_answer( - pThis->getRelay().nfoGetSchemeUC().c_str(), "messages", strResponse.size() ); - stats::register_stats_answer( - ( std::string( "RPC/" ) + pThis->getRelay().nfoGetSchemeUC() ).c_str(), - joRequest, joResponse ); - stats::register_stats_answer( "RPC", joRequest, joResponse ); - a.set_json_out( joResponse ); - bPassed = true; + json joResponse = json::parse( strResponse ); } catch ( const std::exception& ex ) { - rttElement->setError(); - clog( dev::VerbosityError, cc::info( pThis->getRelay().nfoGetSchemeUC() ) + - cc::debug( "/" ) + - cc::num10( pThis->getRelay().serverIndex() ) ) + clog( dev::VerbosityError, pThis->getRelay().nfoGetSchemeUC() + "/" + + to_string( pThis->getRelay().serverIndex() ) ) << ( cc::ws_tx_inv( " !!! " + pThis->getRelay().nfoGetSchemeUC() + "/" + std::to_string( pThis->getRelay().serverIndex() ) + "/ERR !!! " ) + - pThis->desc() + cc::ws_tx( " !!! " ) + cc::warn( ex.what() ) ); - nlohmann::json joErrorResponce; + pThis->desc() + cc::ws_tx( " !!! " ) + ex.what() ); + json joErrorResponce; joErrorResponce["id"] = joID; - nlohmann::json joErrorObj; + json joErrorObj; joErrorObj["code"] = -32000; - joErrorObj["message"] = std::string( ex.what() ); + joErrorObj["message"] = string( ex.what() ); joErrorResponce["error"] = joErrorObj; strResponse = joErrorResponce.dump(); - stats::register_stats_exception( - ( std::string( "RPC/" ) + pThis->getRelay().nfoGetSchemeUC() ).c_str(), "" ); - if ( !strMethod.empty() ) { - stats::register_stats_exception( - pThis->getRelay().nfoGetSchemeUC().c_str(), "messages" ); - stats::register_stats_exception( "RPC", strMethod.c_str() ); - } - a.set_json_err( joErrorResponce ); } catch ( ... ) { - rttElement->setError(); const char* e = "unknown exception in SkaleServerOverride"; - clog( dev::VerbosityError, cc::info( pThis->getRelay().nfoGetSchemeUC() ) + - cc::debug( "/" ) + - cc::num10( pThis->getRelay().serverIndex() ) ) - << ( cc::ws_tx_inv( " !!! " + pThis->getRelay().nfoGetSchemeUC() + "/" + - std::to_string( pThis->getRelay().serverIndex() ) + - "/ERR !!! " ) + - pThis->desc() + cc::ws_tx( " !!! " ) + cc::warn( e ) ); - nlohmann::json joErrorResponce; + clog( dev::VerbosityError, pThis->getRelay().nfoGetSchemeUC() ) + << "/" << to_string( pThis->getRelay().serverIndex() ) + << cc::ws_tx_inv( " !!! " + pThis->getRelay().nfoGetSchemeUC() + "/" + + std::to_string( pThis->getRelay().serverIndex() ) + + "/ERR !!! " ) + << pThis->desc() + cc::ws_tx( " !!! " ) + e; + json joErrorResponce; joErrorResponce["id"] = joID; - nlohmann::json joErrorObj; + json joErrorObj; joErrorObj["code"] = -32000; - joErrorObj["message"] = std::string( e ); + joErrorObj["message"] = string( e ); joErrorResponce["error"] = joErrorObj; strResponse = joErrorResponce.dump(); - stats::register_stats_exception( - ( std::string( "RPC/" ) + pThis->getRelay().nfoGetSchemeUC() ).c_str(), - "messages" ); - if ( !strMethod.empty() ) { - stats::register_stats_exception( - pThis->getRelay().nfoGetSchemeUC().c_str(), "messages" ); - stats::register_stats_exception( "RPC", strMethod.c_str() ); - } - a.set_json_err( joErrorResponce ); } if ( pSO->methodTraceVerbosity( strMethod ) != dev::VerbositySilent ) - clog( pSO->methodTraceVerbosity( strMethod ), - cc::info( pThis->getRelay().nfoGetSchemeUC() ) + cc::debug( "/" ) + - cc::num10( pThis->getRelay().serverIndex() ) ) + clog( pSO->methodTraceVerbosity( strMethod ), pThis->getRelay().nfoGetSchemeUC() ) + << "/" << pThis->getRelay().serverIndex() << ( cc::ws_tx_inv( " <<< " + pThis->getRelay().nfoGetSchemeUC() + "/" + std::to_string( pThis->getRelay().serverIndex() ) + "/TX <<< " ) + pThis->desc() + cc::ws_tx( " <<< " ) + pThis->implPreformatTrafficJsonMessage( strResponse, false ) ); if ( isBatch ) { - nlohmann::json joAnswerPart = nlohmann::json::parse( strResponse ); + json joAnswerPart = json::parse( strResponse ); jarrBatchAnswer.push_back( joAnswerPart ); } else pThis.get_unconst()->sendMessage( skutils::tools::trim_copy( strResponse ) ); - if ( !bPassed ) - stats::register_stats_answer( - pThis->getRelay().nfoGetSchemeUC().c_str(), "messages", strResponse.size() ); - rttElement->stop(); - double lfExecutionDuration = rttElement->getDurationInSeconds(); // in seconds + uint64_t lfExecutionDuration = + chrono::duration_cast< chrono::seconds >( chrono::system_clock::now() - beginTime ) + .count(); // in seconds if ( lfExecutionDuration >= pSO->opts_.lfExecutionDurationMaxForPerformanceWarning_ ) pSO->logPerformanceWarning( lfExecutionDuration, -1, pThis->getRelay().nfoGetSchemeUC().c_str(), pThis->getRelay().serverIndex(), pThis->getRelay().esm_, pThis->getOrigin().c_str(), strMethod.c_str(), joID ); - } // for( const nlohmann::json & joRequest : jarrRequest ) + } if ( isBatch ) { - std::string strResponse = jarrBatchAnswer.dump(); + string strResponse = jarrBatchAnswer.dump(); pThis.get_unconst()->sendMessage( skutils::tools::trim_copy( strResponse ) ); } }; // WS-processing-lambda @@ -1029,38 +706,33 @@ void SkaleWsPeer::onMessage( const std::string& msg, skutils::ws::opcv eOpCode ) } void SkaleWsPeer::onClose( - const std::string& reason, int local_close_code, const std::string& local_close_code_as_str ) { + const string& reason, int local_close_code, const string& local_close_code_as_str ) { SkaleServerOverride* pSO = pso(); if ( pSO->opts_.isTraceCalls_ ) - clog( dev::VerbosityDebug, cc::info( getRelay().nfoGetSchemeUC() ) + cc::debug( "/" ) + - cc::num10( getRelay().serverIndex() ) ) - << ( desc() + cc::warn( " peer close event with code=" ) + cc::c( local_close_code ) + - cc::debug( ", reason=" ) + cc::info( reason ) ); + clog( dev::VerbosityDebug, + getRelay().nfoGetSchemeUC() + "/" + to_string( getRelay().serverIndex() ) ) + << ( desc() + " peer close event with code=" + to_string( local_close_code ) + + ", reason=" + reason ); skutils::ws::peer::onClose( reason, local_close_code, local_close_code_as_str ); uninstallAllWatches(); - // unddos unregister_ws_conn_for_origin(); } void SkaleWsPeer::onFail() { SkaleServerOverride* pSO = pso(); if ( pSO->opts_.isTraceCalls_ ) - clog( dev::VerbosityError, cc::fatal( getRelay().nfoGetSchemeUC() ) ) - << ( desc() + cc::error( " peer fail event" ) ); + cerror << getRelay().nfoGetSchemeUC() << desc() << " peer fail event"; skutils::ws::peer::onFail(); uninstallAllWatches(); // unddos unregister_ws_conn_for_origin(); } -void SkaleWsPeer::onLogMessage( - skutils::ws::e_ws_log_message_type_t eWSLMT, const std::string& msg ) { +void SkaleWsPeer::onLogMessage( skutils::ws::e_ws_log_message_type_t eWSLMT, const string& msg ) { SkaleServerOverride* pSO = pso(); if ( pSO->opts_.isTraceCalls_ ) - clog( skale::server::helper::dv_from_ws_msg_type( eWSLMT ), - cc::info( getRelay().nfoGetSchemeUC() ) + cc::debug( "/" ) + - cc::num10( getRelay().serverIndex() ) ) - << ( desc() + cc::debug( " peer log: " ) + cc::info( msg ) ); + clog( skale::server::helper::dv_from_ws_msg_type( eWSLMT ), getRelay().nfoGetSchemeUC() ) + << "/" << getRelay().serverIndex() << desc() << " peer log: " << msg; skutils::ws::peer::onLogMessage( eWSLMT, msg ); } @@ -1108,25 +780,11 @@ void SkaleWsPeer::uninstallAllWatches() { } } -bool SkaleWsPeer::handleRequestWithBinaryAnswer( - e_server_mode_t esm, const nlohmann::json& joRequest ) { - SkaleServerOverride* pSO = pso(); - std::vector< uint8_t > buffer; - if ( pSO->handleRequestWithBinaryAnswer( esm, joRequest, buffer ) ) { - std::string strMethodName = - skutils::tools::getFieldSafe< std::string >( joRequest, "method" ); - std::string s( buffer.begin(), buffer.end() ); - sendMessage( s, skutils::ws::opcv::binary ); - stats::register_stats_answer( "RPC", strMethodName, buffer.size() ); - return true; - } - return false; -} bool SkaleWsPeer::handleWebSocketSpecificRequest( - e_server_mode_t esm, const nlohmann::json& joRequest, std::string& strResponse ) { + e_server_mode_t esm, const json& joRequest, string& strResponse ) { strResponse.clear(); - nlohmann::json joResponse = nlohmann::json::object(); + json joResponse = json::object(); joResponse["jsonrpc"] = "2.0"; if ( joRequest.count( "id" ) > 0 ) joResponse["id"] = joRequest["id"]; @@ -1134,12 +792,12 @@ bool SkaleWsPeer::handleWebSocketSpecificRequest( rapidjson::Document joRequestRapidjson; joRequestRapidjson.SetObject(); - std::string strRequest = joRequest.dump(); + string strRequest = joRequest.dump(); joRequestRapidjson.Parse( strRequest.data() ); rapidjson::Document joResponseRapidjson; joResponseRapidjson.SetObject(); - std::string strResponseCopy = joResponse.dump(); + string strResponseCopy = joResponse.dump(); joResponseRapidjson.Parse( strResponseCopy.data() ); if ( handleWebSocketSpecificRequest( esm, joRequest, joResponse ) ) { @@ -1148,7 +806,7 @@ bool SkaleWsPeer::handleWebSocketSpecificRequest( } bool isSkipProtocolSpecfic = false; - std::string strMethod = joRequest["method"].get< std::string >(); + string strMethod = joRequest["method"].get< string >(); if ( esm == e_server_mode_t::esm_informational && strMethod == "eth_getBalance" ) isSkipProtocolSpecfic = true; @@ -1167,12 +825,12 @@ bool SkaleWsPeer::handleWebSocketSpecificRequest( } bool SkaleWsPeer::handleWebSocketSpecificRequest( - e_server_mode_t esm, const nlohmann::json& joRequest, nlohmann::json& joResponse ) { + e_server_mode_t esm, const json& joRequest, json& joResponse ) { if ( esm == e_server_mode_t::esm_informational && pso()->handleInformationalRequest( joRequest, joResponse ) ) { return true; } - std::string strMethod = joRequest["method"].get< std::string >(); + string strMethod = joRequest["method"].get< string >(); ws_rpc_map_t::const_iterator itFind = g_ws_rpc_map.find( strMethod ); if ( itFind == g_ws_rpc_map.end() ) { return false; @@ -1186,18 +844,17 @@ const SkaleWsPeer::ws_rpc_map_t SkaleWsPeer::g_ws_rpc_map = { { "eth_unsubscribe", &SkaleWsPeer::eth_unsubscribe }, }; -void SkaleWsPeer::eth_subscribe( - e_server_mode_t esm, const nlohmann::json& joRequest, nlohmann::json& joResponse ) { +void SkaleWsPeer::eth_subscribe( e_server_mode_t esm, const json& joRequest, json& joResponse ) { if ( !skale::server::helper::checkParamsIsArray( "eth_subscribe", joRequest, joResponse ) ) return; - const nlohmann::json& jarrParams = joRequest["params"]; - std::string strSubscriptionType; + const json& jarrParams = joRequest["params"]; + string strSubscriptionType; size_t idxParam, cntParams = jarrParams.size(); for ( idxParam = 0; idxParam < cntParams; ++idxParam ) { - const nlohmann::json& joParamItem = jarrParams[idxParam]; + const json& joParamItem = jarrParams[idxParam]; if ( !joParamItem.is_string() ) continue; - strSubscriptionType = skutils::tools::trim_copy( joParamItem.get< std::string >() ); + strSubscriptionType = skutils::tools::trim_copy( joParamItem.get< string >() ); break; } if ( strSubscriptionType == "logs" ) { @@ -1221,14 +878,12 @@ void SkaleWsPeer::eth_subscribe( strSubscriptionType = ""; SkaleServerOverride* pSO = pso(); if ( pSO->opts_.isTraceCalls_ ) - clog( dev::Verbosity::VerbosityError, cc::info( getRelay().nfoGetSchemeUC() ) + - cc::debug( "/" ) + - cc::num10( getRelay().serverIndex() ) ) - << ( desc() + " " + cc::error( "error in " ) + cc::warn( "eth_subscribe" ) + - cc::error( " rpc method, missing valid subscription type in parameters, was " - "specifiedL " ) + - cc::warn( strSubscriptionType ) ); - nlohmann::json joError = nlohmann::json::object(); + cerror << getRelay().nfoGetSchemeUC() << "/" << getRelay().serverIndex() << desc() << " " + << "error in eth_subscribe" + << " rpc method, missing valid subscription type in parameters, was " + "specifiedL " + + strSubscriptionType; + json joError = json::object(); joError["code"] = -32603; joError["message"] = "error in \"eth_subscribe\" rpc method, missing valid subscription type in parameters, was " @@ -1238,15 +893,15 @@ void SkaleWsPeer::eth_subscribe( } void SkaleWsPeer::eth_subscribe_logs( - e_server_mode_t /*esm*/, const nlohmann::json& joRequest, nlohmann::json& joResponse ) { + e_server_mode_t /*esm*/, const json& joRequest, json& joResponse ) { SkaleServerOverride* pSO = pso(); try { - const nlohmann::json& jarrParams = joRequest["params"]; + const json& jarrParams = joRequest["params"]; dev::eth::LogFilter logFilter; bool bHaveLogFilter = false; size_t idxParam, cntParams = jarrParams.size(); for ( idxParam = 0; idxParam < cntParams; ++idxParam ) { - const nlohmann::json& joParamItem = jarrParams[idxParam]; + const json& joParamItem = jarrParams[idxParam]; if ( joParamItem.is_string() ) continue; if ( joParamItem.is_object() ) { @@ -1255,49 +910,48 @@ void SkaleWsPeer::eth_subscribe_logs( logFilter = skale::server::helper::toLogFilter( joParamItem ); } } - } // for ( idxParam = 0; idxParam < cntParams; ++idxParam ) + } skutils::retain_release_ptr< SkaleWsPeer > pThis( this ); dev::eth::fnClientWatchHandlerMulti_t fnOnSunscriptionEvent; fnOnSunscriptionEvent += [pThis]( unsigned iw ) -> void { skutils::dispatch::async( "logs-rethread", [=]() -> void { skutils::dispatch::async( pThis->m_strPeerQueueID, [pThis, iw]() -> void { dev::eth::LocalisedLogEntries le = pThis->ethereum()->checkWatch( iw ); - nlohmann::json joResult = skale::server::helper::toJsonByBlock( le ); + json joResult = skale::server::helper::toJsonByBlock( le ); if ( !joResult.is_array() ) throw std::runtime_error( "Log entries should be array" ); for ( const auto& joRW : joResult ) { if ( joRW.count( "logs" ) > 0 && joRW.count( "blockHash" ) > 0 && joRW.count( "blockNumber" ) > 0 ) { - const std::string strBlockHash = joRW["blockHash"].get< std::string >(); - std::string strBlockNumber = joRW["blockNumber"].get< std::string >(); - const nlohmann::json& joResultLogs = joRW["logs"]; + const string strBlockHash = joRW["blockHash"].get< string >(); + string strBlockNumber = joRW["blockNumber"].get< string >(); + const json& joResultLogs = joRW["logs"]; if ( !joResultLogs.is_array() ) throw std::runtime_error( "Result logs should be array" ); for ( const auto& joWalk : joResultLogs ) { if ( !joWalk.is_object() ) continue; - nlohmann::json joLog = joWalk; // copy + json joLog = joWalk; // copy joLog["blockHash"] = strBlockHash; joLog["blockNumber"] = strBlockNumber; - nlohmann::json joParams = nlohmann::json::object(); + json joParams = json::object(); joParams["subscription"] = dev::toJS( iw ); joParams["result"] = joLog; - nlohmann::json joNotification = nlohmann::json::object(); + json joNotification = json::object(); joNotification["jsonrpc"] = "2.0"; joNotification["method"] = "eth_subscription"; joNotification["params"] = joParams; - std::string strNotification = joNotification.dump(); + string strNotification = joNotification.dump(); const SkaleServerOverride* pSO = pThis->pso(); if ( pSO->opts_.isTraceCalls_ ) - clog( dev::VerbosityDebug, - cc::info( pThis->getRelay().nfoGetSchemeUC() ) + - cc::ws_tx_inv( " <<< " + - pThis->getRelay().nfoGetSchemeUC() + - "/TX <<< " ) ) - << ( pThis->desc() + cc::ws_tx( " <<< " ) + - pThis->implPreformatTrafficJsonMessage( - strNotification, false ) ); + cdebug << pThis->getRelay().nfoGetSchemeUC() + << cc::ws_tx_inv( " <<< " + + pThis->getRelay().nfoGetSchemeUC() + + "/TX <<< " ) + << ( pThis->desc() + cc::ws_tx( " <<< " ) + + pThis->implPreformatTrafficJsonMessage( + strNotification, false ) ); bool bMessageSentOK = false; try { bMessageSentOK = const_cast< SkaleWsPeer* >( pThis.get() ) @@ -1305,42 +959,24 @@ void SkaleWsPeer::eth_subscribe_logs( strNotification ) ); if ( !bMessageSentOK ) throw std::runtime_error( - "eth_subscription/logs failed to sent " - "message" ); - stats::register_stats_answer( - ( std::string( "RPC/" ) + - pThis->getRelay().nfoGetSchemeUC() ) - .c_str(), - "eth_subscription/logs", strNotification.size() ); - stats::register_stats_answer( - "RPC", "eth_subscription/logs", strNotification.size() ); + "eth_subscription/logs failed to sent message" ); } catch ( std::exception& ex ) { clog( dev::Verbosity::VerbosityError, - cc::info( pThis->getRelay().nfoGetSchemeUC() ) + - cc::debug( "/" ) + - cc::num10( pThis->getRelay().serverIndex() ) ) - << ( pThis->desc() + " " + cc::error( "error in " ) + - cc::warn( "eth_subscription/logs" ) + - cc::error( " will uninstall watcher callback " - "because of exception: " ) + - cc::warn( ex.what() ) ); + pThis->getRelay().nfoGetSchemeUC() + "/" + + to_string( pThis->getRelay().serverIndex() ) ) + << ( pThis->desc() + " " + "error in " + + "eth_subscription/logs" + + " will uninstall watcher callback " + "because of exception: " + + ex.what() ); } catch ( ... ) { - clog( dev::Verbosity::VerbosityError, - cc::info( pThis->getRelay().nfoGetSchemeUC() ) + - cc::debug( "/" ) + - cc::num10( pThis->getRelay().serverIndex() ) ) - << ( pThis->desc() + " " + cc::error( "error in " ) + - cc::warn( "eth_subscription/logs" ) + - cc::error( " will uninstall watcher callback " - "because of unknown exception" ) ); + cerror << pThis->getRelay().nfoGetSchemeUC() << "/" + << pThis->getRelay().serverIndex() << pThis->desc() + << " error in eth_subscription/logs will uninstall " + "watcher callback" + << "because of unknown exception"; } if ( !bMessageSentOK ) { - stats::register_stats_error( - ( std::string( "RPC/" ) + - pThis->getRelay().nfoGetSchemeUC() ) - .c_str(), - "eth_subscription/logs" ); - stats::register_stats_error( "RPC", "eth_subscription/logs" ); pThis->ethereum()->uninstallWatch( iw ); } } @@ -1352,35 +988,29 @@ void SkaleWsPeer::eth_subscribe_logs( unsigned iw = ethereum()->installWatch( logFilter, dev::eth::Reaping::Automatic, fnOnSunscriptionEvent, true ); // isWS = true setInstalledWatchesLogs_.insert( iw ); - std::string strIW = dev::toJS( iw ); + string strIW = dev::toJS( iw ); if ( pSO->opts_.isTraceCalls_ ) - clog( dev::Verbosity::VerbosityTrace, cc::info( getRelay().nfoGetSchemeUC() ) + - cc::debug( "/" ) + - cc::num10( getRelay().serverIndex() ) ) - << ( desc() + " " + cc::info( "eth_subscribe/logs" ) + - cc::debug( " rpc method did installed watch " ) + cc::info( strIW ) ); + ctrace << getRelay().nfoGetSchemeUC() << "/" << getRelay().serverIndex() << desc() + << " " + << "eth_subscribe/logs rpc method installed watch " << strIW; joResponse["result"] = strIW; } catch ( const std::exception& ex ) { if ( pSO->opts_.isTraceCalls_ ) - clog( dev::Verbosity::VerbosityError, cc::info( getRelay().nfoGetSchemeUC() ) + - cc::debug( "/" ) + - cc::num10( getRelay().serverIndex() ) ) - << ( desc() + " " + cc::error( "error in " ) + cc::warn( "eth_subscribe/logs" ) + - cc::error( " rpc method, exception " ) + cc::warn( ex.what() ) ); - nlohmann::json joError = nlohmann::json::object(); + clog( dev::Verbosity::VerbosityError, + getRelay().nfoGetSchemeUC() + "/" + to_string( getRelay().serverIndex() ) ) + << desc() << " error in eth_subscribe/logs rpc method:" << ex.what(); + json joError = json::object(); joError["code"] = -32602; joError["message"] = - std::string( "error in \"eth_subscribe/logs\" rpc method, exception: " ) + ex.what(); + string( "error in \"eth_subscribe/logs\" rpc method, exception: " ) + ex.what(); joResponse["error"] = joError; return; } catch ( ... ) { if ( pSO->opts_.isTraceCalls_ ) - clog( dev::Verbosity::VerbosityError, cc::info( getRelay().nfoGetSchemeUC() ) + - cc::debug( "/" ) + - cc::num10( getRelay().serverIndex() ) ) - << ( desc() + " " + cc::error( "error in " ) + cc::warn( "eth_subscribe/logs" ) + - cc::error( " rpc method, unknown exception " ) ); - nlohmann::json joError = nlohmann::json::object(); + clog( dev::Verbosity::VerbosityError, + getRelay().nfoGetSchemeUC() + "/" + to_string( getRelay().serverIndex() ) + + " error in eth_subscribe/logs" + " rpc method, unknown exception " ); + json joError = json::object(); joError["code"] = -32602; joError["message"] = "error in \"eth_subscribe/logs\" rpc method, unknown exception"; joResponse["error"] = joError; @@ -1389,7 +1019,7 @@ void SkaleWsPeer::eth_subscribe_logs( } void SkaleWsPeer::eth_subscribe_newPendingTransactions( - e_server_mode_t /*esm*/, const nlohmann::json& /*joRequest*/, nlohmann::json& joResponse ) { + e_server_mode_t /*esm*/, const json& /*joRequest*/, json& joResponse ) { SkaleServerOverride* pSO = pso(); try { skutils::retain_release_ptr< SkaleWsPeer > pThis( this ); @@ -1400,21 +1030,21 @@ void SkaleWsPeer::eth_subscribe_newPendingTransactions( const SkaleServerOverride* pSO = pThis->pso(); dev::h256 h = t.sha3(); // - nlohmann::json joParams = nlohmann::json::object(); + json joParams = json::object(); joParams["subscription"] = dev::toJS( iw | SKALED_WS_SUBSCRIPTION_TYPE_NEW_PENDING_TRANSACTION ); joParams["result"] = dev::toJS( h ); // h.hex() - nlohmann::json joNotification = nlohmann::json::object(); + json joNotification = json::object(); joNotification["jsonrpc"] = "2.0"; joNotification["method"] = "eth_subscription"; joNotification["params"] = joParams; - std::string strNotification = joNotification.dump(); + string strNotification = joNotification.dump(); if ( pSO->opts_.isTraceCalls_ ) - clog( dev::VerbosityDebug, cc::info( pThis->getRelay().nfoGetSchemeUC() ) ) - << ( cc::ws_tx_inv( - " <<< " + pThis->getRelay().nfoGetSchemeUC() + "/TX <<< " ) + - pThis->desc() + cc::ws_tx( " <<< " ) + - pThis->implPreformatTrafficJsonMessage( strNotification, false ) ); + cdebug << pThis->getRelay().nfoGetSchemeUC() + << cc::ws_tx_inv( + " <<< " + pThis->getRelay().nfoGetSchemeUC() + "/TX <<< " ) + + pThis->desc() + cc::ws_tx( " <<< " ) + + pThis->implPreformatTrafficJsonMessage( strNotification, false ); bool bMessageSentOK = false; try { bMessageSentOK = @@ -1423,34 +1053,23 @@ void SkaleWsPeer::eth_subscribe_newPendingTransactions( if ( !bMessageSentOK ) throw std::runtime_error( "eth_subscription/newPendingTransactions failed to sent message" ); - stats::register_stats_answer( - ( std::string( "RPC/" ) + pThis->getRelay().nfoGetSchemeUC() ).c_str(), - "eth_subscription/newPendingTransactions", strNotification.size() ); - stats::register_stats_answer( - "RPC", "eth_subscription/newPendingTransactions", strNotification.size() ); } catch ( std::exception& ex ) { clog( dev::Verbosity::VerbosityError, - cc::info( pThis->getRelay().nfoGetSchemeUC() ) + cc::debug( "/" ) + - cc::num10( pThis->getRelay().serverIndex() ) ) - << ( pThis->desc() + " " + cc::error( "error in " ) + - cc::warn( "eth_subscription/newPendingTransactions" ) + - cc::error( - " will uninstall watcher callback because of exception: " ) + - cc::warn( ex.what() ) ); + pThis->getRelay().nfoGetSchemeUC() + "/" + + to_string( pThis->getRelay().serverIndex() ) + pThis->desc() + " " + + "error in " + "eth_subscription/newPendingTransactions" + + + " will uninstall watcher callback because of exception: " + ex.what() ); } catch ( ... ) { clog( dev::Verbosity::VerbosityError, - cc::info( pThis->getRelay().nfoGetSchemeUC() ) + cc::debug( "/" ) + - cc::num10( pThis->getRelay().serverIndex() ) ) - << ( pThis->desc() + " " + cc::error( "error in " ) + - cc::warn( "eth_subscription/newPendingTransactions" ) + - cc::error( " will uninstall watcher callback because of unknown " - "exception" ) ); + pThis->getRelay().nfoGetSchemeUC() + "/" + + to_string( pThis->getRelay().serverIndex() ) ) + << ( pThis->desc() + " " + "error in " + + "eth_subscription/newPendingTransactions" + + " will uninstall watcher callback because of unknown " + "exception" ); } if ( !bMessageSentOK ) { - stats::register_stats_error( - ( std::string( "RPC/" ) + pThis->getRelay().nfoGetSchemeUC() ).c_str(), - "eth_subscription/newPendingTransactions" ); - stats::register_stats_error( "RPC", "eth_subscription/newPendingTransactions" ); pThis->ethereum()->uninstallNewPendingTransactionWatch( iw ); } //} ); @@ -1459,39 +1078,32 @@ void SkaleWsPeer::eth_subscribe_newPendingTransactions( unsigned iw = ethereum()->installNewPendingTransactionWatch( fnOnSunscriptionEvent ); setInstalledWatchesNewPendingTransactions_.insert( iw ); iw |= SKALED_WS_SUBSCRIPTION_TYPE_NEW_PENDING_TRANSACTION; - std::string strIW = dev::toJS( iw ); + string strIW = dev::toJS( iw ); if ( pSO->opts_.isTraceCalls_ ) - clog( dev::Verbosity::VerbosityTrace, cc::info( getRelay().nfoGetSchemeUC() ) + - cc::debug( "/" ) + - cc::num10( getRelay().serverIndex() ) ) - << ( desc() + " " + cc::info( "eth_subscribe/newPendingTransactions" ) + - cc::debug( " rpc method did installed watch " ) + cc::info( strIW ) ); + ctrace << getRelay().nfoGetSchemeUC() << "/" << to_string( getRelay().serverIndex() ) + << desc() << " " << cc::info( "eth_subscribe/newPendingTransactions" ) + << " rpc method did installed watch " << strIW; joResponse["result"] = strIW; } catch ( const std::exception& ex ) { if ( pSO->opts_.isTraceCalls_ ) - clog( dev::Verbosity::VerbosityError, cc::info( getRelay().nfoGetSchemeUC() ) + - cc::debug( "/" ) + - cc::num10( getRelay().serverIndex() ) ) - << ( desc() + " " + cc::error( "error in " ) + - cc::warn( "eth_subscribe/newPendingTransactions" ) + - cc::error( " rpc method, exception " ) + cc::warn( ex.what() ) ); - nlohmann::json joError = nlohmann::json::object(); + clog( dev::Verbosity::VerbosityError, + getRelay().nfoGetSchemeUC() + "/" + to_string( getRelay().serverIndex() ) ) + << ( desc() + " " + "error in " + "eth_subscribe/newPendingTransactions" + + " rpc method, exception " + ex.what() ); + json joError = json::object(); joError["code"] = -32602; joError["message"] = - std::string( - "error in \"eth_subscribe/newPendingTransactions\" rpc method, exception: " ) + + string( "error in \"eth_subscribe/newPendingTransactions\" rpc method, exception: " ) + ex.what(); joResponse["error"] = joError; return; } catch ( ... ) { if ( pSO->opts_.isTraceCalls_ ) - clog( dev::Verbosity::VerbosityError, cc::info( getRelay().nfoGetSchemeUC() ) + - cc::debug( "/" ) + - cc::num10( getRelay().serverIndex() ) ) - << ( desc() + " " + cc::error( "error in " ) + - cc::warn( "eth_subscribe/newPendingTransactions" ) + - cc::error( " rpc method, unknown exception " ) ); - nlohmann::json joError = nlohmann::json::object(); + clog( dev::Verbosity::VerbosityError, + getRelay().nfoGetSchemeUC() + "/" + to_string( getRelay().serverIndex() ) ) + << ( desc() + " " + "error in " + "eth_subscribe/newPendingTransactions" + + " rpc method, unknown exception " ); + json joError = json::object(); joError["code"] = -32602; joError["message"] = "error in \"eth_subscribe/newPendingTransactions\" rpc method, unknown exception"; @@ -1500,8 +1112,8 @@ void SkaleWsPeer::eth_subscribe_newPendingTransactions( } } -void SkaleWsPeer::eth_subscribe_newHeads( e_server_mode_t /*esm*/, - const nlohmann::json& /*joRequest*/, nlohmann::json& joResponse, bool bIncludeTransactions ) { +void SkaleWsPeer::eth_subscribe_newHeads( e_server_mode_t /*esm*/, const json& /*joRequest*/, + json& joResponse, bool bIncludeTransactions ) { SkaleServerOverride* pSO = pso(); try { skutils::retain_release_ptr< SkaleWsPeer > pThis( this ); @@ -1522,23 +1134,23 @@ void SkaleWsPeer::eth_subscribe_newHeads( e_server_mode_t /*esm*/, pThis->ethereum()->transactionHashes( h ), pThis->ethereum()->sealEngine() ); Json::FastWriter fastWriter; - std::string s = fastWriter.write( jv ); - nlohmann::json joBlockDescription = nlohmann::json::parse( s ); + string s = fastWriter.write( jv ); + json joBlockDescription = json::parse( s ); // - nlohmann::json joParams = nlohmann::json::object(); + json joParams = json::object(); joParams["subscription"] = dev::toJS( iw | SKALED_WS_SUBSCRIPTION_TYPE_NEW_BLOCK ); joParams["result"] = joBlockDescription; - nlohmann::json joNotification = nlohmann::json::object(); + json joNotification = json::object(); joNotification["jsonrpc"] = "2.0"; joNotification["method"] = "eth_subscription"; joNotification["params"] = joParams; - std::string strNotification = joNotification.dump(); + string strNotification = joNotification.dump(); if ( pSO->opts_.isTraceCalls_ ) - clog( dev::VerbosityDebug, cc::info( pThis->getRelay().nfoGetSchemeUC() ) ) - << ( cc::ws_tx_inv( - " <<< " + pThis->getRelay().nfoGetSchemeUC() + "/TX <<< " ) + - pThis->desc() + cc::ws_tx( " <<< " ) + - pThis->implPreformatTrafficJsonMessage( strNotification, false ) ); + cdebug << pThis->getRelay().nfoGetSchemeUC() + << cc::ws_tx_inv( + " <<< " + pThis->getRelay().nfoGetSchemeUC() + "/TX <<< " ) + + pThis->desc() + cc::ws_tx( " <<< " ) + + pThis->implPreformatTrafficJsonMessage( strNotification, false ); // skutils::dispatch::async( pThis->m_strPeerQueueID, [pThis, strNotification]() -> // void { bool bMessageSentOK = false; @@ -1549,34 +1161,20 @@ void SkaleWsPeer::eth_subscribe_newHeads( e_server_mode_t /*esm*/, if ( !bMessageSentOK ) throw std::runtime_error( "eth_subscription/newHeads failed to sent message" ); - stats::register_stats_answer( - ( std::string( "RPC/" ) + pThis->getRelay().nfoGetSchemeUC() ).c_str(), - "eth_subscription/newHeads", strNotification.size() ); - stats::register_stats_answer( - "RPC", "eth_subscription/newHeads", strNotification.size() ); } catch ( std::exception& ex ) { - clog( dev::Verbosity::VerbosityError, - cc::info( pThis->getRelay().nfoGetSchemeUC() ) + cc::debug( "/" ) + - cc::num10( pThis->getRelay().serverIndex() ) ) - << ( pThis->desc() + " " + cc::error( "error in " ) + - cc::warn( "eth_subscription/newHeads" ) + - cc::error( - " will uninstall watcher callback because of exception: " ) + - cc::warn( ex.what() ) ); + cerror << pThis->getRelay().nfoGetSchemeUC() << "/" + << pThis->getRelay().serverIndex() << pThis->desc() + << " error in eth_subscription/newHeads" + << " will uninstall watcher callback because of exception: " + << ex.what(); } catch ( ... ) { - clog( dev::Verbosity::VerbosityError, - cc::info( pThis->getRelay().nfoGetSchemeUC() ) + cc::debug( "/" ) + - cc::num10( pThis->getRelay().serverIndex() ) ) - << ( pThis->desc() + " " + cc::error( "error in " ) + - cc::warn( "eth_subscription/newHeads" ) + - cc::error( " will uninstall watcher callback because of unknown " - "exception" ) ); + cerror << pThis->getRelay().nfoGetSchemeUC() << "/" + << to_string( pThis->getRelay().serverIndex() ) + << pThis->desc() + " error in eth_subscription/newHeads" + << " will uninstall watcher callback because of unknown " + << "exception"; } if ( !bMessageSentOK ) { - stats::register_stats_error( - ( std::string( "RPC/" ) + pThis->getRelay().nfoGetSchemeUC() ).c_str(), - "eth_subscription/newHeads" ); - stats::register_stats_error( "RPC", "eth_subscription/newHeads" ); pThis->ethereum()->uninstallNewBlockWatch( iw ); } //} ); @@ -1585,38 +1183,30 @@ void SkaleWsPeer::eth_subscribe_newHeads( e_server_mode_t /*esm*/, unsigned iw = ethereum()->installNewBlockWatch( fnOnSunscriptionEvent ); setInstalledWatchesNewBlocks_.insert( iw ); iw |= SKALED_WS_SUBSCRIPTION_TYPE_NEW_BLOCK; - std::string strIW = dev::toJS( iw ); + string strIW = dev::toJS( iw ); if ( pSO->opts_.isTraceCalls_ ) - clog( dev::Verbosity::VerbosityTrace, cc::info( getRelay().nfoGetSchemeUC() ) + - cc::debug( "/" ) + - cc::num10( getRelay().serverIndex() ) ) - << ( desc() + " " + cc::info( "eth_subscribe/newHeads" ) + - cc::debug( " rpc method did installed watch " ) + cc::info( strIW ) ); + ctrace << getRelay().nfoGetSchemeUC() + "/" + to_string( getRelay().serverIndex() ) + << desc() << " eth_subscribe/newHeads" + << " rpc method did installed watch " << strIW; joResponse["result"] = strIW; } catch ( const std::exception& ex ) { if ( pSO->opts_.isTraceCalls_ ) - clog( dev::Verbosity::VerbosityError, cc::info( getRelay().nfoGetSchemeUC() ) + - cc::debug( "/" ) + - cc::num10( getRelay().serverIndex() ) ) - << ( desc() + " " + cc::error( "error in " ) + - cc::warn( "eth_subscribe/newHeads(" ) + - cc::error( " rpc method, exception " ) + cc::warn( ex.what() ) ); - nlohmann::json joError = nlohmann::json::object(); + clog( dev::Verbosity::VerbosityError, + getRelay().nfoGetSchemeUC() + "/" + to_string( getRelay().serverIndex() ) ) + << ( desc() + " " + "error in " + "eth_subscribe/newHeads(" + + " rpc method, exception " + ex.what() ); + json joError = json::object(); joError["code"] = -32602; joError["message"] = - std::string( "error in \"eth_subscribe/newHeads(\" rpc method, exception: " ) + - ex.what(); + string( "error in \"eth_subscribe/newHeads(\" rpc method, exception: " ) + ex.what(); joResponse["error"] = joError; return; } catch ( ... ) { if ( pSO->opts_.isTraceCalls_ ) - clog( dev::Verbosity::VerbosityError, cc::info( getRelay().nfoGetSchemeUC() ) + - cc::debug( "/" ) + - cc::num10( getRelay().serverIndex() ) ) - << ( desc() + " " + cc::error( "error in " ) + - cc::warn( "eth_subscribe/newHeads(" ) + - cc::error( " rpc method, unknown exception " ) ); - nlohmann::json joError = nlohmann::json::object(); + cerror << getRelay().nfoGetSchemeUC() << "/" << to_string( getRelay().serverIndex() ) + << desc() << " error in eth_subscribe/newHeads(" + << " rpc method, unknown exception "; + json joError = json::object(); joError["code"] = -32602; joError["message"] = "error in \"eth_subscribe/newHeads(\" rpc method, unknown exception"; joResponse["error"] = joError; @@ -1625,10 +1215,9 @@ void SkaleWsPeer::eth_subscribe_newHeads( e_server_mode_t /*esm*/, } void SkaleWsPeer::eth_subscribe_skaleStats( - e_server_mode_t /*esm*/, const nlohmann::json& joRequest, nlohmann::json& joResponse ) { + e_server_mode_t /*esm*/, const json& joRequest, json& joResponse ) { SkaleServerOverride* pSO = pso(); try { - // skutils::retain_release_ptr< SkaleWsPeer > pThis( this ); SkaleStatsSubscriptionManager::subscription_id_t idSubscription = 0; size_t nIntervalMilliseconds = 1000; if ( joRequest.count( "intervalMilliseconds" ) ) @@ -1637,38 +1226,31 @@ void SkaleWsPeer::eth_subscribe_skaleStats( bool bWasSubscribed = pSO->subscribe( idSubscription, this, nIntervalMilliseconds ); if ( !bWasSubscribed ) throw std::runtime_error( "internal subscription error" ); - std::string strIW = dev::toJS( idSubscription | SKALED_WS_SUBSCRIPTION_TYPE_SKALE_STATS ); + string strIW = dev::toJS( idSubscription | SKALED_WS_SUBSCRIPTION_TYPE_SKALE_STATS ); if ( pSO->opts_.isTraceCalls_ ) - clog( dev::Verbosity::VerbosityTrace, cc::info( getRelay().nfoGetSchemeUC() ) + - cc::debug( "/" ) + - cc::num10( getRelay().serverIndex() ) ) - << ( desc() + " " + cc::info( "eth_subscribe/skaleStats" ) + - cc::debug( " rpc method did installed watch " ) + cc::info( strIW ) ); + ctrace << getRelay().nfoGetSchemeUC() << "/" << getRelay().serverIndex() + << desc() + " eth_subscribe/skaleStats" + << " rpc method did installed watch " << strIW; joResponse["result"] = strIW; } catch ( const std::exception& ex ) { if ( pSO->opts_.isTraceCalls_ ) - clog( dev::Verbosity::VerbosityError, cc::info( getRelay().nfoGetSchemeUC() ) + - cc::debug( "/" ) + - cc::num10( getRelay().serverIndex() ) ) - << ( desc() + " " + cc::error( "error in " ) + - cc::warn( "eth_subscribe/newHeads(" ) + - cc::error( " rpc method, exception " ) + cc::warn( ex.what() ) ); - nlohmann::json joError = nlohmann::json::object(); + cerror << getRelay().nfoGetSchemeUC() << "/" << to_string( getRelay().serverIndex() ) + << desc() + " error in " << +"eth_subscribe/newHeads(" + << " rpc method, exception " << ex.what(); + json joError = json::object(); joError["code"] = -32602; joError["message"] = - std::string( "error in \"eth_subscribe/SkaleStats(\" rpc method, exception: " ) + - ex.what(); + string( "error in \"eth_subscribe/SkaleStats(\" rpc method, exception: " ) + ex.what(); joResponse["error"] = joError; return; } catch ( ... ) { if ( pSO->opts_.isTraceCalls_ ) clog( dev::Verbosity::VerbosityError, cc::info( getRelay().nfoGetSchemeUC() ) + cc::debug( "/" ) + - cc::num10( getRelay().serverIndex() ) ) - << ( desc() + " " + cc::error( "error in " ) + - cc::warn( "eth_subscribe/newHeads(" ) + - cc::error( " rpc method, unknown exception " ) ); - nlohmann::json joError = nlohmann::json::object(); + to_string( getRelay().serverIndex() ) ) + << ( desc() + " " + cc::error( "error in " ) + "eth_subscribe/newHeads(" + + " rpc method, unknown exception " ); + json joError = json::object(); joError["code"] = -32602; joError["message"] = "error in \"eth_subscribe/SkaleStats(\" rpc method, unknown exception"; joResponse["error"] = joError; @@ -1676,35 +1258,31 @@ void SkaleWsPeer::eth_subscribe_skaleStats( } } + void SkaleWsPeer::eth_unsubscribe( - e_server_mode_t /*esm*/, const nlohmann::json& joRequest, nlohmann::json& joResponse ) { + e_server_mode_t /*esm*/, const json& joRequest, json& joResponse ) { if ( !skale::server::helper::checkParamsIsArray( "eth_unsubscribe", joRequest, joResponse ) ) return; SkaleServerOverride* pSO = pso(); - const nlohmann::json& jarrParams = joRequest["params"]; + const json& jarrParams = joRequest["params"]; size_t idxParam, cntParams = jarrParams.size(); for ( idxParam = 0; idxParam < cntParams; ++idxParam ) { - const nlohmann::json& joParamItem = jarrParams[idxParam]; + const json& joParamItem = jarrParams[idxParam]; unsigned iw = unsigned( -1 ); if ( joParamItem.is_string() ) { - std::string strIW = skutils::tools::trim_copy( joParamItem.get< std::string >() ); + string strIW = skutils::tools::trim_copy( joParamItem.get< string >() ); if ( !strIW.empty() ) iw = unsigned( std::stoul( strIW.c_str(), nullptr, 0 ) ); } else if ( joParamItem.is_number_integer() ) { iw = joParamItem.get< unsigned >(); } if ( iw == unsigned( -1 ) ) { - if ( pSO->opts_.isTraceCalls_ ) - clog( dev::Verbosity::VerbosityError, cc::info( getRelay().nfoGetSchemeUC() ) + - cc::debug( "/" ) + - cc::num10( getRelay().serverIndex() ) ) - << ( desc() + " " + cc::error( "error in " ) + cc::warn( "eth_unsubscribe" ) + - cc::error( " rpc method, bad subscription ID " ) + - cc::j( joParamItem ) ); - nlohmann::json joError = nlohmann::json::object(); + auto errMessage = + "eth_unsubscribe rpc method, bad subscription ID " + joParamItem.dump(); + cerror << errMessage; + json joError = json::object(); joError["code"] = -32602; - joError["message"] = - "error in \"eth_unsubscribe\" rpc method, ad subscription ID " + joParamItem.dump(); + joError["message"] = errMessage; joResponse["error"] = joError; return; } @@ -1713,16 +1291,15 @@ void SkaleWsPeer::eth_unsubscribe( if ( setInstalledWatchesNewPendingTransactions_.find( iw & ( ~( SKALED_WS_SUBSCRIPTION_TYPE_MASK ) ) ) == setInstalledWatchesNewPendingTransactions_.end() ) { - std::string strIW = dev::toJS( iw ); + string strIW = dev::toJS( iw ); if ( pSO->opts_.isTraceCalls_ ) clog( dev::Verbosity::VerbosityError, cc::info( getRelay().nfoGetSchemeUC() ) + cc::debug( "/" ) + - cc::num10( getRelay().serverIndex() ) ) + to_string( getRelay().serverIndex() ) ) << ( desc() + " " + cc::error( "error in " ) + - cc::warn( "eth_unsubscribe/newPendingTransactionWatch" ) + - cc::error( " rpc method, bad subscription ID " ) + - cc::warn( strIW ) ); - nlohmann::json joError = nlohmann::json::object(); + "eth_unsubscribe/newPendingTransactionWatch" + + " rpc method, bad subscription ID " + strIW ); + json joError = json::object(); joError["code"] = -32602; joError["message"] = "error in \"eth_unsubscribe/newPendingTransactionWatch\" rpc method, ad " @@ -1738,16 +1315,14 @@ void SkaleWsPeer::eth_unsubscribe( if ( setInstalledWatchesNewBlocks_.find( iw & ( ~( SKALED_WS_SUBSCRIPTION_TYPE_MASK ) ) ) == setInstalledWatchesNewBlocks_.end() ) { - std::string strIW = dev::toJS( iw ); - if ( pSO->opts_.isTraceCalls_ ) + string strIW = dev::toJS( iw ); + if ( pSO->opts_.isTraceCalls_ ) { clog( dev::Verbosity::VerbosityError, - cc::info( getRelay().nfoGetSchemeUC() ) + cc::debug( "/" ) + - cc::num10( getRelay().serverIndex() ) ) - << ( desc() + " " + cc::error( "error in " ) + - cc::warn( "eth_unsubscribe/newHeads" ) + - cc::error( " rpc method, bad subscription ID " ) + - cc::warn( strIW ) ); - nlohmann::json joError = nlohmann::json::object(); + getRelay().nfoGetSchemeUC() + "/" + to_string( getRelay().serverIndex() ) + + desc() + " " + "error in " + "eth_unsubscribe/newHeads" + + " rpc method, bad subscription ID " + strIW ); + } + json joError = json::object(); joError["code"] = -32602; joError["message"] = "error in \"eth_unsubscribe/newHeads\" rpc method, ad subscription ID " + strIW; @@ -1762,16 +1337,13 @@ void SkaleWsPeer::eth_unsubscribe( iw & ( ~( SKALED_WS_SUBSCRIPTION_TYPE_SKALE_STATS ) ) ); bool bWasUnsubscribed = pSO->unsubscribe( idSubscription ); if ( !bWasUnsubscribed ) { - std::string strIW = dev::toJS( iw ); + string strIW = dev::toJS( iw ); if ( pSO->opts_.isTraceCalls_ ) - clog( dev::Verbosity::VerbosityError, - cc::info( getRelay().nfoGetSchemeUC() ) + cc::debug( "/" ) + - cc::num10( getRelay().serverIndex() ) ) - << ( desc() + " " + cc::error( "error in " ) + - cc::warn( "eth_unsubscribe/newHeads" ) + - cc::error( " rpc method, bad subscription ID " ) + - cc::warn( strIW ) ); - nlohmann::json joError = nlohmann::json::object(); + clog( dev::Verbosity::VerbosityError, getRelay().nfoGetSchemeUC() ) + << "/" << getRelay().serverIndex() << desc() + << " error in eth_unsubscribe/newHeads rpc method, bad subscription ID " + << strIW; + json joError = json::object(); joError["code"] = -32602; joError["message"] = "error in \"eth_unsubscribe/skaleStats\" rpc method, ad subscription ID " + @@ -1781,16 +1353,14 @@ void SkaleWsPeer::eth_unsubscribe( } // if ( !bWasUnsubscribed ) } else { if ( setInstalledWatchesLogs_.find( iw ) == setInstalledWatchesLogs_.end() ) { - std::string strIW = dev::toJS( iw ); - if ( pSO->opts_.isTraceCalls_ ) - clog( dev::Verbosity::VerbosityError, - cc::info( getRelay().nfoGetSchemeUC() ) + cc::debug( "/" ) + - cc::num10( getRelay().serverIndex() ) ) - << ( desc() + " " + cc::error( "error in " ) + - cc::warn( "eth_unsubscribe/logs" ) + - cc::error( " rpc method, bad subscription ID " ) + - cc::warn( strIW ) ); - nlohmann::json joError = nlohmann::json::object(); + string strIW = dev::toJS( iw ); + if ( pSO->opts_.isTraceCalls_ ) { + clog( dev::Verbosity::VerbosityError, getRelay().nfoGetSchemeUC() ) + << "/" << to_string( getRelay().serverIndex() ) << desc() + << " error in eth_unsubscribe/logs" + << " rpc method, bad subscription ID " + strIW; + } + json joError = json::object(); joError["code"] = -32602; joError["message"] = "error in \"eth_unsubscribe/logs\" rpc method, ad subscription ID " + strIW; @@ -1800,26 +1370,23 @@ void SkaleWsPeer::eth_unsubscribe( ethereum()->uninstallWatch( iw ); setInstalledWatchesLogs_.erase( iw ); } - } // for ( idxParam = 0; idxParam < cntParams; ++idxParam ) + } } -std::string SkaleWsPeer::implPreformatTrafficJsonMessage( - const std::string& strJSON, bool isRequest ) const { +string SkaleWsPeer::implPreformatTrafficJsonMessage( const string& strJSON, bool isRequest ) const { try { - nlohmann::json jo = nlohmann::json::parse( strJSON ); + json jo = json::parse( strJSON ); return implPreformatTrafficJsonMessage( jo, isRequest ); } catch ( ... ) { } - return cc::error( isRequest ? "bad JSON request" : "bad JSON response" ) + " " + - cc::warn( strJSON ); + return isRequest ? "bad JSON request" : "bad JSON response " + strJSON; } -std::string SkaleWsPeer::implPreformatTrafficJsonMessage( - const nlohmann::json& jo, bool isRequest ) const { +string SkaleWsPeer::implPreformatTrafficJsonMessage( const json& jo, bool isRequest ) const { const SkaleServerOverride* pSO = pso(); if ( pSO ) return pSO->implPreformatTrafficJsonMessage( jo, isRequest ); - nlohmann::json jo2 = jo; + json jo2 = jo; SkaleServerOverride::stat_transformJsonForLogOutput( jo2, isRequest, SkaleServerOverride::g_nMaxStringValueLengthForJsonLogs, SkaleServerOverride::g_nMaxStringValueLengthForTransactionParams ); @@ -1850,7 +1417,7 @@ SkaleRelayWS::SkaleRelayWS( int ipVer, const char* strBindAddr, strBindAddr_.clear(); } if ( !strBindAddr_.empty() ) { - std::list< std::pair< std::string, std::string > > listIfaceInfos = + std::list< std::pair< string, string > > listIfaceInfos = skutils::network::get_machine_ip_addresses( ( ipVer_ == 6 ) ? false : true, ( ipVer_ == 6 ) ? true : false ); strInterfaceName_ = @@ -1863,14 +1430,13 @@ SkaleRelayWS::SkaleRelayWS( int ipVer, const char* strBindAddr, SkaleWsPeer* pSkalePeer = nullptr; SkaleServerOverride* pSO = pso(); if ( pSO->opts_.isTraceCalls_ ) - clog( dev::VerbosityTrace, cc::info( m_strSchemeUC ) ) - << ( cc::notice( "Will instantiate new peer" ) ); + ctrace << m_strSchemeUC << "Will instantiate new peer"; if ( pSO->isShutdownMode() ) { - clog( dev::VerbosityWarning, - cc::info( m_strSchemeUC ) + cc::debug( "/" ) + cc::num10( serverIndex() ) ) - << ( cc::ws_rx_inv( " >>> " + m_strSchemeUC + "/" + - std::to_string( serverIndex() ) + "/RX >>> " ) + - cc::warn( "Skipping connection accept while in shutdown mode" ) ); + clog( dev::VerbosityWarning, m_strSchemeUC ) + << "/" << serverIndex() + << cc::ws_rx_inv( + " >>> " + m_strSchemeUC + "/" + to_string( serverIndex() ) + "/RX >>> " ) + << "Skipping connection accept while in shutdown mode"; return pSkalePeer; } pSkalePeer = new SkaleWsPeer( srv, hdl ); @@ -1934,12 +1500,11 @@ bool SkaleRelayWS::start( SkaleServerOverride* pSO ) { stop(); m_pSO = pSO; server_disable_ipv6_ = ( ipVer_ == 6 ) ? false : true; - clog( dev::VerbosityDebug, cc::info( m_strSchemeUC ) ) - << ( cc::notice( "Will start server on port " ) + cc::c( m_nPort ) ); + cdebug << m_strSchemeUC << "Will start server on port " << m_nPort; if ( !open( m_strScheme_, m_nPort, ( !strInterfaceName_.empty() ) ? strInterfaceName_.c_str() : nullptr ) ) { - clog( dev::VerbosityError, cc::fatal( m_strSchemeUC + " ERROR:" ) ) - << ( cc::error( "Failed to start server on port " ) + cc::c( m_nPort ) ); + cerror << m_strSchemeUC << " ERROR:" + << "Failed to start server on port " << m_nPort; return false; } std::thread( [pThis]() { @@ -1956,22 +1521,18 @@ bool SkaleRelayWS::start( SkaleServerOverride* pSO ) { } ); } catch ( ... ) { } - // pThis->m_isRunning = false; } ).detach(); - clog( dev::VerbosityDebug, cc::info( m_strSchemeUC ) ) - << ( cc::success( "OK, server started on port " ) + cc::c( m_nPort ) ); + cdebug << m_strSchemeUC << "Server started on port " << m_nPort; return true; } void SkaleRelayWS::stop() { if ( !isRunning() ) return; - clog( dev::VerbosityDebug, cc::info( m_strSchemeUC ) ) - << ( cc::notice( "Will stop on port " ) + cc::c( m_nPort ) + cc::notice( "..." ) ); + cdebug << m_strSchemeUC << "Will stop on port " << m_nPort; m_isRunning = false; waitWhileInLoop(); close(); - clog( dev::VerbosityInfo, cc::info( m_strSchemeUC ) ) - << ( cc::success( "OK, server stopped on port " ) + cc::c( m_nPort ) ); + cnote << m_strSchemeUC << "Server stopped on port " << m_nPort; } dev::eth::Interface* SkaleRelayWS::ethereum() const { @@ -2020,16 +1581,11 @@ const double SkaleServerOverride::g_lfDefaultExecutionDurationMaxForPerformanceW SkaleServerOverride::SkaleServerOverride( dev::eth::ChainParams& chainParams, dev::eth::Interface* pEth, const opts_t& opts ) : AbstractServerConnector(), chainParams_( chainParams ), pEth_( pEth ), opts_( opts ) { - // - // // proxygen-related init skutils::http_pg::init_logging( "skaled" ); skutils::http_pg::install_logging_fail_func( []() -> void { - clog( dev::VerbosityError, "generic" ) << ( cc::fatal( "CRITICAL ERROR:" ) + " " + - cc::error( "Proxygen abort handler called." ) ); + clog( dev::VerbosityError, "generic" ) << "CRITICAL ERROR: Proxygen abort handler called."; } ); - // - // { // block std::function< void( const unsigned& iw, const dev::eth::Block& block ) > @@ -2037,32 +1593,16 @@ SkaleServerOverride::SkaleServerOverride( [this]( const unsigned& /*iw*/, const dev::eth::Block& block ) -> void { dev::h256 h = block.info().hash(); dev::eth::TransactionHashes arrTxHashes = ethereum()->transactionHashes( h ); - size_t cntTXs = arrTxHashes.size(); - lock_type lock( mtxStats_ ); - statsBlocks_.event_add( "blocks", 1 ); - statsTransactions_.event_add( "transactions", cntTXs ); }; - statsBlocks_.event_queue_add( "blocks", - 0 // stats::g_nSizeDefaultOnQueueAdd - ); - statsTransactions_.event_queue_add( "transactions", - 0 // stats::g_nSizeDefaultOnQueueAdd - ); iwBlockStats_ = ethereum()->installNewBlockWatch( fnOnSunscriptionEvent ); - } // block - { // block + } + { std::function< void( const unsigned& iw, const dev::eth::Transaction& tx ) > fnOnSunscriptionEvent = - [this]( const unsigned& /*iw*/, const dev::eth::Transaction& /*tx*/ ) -> void { - lock_type lock( mtxStats_ ); - statsPendingTx_.event_add( "transactionsPending", 1 ); - }; - statsPendingTx_.event_queue_add( "transactionsPending", - 0 // stats::g_nSizeDefaultOnQueueAdd - ); + [this]( const unsigned& /*iw*/, const dev::eth::Transaction& /*tx*/ ) -> void {}; iwPendingTransactionStats_ = ethereum()->installNewPendingTransactionWatch( fnOnSunscriptionEvent ); - } // block + } } SkaleServerOverride::~SkaleServerOverride() { @@ -2077,39 +1617,6 @@ SkaleServerOverride::~SkaleServerOverride() { StopListening(); } -nlohmann::json SkaleServerOverride::generateBlocksStats() { - lock_type lock( mtxStats_ ); - nlohmann::json joStats = nlohmann::json::object(); - skutils::stats::time_point tpNow = skutils::stats::clock::now(); - const double lfBlocksPerSecond = statsBlocks_.compute_eps_smooth( "blocks", tpNow ); - double lfTransactionsPerSecond = statsTransactions_.compute_eps_smooth( "transactions", tpNow ); - if ( lfTransactionsPerSecond >= 1.0 ) - lfTransactionsPerSecond -= 1.0; // workaround for UnitsPerSecond in skutils::stats - if ( lfTransactionsPerSecond <= 1.0 ) - lfTransactionsPerSecond = 0.0; - double lfTransactionsPerBlock = - ( lfBlocksPerSecond > 0.0 ) ? ( lfTransactionsPerSecond / lfBlocksPerSecond ) : 0.0; - if ( lfTransactionsPerBlock >= 1.0 ) - lfTransactionsPerBlock -= 1.0; // workaround for UnitsPerSecond in skutils::stats - if ( lfTransactionsPerBlock <= 1.0 ) - lfTransactionsPerBlock = 0.0; - if ( lfTransactionsPerBlock == 0.0 ) - lfTransactionsPerSecond = 0.0; - if ( lfTransactionsPerSecond == 0.0 ) - lfTransactionsPerBlock = 0.0; - double lfPendingTxPerSecond = - statsPendingTx_.compute_eps_smooth( "transactionsPending", tpNow ); - if ( lfPendingTxPerSecond >= 1.0 ) - lfPendingTxPerSecond -= 1.0; // workaround for UnitsPerSecond in skutils::stats - if ( lfPendingTxPerSecond <= 1.0 ) - lfPendingTxPerSecond = 0.0; - joStats["blocksPerSecond"] = lfBlocksPerSecond; - joStats["transactionsPerSecond"] = lfTransactionsPerSecond; - joStats["transactionsPerBlock"] = lfTransactionsPerBlock; - joStats["pendingTxPerSecond"] = lfPendingTxPerSecond; - return joStats; -} - dev::eth::Interface* SkaleServerOverride::ethereum() const { if ( !pEth_ ) { cerror << "SKALE server fatal error: no eth interface\n"; @@ -2127,7 +1634,7 @@ const dev::eth::ChainParams& SkaleServerOverride::chainParams() const { return chainParams_; } -dev::Verbosity SkaleServerOverride::methodTraceVerbosity( const std::string& strMethod ) const { +dev::Verbosity SkaleServerOverride::methodTraceVerbosity( const string& strMethod ) const { // skip if disabled completely if ( !this->opts_.isTraceCalls_ && !this->opts_.isTraceSpecialCalls_ ) return dev::VerbositySilent; @@ -2151,14 +1658,14 @@ dev::Verbosity SkaleServerOverride::methodTraceVerbosity( const std::string& str return dev::VerbositySilent; } -bool SkaleServerOverride::checkAdminOriginAllowed( const std::string& origin ) const { +bool SkaleServerOverride::checkAdminOriginAllowed( const string& origin ) const { return chainParams().checkAdminOriginAllowed( origin ); } -jsonrpc::IClientConnectionHandler* SkaleServerOverride::GetHandler( const std::string& url ) { +jsonrpc::IClientConnectionHandler* SkaleServerOverride::GetHandler( const string& url ) { if ( jsonrpc::AbstractServerConnector::GetHandler() != nullptr ) return AbstractServerConnector::GetHandler(); - std::map< std::string, jsonrpc::IClientConnectionHandler* >::iterator it = + std::map< string, jsonrpc::IClientConnectionHandler* >::iterator it = this->urlhandler.find( url ); if ( it != this->urlhandler.end() ) return it->second; @@ -2167,50 +1674,44 @@ jsonrpc::IClientConnectionHandler* SkaleServerOverride::GetHandler( const std::s void SkaleServerOverride::logPerformanceWarning( double lfExecutionDuration, int ipVer, const char* strProtocol, int nServerIndex, e_server_mode_t esm, const char* strOrigin, - const char* strMethod, nlohmann::json joID ) { - std::stringstream ssProtocol; + const char* strMethod, json joID ) { + stringstream ssProtocol; strProtocol = ( strProtocol && strProtocol[0] ) ? strProtocol : "Unknown network protocol"; ssProtocol << cc::info( strProtocol ); if ( ipVer > 0 ) - ssProtocol << cc::debug( "/" ) << cc::notice( "IPv" ) << cc::num10( ipVer ); - if ( nServerIndex >= 0 ) - ssProtocol << cc::debug( "/" ) << cc::num10( nServerIndex ); - ssProtocol << cc::debug( "/" ) << cc::notice( esm2str( esm ) ); - ssProtocol << cc::info( std::string( ":" ) ); - std::string strProtocolDescription = ssProtocol.str(); - // - std::string strCallID = joID.dump(); - // - std::stringstream ssMessage; - ssMessage << cc::deep_warn( "Performance warning:" ) << " " << cc::c( lfExecutionDuration ) - << cc::warn( " seconds execution time for " ) << cc::info( strMethod ) - << cc::warn( " call with " ) << cc::notice( "id" ) << cc::warn( "=" ) - << cc::info( strCallID ) << cc::warn( " when called from origin " ) - << cc::notice( strOrigin ); + ssProtocol << "/IPv" << ipVer; if ( nServerIndex >= 0 ) - ssMessage << cc::warn( " through server with " ) << cc::notice( "index" ) << cc::warn( "=" ) - << cc::num10( nServerIndex ); - std::string strMessage = ssMessage.str(); - clog( dev::VerbosityWarning, strProtocolDescription ) << strMessage; + ssProtocol << "/" << nServerIndex; + ssProtocol << "/" << esm2str( esm ) << ":"; + string strProtocolDescription = ssProtocol.str(); + + string strCallID = joID.dump(); + clog( dev::VerbosityWarning, strProtocolDescription ) + << "Performance warning:" + << " " << lfExecutionDuration << " seconds execution time for " << strMethod + << " call with id =" << strCallID << " when called from origin " << strOrigin + << "through server with index =" << nServerIndex; + ; } void SkaleServerOverride::logTraceServerEvent( bool isError, int ipVer, const char* strProtocol, - int nServerIndex, e_server_mode_t esm, const std::string& strMessage ) { + int nServerIndex, e_server_mode_t esm, const string& strMessage ) { if ( strMessage.empty() ) return; - std::stringstream ssProtocol; + stringstream ssProtocol; strProtocol = ( strProtocol && strProtocol[0] ) ? strProtocol : "Unknown network protocol"; - ssProtocol << cc::info( strProtocol ); + ssProtocol << strProtocol; if ( ipVer > 0 ) - ssProtocol << cc::debug( "/" ) << cc::notice( "IPv" ) << cc::num10( ipVer ); + ssProtocol << "/" + << "IPv" << ipVer; if ( nServerIndex >= 0 ) - ssProtocol << cc::debug( "/" ) << cc::num10( nServerIndex ); - ssProtocol << cc::debug( "/" ) << cc::notice( esm2str( esm ) ); + ssProtocol << "/" << nServerIndex; + ssProtocol << "/" << esm2str( esm ); if ( isError ) - ssProtocol << cc::fatal( std::string( " ERROR:" ) ); + ssProtocol << " ERROR:"; else - ssProtocol << cc::info( std::string( ":" ) ); - std::string strProtocolDescription = ssProtocol.str(); + ssProtocol << ":"; + string strProtocolDescription = ssProtocol.str(); if ( isError ) clog( dev::VerbosityError, strProtocolDescription ) << strMessage; else @@ -2219,73 +1720,64 @@ void SkaleServerOverride::logTraceServerEvent( bool isError, int ipVer, const ch void SkaleServerOverride::logTraceServerTraffic( bool isRX, dev::Verbosity verbosity, int ipVer, const char* strProtocol, int nServerIndex, e_server_mode_t esm, const char* strOrigin, - const std::string& strPayload ) { + const string& strPayload ) { bool isError = verbosity == dev::VerbosityError; - std::stringstream ssProtocol; - std::string strProto = - ( strProtocol && strProtocol[0] ) ? strProtocol : "Unknown network protocol"; + stringstream ssProtocol; + string strProto = ( strProtocol && strProtocol[0] ) ? strProtocol : "Unknown network protocol"; strOrigin = ( strOrigin && strOrigin[0] ) ? strOrigin : "unknown origin"; - std::string strErrorSuffix, strOriginSuffix, strDirect; + string strErrorSuffix, strOriginSuffix, strDirect; if ( isRX ) { strDirect = cc::ws_rx( " >>> " ); ssProtocol << cc::ws_rx_inv( " >>> " + strProto ); if ( ipVer > 0 ) - ssProtocol << cc::debug( "/" ) << cc::notice( "IPv" ) << cc::num10( ipVer ); + ssProtocol << "/" + << "IPv" << ipVer; if ( nServerIndex >= 0 ) ssProtocol << cc::ws_rx_inv( "/" + std::to_string( nServerIndex ) ); - ssProtocol << cc::debug( "/" ) << cc::notice( esm2str( esm ) ); + ssProtocol << "/" << esm2str( esm ); ssProtocol << cc::ws_rx_inv( "/RX >>> " ); } else { strDirect = cc::ws_tx( " <<< " ); ssProtocol << cc::ws_tx_inv( " <<< " + strProto ); if ( ipVer > 0 ) - ssProtocol << cc::debug( "/" ) << cc::notice( "IPv" ) << cc::num10( ipVer ); + ssProtocol << "/IPv" << ipVer; if ( nServerIndex >= 0 ) ssProtocol << cc::ws_tx_inv( "/" + std::to_string( nServerIndex ) ); - ssProtocol << cc::debug( "/" ) << cc::notice( esm2str( esm ) ); - ssProtocol << cc::ws_tx_inv( "/TX <<< " ); + ssProtocol << "/" << esm2str( esm ) << cc::ws_tx_inv( "/TX <<< " ); } strOriginSuffix = cc::u( strOrigin ); if ( isError ) - strErrorSuffix = cc::fatal( " ERROR " ); - std::string strProtocolDescription = ssProtocol.str(); + strErrorSuffix = " ERROR "; + string strProtocolDescription = ssProtocol.str(); clog( verbosity, strProtocolDescription ) - << ( strErrorSuffix + strOriginSuffix + strDirect + strPayload ); + << strErrorSuffix << strOriginSuffix << strDirect << strPayload; } static void stat_check_port_availability_for_server_to_start_listen( int ipVer, const char* strAddr, int nPort, e_server_mode_t esm, const char* strProtocolName, int nServerIndex, SkaleServerOverride* pSO ) { pSO->logTraceServerEvent( false, ipVer, strProtocolName, nServerIndex, esm, - cc::debug( "Will check port " ) + cc::num10( nPort ) + - cc::debug( "/IPv" + std::to_string( ipVer ) ) + cc::debug( "/" ) + - cc::notice( esm2str( esm ) ) + cc::debug( " availability for " ) + - cc::info( strProtocolName ) + cc::debug( " server..." ) ); + "Will check port " + to_string( nPort ) + "/IPv" + std::to_string( ipVer ) + "/" + + esm2str( esm ) + " availability for " + strProtocolName ); skutils::network::sockaddr46 sa46; - std::string strError = + string strError = skutils::network::resolve_address_for_client_connection( ipVer, strAddr, sa46 ); - if ( !strError.empty() ) + if ( !strError.empty() ) { throw std::runtime_error( - std::string( "Failed to check " ) + std::string( strProtocolName ) + - std::string( " server listen IP address availability for address \"" ) + strAddr + - std::string( "\" on IPv" ) + std::to_string( ipVer ) + cc::debug( "/" ) + - cc::notice( esm2str( esm ) ) + - std::string( - ", please check network interface with this IP address exist, error details: " ) + + string( "Failed to check " ) + strProtocolName + + " server listen IP address availability for address " + strAddr + " on IPv" + + to_string( ipVer ) + "/" + esm2str( esm ) + + ", please check network interface with this IP address exist, error details: " + strError ); - if ( is_tcp_port_listening( ipVer, sa46, nPort ) ) - throw std::runtime_error( - std::string( "Cannot start " ) + std::string( strProtocolName ) + - std::string( " server on address \"" ) + strAddr + std::string( "\", port " ) + - std::to_string( nPort ) + std::string( ", IPv" ) + std::to_string( ipVer ) + - std::string( "/" ) + esm2str( esm ) + std::string( " - port is already listening" ) ); - pSO->logTraceServerEvent( false, ipVer, strProtocolName, nServerIndex, esm, - cc::notice( "Port " ) + cc::num10( nPort ) + - cc::notice( "/IPv" + std::to_string( ipVer ) ) + cc::debug( "/" ) + - cc::notice( esm2str( esm ) ) + cc::notice( " is free for " ) + - cc::info( strProtocolName ) + cc::notice( " server to start" ) ); + } + if ( is_tcp_port_listening( ipVer, sa46, nPort ) ) { + throw std::runtime_error( string( "Cannot start " ) + strProtocolName + + " server on address \"" + strAddr + "\", port " + + to_string( nPort ) + ", IPv" + to_string( ipVer ) + "/" + + esm2str( esm ) + " - port is already listening" ); + } } string hostname_to_ip( string hostname ) { @@ -2307,26 +1799,25 @@ string hostname_to_ip( string hostname ) { return ""; } -skutils::result_of_http_request SkaleServerOverride::implHandleHttpRequest( - const nlohmann::json& joIn, const std::string& strProtocol, int nServerIndex, - std::string strOrigin, int ipVer, int nPort, e_server_mode_t esm ) { +skutils::result_of_http_request SkaleServerOverride::implHandleHttpRequest( const json& _joIn, + const string& _protocol, int _serverIndex, string _origin, int _ipVer, int _port, + e_server_mode_t _esm ) { skutils::result_of_http_request rslt; rslt.isBinary_ = false; - std::string strMethod; - nlohmann::json jarrRequest, joID = "-1"; + string strMethod; + json jarrRequest, joID = "-1"; bool isBatch = false; try { // fetch method name and id earlier - if ( joIn.is_array() ) { + if ( _joIn.is_array() ) { isBatch = true; - jarrRequest = joIn; + jarrRequest = _joIn; } else { - jarrRequest = nlohmann::json::array(); - jarrRequest.push_back( joIn ); + jarrRequest = json::array(); + jarrRequest.push_back( _joIn ); } - for ( const nlohmann::json& jsonRpcRequest : jarrRequest ) { - std::string methodName = - skutils::tools::getFieldSafe< std::string >( jsonRpcRequest, "method" ); + for ( const json& jsonRpcRequest : jarrRequest ) { + string methodName = skutils::tools::getFieldSafe< string >( jsonRpcRequest, "method" ); if ( methodName.empty() ) throw std::runtime_error( "Bad JSON RPC request, \"method\" name is missing" ); @@ -2341,18 +1832,18 @@ skutils::result_of_http_request SkaleServerOverride::implHandleHttpRequest( throw std::runtime_error( "Bad JSON RPC request, too much requests in batch" ); } } catch ( ... ) { - std::string e = "Bad JSON RPC request: " + joIn.dump(); + string e = "Bad JSON RPC request: " + _joIn.dump(); throw std::runtime_error( e ); } - // - // unddos - skutils::url url_unddos_origin( strOrigin ); - const std::string str_unddos_origin = url_unddos_origin.host(); + + skutils::url url_unddos_origin( _origin ); + const string str_unddos_origin = url_unddos_origin.host(); static string mainnet_proxy_ip_address = hostname_to_ip( "api.skalenodes.com" ); static string testnet_proxy_ip_address = hostname_to_ip( "testnet-api.skalenodes.com" ); - skutils::unddos::e_high_load_detection_result_t ehldr; + skutils::unddos::e_high_load_detection_result_t ehldr = + skutils::unddos::e_high_load_detection_result_t::ehldr_no_error; if ( str_unddos_origin == mainnet_proxy_ip_address || str_unddos_origin == testnet_proxy_ip_address ) { ehldr = skutils::unddos::e_high_load_detection_result_t::ehldr_no_error; @@ -2360,154 +1851,123 @@ skutils::result_of_http_request SkaleServerOverride::implHandleHttpRequest( ehldr = unddos_.register_call_from_origin( str_unddos_origin, strMethod ); } switch ( ehldr ) { - case skutils::unddos::e_high_load_detection_result_t::ehldr_peak: // ban by too high - // load per minute - case skutils::unddos::e_high_load_detection_result_t::ehldr_lengthy: // ban by too high - // load per second - case skutils::unddos::e_high_load_detection_result_t::ehldr_ban: // still banned + case skutils::unddos::e_high_load_detection_result_t::ehldr_detected_ban_per_sec: // ban by too + // high load + // per minute + case skutils::unddos::e_high_load_detection_result_t::ehldr_detected_ban_per_min: // ban by too + // high load + // per second + case skutils::unddos::e_high_load_detection_result_t::ehldr_already_banned: // still banned case skutils::unddos::e_high_load_detection_result_t::ehldr_bad_origin: { if ( strMethod.empty() ) strMethod = isBatch ? "batch_json_rpc_request" : "unknown_json_rpc_method"; - std::string reason_part = + string reason_part = ( ehldr == skutils::unddos::e_high_load_detection_result_t::ehldr_bad_origin ) ? "bad origin" : "high load"; - std::string e = "Banned due to " + reason_part + " JSON RPC request: " + joIn.dump(); + string e = "Banned due to " + reason_part + " JSON RPC request: " + _joIn.dump(); throw std::runtime_error( e ); } - // break; + case skutils::unddos::e_high_load_detection_result_t::ehldr_no_error: default: { // no error } break; - } // switch( ehldr ) - // - // - nlohmann::json jarrBatchAnswer; + } + json jarrBatchAnswer; if ( isBatch ) - jarrBatchAnswer = nlohmann::json::array(); - for ( const nlohmann::json& joRequest : jarrRequest ) { - std::string strBody = joRequest.dump(); // = req.body_; - std::string strPerformanceQueueName = - skutils::tools::format( "rpc/%s/%zu", strProtocol.c_str(), nServerIndex ); - std::string strPerformanceActionName = skutils::tools::format( - "%s task %zu, %s", strProtocol.c_str(), nTaskNumberCall_++, strMethod.c_str() ); - skutils::task::performance::action a( strPerformanceQueueName, strPerformanceActionName ); - // - skutils::stats::time_tracker::element_ptr_t rttElement; - rttElement.emplace( "RPC", strProtocol.c_str(), strMethod.c_str(), nServerIndex, ipVer ); - // + jarrBatchAnswer = json::array(); + for ( const json& joRequest : jarrRequest ) { + string strBody = joRequest.dump(); // = req.body_; + string strPerformanceQueueName = + skutils::tools::format( "rpc/%s/%zu", _protocol.c_str(), _serverIndex ); + string strPerformanceActionName = skutils::tools::format( + "%s task %zu, %s", _protocol.c_str(), nTaskNumberCall_++, strMethod.c_str() ); + + + auto beginTime = chrono::system_clock::now(); SkaleServerConnectionsTrackHelper sscth( *this ); if ( methodTraceVerbosity( strMethod ) != dev::VerbositySilent ) - logTraceServerTraffic( true, methodTraceVerbosity( strMethod ), ipVer, - strProtocol.c_str(), nServerIndex, esm, strOrigin.c_str(), + logTraceServerTraffic( true, methodTraceVerbosity( strMethod ), _ipVer, + _protocol.c_str(), _serverIndex, _esm, _origin.c_str(), implPreformatTrafficJsonMessage( strBody, true ) ); - std::string strResponse; - bool bPassed = false; + string strResponse; try { if ( is_connection_limit_overflow() ) { on_connection_overflow_peer_closed( - ipVer, strProtocol.c_str(), nServerIndex, nPort, esm ); + _ipVer, _protocol.c_str(), _serverIndex, _port, _esm ); throw std::runtime_error( "server too busy" ); } - strMethod = skutils::tools::getFieldSafe< std::string >( joRequest, "method" ); - if ( !handleAdminOriginFilter( strMethod, strOrigin ) ) { + strMethod = skutils::tools::getFieldSafe< string >( joRequest, "method" ); + if ( !handleAdminOriginFilter( strMethod, _origin ) ) { throw std::runtime_error( "origin not allowed for call attempt" ); } jsonrpc::IClientConnectionHandler* handler = GetHandler( "/" ); if ( handler == nullptr ) throw std::runtime_error( "No client connection handler found" ); - // - stats::register_stats_message( strProtocol.c_str(), "POST", strBody.size() ); - stats::register_stats_message( ( "RPC/" + strProtocol ).c_str(), joRequest ); - stats::register_stats_message( "RPC", joRequest ); - // std::vector< uint8_t > buffer; - if ( handleRequestWithBinaryAnswer( esm, joRequest, buffer ) ) { - stats::register_stats_answer( strProtocol.c_str(), "POST", buffer.size() ); - rttElement->stop(); + if ( handleRequestWithBinaryAnswer( _esm, joRequest, buffer ) ) { rslt.isBinary_ = true; rslt.vecBytes_ = buffer; return rslt; } - if ( !handleHttpSpecificRequest( strOrigin, esm, strBody, strResponse ) ) { + if ( !handleHttpSpecificRequest( _origin, _esm, strBody, strResponse ) ) { handler->HandleRequest( strBody.c_str(), strResponse ); } - // - stats::register_stats_answer( strProtocol.c_str(), "POST", strResponse.size() ); - nlohmann::json joResponse = nlohmann::json::parse( strResponse ); - stats::register_stats_answer( ( "RPC/" + strProtocol ).c_str(), joRequest, joResponse ); - stats::register_stats_answer( "RPC", joRequest, joResponse ); - // + + json joResponse = json::parse( strResponse ); if ( !isBatch ) { rslt.isBinary_ = false; - rslt.joOut_ = nlohmann::json::parse( strResponse ); + rslt.joOut_ = json::parse( strResponse ); } - a.set_json_out( joResponse ); - bPassed = true; } catch ( const std::exception& ex ) { - rttElement->setError(); - logTraceServerTraffic( false, dev::VerbosityError, ipVer, strProtocol.c_str(), - nServerIndex, esm, strOrigin.c_str(), cc::warn( ex.what() ) ); - nlohmann::json joErrorResponce; + logTraceServerTraffic( false, dev::VerbosityError, _ipVer, _protocol.c_str(), + _serverIndex, _esm, _origin.c_str(), ex.what() ); + json joErrorResponce; joErrorResponce["id"] = joID; - nlohmann::json joErrorObj; + json joErrorObj; joErrorObj["code"] = -32000; - joErrorObj["message"] = std::string( ex.what() ); + joErrorObj["message"] = string( ex.what() ); joErrorResponce["error"] = joErrorObj; strResponse = joErrorResponce.dump(); - stats::register_stats_exception( strProtocol.c_str(), "POST" ); - if ( !strMethod.empty() ) { - stats::register_stats_exception( strProtocol.c_str(), strMethod.c_str() ); - stats::register_stats_exception( "RPC", strMethod.c_str() ); - } if ( !isBatch ) { rslt.isBinary_ = false; rslt.joOut_ = joErrorResponce; } - a.set_json_err( joErrorResponce ); } catch ( ... ) { - rttElement->setError(); const char* e = "unknown exception in SkaleServerOverride"; - logTraceServerTraffic( false, dev::VerbosityError, ipVer, strProtocol.c_str(), - nServerIndex, esm, strOrigin.c_str(), cc::warn( e ) ); - nlohmann::json joErrorResponce; + logTraceServerTraffic( false, dev::VerbosityError, _ipVer, _protocol.c_str(), + _serverIndex, _esm, _origin.c_str(), e ); + json joErrorResponce; joErrorResponce["id"] = joID; - nlohmann::json joErrorObj; + json joErrorObj; joErrorObj["code"] = -32000; - joErrorObj["message"] = std::string( e ); + joErrorObj["message"] = string( e ); joErrorResponce["error"] = joErrorObj; strResponse = joErrorResponce.dump(); - stats::register_stats_exception( strProtocol.c_str(), "POST" ); - if ( !strMethod.empty() ) { - stats::register_stats_exception( strProtocol.c_str(), strMethod.c_str() ); - stats::register_stats_exception( "RPC", strMethod.c_str() ); - } if ( !isBatch ) { rslt.isBinary_ = false; rslt.joOut_ = joErrorResponce; } - a.set_json_err( joErrorResponce ); } if ( methodTraceVerbosity( strMethod ) != dev::VerbositySilent ) - logTraceServerTraffic( false, methodTraceVerbosity( strMethod ), ipVer, - strProtocol.c_str(), nServerIndex, esm, strOrigin.c_str(), + logTraceServerTraffic( false, methodTraceVerbosity( strMethod ), _ipVer, + _protocol.c_str(), _serverIndex, _esm, _origin.c_str(), implPreformatTrafficJsonMessage( strResponse, false ) ); if ( isBatch ) { - nlohmann::json joAnswerPart = nlohmann::json::parse( strResponse ); + json joAnswerPart = json::parse( strResponse ); jarrBatchAnswer.push_back( joAnswerPart ); } else { rslt.isBinary_ = false; - rslt.joOut_ = nlohmann::json::parse( strResponse ); + rslt.joOut_ = json::parse( strResponse ); } - if ( !bPassed ) - stats::register_stats_answer( strProtocol.c_str(), "POST", strResponse.size() ); - rttElement->stop(); - double lfExecutionDuration = rttElement->getDurationInSeconds(); // in seconds + uint64_t lfExecutionDuration = + chrono::duration_cast< chrono::seconds >( chrono::system_clock::now() - beginTime ) + .count(); if ( lfExecutionDuration >= opts_.lfExecutionDurationMaxForPerformanceWarning_ ) - logPerformanceWarning( lfExecutionDuration, ipVer, strProtocol.c_str(), nServerIndex, - esm, strOrigin.c_str(), strMethod.c_str(), joID ); - } // for( const nlohmann::json & joRequest : jarrRequest ) + logPerformanceWarning( lfExecutionDuration, _ipVer, _protocol.c_str(), _serverIndex, + _esm, _origin.c_str(), strMethod.c_str(), joID ); + } if ( isBatch ) { rslt.isBinary_ = false; // batch request can be only text/JSON rslt.joOut_ = jarrBatchAnswer; @@ -2517,9 +1977,9 @@ skutils::result_of_http_request SkaleServerOverride::implHandleHttpRequest( bool SkaleServerOverride::implStartListening( // web socket - std::shared_ptr< SkaleRelayWS >& pSrv, int ipVer, const std::string& strAddr, int nPort, - const std::string& strPathSslKey, const std::string& strPathSslCert, - const std::string& /*strPathSslCA*/, int nServerIndex, e_server_mode_t esm ) { + std::shared_ptr< SkaleRelayWS >& pSrv, int ipVer, const string& strAddr, int nPort, + const string& strPathSslKey, const string& strPathSslCert, const string& /*strPathSslCA*/, + int nServerIndex, e_server_mode_t esm ) { bool bIsSSL = false; if ( ( !strPathSslKey.empty() ) && ( !strPathSslCert.empty() ) ) bIsSSL = true; @@ -2527,11 +1987,8 @@ bool SkaleServerOverride::implStartListening( // web socket implStopListening( pSrv, ipVer, bIsSSL, esm ); if ( strAddr.empty() || nPort <= 0 ) return true; - logTraceServerEvent( false, ipVer, bIsSSL ? "WSS" : "WS", nServerIndex, esm, - cc::debug( "starting " ) + cc::info( bIsSSL ? "WSS" : "WS" ) + cc::debug( "/" ) + - cc::num10( nServerIndex ) + cc::debug( "/" ) + cc::notice( esm2str( esm ) ) + - cc::debug( " server on address " ) + cc::info( strAddr ) + - cc::debug( " and port " ) + cc::c( nPort ) + cc::debug( "..." ) ); + cnote << string( "starting " ) + to_string( nServerIndex ) + "/" + esm2str( esm ) + + " server on address " + strAddr + " and port " + to_string( nPort ); pSrv.reset( new SkaleRelayWS( ipVer, strAddr.c_str(), bIsSSL ? "wss" : "ws", nPort, esm, nServerIndex, &bns4ws_ ) ); if ( bIsSSL ) { @@ -2544,20 +2001,13 @@ bool SkaleServerOverride::implStartListening( // web socket // make server listen in its dedicated thread if ( !pSrv->start( this ) ) throw std::runtime_error( "Failed to start server" ); - logTraceServerEvent( false, ipVer, bIsSSL ? "WSS" : "WS", pSrv->serverIndex(), esm, - cc::success( "OK, started " ) + cc::info( bIsSSL ? "WSS" : "WS" ) + cc::debug( "/" ) + - cc::num10( pSrv->serverIndex() ) + cc::success( " server on address " ) + - cc::info( strAddr ) + cc::success( " and port " ) + cc::c( nPort ) + - cc::debug( "..." ) ); + cnote << "Started server"; + return true; } catch ( const std::exception& ex ) { - logTraceServerEvent( false, ipVer, bIsSSL ? "WSS" : "WS", pSrv->serverIndex(), esm, - cc::fatal( "FAILED" ) + cc::error( " to start " ) + cc::warn( bIsSSL ? "WSS" : "WS" ) + - cc::error( " server: " ) + cc::warn( ex.what() ) ); + cerror << "FAILED to start server: " << ex.what(); } catch ( ... ) { - logTraceServerEvent( false, ipVer, bIsSSL ? "WSS" : "WS", pSrv->serverIndex(), esm, - cc::fatal( "FAILED" ) + cc::error( " to start " ) + cc::warn( bIsSSL ? "WSS" : "WS" ) + - cc::error( " server: " ) + cc::warn( "unknown exception" ) ); + cerror << "FAILED to start server: unknown exception"; } try { implStopListening( pSrv, ipVer, bIsSSL, esm ); @@ -2567,10 +2017,9 @@ bool SkaleServerOverride::implStartListening( // web socket } bool SkaleServerOverride::implStartListening( // proxygen HTTP - std::shared_ptr< SkaleRelayProxygenHTTP >& pSrv, int ipVer, const std::string& strAddr, - int nPort, const std::string& strPathSslKey, const std::string& strPathSslCert, - const std::string& strPathSslCA, int nServerIndex, e_server_mode_t esm, int32_t threads, - int32_t threads_limit ) { + std::shared_ptr< SkaleRelayProxygenHTTP >& pSrv, int ipVer, const string& strAddr, int nPort, + const string& strPathSslKey, const string& strPathSslCert, const string& strPathSslCA, + int nServerIndex, e_server_mode_t esm, int32_t threads, int32_t threads_limit ) { bool bIsSSL = false; SkaleServerOverride* pSO = this; if ( ( !strPathSslKey.empty() ) && ( !strPathSslCert.empty() ) ) @@ -2579,12 +2028,8 @@ bool SkaleServerOverride::implStartListening( // proxygen HTTP implStopListening( pSrv, ipVer, bIsSSL, esm ); if ( strAddr.empty() || nPort <= 0 ) return true; - logTraceServerEvent( false, ipVer, bIsSSL ? "HTTPS" : "HTTP", -1, esm, - cc::debug( "starting " ) + cc::attention( "proxygen" ) + cc::debug( "/" ) + - cc::info( bIsSSL ? "HTTPS" : "HTTP" ) + cc::debug( "/" ) + - cc::num10( nServerIndex ) + cc::debug( "/" ) + cc::notice( esm2str( esm ) ) + - cc::debug( " server on address " ) + cc::info( strAddr ) + - cc::debug( " and port " ) + cc::c( nPort ) + cc::debug( "..." ) ); + cnote << "starting proxygen" << ( bIsSSL ? "HTTPS" : "HTTP" ) << "/" << nServerIndex << "/" + << esm2str( esm ) << " server on address " << strAddr << " and port " << nPort; // check if somebody is already listening @@ -2595,29 +2040,14 @@ bool SkaleServerOverride::implStartListening( // proxygen HTTP strPathSslCert.c_str(), strPathSslKey.c_str(), strPathSslCA.c_str(), nServerIndex, esm, threads, threads_limit ) ); // cher server listen in its dedicated thread(s) - if ( pSrv->is_running() ) - stats::register_stats_message( bIsSSL ? "HTTPS" : "HTTP", "LISTEN" ); - else + if ( !pSrv->is_running() ) throw std::runtime_error( "failed to start proxygen server instance" ); - logTraceServerEvent( false, ipVer, bIsSSL ? "HTTPS" : "HTTP", pSrv->serverIndex(), esm, - cc::success( "OK, started " ) + cc::attention( "proxygen" ) + cc::debug( "/" ) + - cc::info( bIsSSL ? "HTTPS" : "HTTP" ) + cc::debug( "/" ) + - cc::num10( pSrv->serverIndex() ) + cc::success( " server on address " ) + - cc::info( strAddr ) + cc::success( " and port " ) + cc::c( nPort ) + - cc::success( "/" ) + cc::notice( esm2str( esm ) ) + " " ); + cnote << "Started server"; return true; } catch ( const std::exception& ex ) { - logTraceServerEvent( false, ipVer, bIsSSL ? "HTTPS" : "HTTP", - pSrv ? pSrv->serverIndex() : -1, esm, - cc::fatal( "FAILED" ) + cc::error( " to start " ) + cc::attention( "proxygen" ) + - cc::debug( "/" ) + cc::warn( bIsSSL ? "HTTPS" : "HTTP" ) + - cc::error( " server: " ) + cc::warn( ex.what() ) ); + cerror << "Failed to start proxygen)" << ex.what(); } catch ( ... ) { - logTraceServerEvent( false, ipVer, bIsSSL ? "HTTPS" : "HTTP", - pSrv ? pSrv->serverIndex() : -1, esm, - cc::fatal( "FAILED" ) + cc::error( " to start " ) + cc::attention( "proxygen" ) + - cc::debug( "/" ) + cc::warn( bIsSSL ? "HTTPS" : "HTTP" ) + - cc::error( " server: " ) + cc::warn( "unknown exception" ) ); + cerror << "Failed to start proxygen: unknown exception"; } try { implStopListening( pSrv, ipVer, bIsSSL, esm ); @@ -2636,24 +2066,18 @@ bool SkaleServerOverride::implStopListening( // web socket opts_.netOpts_.bindOptsStandard_ : opts_.netOpts_.bindOptsInformational_; int nServerIndex = pSrv->serverIndex(); - std::string strAddr = ( ipVer == 4 ) ? ( bIsSSL ? bo.strAddrWSS4_ : bo.strAddrWS4_ ) : - ( bIsSSL ? bo.strAddrWSS6_ : bo.strAddrWS6_ ); + string strAddr = ( ipVer == 4 ) ? ( bIsSSL ? bo.strAddrWSS4_ : bo.strAddrWS4_ ) : + ( bIsSSL ? bo.strAddrWSS6_ : bo.strAddrWS6_ ); int nPort = ( ( ipVer == 4 ) ? ( bIsSSL ? bo.nBasePortWSS4_ : bo.nBasePortWS4_ ) : ( bIsSSL ? bo.nBasePortWSS6_ : bo.nBasePortWS6_ ) ) + nServerIndex; - logTraceServerEvent( false, ipVer, bIsSSL ? "WSS" : "WS", nServerIndex, esm, - cc::notice( "Will stop " ) + cc::info( bIsSSL ? "WSS" : "WS" ) + - cc::notice( " server on address " ) + cc::info( strAddr ) + - cc::success( " and port " ) + cc::c( nPort ) + cc::debug( "/" ) + - cc::notice( esm2str( esm ) ) + cc::notice( "..." ) ); + ctrace << "Will stop " << ( bIsSSL ? "WSS" : "WS" ) << " server on address " + << strAddr + " and port " << nPort << "/" << esm2str( esm ); if ( pSrv->isRunning() ) pSrv->stop(); pSrv.reset(); - logTraceServerEvent( false, ipVer, bIsSSL ? "WSS" : "WS", nServerIndex, esm, - cc::success( "OK, stopped " ) + cc::info( bIsSSL ? "WSS" : "WS" ) + - cc::success( " server on address " ) + cc::info( strAddr ) + - cc::success( " and port " ) + cc::c( nPort ) + cc::debug( "/" ) + - cc::notice( esm2str( esm ) ) ); + ctrace << "Stopped server"; + } catch ( ... ) { } return true; @@ -2670,24 +2094,16 @@ bool SkaleServerOverride::implStopListening( // proxygen HTTP opts_.netOpts_.bindOptsStandard_ : opts_.netOpts_.bindOptsInformational_; int nServerIndex = pSrv->serverIndex(); - std::string strAddr = ( ipVer == 4 ) ? ( bIsSSL ? bo.strAddrHTTPS4_ : bo.strAddrHTTP4_ ) : - ( bIsSSL ? bo.strAddrHTTPS6_ : bo.strAddrHTTP6_ ); + string strAddr = ( ipVer == 4 ) ? ( bIsSSL ? bo.strAddrHTTPS4_ : bo.strAddrHTTP4_ ) : + ( bIsSSL ? bo.strAddrHTTPS6_ : bo.strAddrHTTP6_ ); int nPort = ( ( ipVer == 4 ) ? ( bIsSSL ? bo.nBasePortHTTPS4_ : bo.nBasePortHTTP4_ ) : ( bIsSSL ? bo.nBasePortHTTPS6_ : bo.nBasePortHTTP6_ ) ) + nServerIndex; - logTraceServerEvent( false, ipVer, bIsSSL ? "HTTPS" : "HTTP", nServerIndex, esm, - cc::notice( "Will stop " ) + cc::attention( "proxygen" ) + cc::debug( "/" ) + - cc::info( bIsSSL ? "HTTPS" : "HTTP" ) + cc::notice( " server on address " ) + - cc::info( strAddr ) + cc::success( " and port " ) + cc::c( nPort ) + - cc::debug( "/" ) + cc::notice( esm2str( esm ) ) + cc::notice( "..." ) ); + cdebug << "Will stop proxygen" << ( bIsSSL ? "HTTPS" : "HTTP" ) << "server on address " + << strAddr << " and port " << nPort; pSrv->stop(); - stats::register_stats_message( bIsSSL ? "HTTPS" : "HTTP", "STOP" ); pSrv.reset(); - logTraceServerEvent( false, ipVer, bIsSSL ? "HTTPS" : "HTTP", nServerIndex, esm, - cc::success( "OK, stopped " ) + cc::attention( "proxygen" ) + cc::debug( "/" ) + - cc::info( bIsSSL ? "HTTPS" : "HTTP" ) + cc::success( " server on address " ) + - cc::info( strAddr ) + cc::success( " and port " ) + cc::c( nPort ) + - cc::debug( "/" ) + cc::notice( esm2str( esm ) ) ); + cdebug << "Stopped proxygen server"; } catch ( ... ) { } return true; @@ -2758,8 +2174,7 @@ bool SkaleServerOverride::StartListening( e_server_mode_t esm ) { serversWSS6.push_back( pServer ); } } - // - // + std::list< std::shared_ptr< SkaleRelayProxygenHTTP > >& serversProxygenHTTP4 = ( esm == e_server_mode_t::esm_standard ) ? serversProxygenHTTP4std_ : serversProxygenHTTP4nfo_; @@ -2822,13 +2237,11 @@ bool SkaleServerOverride::StartListening( e_server_mode_t esm ) { serversProxygenHTTPS6.push_back( pServer ); } } - // - // return true; } e_server_mode_t SkaleServerOverride::implGuessProxygenRequestESM( - const std::string& strDstAddress, int nDstPort ) { + const string& strDstAddress, int nDstPort ) { e_server_mode_t esm = e_server_mode_t::esm_standard; if ( implGuessProxygenRequestESM( serversProxygenHTTP4std_, strDstAddress, nDstPort, esm ) ) return esm; @@ -2846,13 +2259,11 @@ e_server_mode_t SkaleServerOverride::implGuessProxygenRequestESM( return esm; if ( implGuessProxygenRequestESM( serversProxygenHTTPS6nfo_, strDstAddress, nDstPort, esm ) ) return esm; - clog( dev::VerbosityWarning, cc::fatal( "WARNING:" ) ) - << ( cc::warn( "Failed to lookup ESM for " ) + cc::attention( strDstAddress ) + - cc::warn( ":" ) + cc::num10( nDstPort ) ); + cwarn << "Failed to lookup ESM for " << strDstAddress << ":" << nDstPort; return e_server_mode_t::esm_standard; } bool SkaleServerOverride::implGuessProxygenRequestESM( - std::list< std::shared_ptr< SkaleRelayProxygenHTTP > >& lst, const std::string& strDstAddress, + std::list< std::shared_ptr< SkaleRelayProxygenHTTP > >& lst, const string& strDstAddress, int nDstPort, e_server_mode_t& esm ) { auto itWalk = lst.cbegin(), itEnd = lst.cend(); for ( ; itWalk != itEnd; ++itWalk ) { @@ -2872,15 +2283,14 @@ bool SkaleServerOverride::StartListening() { StartListening( e_server_mode_t::esm_informational ) ) { if ( skutils::http_pg::pg_accumulate_size() > 0 ) { skutils::http_pg::pg_on_request_handler_t fnHandler = - [=]( const nlohmann::json& joIn, const std::string& strOrigin, int ipVer, - const std::string& strDstAddress, - int nDstPort ) -> skutils::result_of_http_request { + [=]( const json& joIn, const string& strOrigin, int ipVer, + const string& strDstAddress, int nDstPort ) -> skutils::result_of_http_request { if ( isShutdownMode() ) throw std::runtime_error( "query was cancelled due to server shutdown mode" ); skutils::url u( strOrigin ); - std::string strSchemeUC = + string strSchemeUC = skutils::tools::to_upper( skutils::tools::trim_copy( u.scheme() ) ); - std::string strPort = skutils::tools::trim_copy( u.port() ); + string strPort = skutils::tools::trim_copy( u.port() ); int nPort = 0; if ( strPort.empty() ) { if ( strSchemeUC == "HTTPS" ) @@ -2895,12 +2305,11 @@ bool SkaleServerOverride::StartListening() { joIn, strSchemeUC, nServerIndex, strOrigin, ipVer, nPort, esm ); return rslt; }; - hProxygenServer_ = + m_proxygenServer = skutils::http_pg::pg_accumulate_start( fnHandler, pg_threads_, pg_threads_limit_ ); skutils::http_pg::pg_accumulate_clear(); - if ( !hProxygenServer_ ) { - clog( dev::VerbosityError, cc::fatal( "PROXYGEN ERROR:" ) ) - << ( cc::error( "Failed to start server" ) ); + if ( !m_proxygenServer ) { + cerror << "Failed to start proxygen server"; return false; } } @@ -2911,9 +2320,9 @@ bool SkaleServerOverride::StartListening() { bool SkaleServerOverride::StopListening( e_server_mode_t esm ) { bool bRetVal = true; - if ( hProxygenServer_ ) { - skutils::http_pg::pg_stop( hProxygenServer_ ); - hProxygenServer_ = nullptr; + if ( m_proxygenServer ) { + skutils::http_pg::pg_stop( m_proxygenServer ); + m_proxygenServer = nullptr; } std::list< std::shared_ptr< SkaleRelayWS > >& serversWS4 = @@ -2944,8 +2353,7 @@ bool SkaleServerOverride::StopListening( e_server_mode_t esm ) { bRetVal = false; } serversWSS6.clear(); - // - // + std::list< std::shared_ptr< SkaleRelayProxygenHTTP > >& serversProxygenHTTP4 = ( esm == e_server_mode_t::esm_standard ) ? serversProxygenHTTP4std_ : serversProxygenHTTP4nfo_; @@ -3080,16 +2488,8 @@ void SkaleServerOverride::max_connection_set( size_t cntConnectionsMax ) { void SkaleServerOverride::on_connection_overflow_peer_closed( int ipVer, const char* strProtocol, int nServerIndex, int nPort, e_server_mode_t esm ) { - std::string strMessage = cc::info( strProtocol ) + cc::debug( "/" ) + - cc::num10( nServerIndex ) + cc::warn( " server on port " ) + - cc::num10( nPort ) + - cc::warn( " did closed peer because of connection limit overflow" ); - logTraceServerEvent( false, ipVer, strProtocol, nServerIndex, esm, strMessage ); -} - -skutils::tools::load_monitor& stat_get_load_monitor() { - static skutils::tools::load_monitor g_lm; - return g_lm; + cdebug << ipVer << " " << strProtocol << nServerIndex << "server on port " << nPort + << " closed peer because of connection limit overflow" << ( int ) esm; } SkaleServerOverride& SkaleServerOverride::getSSO() { // abstract in SkaleStatsSubscriptionManager @@ -3099,50 +2499,19 @@ SkaleServerOverride& SkaleServerOverride::getSSO() { // abstract in SkaleStatsS nlohmann::json SkaleServerOverride::provideSkaleStats() { // abstract from // dev::rpc::SkaleStatsProviderImpl nlohmann::json joStats = nlohmann::json::object(); - // - joStats["blocks"] = generateBlocksStats(); - // - nlohmann::json joExecutionPerformance = nlohmann::json::object(); - joExecutionPerformance["RPC"] = - skutils::stats::time_tracker::queue::getQueueForSubsystem( "RPC" ).getAllStats(); - joStats["executionPerformance"] = joExecutionPerformance; - joStats["protocols"]["http"]["listenerCount"] = - serversProxygenHTTP4std_.size() + serversProxygenHTTP4nfo_.size() + - serversProxygenHTTP6std_.size() + serversProxygenHTTP6nfo_.size(); - joStats["protocols"]["https"]["listenerCount"] = - serversProxygenHTTPS4std_.size() + serversProxygenHTTPS4nfo_.size() + - serversProxygenHTTPS6std_.size() + serversProxygenHTTPS6nfo_.size(); - joStats["protocols"]["wss"]["listenerCount"] = serversWSS4std_.size() + serversWSS4nfo_.size() + - serversWSS6std_.size() + serversWSS6nfo_.size(); - { // block for subsystem stats using optimized locking only once - stats::lock_type_stats lock( stats::g_mtx_stats ); - joStats["protocols"]["http"]["stats"] = stats::generate_subsystem_stats( "HTTP" ); - joStats["protocols"]["http"]["rpc"] = stats::generate_subsystem_stats( "RPC/HTTP" ); - joStats["protocols"]["https"]["stats"] = stats::generate_subsystem_stats( "HTTPS" ); - joStats["protocols"]["https"]["rpc"] = stats::generate_subsystem_stats( "RPC/HTTPS" ); - joStats["protocols"]["ws"]["listenerCount"] = serversWS4std_.size() + - serversWS4nfo_.size() + - serversWS6std_.size() + serversWS6nfo_.size(); - joStats["protocols"]["ws"]["stats"] = stats::generate_subsystem_stats( "WS" ); - joStats["protocols"]["ws"]["rpc"] = stats::generate_subsystem_stats( "RPC/WS" ); - joStats["protocols"]["wss"]["stats"] = stats::generate_subsystem_stats( "WSS" ); - joStats["protocols"]["wss"]["rpc"] = stats::generate_subsystem_stats( "RPC/WSS" ); - joStats["rpc"] = stats::generate_subsystem_stats( "RPC" ); - } // block for subsystem stats using optimized locking only once - // - skutils::tools::load_monitor& lm = stat_get_load_monitor(); - double lfCpuLoad = lm.last_cpu_load(); - joStats["system"]["cpu_load"] = lfCpuLoad; - joStats["system"]["disk_usage"] = lm.last_disk_load(); - double lfMemUsage = skutils::tools::mem_usage(); - joStats["system"]["mem_usage"] = lfMemUsage; - joStats["unddos"] = unddos_.stats(); + + + joStats["protocols"]["http"]["stats"] = stats::generate_subsystem_stats( "http:" ); + joStats["protocols"]["https"]["stats"] = stats::generate_subsystem_stats( "https:" ); + joStats["protocols"]["ws"]["stats"] = stats::generate_subsystem_stats( "ws:" ); + joStats["protocols"]["wss"]["stats"] = stats::generate_subsystem_stats( "wss:" ); + + return joStats; } -bool SkaleServerOverride::handleInformationalRequest( - const nlohmann::json& joRequest, nlohmann::json& joResponse ) { - std::string strMethod = joRequest["method"].get< std::string >(); +bool SkaleServerOverride::handleInformationalRequest( const json& joRequest, json& joResponse ) { + string strMethod = joRequest["method"].get< string >(); informational_rpc_map_t::const_iterator itFind = g_informational_rpc_map.find( strMethod ); if ( itFind == g_informational_rpc_map.end() ) { return false; @@ -3156,43 +2525,40 @@ const SkaleServerOverride::informational_rpc_map_t SkaleServerOverride::g_inform { "eth_getBalance", &SkaleServerOverride::informational_eth_getBalance }, }; -static std::string stat_prefix_align( const std::string& strSrc, size_t n, char ch ) { - std::string strDst = strSrc; +static string stat_prefix_align( const string& strSrc, size_t n, char ch ) { + string strDst = strSrc; while ( strDst.length() < n ) strDst.insert( 0, 1, ch ); return strDst; } -static std::string stat_encode_eth_call_data_chunck_address( - const std::string& strSrc, size_t alignWithZerosTo = 64 ) { - std::string strDst = strSrc; +static string stat_encode_eth_call_data_chunck_address( + const string& strSrc, size_t alignWithZerosTo = 64 ) { + string strDst = strSrc; strDst = skutils::tools::replace_all_copy( strDst, "0x", "" ); strDst = skutils::tools::replace_all_copy( strDst, "0X", "" ); strDst = stat_prefix_align( strDst, alignWithZerosTo, '0' ); return strDst; } -void SkaleServerOverride::informational_eth_getBalance( - const nlohmann::json& joRequest, nlohmann::json& joResponse ) { - std::cout << ( cc::debug( "Got call to informational version of " ) + - cc::info( "eth_getBalance" ) + cc::debug( " JSON RPC API with request as " ) + - cc::j( joRequest ) + "\n" ); +void SkaleServerOverride::informational_eth_getBalance( const json& joRequest, json& joResponse ) { + cdebug << "Got call to informational version of eth_getBalance"; auto pEthereum = ethereum(); if ( !pEthereum ) throw std::runtime_error( "internal error, no Ethereum interface found" ); dev::eth::Client* pClient = dynamic_cast< dev::eth::Client* >( pEthereum ); if ( !pClient ) throw std::runtime_error( "internal error, no client interface found" ); - const nlohmann::json& joParams = joRequest["params"]; + const json& joParams = joRequest["params"]; if ( !joParams.is_array() ) throw std::runtime_error( "\"params\" must be array for \"eth_getBalance\"" ); size_t cntParams = joParams.size(); if ( cntParams < 1 ) throw std::runtime_error( "\"params\" must be non-empty array for \"eth_getBalance\"" ); - const nlohmann::json& joAddress = joParams[0]; + const json& joAddress = joParams[0]; if ( !joAddress.is_string() ) throw std::runtime_error( "\"params[0]\" must be address string for \"eth_getBalance\"" ); - std::string strAddress = joAddress.get< std::string >(); + string strAddress = joAddress.get< string >(); try { @@ -3202,12 +2568,12 @@ void SkaleServerOverride::informational_eth_getBalance( // keccak256( "balanceOf(address)" ) = // "0x70a08231b98ef4ca268c9cc3f6b4590e4bfec28280db06bb5d45e689f2a360be", so function // signature is "0x70a08231" - std::string strCallData = "0x70a08231"; + string strCallData = "0x70a08231"; strCallData += stat_encode_eth_call_data_chunck_address( strAddress ); - nlohmann::json joCallArgs = nlohmann::json::object(); + json joCallArgs = json::object(); joCallArgs["data"] = strCallData; joCallArgs["to"] = opts_.strEthErc20Address_; - std::string strCallArgs = joCallArgs.dump(); + string strCallArgs = joCallArgs.dump(); Json::Value _jsonCallArgs; Json::Reader().parse( strCallArgs, _jsonCallArgs ); @@ -3232,50 +2598,35 @@ void SkaleServerOverride::informational_eth_getBalance( #endif dev::eth::FudgeFactor::Lenient ); - std::string strRevertReason; + string strRevertReason; if ( er.excepted == dev::eth::TransactionException::RevertInstruction ) { strRevertReason = skutils::eth::call_error_message_2_str( er.output ); if ( strRevertReason.empty() ) strRevertReason = "EVM revert instruction without description message"; Json::FastWriter fastWriter; - std::string strJSON = fastWriter.write( _jsonCallArgs ); - std::string strOut = cc::fatal( "Error message from eth_call():" ) + cc::error( " " ) + - cc::warn( strRevertReason ) + - cc::error( ", with call arguments: " ) + cc::j( strJSON ) + - cc::error( ", and using " ) + cc::info( "blockNumber" ) + - cc::error( "=" ) + cc::bright( blockNumber ); - cerror << strOut; - cerror << DETAILED_ERROR; + string strJSON = fastWriter.write( _jsonCallArgs ); + cerror << "Error message from eth_call(): " + << strRevertReason + ", with call arguments: " << strJSON + << +", and using blockNumber" << blockNumber << DETAILED_ERROR; throw std::runtime_error( strRevertReason ); } - std::string strBallance = er.output.empty() ? "0x0" : dev::toJS( er.output ); + string strBallance = er.output.empty() ? "0x0" : dev::toJS( er.output ); joResponse["result"] = strBallance; + } catch ( const std::exception& ex ) { - const char* strError = ex.what(); - if ( strError == nullptr || strError[0] == '\0' ) - strError = "Error without description in informational version of \"eth_getBalance\""; - std::cout << ( cc::fatal( "ERROR:" ) + - cc::error( " Got error in informational version of " ) + - cc::info( "eth_getBalance" ) + cc::debug( " with description: " ) + - cc::error( strError ) + "\n" ); - throw ex; + cerror << __FUNCTION__ << ex.what(); } catch ( ... ) { - const char* strError = "Unknown error in informational version of \"eth_getBalance\""; - std::cout << ( cc::fatal( "ERROR:" ) + - cc::error( " Got error in informational version of " ) + - cc::info( "eth_getBalance" ) + cc::debug( " with description: " ) + - cc::error( strError ) + "\n" ); - throw std::runtime_error( strError ); + cerror << __FUNCTION__ << "Unknown exception"; } } bool SkaleServerOverride::handleRequestWithBinaryAnswer( - e_server_mode_t /*esm*/, const nlohmann::json& joRequest, std::vector< uint8_t >& buffer ) { + e_server_mode_t /*esm*/, const json& joRequest, std::vector< uint8_t >& buffer ) { buffer.clear(); - std::string strMethodName = skutils::tools::getFieldSafe< std::string >( joRequest, "method" ); + string strMethodName = skutils::tools::getFieldSafe< string >( joRequest, "method" ); if ( strMethodName == "skale_downloadSnapshotFragment" && opts_.fn_binary_snapshot_download_ ) { - const nlohmann::json& joParams = joRequest["params"]; + const json& joParams = joRequest["params"]; if ( joParams.count( "isBinary" ) > 0 ) { bool isBinary = joParams["isBinary"].get< bool >(); if ( isBinary ) { @@ -3288,12 +2639,12 @@ bool SkaleServerOverride::handleRequestWithBinaryAnswer( } bool SkaleServerOverride::handleAdminOriginFilter( - const std::string& strMethod, const std::string& strOriginURL ) { - static const std::set< std::string > g_setAdminMethods = { "skale_getSnapshot", + const string& strMethod, const string& strOriginURL ) { + static const std::set< string > g_setAdminMethods = { "skale_getSnapshot", "skale_downloadSnapshotFragment" }; if ( g_setAdminMethods.find( strMethod ) == g_setAdminMethods.end() ) return true; // not an admin methhod - std::string origin = strOriginURL; + string origin = strOriginURL; try { skutils::url u( strOriginURL.c_str() ); origin = u.host(); @@ -3305,13 +2656,31 @@ bool SkaleServerOverride::handleAdminOriginFilter( } -bool SkaleServerOverride::handleProtocolSpecificRequest( const std::string& strOrigin, +bool SkaleServerOverride::handleProtocolSpecificRequest( const string& strOrigin, const rapidjson::Document& joRequest, rapidjson::Document& joResponse ) { - std::string strMethod = joRequest["method"].GetString(); + string strMethod = joRequest["method"].GetString(); protocol_rpc_map_t::const_iterator itFind = g_protocol_rpc_map.find( strMethod ); + if ( itFind == g_protocol_rpc_map.end() ) return false; - ( ( *this ).*( itFind->second ) )( strOrigin, joRequest, joResponse ); + + + auto beginTime = std::chrono::duration_cast< std::chrono::microseconds >( + chrono::system_clock::now().time_since_epoch() ); + + + using dev::rpc::SkaleStats; + SkaleStats::countCall( strOrigin, strMethod ); + + try { + ( this->*( itFind->second ) )( strOrigin, joRequest, joResponse ); + } catch ( ... ) { + SkaleStats::countError( strOrigin, strMethod ); + throw; + } + + SkaleStats::countAnswer( strOrigin, strMethod, beginTime ); + return true; } @@ -3327,7 +2696,7 @@ const SkaleServerOverride::protocol_rpc_map_t SkaleServerOverride::g_protocol_rp }; -void SkaleServerOverride::setSchainExitTime( const std::string& strOrigin, +void SkaleServerOverride::setSchainExitTime( const string& strOrigin, const rapidjson::Document& joRequest, rapidjson::Document& joResponse ) { SkaleServerOverride* pSO = this; try { @@ -3335,8 +2704,8 @@ void SkaleServerOverride::setSchainExitTime( const std::string& strOrigin, rapidjson::Value joError; joError.SetObject(); joError.AddMember( "code", -32602, joResponse.GetAllocator() ); - std::string errorMessage = std::string( "error in \"" ) + "setSchainExitTime" + - "\" rpc method, json entry \"params\" must be object"; + string errorMessage = string( "error in \"" ) + "setSchainExitTime" + + "\" rpc method, json entry \"params\" must be object"; rapidjson::Value v; v.SetString( errorMessage.c_str(), errorMessage.size(), joResponse.GetAllocator() ); joError.AddMember( "message", v, joResponse.GetAllocator() ); @@ -3347,8 +2716,8 @@ void SkaleServerOverride::setSchainExitTime( const std::string& strOrigin, rapidjson::Value joError; joError.SetObject(); joError.AddMember( "code", -32602, joResponse.GetAllocator() ); - std::string errorMessage = std::string( "error in \"" ) + "setSchainExitTime" + - "\" rpc method, json entry \"params\" must be object"; + string errorMessage = string( "error in \"" ) + "setSchainExitTime" + + "\" rpc method, json entry \"params\" must be object"; rapidjson::Value v; v.SetString( errorMessage.c_str(), errorMessage.size(), joResponse.GetAllocator() ); joError.AddMember( "message", v, joResponse.GetAllocator() ); @@ -3372,43 +2741,23 @@ void SkaleServerOverride::setSchainExitTime( const std::string& strOrigin, // get connection info skutils::url u( strOrigin ); - std::string strIP = u.host(); + string strIP = u.host(); bool isLocalAddress = skutils::is_local_private_network_address( strIP ); // NOTICE: supports both IPv4 and IPv6 // print info about this method call into log output - clog( dev::VerbosityDebug, cc::warn( "ADMIN-CALL" ) ) - << ( cc::debug( "Got " ) + cc::info( "setSchainExitTime" ) + - cc::debug( " call with " ) + cc::notice( "finishTime" ) + cc::debug( "=" ) + - cc::size10( finishTime ) + cc::debug( ", " ) + cc::notice( "origin" ) + - cc::debug( "=" ) + cc::notice( strOrigin ) + cc::debug( ", " ) + - cc::notice( "remote IP" ) + cc::debug( "=" ) + cc::notice( strIP ) + - cc::debug( ", " ) + cc::notice( "isLocalAddress" ) + cc::debug( "=" ) + - cc::yn( isLocalAddress ) ); + cdebug << __FUNCTION__ << " call with finishTime =" << finishTime + << ", << origin =" << strOrigin << ", remote IP =" << strIP << ", " + << "isLocalAddress =" << isLocalAddress; // return call error if call from outside of local network if ( !isLocalAddress ) throw std::runtime_error( "caller have no permition for this action" ); // NOTICE: just throw exception and // RPC call will extract text from it // and return it as call error - // - // TO-DO: optionally, put some data into joResponse which represents return value JSON - // - // TESTING: you can use wascat console - // npm install -g - // wscat -c 127.0.0.1:15020 - // {"jsonrpc":"2.0","id":12345,"method":"setSchainExitTime","params":{}} - // {"jsonrpc":"2.0","id":12345,"method":"setSchainExitTime","params":{"finishTime":123}} - // - // or specify JSON right in command line... - // - // wscat -c ws://127.0.0.1:15020 -w 1 -x - // '{"jsonrpc":"2.0","id":12345,"method":"setSchainExitTime","params":{"finishTime":123}}' - - // Result rapidjson::StringBuffer buffer; rapidjson::Writer< rapidjson::StringBuffer > writer( buffer ); joResponse.Accept( writer ); - std::string strResponse = buffer.GetString(); + string strResponse = buffer.GetString(); auto pEthereum = pSO->ethereum(); if ( !pEthereum ) throw std::runtime_error( "internal error, no Ethereum interface found" ); @@ -3418,73 +2767,65 @@ void SkaleServerOverride::setSchainExitTime( const std::string& strOrigin, pClient->setSchainExitTime( uint64_t( finishTime ) ); joResponse.Parse( strResponse.data() ); } catch ( const std::exception& ex ) { - if ( pSO->opts_.isTraceCalls_ ) - clog( dev::Verbosity::VerbosityError, - cc::debug( " during call from " ) + cc::u( strOrigin ) ) - << ( " " + cc::error( "error in " ) + cc::warn( "setSchainExitTime" ) + - cc::error( " rpc method, exception " ) + cc::warn( ex.what() ) ); + auto errMesssage = "setSchainExitTime rpc method, exception " + string( ex.what() ); + cerror << errMesssage; rapidjson::Value joError; joError.SetObject(); joError.AddMember( "code", -32602, joResponse.GetAllocator() ); - std::string errorMessage = - std::string( "error in \"setSchainExitTime\" rpc method, exception: " ) + ex.what(); rapidjson::Value v; - v.SetString( errorMessage.c_str(), errorMessage.size(), joResponse.GetAllocator() ); + v.SetString( errMesssage.c_str(), errMesssage.size(), joResponse.GetAllocator() ); joError.AddMember( "message", v, joResponse.GetAllocator() ); joResponse.AddMember( "error", joError, joResponse.GetAllocator() ); } catch ( ... ) { - if ( pSO->opts_.isTraceCalls_ ) - clog( dev::Verbosity::VerbosityError, - cc::debug( " during call from " ) + cc::u( strOrigin ) ) - << ( " " + cc::error( "error in " ) + cc::warn( "setSchainExitTime" ) + - cc::error( " rpc method, unknown exception " ) ); + string errMesssage = "setSchainExitTime rpc method, unknown exception"; + cerror << errMesssage; rapidjson::Value joError; joError.SetObject(); joError.AddMember( "code", -32602, joResponse.GetAllocator() ); - joError.AddMember( "message", - "error in \"setSchainExitTime\" rpc method, unknown exception", - joResponse.GetAllocator() ); + rapidjson::Value v; + v.SetString( errMesssage.c_str(), errMesssage.size(), joResponse.GetAllocator() ); + joError.AddMember( "message", v, joResponse.GetAllocator() ); joResponse.AddMember( "error", joError, joResponse.GetAllocator() ); } } -void SkaleServerOverride::eth_sendRawTransaction( const std::string& /*strOrigin*/, +void SkaleServerOverride::eth_sendRawTransaction( const string& /*strOrigin*/, const rapidjson::Document& joRequest, rapidjson::Document& joResponse ) { opts_.fn_eth_sendRawTransaction_( joRequest, joResponse ); } -void SkaleServerOverride::eth_getTransactionReceipt( const std::string& /*strOrigin*/, +void SkaleServerOverride::eth_getTransactionReceipt( const string& /*strOrigin*/, const rapidjson::Document& joRequest, rapidjson::Document& joResponse ) { opts_.fn_eth_getTransactionReceipt_( joRequest, joResponse ); } -void SkaleServerOverride::eth_call( const std::string& /*strOrigin*/, +void SkaleServerOverride::eth_call( const string& /*strOrigin*/, const rapidjson::Document& joRequest, rapidjson::Document& joResponse ) { opts_.fn_eth_call_( joRequest, joResponse ); } -void SkaleServerOverride::eth_getBalance( const std::string& /*strOrigin*/, +void SkaleServerOverride::eth_getBalance( const string& /*strOrigin*/, const rapidjson::Document& joRequest, rapidjson::Document& joResponse ) { opts_.fn_eth_getBalance_( joRequest, joResponse ); } -void SkaleServerOverride::eth_getStorageAt( const std::string& /*strOrigin*/, +void SkaleServerOverride::eth_getStorageAt( const string& /*strOrigin*/, const rapidjson::Document& joRequest, rapidjson::Document& joResponse ) { opts_.fn_eth_getStorageAt_( joRequest, joResponse ); } -void SkaleServerOverride::eth_getTransactionCount( const std::string& /*strOrigin*/, +void SkaleServerOverride::eth_getTransactionCount( const string& /*strOrigin*/, const rapidjson::Document& joRequest, rapidjson::Document& joResponse ) { opts_.fn_eth_getTransactionCount_( joRequest, joResponse ); } -void SkaleServerOverride::eth_getCode( const std::string& /*strOrigin*/, +void SkaleServerOverride::eth_getCode( const string& /*strOrigin*/, const rapidjson::Document& joRequest, rapidjson::Document& joResponse ) { opts_.fn_eth_getCode_( joRequest, joResponse ); } -bool SkaleServerOverride::handleHttpSpecificRequest( const std::string& strOrigin, - e_server_mode_t esm, const std::string& strRequest, std::string& strResponse ) { +bool SkaleServerOverride::handleHttpSpecificRequest( + const string& strOrigin, e_server_mode_t esm, const string& strRequest, string& strResponse ) { strResponse.clear(); rapidjson::Document joRequest; joRequest.SetObject(); @@ -3508,9 +2849,9 @@ bool SkaleServerOverride::handleHttpSpecificRequest( const std::string& strOrigi rapidjson::StringBuffer bufferResponse; rapidjson::Writer< rapidjson::StringBuffer > writerResponse( bufferResponse ); joResponse.Accept( writerResponse ); - std::string strResponseCopy = bufferResponse.GetString(); - nlohmann::json joResponseObj = nlohmann::json::parse( strResponseCopy ); - nlohmann::json objRequest = nlohmann::json::parse( strRequest ); + string strResponseCopy = bufferResponse.GetString(); + json joResponseObj = json::parse( strResponseCopy ); + json objRequest = json::parse( strRequest ); if ( handleHttpSpecificRequest( strOrigin, esm, objRequest, joResponseObj ) ) { strResponse = joResponseObj.dump(); return true; @@ -3526,12 +2867,12 @@ bool SkaleServerOverride::handleHttpSpecificRequest( const std::string& strOrigi return true; } -bool SkaleServerOverride::handleHttpSpecificRequest( const std::string& strOrigin, - e_server_mode_t esm, const nlohmann::json& joRequest, nlohmann::json& joResponse ) { +bool SkaleServerOverride::handleHttpSpecificRequest( + const string& strOrigin, e_server_mode_t esm, const json& joRequest, json& joResponse ) { if ( esm == e_server_mode_t::esm_informational && handleInformationalRequest( joRequest, joResponse ) ) return true; - std::string strMethod = joRequest["method"].get< std::string >(); + string strMethod = joRequest["method"].get< string >(); http_rpc_map_t::const_iterator itFind = g_http_rpc_map.find( strMethod ); if ( itFind == g_http_rpc_map.end() ) return false; @@ -3541,46 +2882,44 @@ bool SkaleServerOverride::handleHttpSpecificRequest( const std::string& strOrigi const SkaleServerOverride::http_rpc_map_t SkaleServerOverride::g_http_rpc_map = {}; -std::string SkaleServerOverride::implPreformatTrafficJsonMessage( - const std::string& strJSON, bool isRequest ) const { +string SkaleServerOverride::implPreformatTrafficJsonMessage( + const string& strJSON, bool isRequest ) const { try { - nlohmann::json jo = nlohmann::json::parse( strJSON ); + json jo = json::parse( strJSON ); return implPreformatTrafficJsonMessage( jo, isRequest ); } catch ( ... ) { } - return cc::error( isRequest ? "bad JSON request" : "bad JSON response" ) + " " + - cc::warn( strJSON ); + return ( isRequest ? "bad JSON request" : "bad JSON response" ) + string( " " ) + strJSON; } -std::string SkaleServerOverride::implPreformatTrafficJsonMessage( - const nlohmann::json& jo, bool isRequest ) const { - nlohmann::json jo2 = jo; - SkaleServerOverride::stat_transformJsonForLogOutput( jo2, isRequest, - SkaleServerOverride::g_nMaxStringValueLengthForJsonLogs, - SkaleServerOverride::g_nMaxStringValueLengthForTransactionParams ); +string SkaleServerOverride::implPreformatTrafficJsonMessage( + const json& jo, bool isRequest ) const { + json jo2 = jo; + stat_transformJsonForLogOutput( jo2, isRequest, g_nMaxStringValueLengthForJsonLogs, + g_nMaxStringValueLengthForTransactionParams ); return cc::j( jo2 ); } size_t SkaleServerOverride::g_nMaxStringValueLengthForJsonLogs = 1024 * 32; size_t SkaleServerOverride::g_nMaxStringValueLengthForTransactionParams = 64; -void SkaleServerOverride::stat_transformJsonForLogOutput( nlohmann::json& jo, bool isRequest, +void SkaleServerOverride::stat_transformJsonForLogOutput( json& jo, bool isRequest, size_t nMaxStringValueLengthForJsonLogs, size_t nMaxStringValueLengthForTransactionParams, size_t nCallIndent ) { if ( ( nMaxStringValueLengthForJsonLogs == 0 || - nMaxStringValueLengthForJsonLogs == std::string::npos ) && + nMaxStringValueLengthForJsonLogs == string::npos ) && ( nMaxStringValueLengthForTransactionParams == 0 || - nMaxStringValueLengthForTransactionParams == std::string::npos ) ) + nMaxStringValueLengthForTransactionParams == string::npos ) ) return; if ( jo.is_string() ) { - std::string strValue = jo.get< std::string >(); + string strValue = jo.get< string >(); if ( strValue.size() > nMaxStringValueLengthForJsonLogs ) jo = strValue.substr( 0, nMaxStringValueLengthForJsonLogs ) + "..."; return; } if ( jo.is_array() ) { if ( nMaxStringValueLengthForJsonLogs == 0 || - nMaxStringValueLengthForJsonLogs == std::string::npos ) { + nMaxStringValueLengthForJsonLogs == string::npos ) { ++nCallIndent; size_t cnt = jo.size(); for ( size_t i = 0; i < cnt; ++i ) @@ -3595,15 +2934,15 @@ void SkaleServerOverride::stat_transformJsonForLogOutput( nlohmann::json& jo, bo ++nCallIndent; bool bSkipParams = false; if ( ( !( nMaxStringValueLengthForTransactionParams == 0 || - nMaxStringValueLengthForTransactionParams == std::string::npos ) ) && + nMaxStringValueLengthForTransactionParams == string::npos ) ) && nCallIndent == 1 && isRequest && jo.count( "method" ) > 0 && jo["method"].is_string() && - jo["method"].get< std::string >() == "eth_sendRawTransaction" && - jo.count( "params" ) > 0 && jo["params"].is_array() ) { + jo["method"].get< string >() == "eth_sendRawTransaction" && jo.count( "params" ) > 0 && + jo["params"].is_array() ) { bSkipParams = true; - nlohmann::json jarrNewParams = nlohmann::json::array(); + json jarrNewParams = json::array(); for ( auto it : jo["params"].items() ) { if ( it.value().is_string() ) { - std::string strValue = it.value().get< std::string >(); + string strValue = it.value().get< string >(); if ( strValue.size() > nMaxStringValueLengthForTransactionParams ) jarrNewParams.push_back( strValue.substr( 0, nMaxStringValueLengthForTransactionParams ) + "..." ); @@ -3615,7 +2954,7 @@ void SkaleServerOverride::stat_transformJsonForLogOutput( nlohmann::json& jo, bo jo["params"] = jarrNewParams; } if ( nMaxStringValueLengthForJsonLogs == 0 || - nMaxStringValueLengthForJsonLogs == std::string::npos ) { + nMaxStringValueLengthForJsonLogs == string::npos ) { for ( auto it : jo.items() ) { if ( bSkipParams && it.key() == "params" ) continue; diff --git a/libskale/httpserveroverride.h b/libskale/httpserveroverride.h index 0cce6a132..03af090df 100644 --- a/libskale/httpserveroverride.h +++ b/libskale/httpserveroverride.h @@ -41,10 +41,6 @@ typedef intptr_t ssize_t; #endif #include -#define RAPIDJSON_ASSERT( x ) \ - if ( !( x ) ) { \ - throw std::out_of_range( #x " failed with provided JSON" ); \ - } #define RAPIDJSON_ASSERT_THROWS #include #include @@ -63,7 +59,6 @@ typedef intptr_t ssize_t; #include #include #include -#include #include #include #include @@ -82,6 +77,7 @@ class SkaleWsPeer; class SkaleRelayWS; class SkaleServerOverride; +using std::string; enum class e_server_mode_t { esm_standard, esm_informational }; @@ -130,21 +126,20 @@ struct SkaleServerConnectionsTrackHelper { class SkaleWsPeer : public skutils::ws::peer { public: std::atomic_size_t nTaskNumberInPeer_ = 0; - const std::string m_strPeerQueueID; + const string m_strPeerQueueID; std::unique_ptr< SkaleServerConnectionsTrackHelper > m_pSSCTH; - std::string m_strUnDdosOrigin; + string m_strUnDdosOrigin; SkaleWsPeer( skutils::ws::server& srv, const skutils::ws::hdl_t& hdl ); ~SkaleWsPeer() override; void onPeerRegister() override; void onPeerUnregister() override; // peer will no longer receive onMessage after call to this - void onMessage( const std::string& msg, skutils::ws::opcv eOpCode ) override; - void onClose( const std::string& reason, int local_close_code, - const std::string& local_close_code_as_str ) override; + void onMessage( const string& msg, skutils::ws::opcv eOpCode ) override; + void onClose( const string& reason, int local_close_code, + const string& local_close_code_as_str ) override; void onFail() override; - void onLogMessage( - skutils::ws::e_ws_log_message_type_t eWSLMT, const std::string& msg ) override; + void onLogMessage( skutils::ws::e_ws_log_message_type_t eWSLMT, const string& msg ) override; - std::string desc( bool isColored = true ) const { + string desc( bool isColored = true ) const { return getShortPeerDescription( isColored, false, false ); } SkaleRelayWS& getRelay(); @@ -163,14 +158,14 @@ class SkaleWsPeer : public skutils::ws::peer { bool handleRequestWithBinaryAnswer( e_server_mode_t esm, const nlohmann::json& joRequest ); bool handleWebSocketSpecificRequest( - e_server_mode_t esm, const nlohmann::json& joRequest, std::string& strResponse ); + e_server_mode_t esm, const nlohmann::json& joRequest, string& strResponse ); bool handleWebSocketSpecificRequest( e_server_mode_t esm, const nlohmann::json& joRequest, nlohmann::json& joResponse ); protected: typedef void ( SkaleWsPeer::*rpc_method_t )( e_server_mode_t esm, const nlohmann::json& joRequest, nlohmann::json& joResponse ); - typedef std::map< std::string, rpc_method_t > ws_rpc_map_t; + typedef std::map< string, rpc_method_t > ws_rpc_map_t; static const ws_rpc_map_t g_ws_rpc_map; void eth_subscribe( @@ -194,8 +189,8 @@ class SkaleWsPeer : public skutils::ws::peer { void unregister_ws_conn_for_origin(); public: - std::string implPreformatTrafficJsonMessage( const std::string& strJSON, bool isRequest ) const; - std::string implPreformatTrafficJsonMessage( const nlohmann::json& jo, bool isRequest ) const; + string implPreformatTrafficJsonMessage( const string& strJSON, bool isRequest ) const; + string implPreformatTrafficJsonMessage( const nlohmann::json& jo, bool isRequest ) const; }; /// class SkaleWsPeer @@ -215,9 +210,9 @@ class SkaleRelayWS : public skutils::ws::server, public SkaleServerHelper { std::atomic_bool m_isRunning = false; std::atomic_bool m_isInLoop = false; int ipVer_; - std::string strBindAddr_, strInterfaceName_; - std::string m_strScheme_; - std::string m_strSchemeUC; + string strBindAddr_, strInterfaceName_; + string m_strScheme_; + string m_strSchemeUC; int m_nPort = -1; SkaleServerOverride* m_pSO = nullptr; e_server_mode_t esm_; @@ -226,8 +221,8 @@ class SkaleRelayWS : public skutils::ws::server, public SkaleServerHelper { typedef skutils::multithreading::recursive_mutex_type mutex_type; typedef std::lock_guard< mutex_type > lock_type; typedef skutils::retain_release_ptr< SkaleWsPeer > skale_peer_ptr_t; - typedef std::map< std::string, skale_peer_ptr_t > map_skale_peers_t; // maps m_strPeerQueueID - // -> skale peer pointer + typedef std::map< string, skale_peer_ptr_t > map_skale_peers_t; // maps m_strPeerQueueID + // -> skale peer pointer protected: mutable mutex_type m_mtxAllPeers; @@ -249,8 +244,8 @@ class SkaleRelayWS : public skutils::ws::server, public SkaleServerHelper { dev::eth::Interface* ethereum() const; mutex_type& mtxAllPeers() const { return m_mtxAllPeers; } - std::string nfoGetScheme() const { return m_strScheme_; } - std::string nfoGetSchemeUC() const { return m_strSchemeUC; } + string nfoGetScheme() const { return m_strScheme_; } + string nfoGetSchemeUC() const { return m_strSchemeUC; } friend class SkaleWsPeer; }; /// class SkaleRelayWS @@ -262,11 +257,11 @@ class SkaleRelayProxygenHTTP : public SkaleServerHelper { public: int ipVer_; - std::string strBindAddr_; + string strBindAddr_; int nPort_; const bool m_bHelperIsSSL; e_server_mode_t esm_; - std::string cert_path_, private_key_path_, ca_path_; + string cert_path_, private_key_path_, ca_path_; int32_t threads_ = 0; int32_t threads_limit_ = 0; SkaleRelayProxygenHTTP( SkaleServerOverride* pSO, int ipVer, const char* strBindAddr, int nPort, @@ -306,22 +301,22 @@ class SkaleServerOverride : public jsonrpc::AbstractServerConnector, struct net_bind_opts_t { size_t cntServers_ = 1; - std::string strAddrHTTP4_; + string strAddrHTTP4_; int nBasePortHTTP4_ = 0; - std::string strAddrHTTP6_; + string strAddrHTTP6_; int nBasePortHTTP6_ = 0; - std::string strAddrHTTPS4_; + string strAddrHTTPS4_; int nBasePortHTTPS4_ = 0; - std::string strAddrHTTPS6_; + string strAddrHTTPS6_; int nBasePortHTTPS6_ = 0; - std::string strAddrWS4_; + string strAddrWS4_; int nBasePortWS4_ = 0; - std::string strAddrWS6_; + string strAddrWS6_; int nBasePortWS6_ = 0; - std::string strAddrWSS4_; + string strAddrWSS4_; int nBasePortWSS4_ = 0; - std::string strAddrWSS6_; + string strAddrWSS6_; int nBasePortWSS6_ = 0; net_bind_opts_t() {} @@ -354,9 +349,9 @@ class SkaleServerOverride : public jsonrpc::AbstractServerConnector, struct net_opts_t { net_bind_opts_t bindOptsStandard_; net_bind_opts_t bindOptsInformational_; - std::string strPathSslKey_; - std::string strPathSslCert_; - std::string strPathSslCA_; + string strPathSslKey_; + string strPathSslCert_; + string strPathSslCA_; std::atomic_size_t cntConnections_ = 0; std::atomic_size_t cntConnectionsMax_ = 0; // 0 is unlimited net_opts_t() {} @@ -386,7 +381,7 @@ class SkaleServerOverride : public jsonrpc::AbstractServerConnector, double lfExecutionDurationMaxForPerformanceWarning_ = 0; // in seconds bool isTraceCalls_ = false; bool isTraceSpecialCalls_ = false; - std::string strEthErc20Address_; + string strEthErc20Address_; opts_t() {} opts_t( const opts_t& other ) { assign( other ); } opts_t& operator=( const opts_t& other ) { return assign( other ); } @@ -416,23 +411,23 @@ class SkaleServerOverride : public jsonrpc::AbstractServerConnector, dev::eth::Interface* ethereum() const; dev::eth::ChainParams& chainParams(); const dev::eth::ChainParams& chainParams() const; - dev::Verbosity methodTraceVerbosity( const std::string& strMethod ) const; - bool checkAdminOriginAllowed( const std::string& origin ) const; + dev::Verbosity methodTraceVerbosity( const string& strMethod ) const; + bool checkAdminOriginAllowed( const string& origin ) const; protected: - skutils::result_of_http_request implHandleHttpRequest( const nlohmann::json& joIn, - const std::string& strProtocol, int nServerIndex, std::string strOrigin, int ipVer, - int nPort, e_server_mode_t esm ); + skutils::result_of_http_request implHandleHttpRequest( const nlohmann::json& _joIn, + const string& _protocol, int _serverIndex, string _origin, int _ipVer, int _port, + e_server_mode_t _esm ); private: bool implStartListening( // web socket - std::shared_ptr< SkaleRelayWS >& pSrv, int ipVer, const std::string& strAddr, int nPort, - const std::string& strPathSslKey, const std::string& strPathSslCert, - const std::string& strPathSslCA, int nServerIndex, e_server_mode_t esm ); + std::shared_ptr< SkaleRelayWS >& pSrv, int ipVer, const string& strAddr, int nPort, + const string& strPathSslKey, const string& strPathSslCert, const string& strPathSslCA, + int nServerIndex, e_server_mode_t esm ); bool implStartListening( // proxygen HTTP - std::shared_ptr< SkaleRelayProxygenHTTP >& pSrv, int ipVer, const std::string& strAddr, - int nPort, const std::string& strPathSslKey, const std::string& strPathSslCert, - const std::string& strPathSslCA, int nServerIndex, e_server_mode_t esm, int32_t threads = 0, + std::shared_ptr< SkaleRelayProxygenHTTP >& pSrv, int ipVer, const string& strAddr, + int nPort, const string& strPathSslKey, const string& strPathSslCert, + const string& strPathSslCA, int nServerIndex, e_server_mode_t esm, int32_t threads = 0, int32_t threads_limit = 0 ); bool implStopListening( // web socket @@ -451,20 +446,20 @@ class SkaleServerOverride : public jsonrpc::AbstractServerConnector, virtual bool StopListening( e_server_mode_t esm ); virtual bool StopListening() override; - void SetUrlHandler( const std::string& url, jsonrpc::IClientConnectionHandler* handler ); + void SetUrlHandler( const string& url, jsonrpc::IClientConnectionHandler* handler ); void logPerformanceWarning( double lfExecutionDuration, int ipVer, const char* strProtocol, int nServerIndex, e_server_mode_t esm, const char* strOrigin, const char* strMethod, nlohmann::json joID ); void logTraceServerEvent( bool isError, int ipVer, const char* strProtocol, int nServerIndex, - e_server_mode_t esm, const std::string& strMessage ); + e_server_mode_t esm, const string& strMessage ); void logTraceServerTraffic( bool isRX, dev::Verbosity verbosity, int ipVer, const char* strProtocol, int nServerIndex, e_server_mode_t esm, const char* strOrigin, - const std::string& strPayload ); + const string& strPayload ); private: - std::map< std::string, jsonrpc::IClientConnectionHandler* > urlhandler; - jsonrpc::IClientConnectionHandler* GetHandler( const std::string& url ); + std::map< string, jsonrpc::IClientConnectionHandler* > urlhandler; + jsonrpc::IClientConnectionHandler* GetHandler( const string& url ); public: std::atomic_bool m_bShutdownMode = false; @@ -476,10 +471,10 @@ class SkaleServerOverride : public jsonrpc::AbstractServerConnector, serversProxygenHTTP6std_, serversProxygenHTTPS4std_, serversProxygenHTTPS6std_, serversProxygenHTTP4nfo_, serversProxygenHTTP6nfo_, serversProxygenHTTPS4nfo_, serversProxygenHTTPS6nfo_; - skutils::http_pg::wrapped_proxygen_server_handle hProxygenServer_ = nullptr; - e_server_mode_t implGuessProxygenRequestESM( const std::string& strDstAddress, int nDstPort ); + skutils::http_pg::wrapped_proxygen_server_handle m_proxygenServer = nullptr; + e_server_mode_t implGuessProxygenRequestESM( const string& strDstAddress, int nDstPort ); bool implGuessProxygenRequestESM( std::list< std::shared_ptr< SkaleRelayProxygenHTTP > >& lst, - const std::string& strDstAddress, int nDstPort, e_server_mode_t& esm ); + const string& strDstAddress, int nDstPort, e_server_mode_t& esm ); public: int getServerPortStatusWS( int ipVer, e_server_mode_t esm ) const; @@ -501,7 +496,7 @@ class SkaleServerOverride : public jsonrpc::AbstractServerConnector, protected: typedef void ( SkaleServerOverride::*informational_rpc_method_t )( const nlohmann::json& joRequest, nlohmann::json& joResponse ); - typedef std::map< std::string, informational_rpc_method_t > informational_rpc_map_t; + typedef std::map< string, informational_rpc_method_t > informational_rpc_map_t; static const informational_rpc_map_t g_informational_rpc_map; public: @@ -514,61 +509,60 @@ class SkaleServerOverride : public jsonrpc::AbstractServerConnector, public: bool handleRequestWithBinaryAnswer( e_server_mode_t esm, const nlohmann::json& joRequest, std::vector< uint8_t >& buffer ); - bool handleAdminOriginFilter( const std::string& strMethod, const std::string& strOriginURL ); + bool handleAdminOriginFilter( const string& strMethod, const string& strOriginURL ); bool isShutdownMode() const { return m_bShutdownMode; } - bool handleProtocolSpecificRequest( const std::string& strOrigin, + bool handleProtocolSpecificRequest( const string& strOrigin, const rapidjson::Document& joRequest, rapidjson::Document& joResponse ); protected: - typedef void ( SkaleServerOverride::*rpc_method_t )( const std::string& strOrigin, + typedef void ( SkaleServerOverride::*rpc_method_t )( const string& strOrigin, const rapidjson::Document& joRequest, rapidjson::Document& joResponse ); - typedef std::map< std::string, rpc_method_t > protocol_rpc_map_t; + typedef std::map< string, rpc_method_t > protocol_rpc_map_t; static const protocol_rpc_map_t g_protocol_rpc_map; - void setSchainExitTime( const std::string& strOrigin, const rapidjson::Document& joRequest, + void setSchainExitTime( const string& strOrigin, const rapidjson::Document& joRequest, rapidjson::Document& joResponse ); - void eth_sendRawTransaction( const std::string& strOrigin, const rapidjson::Document& joRequest, + void eth_sendRawTransaction( const string& strOrigin, const rapidjson::Document& joRequest, rapidjson::Document& joResponse ); - void eth_getTransactionReceipt( const std::string& strOrigin, - const rapidjson::Document& joRequest, rapidjson::Document& joResponse ); + void eth_getTransactionReceipt( const string& strOrigin, const rapidjson::Document& joRequest, + rapidjson::Document& joResponse ); - void eth_call( const std::string& strOrigin, const rapidjson::Document& joRequest, + void eth_call( const string& strOrigin, const rapidjson::Document& joRequest, rapidjson::Document& joResponse ); - void eth_getBalance( const std::string& strOrigin, const rapidjson::Document& joRequest, + void eth_getBalance( const string& strOrigin, const rapidjson::Document& joRequest, rapidjson::Document& joResponse ); - void eth_getStorageAt( const std::string& strOrigin, const rapidjson::Document& joRequest, + void eth_getStorageAt( const string& strOrigin, const rapidjson::Document& joRequest, rapidjson::Document& joResponse ); - void eth_getTransactionCount( const std::string& strOrigin, - const rapidjson::Document& joRequest, rapidjson::Document& joResponse ); + void eth_getTransactionCount( const string& strOrigin, const rapidjson::Document& joRequest, + rapidjson::Document& joResponse ); - void eth_getCode( const std::string& strOrigin, const rapidjson::Document& joRequest, + void eth_getCode( const string& strOrigin, const rapidjson::Document& joRequest, rapidjson::Document& joResponse ); unsigned iwBlockStats_ = unsigned( -1 ), iwPendingTransactionStats_ = unsigned( -1 ); mutex_type mtxStats_; - skutils::stats::named_event_stats statsBlocks_, statsTransactions_, statsPendingTx_; nlohmann::json generateBlocksStats(); protected: - typedef void ( SkaleServerOverride::*rpc_http_method_t )( const std::string& strOrigin, + typedef void ( SkaleServerOverride::*rpc_http_method_t )( const string& strOrigin, e_server_mode_t esm, const nlohmann::json& joRequest, nlohmann::json& joResponse ); - typedef std::map< std::string, rpc_http_method_t > http_rpc_map_t; + typedef std::map< string, rpc_http_method_t > http_rpc_map_t; static const http_rpc_map_t g_http_rpc_map; - bool handleHttpSpecificRequest( const std::string& strOrigin, e_server_mode_t esm, - const std::string& strRequest, std::string& strResponse ); - bool handleHttpSpecificRequest( const std::string& strOrigin, e_server_mode_t esm, + bool handleHttpSpecificRequest( const string& strOrigin, e_server_mode_t esm, + const string& strRequest, string& strResponse ); + bool handleHttpSpecificRequest( const string& strOrigin, e_server_mode_t esm, const nlohmann::json& joRequest, nlohmann::json& joResponse ); public: - std::string implPreformatTrafficJsonMessage( const std::string& strJSON, bool isRequest ) const; - std::string implPreformatTrafficJsonMessage( const nlohmann::json& jo, bool isRequest ) const; + string implPreformatTrafficJsonMessage( const string& strJSON, bool isRequest ) const; + string implPreformatTrafficJsonMessage( const nlohmann::json& jo, bool isRequest ) const; static size_t g_nMaxStringValueLengthForJsonLogs; static size_t g_nMaxStringValueLengthForTransactionParams; static void stat_transformJsonForLogOutput( nlohmann::json& jo, bool isRequest, diff --git a/libskutils/CMakeLists.txt b/libskutils/CMakeLists.txt index 3bab18e6b..347e1405a 100644 --- a/libskutils/CMakeLists.txt +++ b/libskutils/CMakeLists.txt @@ -22,8 +22,7 @@ add_library( skutils STATIC ./src/multithreading.cpp ./include/skutils/multithreading.h ./src/network.cpp ./include/skutils/network.h ./src/rest_call.cpp ./include/skutils/rest_call.h - ./src/stats.cpp ./include/skutils/stats.h - ./src/task_performance.cpp ./include/skutils/task_performance.h + ./src/task_performance.cpp ./include/skutils/task_performance.h ./src/thread_pool.cpp ./include/skutils/thread_pool.h ./src/unddos.cpp ./include/skutils/unddos.h ./src/url.cpp ./include/skutils/url.h diff --git a/libskutils/include/skutils/http.h b/libskutils/include/skutils/http.h index 4ba9b967e..6f0be4122 100644 --- a/libskutils/include/skutils/http.h +++ b/libskutils/include/skutils/http.h @@ -752,12 +752,12 @@ struct pg_accumulate_entry { typedef std::vector< pg_accumulate_entry > pg_accumulate_entries; bool pg_logging_get(); -void pg_logging_set( bool bIsLoggingMode ); -wrapped_proxygen_server_handle pg_start( pg_on_request_handler_t h, const pg_accumulate_entry& pge, - int32_t threads = 0, int32_t threads_limit = 0 ); -wrapped_proxygen_server_handle pg_start( pg_on_request_handler_t h, - const pg_accumulate_entries& entries, int32_t threads = 0, int32_t threads_limit = 0 ); -void pg_stop( wrapped_proxygen_server_handle hServer ); +void pg_logging_set( bool _bIsLoggingMode ); +wrapped_proxygen_server_handle pg_start( pg_on_request_handler_t _h, + const pg_accumulate_entry& _pge, int32_t _threads = 0, int32_t _threadsLimit = 0 ); +wrapped_proxygen_server_handle pg_start( pg_on_request_handler_t _h, + const pg_accumulate_entries& _entries, int32_t _threads = 0, int32_t _threadsLimit = 0 ); +void pg_stop( wrapped_proxygen_server_handle _hServer ); void pg_accumulate_clear(); size_t pg_accumulate_size(); @@ -769,9 +769,9 @@ wrapped_proxygen_server_handle pg_accumulate_start( typedef void ( *logging_fail_func_t )(); -void install_logging_fail_func( logging_fail_func_t fn ); +void install_logging_fail_func( logging_fail_func_t _fn ); -void init_logging( const char* strProgramName ); +void init_logging( const char* _programName ); }; // namespace http_pg diff --git a/libskutils/include/skutils/http_pg.h b/libskutils/include/skutils/http_pg.h index 5a7b06c9b..48db50d89 100644 --- a/libskutils/include/skutils/http_pg.h +++ b/libskutils/include/skutils/http_pg.h @@ -10,18 +10,14 @@ #pragma GCC diagnostic ignored "-Wsign-compare" #pragma GCC diagnostic ignored "-Wattributes" -#include #include #include -//#include -#include #include #include #pragma GCC diagnostic pop -//#include #include #include @@ -35,11 +31,9 @@ namespace http_pg { class server_side_request_handler; -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// class request_sink { - std::atomic_uint64_t reqCount_{ 0 }; + std::atomic_uint64_t m_reqCount{ 0 }; public: request_sink(); @@ -48,44 +42,41 @@ class request_sink { virtual uint64_t getRequestCount(); }; -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// class request_site : public proxygen::RequestHandler { - request_sink& sink_; - std::unique_ptr< folly::IOBuf > body_; - server_side_request_handler* pSSRQ_; - static std::atomic_uint64_t g_instance_counter; - uint64_t nInstanceNumber_; - std::string strLogPrefix_; - size_t nBodyPartNumber_ = 0; - std::string strBody_; + request_sink& m_sink; + std::unique_ptr< folly::IOBuf > m_body; + server_side_request_handler* m_SSRQ; + static std::atomic_uint64_t g_instanceCounter; + uint64_t m_instanceNumber; + std::string m_strLogPrefix; + size_t m_bodyPartNumber = 0; + std::string m_strBody; public: - std::string strHttpMethod_, strOrigin_, strPath_, strDstAddress_; - int ipVer_ = -1, nDstPort_ = 0; + std::string m_httpMethod, m_origin, m_path, m_dstAddress_; + + int m_ipVer = -1, m_dstPort = 0; + + explicit request_site( request_sink& _aSink, server_side_request_handler* _SSRQ ); - explicit request_site( request_sink& a_sink, server_side_request_handler* pSSRQ ); ~request_site() override; - void onRequest( std::unique_ptr< proxygen::HTTPMessage > headers ) noexcept override; - void onBody( std::unique_ptr< folly::IOBuf > body ) noexcept override; + void onRequest( std::unique_ptr< proxygen::HTTPMessage > _headers ) noexcept override; + void onBody( std::unique_ptr< folly::IOBuf > _body ) noexcept override; void onEOM() noexcept override; - void onUpgrade( proxygen::UpgradeProtocol proto ) noexcept override; + void onUpgrade( proxygen::UpgradeProtocol _proto ) noexcept override; void requestComplete() noexcept override; - void onError( proxygen::ProxygenError err ) noexcept override; + void onError( proxygen::ProxygenError _err ) noexcept override; }; /// class request_site -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - class request_site_factory : public proxygen::RequestHandlerFactory { - folly::ThreadLocalPtr< request_sink > sink_; - server_side_request_handler* pSSRQ_ = nullptr; + folly::ThreadLocalPtr< request_sink > m_sink; + server_side_request_handler* m_SSRQ = nullptr; public: - request_site_factory( server_side_request_handler* pSSRQ ); + request_site_factory( server_side_request_handler* _SSRQ ); ~request_site_factory() override; void onServerStart( folly::EventBase* /*evb*/ ) noexcept override; void onServerStop() noexcept override; @@ -93,48 +84,41 @@ class request_site_factory : public proxygen::RequestHandlerFactory { proxygen::RequestHandler*, proxygen::HTTPMessage* ) noexcept override; }; /// class request_site_factory -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// class server_side_request_handler { public: server_side_request_handler(); virtual ~server_side_request_handler(); static nlohmann::json json_from_error_text( - const char* strErrorDescription, const nlohmann::json& joID ); + const char* _errorDescription, const nlohmann::json& _joID ); static std::string answer_from_error_text( - const char* strErrorDescription, const nlohmann::json& joID ); - virtual skutils::result_of_http_request onRequest( const nlohmann::json& joIn, - const std::string& strOrigin, int ipVer, const std::string& strDstAddress, - int nDstPort ) = 0; + const char* _errorDescription, const nlohmann::json& _joID ); + virtual skutils::result_of_http_request onRequest( const nlohmann::json& _joIn, + const std::string& _origin, int _ipVer, const std::string& _dstAddress, int _dstPort ) = 0; }; /// class server_side_request_handler -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// class server : public server_side_request_handler { - std::thread thread_; - std::unique_ptr< proxygen::HTTPServer > server_; - pg_on_request_handler_t h_; - pg_accumulate_entries entries_; - int32_t threads_ = 0; - int32_t threads_limit_ = 0; + std::thread m_thread; + std::unique_ptr< proxygen::HTTPServer > m_server; + pg_on_request_handler_t m_h; + pg_accumulate_entries m_entries; + int32_t m_threads = 0; + int32_t m_threads_limit = 0; - std::string strLogPrefix_; + std::string m_logPrefix; public: - server( pg_on_request_handler_t h, const pg_accumulate_entries& entries, int32_t threads = 0, - int32_t threads_limit = 0 ); + server( pg_on_request_handler_t _h, const pg_accumulate_entries& _entries, int32_t _threads = 0, + int32_t _threadsLimit = 0 ); ~server() override; bool start(); void stop(); - skutils::result_of_http_request onRequest( const nlohmann::json& joIn, - const std::string& strOrigin, int ipVer, const std::string& strDstAddress, - int nDstPort ) override; + skutils::result_of_http_request onRequest( const nlohmann::json& _joIn, + const std::string& _origin, int _ipVer, const std::string& _dstAddress, + int _dstPort ) override; }; /// class server -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// }; // namespace http_pg }; // namespace skutils diff --git a/libskutils/include/skutils/stats.h b/libskutils/include/skutils/stats.h index 3600d637b..6401ef539 100644 --- a/libskutils/include/skutils/stats.h +++ b/libskutils/include/skutils/stats.h @@ -192,7 +192,7 @@ double stat_compute_bps_til_now( const traffic_queue_t& qtr, bytes_count_t* p_nS namespace time_tracker { -class element : public skutils::ref_retain_release { +class element { public: typedef std::pair< skutils::stats::time_point, void* > id_t; @@ -202,59 +202,17 @@ class element : public skutils::ref_retain_release { typedef std::chrono::duration< double, std::milli > duration; private: - typedef skutils::multithreading::recursive_mutex_type mutex_type; - typedef std::lock_guard< mutex_type > lock_type; - static mutex_type& mtx() { return skutils::get_ref_mtx(); } + mutable std::atomic< bool > m_isStopped = false; - mutable volatile bool isError_ = false, isStopped_ = false; - mutable std::string strSubSystem_, strProtocol_, strMethod_; - - mutable time_point tpStart_, tpEnd_; - - void do_register(); - void do_unregister(); + mutable std::atomic< uint64_t > m_startTime, m_endTime; public: - static const char g_strMethodNameUnknown[]; - - element( const char* strSubSystem, const char* strProtocol, const char* strMethod, - int /*nServerIndex*/, int /*ipVer*/ ); + element(); virtual ~element(); void stop(); - void setMethod( const char* strMethod ) const; - void setError() const; double getDurationInSeconds() const; - id_t getID() { return id_t( tpStart_, this ); } - const std::string& getProtocol() const { return strProtocol_; } - const std::string& getMethod() const { return strMethod_; } }; /// class element -typedef skutils::retain_release_ptr< element > element_ptr_t; - -class queue : public skutils::ref_retain_release { - typedef skutils::multithreading::recursive_mutex_type mutex_type; - typedef std::lock_guard< mutex_type > lock_type; - static mutex_type& mtx() { return skutils::get_ref_mtx(); } - - typedef std::map< element::id_t, element_ptr_t > map_rtte_t; // rttID -> rttElement - typedef std::map< std::string, map_rtte_t > map_pq_t; // protocol name -> map_rtte_t - map_pq_t map_pq_; - - size_t nMaxItemsInQueue = 100; - -public: - typedef std::map< std::string, skutils::retain_release_ptr< queue > > - map_subsystem_time_trackers_t; - - queue(); - virtual ~queue(); - static queue& getQueueForSubsystem( const char* strSubSystem ); - void do_register( element_ptr_t& rttElement ); - void do_unregister( element_ptr_t& rttElement ); - std::list< std::string > getProtocols(); - nlohmann::json getProtocolStats( const char* strProtocol ); - nlohmann::json getAllStats(); -}; /// class queue }; // namespace time_tracker diff --git a/libskutils/include/skutils/task_performance.h b/libskutils/include/skutils/task_performance.h index 67f251a03..d861fdd7a 100644 --- a/libskutils/include/skutils/task_performance.h +++ b/libskutils/include/skutils/task_performance.h @@ -8,7 +8,7 @@ #include #include -#include + #include @@ -157,8 +157,6 @@ class item : public skutils::ref_retain_release, public describable, public time void set_json_err( const json& jsn ) override; }; -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// class queue : public skutils::ref_retain_release, public describable, @@ -186,9 +184,6 @@ class queue : public skutils::ref_retain_release, json compose_json( index_type minIndexT = 0 ) const; }; -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - class tracker : public skutils::ref_retain_release, public lockable, public index_holder, @@ -233,44 +228,6 @@ class tracker : public skutils::ref_retain_release, extern tracker_ptr get_default_tracker(); -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -class action { - bool isSkipped_ = false; - item_ptr pItem_; - -public: - action( const string& strQueueName, const string& strActionName, const json& jsnAction, - tracker_ptr pTracker ); - action( const string& strQueueName, const string& strActionName, const json& jsnAction ); - action( const string& strQueueName, const string& strActionName ); - action( const action& ) = delete; - action( action&& ) = delete; - virtual ~action(); - action& operator=( const action& ) = delete; - action& operator=( action&& ) = delete; - -private: - void init( const string& strQueueName, const string& strActionName, const json& jsnAction, - tracker_ptr pTracker ); - -public: - json get_json_in() const; - json get_json_out() const; - json get_json_err() const; - void set_json_in( const json& jsn ); - void set_json_out( const json& jsn ); - void set_json_err( const json& jsn ); - item_ptr get_item() const; - queue_ptr get_queue() const; - tracker_ptr get_tracker() const; - void finish(); - bool is_skipped() const; -}; - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// }; // namespace performance }; // namespace task diff --git a/libskutils/include/skutils/unddos.h b/libskutils/include/skutils/unddos.h index 4dc2307cc..56e588a40 100644 --- a/libskutils/include/skutils/unddos.h +++ b/libskutils/include/skutils/unddos.h @@ -1,6 +1,8 @@ #if ( !defined __SKUTILS_UN_DDOS_H ) #define __SKUTILS_UN_DDOS_H 1 +#include +#include #include #include #include @@ -10,17 +12,12 @@ #include #include #include +#include #include #include -#include -#include - -namespace skutils { -namespace unddos { +namespace skutils ::unddos { -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// typedef time_t time_tick_mark; typedef time_t duration; @@ -35,322 +32,265 @@ inline time_tick_mark make_tick_mark( time_tick_mark ttm ) { return ttm; } -inline void adjust_now_tick_mark( time_tick_mark& ttm ) { +inline void setCallTimeToNowIfZero( time_tick_mark& ttm ) { ttm = make_tick_mark( ttm ); } -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -class custom_method_setting { +class custom_method_limits { public: - size_t max_calls_per_second_ = 0; - size_t max_calls_per_minute_ = 0; - custom_method_setting& merge( const custom_method_setting& other ) { - max_calls_per_second_ = std::min( max_calls_per_second_, other.max_calls_per_second_ ); - max_calls_per_minute_ = std::min( max_calls_per_minute_, other.max_calls_per_minute_ ); + size_t m_maxCallsPerSecond = 0; + size_t m_maxCallsPerMinute = 0; + + custom_method_limits& merge( const custom_method_limits& other ) { + m_maxCallsPerSecond = std::min( m_maxCallsPerSecond, other.m_maxCallsPerSecond ); + m_maxCallsPerMinute = std::min( m_maxCallsPerMinute, other.m_maxCallsPerMinute ); return ( *this ); } -}; // class custom_method_setting - -typedef std::map< std::string, custom_method_setting > map_custom_method_settings_t; +}; -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +typedef std::map< std::string, custom_method_limits > map_custom_method_limits_t; typedef std::vector< std::string > origin_wildcards_t; -class origin_entry_setting { +class origin_dos_limits { public: - origin_wildcards_t origin_wildcards_; - size_t max_calls_per_second_ = 0; - size_t max_calls_per_minute_ = 0; - duration ban_peak_ = duration( 0 ); - duration ban_lengthy_ = duration( 0 ); - size_t max_ws_conn_ = 0; - map_custom_method_settings_t map_custom_method_settings_; - origin_entry_setting(); - origin_entry_setting( const origin_entry_setting& other ); - origin_entry_setting( origin_entry_setting&& other ); - virtual ~origin_entry_setting(); - origin_entry_setting& operator=( const origin_entry_setting& other ); + origin_wildcards_t m_originWildcards; + size_t m_defaultMaxCallsPerSec = 0; + size_t m_defaultMaxCallsPerMin = 0; + duration m_banPerSecDuration = duration( 0 ); + duration m_banPerMinDuration = duration( 0 ); + size_t m_maxWSConn = 0; + map_custom_method_limits_t m_mapCustomMethodLimits; + + origin_dos_limits(); + + origin_dos_limits( const origin_dos_limits& other ); + + origin_dos_limits( origin_dos_limits&& other ); + + virtual ~origin_dos_limits(); + + origin_dos_limits& operator=( const origin_dos_limits& other ); + void load_defaults_for_any_origin(); + void load_friendly_for_any_origin(); - void load_reasonable_for_any_origin(); + void load_unlim_for_any_origin(); + void load_unlim_for_localhost_only(); + void load_custom_method_as_multiplier_of_default( const char* strMethod, double lfMultiplier = 10.0 ); + void load_recommended_custom_methods_as_multiplier_of_default( double lfMultiplier = 10.0 ); + bool empty() const; + operator bool() const { return ( !empty() ); } + bool operator!() const { return empty(); } + void clear(); - origin_entry_setting& assign( const origin_entry_setting& other ); - origin_entry_setting& merge( const origin_entry_setting& other ); + + origin_dos_limits& assign( const origin_dos_limits& other ); + + origin_dos_limits& merge( const origin_dos_limits& other ); + void fromJSON( const nlohmann::json& jo ); + void toJSON( nlohmann::json& jo ) const; + bool match_origin( const char* origin ) const; - bool match_origin( const std::string& origin ) const; + size_t max_calls_per_second( const char* strMethod ) const; - size_t max_calls_per_minute( const char* strMethod ) const; -}; /// class origin_entry_setting -typedef std::vector< origin_entry_setting > origin_entry_settings_t; + size_t max_calls_per_minute( const char* strMethod ) const; +}; -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +typedef std::vector< origin_dos_limits > origin_entry_settings_t; class settings { public: - bool enabled_ = true; - origin_entry_settings_t origins_; - origin_entry_setting global_limit_; + bool m_enabled = true; + origin_entry_settings_t m_originDosLimits; + origin_dos_limits m_globalLimitSetting; + settings(); + settings( const settings& other ); + settings( settings&& other ); + virtual ~settings(); + settings& operator=( const settings& other ); + bool empty() const; + operator bool() const { return ( !empty() ); } + bool operator!() const { return empty(); } + void clear(); + settings& assign( const settings& other ); - settings& merge( const origin_entry_setting& oe ); + + settings& merge( const origin_dos_limits& oe ); + settings& merge( const settings& other ); - size_t indexOfOrigin( const origin_entry_setting& oe, size_t idxStart = std::string::npos ); + + size_t indexOfOrigin( const origin_dos_limits& oe, size_t idxStart = std::string::npos ); + size_t indexOfOrigin( const char* origin_wildcard, size_t idxStart = std::string::npos ); + size_t indexOfOrigin( const std::string& origin_wildcard, size_t idxStart = std::string::npos ); + void fromJSON( const nlohmann::json& jo ); + void toJSON( nlohmann::json& jo ) const; - size_t find_origin_entry_setting_match( - const char* origin, size_t idxStart = std::string::npos ) const; - size_t find_origin_entry_setting_match( - const std::string& origin, size_t idxStart = std::string::npos ) const { - return find_origin_entry_setting_match( origin.c_str(), idxStart ); - } - origin_entry_setting& find_origin_entry_setting( const char* origin ); - origin_entry_setting& find_origin_entry_setting( const std::string& origin ) { - return find_origin_entry_setting( origin.c_str() ); - } - const origin_entry_setting& find_origin_entry_setting( const char* origin ) const { - return ( const_cast< settings* >( this ) )->find_origin_entry_setting( origin ); - } - const origin_entry_setting& find_origin_entry_setting( const std::string& origin ) const { - return ( const_cast< settings* >( this ) )->find_origin_entry_setting( origin ); - } - origin_entry_setting& auto_append_any_origin_rule(); -}; /// class settings -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + size_t findOriginLimitsMatch( const char* origin, size_t idxStart = std::string::npos ) const; -class time_entry { -public: - time_tick_mark ttm_ = time_tick_mark( 0 ); - time_entry( time_tick_mark ttm = time_tick_mark( 0 ) ); - time_entry( const time_entry& other ); - time_entry( time_entry&& other ); - virtual ~time_entry(); - time_entry& operator=( const time_entry& other ); - bool empty() const; - operator bool() const { return ( !empty() ); } - bool operator!() const { return empty(); } - void clear(); - time_entry& assign( const time_entry& other ); - int compare( const time_entry& other ) const; - bool operator==( const time_entry& other ) const { - return ( compare( other ) == 0 ) ? true : false; - } - bool operator!=( const time_entry& other ) const { - return ( compare( other ) != 0 ) ? true : false; - } - bool operator<( const time_entry& other ) const { - return ( compare( other ) < 0 ) ? true : false; - } - bool operator<=( const time_entry& other ) const { - return ( compare( other ) <= 0 ) ? true : false; - } - bool operator>( const time_entry& other ) const { - return ( compare( other ) > 0 ) ? true : false; - } - bool operator>=( const time_entry& other ) const { - return ( compare( other ) >= 0 ) ? true : false; - } -}; /// class time_entry + origin_dos_limits& findOriginDosLimits( const char* _origin ); -typedef std::vector< time_entry > time_entries_t; + origin_dos_limits& auto_append_any_origin_rule(); +}; + + +enum class e_high_load_detection_result_t { + ehldr_no_error, + ehldr_detected_ban_per_sec, // ban by too high load per sec + ehldr_detected_ban_per_min, // ban by too high load per min + ehldr_bad_origin, + ehldr_already_banned // still banned +}; -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// class tracked_origin { public: - std::string origin_; - time_entries_t time_entries_; - time_tick_mark ban_until_ = time_tick_mark( 0 ); - tracked_origin( const char* origin = nullptr, time_tick_mark ttm = time_tick_mark( 0 ) ); - tracked_origin( const std::string& origin, time_tick_mark ttm = time_tick_mark( 0 ) ); - tracked_origin( const tracked_origin& other ); - tracked_origin( tracked_origin&& other ); - virtual ~tracked_origin(); - operator std::string() const { return origin_; } - tracked_origin& operator=( const tracked_origin& other ); - bool empty() const; - operator bool() const { return ( !empty() ); } - bool operator!() const { return empty(); } - void clear(); - tracked_origin& assign( const tracked_origin& other ); - int compare( const tracked_origin& other ) const; - int compare( const char* origin ) const; - int compare( const std::string& origin ) const; - // - bool operator==( const tracked_origin& other ) const { - return ( compare( other ) == 0 ) ? true : false; - } - bool operator!=( const tracked_origin& other ) const { - return ( compare( other ) != 0 ) ? true : false; - } - bool operator<( const tracked_origin& other ) const { - return ( compare( other ) < 0 ) ? true : false; - } - bool operator<=( const tracked_origin& other ) const { - return ( compare( other ) <= 0 ) ? true : false; - } - bool operator>( const tracked_origin& other ) const { - return ( compare( other ) > 0 ) ? true : false; - } - bool operator>=( const tracked_origin& other ) const { - return ( compare( other ) >= 0 ) ? true : false; - } - // - bool operator==( const char* origin ) const { - return ( compare( origin ) == 0 ) ? true : false; - } - bool operator!=( const char* origin ) const { - return ( compare( origin ) != 0 ) ? true : false; - } - bool operator<( const char* origin ) const { return ( compare( origin ) < 0 ) ? true : false; } - bool operator<=( const char* origin ) const { - return ( compare( origin ) <= 0 ) ? true : false; - } - bool operator>( const char* origin ) const { return ( compare( origin ) > 0 ) ? true : false; } - bool operator>=( const char* origin ) const { - return ( compare( origin ) >= 0 ) ? true : false; - } - // - bool operator==( const std::string& origin ) const { - return ( compare( origin ) == 0 ) ? true : false; - } - bool operator!=( const std::string& origin ) const { - return ( compare( origin ) != 0 ) ? true : false; - } - bool operator<( const std::string& origin ) const { - return ( compare( origin ) < 0 ) ? true : false; - } - bool operator<=( const std::string& origin ) const { - return ( compare( origin ) <= 0 ) ? true : false; - } - bool operator>( const std::string& origin ) const { - return ( compare( origin ) > 0 ) ? true : false; - } - bool operator>=( const std::string& origin ) const { - return ( compare( origin ) >= 0 ) ? true : false; + std::shared_mutex x_mutex; + std::string m_origin; + uint64_t m_currentSec = 0; + uint64_t m_currentMin = 0; + std::map< std::string, uint64_t > m_currentMinUseCounterPerMethod; + std::map< std::string, uint64_t > m_currentSecUseCounterPerMethod; + std::atomic< uint64_t > m_banUntilSec = 0; + origin_dos_limits m_dosLimits; + + tracked_origin( const char* origin ); + + + tracked_origin( const tracked_origin& other ) + : m_origin( other.m_origin ), + m_currentSec( other.m_currentSec ), + m_currentMin( other.m_currentMin ), + m_currentMinUseCounterPerMethod( other.m_currentMinUseCounterPerMethod ), + m_currentSecUseCounterPerMethod( other.m_currentSecUseCounterPerMethod ), + m_banUntilSec( other.m_banUntilSec.load() ) {} + + + tracked_origin( tracked_origin&& _other ) noexcept + : m_origin( std::move( _other.m_origin ) ), + m_currentSec( _other.m_currentSec ), + m_currentMin( _other.m_currentMin ), + m_currentMinUseCounterPerMethod( std::move( _other.m_currentMinUseCounterPerMethod ) ), + m_currentSecUseCounterPerMethod( std::move( _other.m_currentSecUseCounterPerMethod ) ), + m_banUntilSec( _other.m_banUntilSec.load() ) { + // x_mutex is intentionally not moved + _other.m_currentSec = 0; + _other.m_currentMin = 0; + _other.m_banUntilSec = 0; } - // - size_t unload_old_data_by_time_to_past( - time_tick_mark ttmNow = time_tick_mark( 0 ), duration durationToPast = duration( 60 ) ); - size_t unload_old_data_by_count( size_t cntEntriesMax ); - size_t count_to_past( time_tick_mark ttmNow = time_tick_mark( 0 ), - duration durationToPast = duration( 60 ), size_t cntOptimizedMaxSteps = size_t( -1 ), - size_t cntTargetUnDDoS = size_t( -1 ) ) const; - bool clear_ban(); - bool check_ban( time_tick_mark ttmNow = time_tick_mark( 0 ), bool isAutoClear = true ); -}; /// class tracked_origin - -typedef std::set< tracked_origin > tracked_origins_t; - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -enum class e_high_load_detection_result_t { - ehldr_no_error, - ehldr_peak, // ban by too high load per minute - ehldr_lengthy, // ban by too high load per second - ehldr_bad_origin, - ehldr_ban // still banned + + virtual ~tracked_origin(); + + operator std::string() const { return m_origin; } + + + bool isBanned( uint64_t _timeSec ); + + void recordUse( uint64_t _useTimeSec, const char* _strMethod ); + + void setDosLimits( const origin_dos_limits& _dosLimits ); + + e_high_load_detection_result_t detectBan( uint64_t _callTimeSec, const char* _strMethod ); + + e_high_load_detection_result_t recordMethodUseAndDetectBan( + uint64_t _callTimeSec, const char* _strMethod ); }; + class algorithm { - typedef skutils::multithreading::recursive_mutex_type mutex_type; - typedef std::lock_guard< mutex_type > lock_type; - mutable mutex_type mtx_; - mutable settings settings_; - tracked_origins_t tracked_origins_; - tracked_origin tracked_global_; typedef std::map< std::string, size_t > map_ws_conn_counts_t; - map_ws_conn_counts_t map_ws_conn_counts_; - size_t ws_conn_count_global_ = 0; - size_t cntOptimizedMaxSteps4cm_ = - 15; // local per one caller, per minute (optimize approximation for calls per time unit) - size_t cntOptimizedMaxSteps4cs_ = - 15; // local per one caller, per second (optimize approximation for calls per time unit) - size_t cntOptimizedMaxSteps4gm_ = - 10; // global for all callers, per minute (optimize approximation for calls per time unit) - size_t cntOptimizedMaxSteps4gs_ = - 10; // global for all callers, per second (optimize approximation for calls per time unit) + + mutable std::shared_mutex x_mtx; + mutable settings m_settings; + + tracked_origin m_globalOrigin; + + std::map< std::string, std::shared_ptr< tracked_origin > > m_trackedOriginsMap; + + map_ws_conn_counts_t m_mapWsConnCounts; + size_t m_WsConnCountGlobal = 0; public: algorithm(); + algorithm( const settings& st ); + algorithm( const algorithm& ) = delete; + algorithm( algorithm&& ) = delete; + virtual ~algorithm(); + algorithm& operator=( const algorithm& ) = delete; + algorithm& operator=( const settings& st ); - size_t unload_old_data_by_time_to_past( - time_tick_mark ttmNow = time_tick_mark( 0 ), duration durationToPast = duration( 60 ) ); - e_high_load_detection_result_t register_call_from_origin( const char* origin, - const char* strMethod, time_tick_mark ttmNow = time_tick_mark( 0 ), - duration durationToPast = duration( 60 ) ); + + e_high_load_detection_result_t register_call_from_origin( const char* _origin, + const char* _strMethod, time_tick_mark _callTime = time_tick_mark( 0 ), + duration _durationToPast = duration( 60 ) ); + e_high_load_detection_result_t register_call_from_origin( const std::string& origin, const std::string& strMethod, time_tick_mark ttmNow = time_tick_mark( 0 ), duration durationToPast = duration( 60 ) ) { return register_call_from_origin( origin.c_str(), strMethod.c_str(), ttmNow, durationToPast ); } + e_high_load_detection_result_t register_call_from_origin( const char* origin, time_tick_mark ttmNow = time_tick_mark( 0 ), duration durationToPast = duration( 60 ) ) { return register_call_from_origin( origin, nullptr, ttmNow, durationToPast ); } - e_high_load_detection_result_t register_call_from_origin( const std::string& origin, - time_tick_mark ttmNow = time_tick_mark( 0 ), duration durationToPast = duration( 60 ) ) { - return register_call_from_origin( origin.c_str(), nullptr, ttmNow, durationToPast ); - } + bool is_ban_ws_conn_for_origin( const char* origin ) const; - bool is_ban_ws_conn_for_origin( const std::string& origin ) const { - return is_ban_ws_conn_for_origin( origin.c_str() ); - } + e_high_load_detection_result_t register_ws_conn_for_origin( const char* origin ); + e_high_load_detection_result_t register_ws_conn_for_origin( const std::string& origin ) { return register_ws_conn_for_origin( origin.c_str() ); } + bool unregister_ws_conn_for_origin( const char* origin ); + bool unregister_ws_conn_for_origin( const std::string& origin ) { return unregister_ws_conn_for_origin( origin.c_str() ); } + bool load_settings_from_json( const nlohmann::json& joUnDdosSettings ); + settings get_settings() const; + void set_settings( const settings& new_settings ) const; + nlohmann::json get_settings_json() const; - nlohmann::json stats( time_tick_mark ttmNow = time_tick_mark( 0 ), - duration durationToPast = duration( 60 ) ) const; -}; /// class algorithm -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + void addNewOriginToMap( const char* _origin ); +}; -}; // namespace unddos -}; // namespace skutils +}; // namespace skutils::unddos #endif // (!defined __SKUTILS_UN_DDOS_H) diff --git a/libskutils/include/skutils/utils.h b/libskutils/include/skutils/utils.h index 7a792f230..d8d65c568 100644 --- a/libskutils/include/skutils/utils.h +++ b/libskutils/include/skutils/utils.h @@ -256,46 +256,6 @@ constexpr static char DISKSTATS[] = "/proc/diskstats"; constexpr static int MAX_NAME_LEN = 128; constexpr static int MAX_LINE_LEN = 256; -#if ( defined __BUILDING_4_MAC_OS_X__ ) -extern float osx_GetSystemMemoryUsagePercentage(); -extern float osx_GetCPULoad(); -#else -struct DiskInfo { - size_t readIOS; - size_t writeIOS; - size_t readSectors; - size_t writeSectors; -}; -extern std::atomic_size_t g_nSleepMillisecondsBetweenCpuLoadMeasurements; -extern std::vector< long double > cpu_load(); -extern std::map< std::string, DiskInfo > disk_load(); -extern nlohmann::json calculate_load_interval( const std::map< std::string, DiskInfo >& prevLoad, - const std::map< std::string, DiskInfo >& currentLoad, size_t nSleepMs ); -#endif - -class load_monitor { - std::atomic_bool stop_flag_; - std::atomic< double > cpu_load_; - size_t nSleepMillisecondsBetweenCpuLoadMeasurements_; - std::thread thread_; - -#if ( !defined __BUILDING_4_MAC_OS_X__ ) - nlohmann::json diskLoad_; - mutable std::mutex diskLoadMutex_; -#endif -public: - load_monitor( size_t nSleepMillisecondsBetweenCpuLoadMeasurements = - 0 ); // 0 means use g_nSleepMillisecondsBetweenCpuLoadMeasurements - virtual ~load_monitor(); - double last_cpu_load() const; - nlohmann::json last_disk_load() const; - -private: - void thread_proc(); -#if ( !defined __BUILDING_4_MAC_OS_X__ ) - void calculate_load( size_t nSleep ); -#endif -}; /// class cpu_load_monitor extern std::string create_random_uuid( const char* strSeparator ); extern std::string create_random_uuid(); @@ -312,8 +272,6 @@ extern std::vector< uint8_t > decodeBin( std::string const& encoded_string ); extern std::string decode( std::string const& encoded_string ); }; // namespace base64 -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// class md5 { // based on https://www.codeproject.com/Articles/98355/SMTP-Client-with-SSL-TLS public: diff --git a/libskutils/include/skutils/ws.h b/libskutils/include/skutils/ws.h index 710579507..cee604ba7 100644 --- a/libskutils/include/skutils/ws.h +++ b/libskutils/include/skutils/ws.h @@ -20,9 +20,6 @@ #include #include #include -#include -#include -#include #include #include @@ -53,143 +50,6 @@ enum class e_ws_log_message_type_t { eWSLMT_error }; /// enum class e_ws_log_message_type_t -class traffic_stats : public skutils::stats::named_event_stats { -public: - typedef traffic_stats myt; - typedef myt& myrt; - typedef myt&& myrrt; - typedef const myt& myrct; - typedef std::lock_guard< myt > lock_type; - typedef skutils::stats::clock clock; - typedef skutils::stats::time_point time_point; - typedef skutils::stats::nanoseconds nanoseconds; - typedef skutils::stats::duration_base_t duration_base_t; - typedef skutils::stats::duration duration; - typedef skutils::stats::event_record_item_t event_record_item_t; - typedef skutils::stats::event_queue_t event_queue_t; - typedef skutils::stats::named_event_stats named_event_stats; - typedef skutils::stats::bytes_count_t bytes_count_t; - typedef skutils::stats::traffic_record_item_t traffic_record_item_t; - typedef skutils::stats::traffic_queue_t traffic_queue_t; - enum e_last_instance_state_changing_type_t { - elisctt_instantiated, - elisctt_opened, - elisctt_closed, - }; // enum e_last_instance_state_changing_type_t -protected: - volatile bytes_count_t text_tx_, text_rx_, bin_tx_, bin_rx_; - e_last_instance_state_changing_type_t elisctt_; - time_point time_stamp_instantiated_, time_stamp_opened_, time_stamp_closed_; - traffic_queue_t traffic_queue_all_tx_, traffic_queue_all_rx_, traffic_queue_text_tx_, - traffic_queue_text_rx_, traffic_queue_bin_tx_, traffic_queue_bin_rx_; - void init(); - myrt limit( size_t lim ); - -public: - traffic_stats(); - traffic_stats( myrct x ); - traffic_stats( myrrt x ); - virtual ~traffic_stats(); - myrt operator=( myrct x ) { return assign( x ); } - myrt operator=( myrrt x ) { return move( x ); } - bool operator==( myrct x ) const { return ( compare( x ) == 0 ) ? true : false; } - bool operator!=( myrct x ) const { return ( compare( x ) != 0 ) ? true : false; } - bool operator<( myrct x ) const { return ( compare( x ) < 0 ) ? true : false; } - bool operator<=( myrct x ) const { return ( compare( x ) <= 0 ) ? true : false; } - bool operator>( myrct x ) const { return ( compare( x ) > 0 ) ? true : false; } - bool operator>=( myrct x ) const { return ( compare( x ) >= 0 ) ? true : false; } - operator bool() const { return ( !empty() ); } - bool operator!() const { return empty(); } - virtual bytes_count_t text_tx() const; - virtual bytes_count_t text_rx() const; - virtual bytes_count_t bin_tx() const; - virtual bytes_count_t bin_rx() const; - virtual bytes_count_t tx() const; - virtual bytes_count_t rx() const; - double bps_text_tx( time_point tpNow ) const; - double bps_text_tx_last_known() const; - double bps_text_tx() const; - double bps_text_rx( time_point tpNow ) const; - double bps_text_rx_last_known() const; - double bps_text_rx() const; - double bps_bin_tx( time_point tpNow ) const; - double bps_bin_tx_last_known() const; - double bps_bin_tx() const; - double bps_bin_rx( time_point tpNow ) const; - double bps_bin_rx_last_known() const; - double bps_bin_rx() const; - double bps_tx( time_point tpNow ) const; - double bps_tx_last_known() const; - double bps_tx() const; - double bps_rx( time_point tpNow ) const; - double bps_rx_last_known() const; - double bps_rx() const; - virtual myrt log_text_tx( bytes_count_t n ); - virtual myrt log_text_rx( bytes_count_t n ); - virtual myrt log_bin_tx( bytes_count_t n ); - virtual myrt log_bin_rx( bytes_count_t n ); - e_last_instance_state_changing_type_t last_instance_state_changing_type() const; - std::string last_instance_state_changing_type_as_str() const; - time_point instantiated() const; - nanoseconds instantiated_ago( time_point tpNow ) const; - nanoseconds instantiated_ago() const; - time_point changed() const; - nanoseconds changed_ago( time_point tpNow ) const; - nanoseconds changed_ago() const; - virtual void log_open(); - virtual void log_close(); - bool empty() const; - void clear(); - int compare( myrct x ) const; - myrt assign( myrct x ); - myrt move( myrt x ); - virtual void lock(); - virtual void unlock(); - virtual std::string getLifeTimeDescription( time_point tpNow, bool isColored = false ) const; - std::string getLifeTimeDescription( bool isColored = false ) const; - virtual std::string getTrafficStatsDescription( - time_point tpNow, bool isColored = false ) const; - std::string getTrafficStatsDescription( bool isColored = false ) const; - nlohmann::json toJSON( time_point tpNow, bool bSkipEmptyStats = true ) const; - nlohmann::json toJSON( bool bSkipEmptyStats = true ) const; - static size_t g_nSizeDefaultOnQueueAdd; - static const char g_strEventNameWebSocketFail[]; - static const char g_strEventNameWebSocketMessagesRecvText[]; - static const char g_strEventNameWebSocketMessagesRecvBinary[]; - static const char g_strEventNameWebSocketMessagesRecv[]; - static const char g_strEventNameWebSocketMessagesSentText[]; - static const char g_strEventNameWebSocketMessagesSentBinary[]; - static const char g_strEventNameWebSocketMessagesSent[]; - void register_default_event_queues_for_web_socket(); - static const char g_strEventNameWebSocketPeerConnect[]; - static const char g_strEventNameWebSocketPeerDisconnect[]; - static const char g_strEventNameWebSocketPeerDisconnectFail[]; - void register_default_event_queues_for_web_socket_peer(); - static const char g_strEventNameWebSocketServerStart[]; - static const char g_strEventNameWebSocketServerStartFail[]; - static const char g_strEventNameWebSocketServerStop[]; - void register_default_event_queues_for_web_socket_server(); - static const char g_strEventNameWebSocketClientConnect[]; - static const char g_strEventNameWebSocketClientConnectFail[]; - static const char g_strEventNameWebSocketClientDisconnect[]; - static const char g_strEventNameWebSocketClientReconnect[]; - void register_default_event_queues_for_web_socket_client(); -}; /// class traffic_stats - -class guarded_traffic_stats : public traffic_stats { - typedef skutils::multithreading::recursive_mutex_type mutex_type; - -protected: - // mutex_type traffic_stats_mtx_; -public: - guarded_traffic_stats(); - guarded_traffic_stats( myrct x ); - guarded_traffic_stats( myrrt x ); - ~guarded_traffic_stats() override; - void lock() override; - void unlock() override; -}; // class guarded_traffic_stats - class security_args { public: std::string strCertificateFile_; @@ -782,7 +642,7 @@ typedef std::function< void( peer& aPeer, const std::string& reason, int local_c onPeerClose_t; typedef std::function< void( peer& aPeer ) > onPeerFail_t; -class peer : public basic_sender, public guarded_traffic_stats { +class peer : public basic_sender { public: onPeerMessage_t onPeerMessage_; onPeerClose_t onPeerClose_; @@ -849,7 +709,7 @@ class peer : public basic_sender, public guarded_traffic_stats { typedef std::function< peer_ptr_t( server& srv, hdl_t hdl ) > onPeerInstantiate_t; typedef std::function< void( peer_ptr_t& pPeer ) > onPeerEvent_t; -class server : public basic_socket, public security_args, public guarded_traffic_stats { +class server : public basic_socket, public security_args { server_api api_; size_t server_serial_number_; @@ -912,10 +772,7 @@ class server : public basic_socket, public security_args, public guarded_traffic nlohmann::json toJSON( bool bSkipEmptyStats = true ) const override; }; /// class server -class client : public basic_socket, - public basic_sender, - public security_args, - public guarded_traffic_stats { +class client : public basic_socket, public basic_sender, public security_args { client_api api_; skutils::async::timer<> restart_timer_; bool isRestartTimerEnabled_ = true; diff --git a/libskutils/src/dispatch.cpp b/libskutils/src/dispatch.cpp index 12ca74c68..456f16bb2 100644 --- a/libskutils/src/dispatch.cpp +++ b/libskutils/src/dispatch.cpp @@ -1049,14 +1049,7 @@ bool queue::impl_job_run( job_t /*&*/ fn ) { // run explicitly specified job sy "dispatch queue %s before run job fn %p\n", id_.c_str(), this ); std::cout.flush(); #endif - // - std::string strPerformanceQueueName = - skutils::tools::format( "dispatch/queue/%s", id_.c_str() ); - std::string strPerformanceActionName = - skutils::tools::format( "task %zu", nTaskNumberInQueue_++ ); - skutils::task::performance::action a( - strPerformanceQueueName, strPerformanceActionName ); - // + fn(); #if ( defined __SKUTILS_DISPATCH_DEBUG_CONSOLE_TRACE_QUEUE_STATES__ ) std::cout << skutils::tools::format( @@ -1337,7 +1330,6 @@ void domain::impl_startup( size_t nWaitMilliSeconds /*= size_t(-1)*/ ) { std::cout << strThreadStartupMessage; std::cout.flush(); } - size_t nTaskNumberInThisThread = 0; for ( ; true; ) { if ( shutdown_flag_ ) break; @@ -1349,12 +1341,6 @@ void domain::impl_startup( size_t nWaitMilliSeconds /*= size_t(-1)*/ ) { break; for ( ; true; ) { // - std::string strPerformanceActionName = - skutils::tools::format( - "task %zu", nTaskNumberInThisThread++ ); - skutils::task::performance::action a( - strPerformanceQueueName, strPerformanceActionName ); - // if ( !run_one() ) break; if ( shutdown_flag_ ) diff --git a/libskutils/src/http_pg.cpp b/libskutils/src/http_pg.cpp index 83952d64c..0248ef5de 100644 --- a/libskutils/src/http_pg.cpp +++ b/libskutils/src/http_pg.cpp @@ -17,101 +17,99 @@ #include #include +#define PG_LOG( __EXPRESSION__ ) \ + if ( pg_logging_get() ) { \ + pg_log( __EXPRESSION__ ); \ + } + namespace skutils { namespace http_pg { -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void init_logging( const char* strProgramName ) { - static bool g_bWasCalled = false; - if ( g_bWasCalled ) +using std::string; +using std::to_string; + +void init_logging( const char* _programName ) { + static std::atomic_bool g_bWasCalled = false; + // run once + if ( g_bWasCalled.exchange( true ) ) return; - g_bWasCalled = true; - google::InitGoogleLogging( strProgramName ); + google::InitGoogleLogging( _programName ); } -void install_logging_fail_func( logging_fail_func_t fn ) { - static bool g_bWasCalled = false; - if ( g_bWasCalled ) +void install_logging_fail_func( logging_fail_func_t _fn ) { + static std::atomic_bool g_wasCalled = false; + if ( g_wasCalled.exchange( true ) ) return; - g_bWasCalled = true; - google::InstallFailureFunction( reinterpret_cast< google::logging_fail_func_t >( fn ) ); + google::InstallFailureFunction( reinterpret_cast< google::logging_fail_func_t >( _fn ) ); } -void pg_log( const char* s ) { - if ( s == nullptr || s[0] == '\0' ) - return; +void pg_log( const string& _s ) { if ( !pg_logging_get() ) return; - std::cout << s; -} - -void pg_log( const std::string& s ) { - if ( s.empty() ) + if ( _s.empty() ) return; - return pg_log( s.c_str() ); + std::cerr << _s << std::endl; } -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// request_sink::request_sink() {} request_sink::~request_sink() {} uint64_t request_sink::getRequestCount() { - return reqCount_; + return m_reqCount; } void request_sink::OnRecordRequestCountIncrement() { - ++reqCount_; + ++m_reqCount; } -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -std::atomic_uint64_t request_site::g_instance_counter = 0; +std::atomic_uint64_t request_site::g_instanceCounter = 0; -request_site::request_site( request_sink& a_sink, server_side_request_handler* pSSRQ ) - : sink_( a_sink ), pSSRQ_( pSSRQ ), nInstanceNumber_( g_instance_counter++ ) { - strLogPrefix_ = cc::notice( "PG" ) + cc::normal( "/" ) + cc::notice( "rq" ) + - cc::normal( "/" ) + cc::notice( "site" ) + cc::normal( "/" ) + - cc::size10( nInstanceNumber_ ) + " "; - pg_log( strLogPrefix_ + cc::debug( "constructor" ) + "\n" ); +request_site::request_site( request_sink& _aSink, server_side_request_handler* _SSRQ ) + : m_sink( _aSink ), m_SSRQ( _SSRQ ), m_instanceNumber( g_instanceCounter++ ) { + m_strLogPrefix = + string( "PG" ) + "/" + "rq" + "/" + "site" + "/" + to_string( m_instanceNumber ) + " "; + PG_LOG( m_strLogPrefix + "constructor" ); } request_site::~request_site() { - pg_log( strLogPrefix_ + cc::debug( "destructor" ) + "\n" ); + PG_LOG( m_strLogPrefix + "destructor" ); } -void request_site::onRequest( std::unique_ptr< proxygen::HTTPMessage > req ) noexcept { - sink_.OnRecordRequestCountIncrement(); - strHttpMethod_ = - skutils::tools::to_upper( skutils::tools::trim_copy( req->getMethodString() ) ); - pg_log( strLogPrefix_ + cc::info( strHttpMethod_ ) + cc::debug( " request query" ) + "\n" ); - const folly::SocketAddress& origin_address = req->getClientAddress(); - std::string strClientAddress = origin_address.getAddressStr(); // getFullyQualified() - ipVer_ = +void request_site::onRequest( std::unique_ptr< proxygen::HTTPMessage > _req ) noexcept { + m_sink.OnRecordRequestCountIncrement(); + m_httpMethod = skutils::tools::to_upper( skutils::tools::trim_copy( _req->getMethodString() ) ); + + PG_LOG( m_strLogPrefix + m_httpMethod + " request query" ); + + const folly::SocketAddress& origin_address = _req->getClientAddress(); + string strClientAddress = origin_address.getAddressStr(); + m_ipVer = ( skutils::is_ipv6( strClientAddress ) && skutils::is_valid_ipv6( strClientAddress ) ) ? 6 : 4; - std::string strAddressPart = - ( ( ipVer_ == 6 ) ? "[" : "" ) + strClientAddress + ( ( ipVer_ == 6 ) ? "]" : "" ); - strOrigin_ = req->getScheme() + "://" + strAddressPart + ":" + req->getClientPort(); - strPath_ = req->getPath(); - strDstAddress_ = req->getDstAddress().getAddressStr(); // getFullyQualified() - std::string strDstPort = req->getDstPort(); - nDstPort_ = ( !strDstPort.empty() ) ? atoi( strDstPort.c_str() ) : 0; - pg_log( strLogPrefix_ + cc::debug( "request query " ) + cc::sunny( strHttpMethod_ ) + - cc::debug( " from origin " ) + cc::info( strOrigin_ ) + cc::debug( ", path " ) + - cc::p( strPath_ ) + "\n" ); - size_t nHeaderIdx = 0; - req->getHeaders().forEach( [&]( std::string& name, std::string& value ) { - pg_log( strLogPrefix_ + cc::debug( "header " ) + cc::num10( nHeaderIdx ) + " " + - cc::attention( name ) + cc::debug( "=" ) + cc::attention( value ) + "\n" ); - ++nHeaderIdx; - } ); - if ( strHttpMethod_ == "OPTIONS" ) { + string strAddressPart = + ( ( m_ipVer == 6 ) ? "[" : "" ) + strClientAddress + ( ( m_ipVer == 6 ) ? "]" : "" ); + m_origin = _req->getScheme() + "://" + strAddressPart + ":" + _req->getClientPort(); + m_path = _req->getPath(); + m_dstAddress_ = _req->getDstAddress().getAddressStr(); // getFullyQualified() + string strDstPort = _req->getDstPort(); + m_dstPort = ( !strDstPort.empty() ) ? atoi( strDstPort.c_str() ) : 0; + + PG_LOG( m_strLogPrefix + "request query " + m_httpMethod + " from origin " + m_origin + + ", path " + m_path ); + + if ( pg_logging_get() ) { + size_t nHeaderIdx = 0; + _req->getHeaders().forEach( [&]( string& _name, string& _value ) { + PG_LOG( + m_strLogPrefix + "header " + to_string( nHeaderIdx ) + " " + _name + "=" + _value ); + ++nHeaderIdx; + } ); + } + if ( m_httpMethod == "OPTIONS" ) { proxygen::ResponseBuilder( downstream_ ) .status( 200, "OK" ) .header( "access-control-allow-headers", "Content-Type" ) @@ -125,72 +123,66 @@ void request_site::onRequest( std::unique_ptr< proxygen::HTTPMessage > req ) noe } } -void request_site::onBody( std::unique_ptr< folly::IOBuf > body ) noexcept { - pg_log( strLogPrefix_ + cc::info( strHttpMethod_ ) + cc::debug( " body query" ) + "\n" ); - if ( strHttpMethod_ == "OPTIONS" ) +void request_site::onBody( std::unique_ptr< folly::IOBuf > _body ) noexcept { + PG_LOG( m_strLogPrefix + m_httpMethod + " body query" ); + + if ( m_httpMethod == "OPTIONS" ) return; - auto cnt = body->computeChainDataLength(); - auto pData = body->data(); - std::string strIn; - strIn.insert( strIn.end(), pData, pData + cnt ); - pg_log( strLogPrefix_ + cc::debug( "got body part number " ) + cc::size10( nBodyPartNumber_ ) + - "\n" ); - pg_log( - strLogPrefix_ + cc::debug( "got body part size " ) + cc::size10( strIn.size() ) + "\n" ); - pg_log( strLogPrefix_ + cc::debug( "got body part content " ) + cc::normal( strIn ) + "\n" ); - strBody_ += strIn; - pg_log( strLogPrefix_ + cc::debug( "accumulated so far body size " ) + - cc::size10( strBody_.size() ) + "\n" ); - pg_log( strLogPrefix_ + cc::debug( "accumulated so far body content part(s) " ) + - cc::normal( strBody_ ) + "\n" ); - ++nBodyPartNumber_; + + auto cnt = _body->computeChainDataLength(); + auto pData = _body->data(); + + m_strBody.insert( m_strBody.end(), pData, pData + cnt ); + + PG_LOG( m_strLogPrefix + __FUNCTION__ + "part number " + to_string( m_bodyPartNumber ) ); + + PG_LOG( + m_strLogPrefix + __FUNCTION__ + " accumulated body size " + to_string( m_strBody.size() ) ); + PG_LOG( m_strLogPrefix + __FUNCTION__ + " accumulated body content part(s) " + m_strBody ); + ++m_bodyPartNumber; } void request_site::onEOM() noexcept { - pg_log( strLogPrefix_ + cc::info( strHttpMethod_ ) + cc::debug( "EOM query" ) + "\n" ); + PG_LOG( m_strLogPrefix + m_httpMethod + __FUNCTION__ ); - if ( strHttpMethod_ == "OPTIONS" ) { + if ( m_httpMethod == "OPTIONS" ) { proxygen::ResponseBuilder( downstream_ ).sendWithEOM(); return; } - pg_log( strLogPrefix_ + cc::debug( "finally got " ) + cc::size10( nBodyPartNumber_ ) + - cc::debug( " body part(s)" ) + "\n" ); - pg_log( strLogPrefix_ + cc::debug( "finally got body size " ) + cc::size10( strBody_.size() ) + - "\n" ); - pg_log( - strLogPrefix_ + cc::debug( "finally got body content " ) + cc::normal( strBody_ ) + "\n" ); + PG_LOG( m_strLogPrefix + __FUNCTION__ + " body part(s): " + to_string( m_bodyPartNumber ) ); + PG_LOG( m_strLogPrefix + __FUNCTION__ + " body size: " + to_string( m_strBody.size() ) ); + PG_LOG( m_strLogPrefix + __FUNCTION__ + " body content: " + m_strBody ); + nlohmann::json joID = "0xBADF00D", joIn; skutils::result_of_http_request rslt; rslt.isBinary_ = false; try { - joIn = nlohmann::json::parse( strBody_ ); - pg_log( strLogPrefix_ + cc::debug( "got body JSON " ) + cc::j( joIn ) + "\n" ); + joIn = nlohmann::json::parse( m_strBody ); + PG_LOG( m_strLogPrefix + "body JSON " + joIn.dump() ); if ( joIn.count( "id" ) > 0 ) joID = joIn["id"]; - rslt = pSSRQ_->onRequest( joIn, strOrigin_, ipVer_, strDstAddress_, nDstPort_ ); - if ( rslt.isBinary_ ) - pg_log( strLogPrefix_ + cc::debug( "got binary answer " ) + + + rslt = m_SSRQ->onRequest( joIn, m_origin, m_ipVer, m_dstAddress_, m_dstPort ); + + if ( rslt.isBinary_ ) { + PG_LOG( m_strLogPrefix + "binary answer " + cc::binary_table( ( const void* ) ( void* ) rslt.vecBytes_.data(), - size_t( rslt.vecBytes_.size() ) ) + - "\n" ); - else - pg_log( strLogPrefix_ + cc::debug( "got answer JSON " ) + cc::j( rslt.joOut_ ) + "\n" ); + size_t( rslt.vecBytes_.size() ) ) ); + } else { + PG_LOG( m_strLogPrefix + "answer JSON " + rslt.joOut_.dump() ); + } } catch ( const std::exception& ex ) { - pg_log( strLogPrefix_ + cc::error( "problem with body " ) + cc::warn( strBody_ ) + - cc::error( ", error info: " ) + cc::warn( ex.what() ) + "\n" ); + PG_LOG( m_strLogPrefix + "problem with body " + m_strBody + ", error info: " + ex.what() ); rslt.isBinary_ = false; rslt.joOut_ = server_side_request_handler::json_from_error_text( ex.what(), joID ); - pg_log( - strLogPrefix_ + cc::error( "got error answer JSON " ) + cc::j( rslt.joOut_ ) + "\n" ); + PG_LOG( m_strLogPrefix + "got error answer JSON " + rslt.joOut_.dump() ); } catch ( ... ) { - pg_log( strLogPrefix_ + cc::error( "problem with body " ) + cc::warn( strBody_ ) + - cc::error( ", error info: " ) + cc::warn( "unknown exception in HTTP handler" ) + - "\n" ); + PG_LOG( m_strLogPrefix + "problem with body " + m_strBody + + ", error info: " + "unknown exception in HTTP handler" ); rslt.isBinary_ = false; rslt.joOut_ = server_side_request_handler::json_from_error_text( "unknown exception in HTTP handler", joID ); - pg_log( - strLogPrefix_ + cc::error( "got error answer JSON " ) + cc::j( rslt.joOut_ ) + "\n" ); + PG_LOG( m_strLogPrefix + "got error answer JSON " + rslt.joOut_.dump() ); } proxygen::ResponseBuilder bldr( downstream_ ); bldr.status( 200, "OK" ); @@ -198,10 +190,10 @@ void request_site::onEOM() noexcept { if ( rslt.isBinary_ ) { bldr.header( "content-length", skutils::tools::format( "%zu", rslt.vecBytes_.size() ) ); bldr.header( "Content-Type", "application/octet-stream" ); - std::string buffer( rslt.vecBytes_.begin(), rslt.vecBytes_.end() ); + string buffer( rslt.vecBytes_.begin(), rslt.vecBytes_.end() ); bldr.body( buffer ); } else { - std::string strOut = rslt.joOut_.dump(); + string strOut = rslt.joOut_.dump(); bldr.header( "content-length", skutils::tools::format( "%zu", strOut.size() ) ); bldr.header( "Content-Type", "application/json" ); bldr.body( strOut ); @@ -209,134 +201,81 @@ void request_site::onEOM() noexcept { bldr.sendWithEOM(); } -void request_site::onUpgrade( proxygen::UpgradeProtocol /*protocol*/ ) noexcept { +void request_site::onUpgrade( proxygen::UpgradeProtocol ) noexcept { // handler doesn't support upgrades - pg_log( strLogPrefix_ + cc::debug( "upgrade query" ) + "\n" ); + PG_LOG( m_strLogPrefix + __FUNCTION__ ); } void request_site::requestComplete() noexcept { - pg_log( strLogPrefix_ + cc::debug( "complete notification" ) + "\n" ); + PG_LOG( m_strLogPrefix + __FUNCTION__ ); delete this; } -void request_site::onError( proxygen::ProxygenError err ) noexcept { - pg_log( - strLogPrefix_ + cc::error( "error notification: " ) + cc::size10( size_t( err ) ) + "\n" ); +void request_site::onError( proxygen::ProxygenError _err ) noexcept { + PG_LOG( m_strLogPrefix + __FUNCTION__ + to_string( size_t( _err ) ) ); delete this; } -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -request_site_factory::request_site_factory( server_side_request_handler* pSSRQ ) - : pSSRQ_( pSSRQ ) {} +request_site_factory::request_site_factory( server_side_request_handler* _SSRQ ) + : m_SSRQ( _SSRQ ) {} request_site_factory::~request_site_factory() {} void request_site_factory::onServerStart( folly::EventBase* /*evb*/ ) noexcept { - sink_.reset( new request_sink ); + m_sink.reset( new request_sink ); } void request_site_factory::onServerStop() noexcept { - sink_.reset(); + m_sink.reset(); } proxygen::RequestHandler* request_site_factory::onRequest( proxygen::RequestHandler*, proxygen::HTTPMessage* ) noexcept { - return new request_site( *sink_.get(), pSSRQ_ ); + return new request_site( *m_sink.get(), m_SSRQ ); } -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// server_side_request_handler::server_side_request_handler() {} server_side_request_handler::~server_side_request_handler() {} nlohmann::json server_side_request_handler::json_from_error_text( - const char* strErrorDescription, const nlohmann::json& joID ) { - if ( strErrorDescription == nullptr || ( *strErrorDescription ) == '\0' ) - strErrorDescription = "unknown error"; + const char* _errorDescription, const nlohmann::json& _joID ) { + if ( _errorDescription == nullptr || ( *_errorDescription ) == '\0' ) + _errorDescription = "unknown error"; nlohmann::json jo = nlohmann::json::object(); - jo["error"] = skutils::tools::safe_ascii( strErrorDescription ); - jo["id"] = joID; + jo["error"] = skutils::tools::safe_ascii( _errorDescription ); + jo["id"] = _joID; return jo; } -std::string server_side_request_handler::answer_from_error_text( - const char* strErrorDescription, const nlohmann::json& joID ) { - nlohmann::json jo = json_from_error_text( strErrorDescription, joID ); - std::string s = jo.dump(); +string server_side_request_handler::answer_from_error_text( + const char* _errorDescription, const nlohmann::json& _joID ) { + nlohmann::json jo = json_from_error_text( _errorDescription, _joID ); + string s = jo.dump(); return s; } -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -server::server( pg_on_request_handler_t h, const pg_accumulate_entries& entries, int32_t threads, - int32_t threads_limit ) - : h_( h ), entries_( entries ), threads_( threads ), threads_limit_( threads_limit ) { - strLogPrefix_ = cc::notice( "PG" ) + cc::normal( "/" ) + cc::notice( "server" ) + " "; - pg_log( strLogPrefix_ + cc::debug( "constructor" ) + "\n" ); +server::server( pg_on_request_handler_t _h, const pg_accumulate_entries& _entries, int32_t _threads, + int32_t _threadsLimit ) + : m_h( _h ), m_entries( _entries ), m_threads( _threads ), m_threads_limit( _threadsLimit ) { + m_logPrefix = "PG/server "; + PG_LOG( m_logPrefix + "constructor" ); } server::~server() { - pg_log( strLogPrefix_ + cc::debug( "destructor" ) + "\n" ); + PG_LOG( m_logPrefix + "destructor" ); stop(); } bool server::start() { stop(); - pg_log( strLogPrefix_ + cc::debug( "will start server thread" ) + "\n" ); - - /* - int32_t http_port = 11000; - int32_t http_port6 = 12000; - int32_t https_port = 11001; - int32_t https_port6 = 12001; - - wangle::SSLContextConfig sslCfg; - sslCfg.isDefault = true; - sslCfg.setCertificate( "./cert.pem", "./key.pem", "" ); - // sslCfg.clientCAFile = "./ca_cert.pem"; - sslCfg.clientVerification = folly::SSLContext::VerifyClientCertificate::DO_NOT_REQUEST; // - IF_PRESENTED - - proxygen::HTTPServer::IPConfig cfg_http( folly::SocketAddress( "127.0.0.1", http_port, true - ), proxygen::HTTPServer::Protocol::HTTP ); proxygen::HTTPServer::IPConfig cfg_http6( - folly::SocketAddress( "::1", http_port6, true ), proxygen::HTTPServer::Protocol::HTTP ); - proxygen::HTTPServer::IPConfig cfg_https( folly::SocketAddress( "127.0.0.1", https_port, - true ), proxygen::HTTPServer::Protocol::HTTP ); proxygen::HTTPServer::IPConfig cfg_https6( - folly::SocketAddress( "::1", https_port6, true ), proxygen::HTTPServer::Protocol::HTTP ); - cfg_https.sslConfigs.push_back( sslCfg ); - cfg_https6.sslConfigs.push_back( sslCfg ); - - std::vector< proxygen::HTTPServer::IPConfig > IPs = { cfg_http, cfg_http6, cfg_https, - cfg_https6, }; - */ - - /* - wangle::SSLContextConfig sslCfg; - if ( m_bHelperIsSSL ) { - sslCfg.isDefault = true; - sslCfg.setCertificate( cert_path_.c_str(), private_key_path_.c_str(), "" ); - sslCfg.clientVerification = - folly::SSLContext::VerifyClientCertificate::DO_NOT_REQUEST; // IF_PRESENTED - if ( !ca_path_.empty() ) - sslCfg.clientCAFile = ca_path_.c_str(); - } - proxygen::HTTPServer::IPConfig cfg_ip( - folly::SocketAddress( strBindAddr_.c_str(), nPort_, true ), - proxygen::HTTPServer::Protocol::HTTP ); - if ( m_bHelperIsSSL ) { - cfg_ip.sslConfigs.push_back( sslCfg ); - } - std::vector< proxygen::HTTPServer::IPConfig > IPs = {cfg_ip}; - */ + PG_LOG( m_logPrefix + "starting server thread" ); std::vector< proxygen::HTTPServer::IPConfig > IPs; - pg_accumulate_entries::const_iterator itWalk = entries_.cbegin(), itEnd = entries_.cend(); + pg_accumulate_entries::const_iterator itWalk = m_entries.cbegin(), itEnd = m_entries.cend(); for ( ; itWalk != itEnd; ++itWalk ) { const pg_accumulate_entry& pge = ( *itWalk ); proxygen::HTTPServer::IPConfig cfg_ip( @@ -358,15 +297,21 @@ bool server::start() { } - if ( threads_ <= 0 ) { - threads_ = 1; + if ( m_threads <= 0 ) { + // Get the number of CPU cores available + unsigned int num_cpus = std::thread::hardware_concurrency(); + // roughly match apache which has 150 threads + m_threads = 32 * num_cpus; } - if ( threads_limit_ > 0 && threads_ > threads_limit_ ) - threads_ = threads_limit_; + + if ( m_threads_limit > 0 && m_threads > m_threads_limit ) + m_threads = m_threads_limit; proxygen::HTTPServerOptions options; - options.threads = static_cast< size_t >( threads_ ); + + + options.threads = static_cast< size_t >( m_threads ); options.idleTimeout = std::chrono::milliseconds( skutils::rest::g_nClientConnectionTimeoutMS ); // // // options.shutdownOn = {SIGINT, SIGTERM}; // experimental only, not needed in `skaled` // here @@ -379,112 +324,101 @@ bool server::start() { options.receiveSessionWindowSize = 10 * ( 1 << 20 ); options.h2cEnabled = true; // - server_.reset( new proxygen::HTTPServer( std::move( options ) ) ); - server_->bind( IPs ); + m_server.reset( new proxygen::HTTPServer( std::move( options ) ) ); + m_server->bind( IPs ); // start HTTPServer main loop in a separate thread - thread_ = std::move( std::thread( [&]() { + m_thread = std::move( std::thread( [&]() { skutils::multithreading::setThreadName( skutils::tools::format( "sklm-%p", ( void* ) this ) ); - server_->start(); + m_server->start(); } ) ); - pg_log( strLogPrefix_ + cc::debug( "did started server thread" ) + "\n" ); + PG_LOG( m_logPrefix + "did started server thread" ); return true; } void server::stop() { - if ( server_ ) { - pg_log( strLogPrefix_ + cc::debug( "will stop server instance" ) + "\n" ); - server_->stop(); - pg_log( strLogPrefix_ + cc::debug( "did stopped server instance" ) + "\n" ); + if ( m_server ) { + PG_LOG( m_logPrefix + "stopping server instance" ); + m_server->stop(); + PG_LOG( m_logPrefix + "stopped server instance" ); } - if ( thread_.joinable() ) { - pg_log( strLogPrefix_ + cc::debug( "will stop server thread" ) + "\n" ); - thread_.join(); - pg_log( strLogPrefix_ + cc::debug( "did stopped server thread" ) + "\n" ); + if ( m_thread.joinable() ) { + PG_LOG( m_logPrefix + "stopping server thread" ); + m_thread.join(); + PG_LOG( m_logPrefix + "stopped server thread" ); } - if ( server_ ) { - pg_log( strLogPrefix_ + cc::debug( "will release server instance" ) + "\n" ); - server_.reset(); - pg_log( strLogPrefix_ + cc::debug( "did released server instance" ) + "\n" ); + if ( m_server ) { + PG_LOG( m_logPrefix + "releasing server instance" ); + m_server.reset(); + PG_LOG( m_logPrefix + "released server instance" ); } } -skutils::result_of_http_request server::onRequest( const nlohmann::json& joIn, - const std::string& strOrigin, int ipVer, const std::string& strDstAddress, int nDstPort ) { - skutils::result_of_http_request rslt = h_( joIn, strOrigin, ipVer, strDstAddress, nDstPort ); +skutils::result_of_http_request server::onRequest( const nlohmann::json& _joIn, + const string& _origin, int _ipVer, const string& _dstAddress, int _dstPort ) { + skutils::result_of_http_request rslt = m_h( _joIn, _origin, _ipVer, _dstAddress, _dstPort ); return rslt; } -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -bool g_b_pb_logging = false; +bool g_pbLogging = false; bool pg_logging_get() { - return g_b_pb_logging; + return g_pbLogging; } -void pg_logging_set( bool bIsLoggingMode ) { - g_b_pb_logging = bIsLoggingMode; +void pg_logging_set( bool _isLoggingMode ) { + g_pbLogging = _isLoggingMode; } -wrapped_proxygen_server_handle pg_start( pg_on_request_handler_t h, const pg_accumulate_entry& pge, - int32_t threads, int32_t threads_limit ) { +wrapped_proxygen_server_handle pg_start( pg_on_request_handler_t _h, + const pg_accumulate_entry& _pge, int32_t _threads, int32_t _threadsLimit ) { pg_accumulate_entries entries; - entries.push_back( pge ); - return pg_start( h, entries, threads, threads_limit ); + entries.push_back( _pge ); + return pg_start( _h, entries, _threads, _threadsLimit ); } -wrapped_proxygen_server_handle pg_start( pg_on_request_handler_t h, - const pg_accumulate_entries& entries, int32_t threads, int32_t threads_limit ) { +wrapped_proxygen_server_handle pg_start( pg_on_request_handler_t _h, + const pg_accumulate_entries& _entries, int32_t _threads, int32_t _threadsLimit ) { skutils::http_pg::server* ptrServer = - new skutils::http_pg::server( h, entries, threads, threads_limit ); + new skutils::http_pg::server( _h, _entries, _threads, _threadsLimit ); ptrServer->start(); return wrapped_proxygen_server_handle( ptrServer ); } -void pg_stop( wrapped_proxygen_server_handle hServer ) { - if ( !hServer ) +void pg_stop( wrapped_proxygen_server_handle _hServer ) { + if ( !_hServer ) return; - skutils::http_pg::server* ptrServer = ( skutils::http_pg::server* ) hServer; + skutils::http_pg::server* ptrServer = ( skutils::http_pg::server* ) _hServer; ptrServer->stop(); delete ptrServer; } -static pg_accumulate_entries g_accumulated_entries; +static pg_accumulate_entries g_accumulatedEntries; void pg_accumulate_clear() { - g_accumulated_entries.clear(); + g_accumulatedEntries.clear(); } size_t pg_accumulate_size() { - size_t cnt = g_accumulated_entries.size(); + size_t cnt = g_accumulatedEntries.size(); return cnt; } -void pg_accumulate_add( int ipVer, std::string strBindAddr, int nPort, const char* cert_path, - const char* private_key_path, const char* ca_path ) { - pg_accumulate_entry pge = { ipVer, strBindAddr, nPort, cert_path ? cert_path : "", - private_key_path ? private_key_path : "", ca_path ? ca_path : "" }; - pg_accumulate_add( pge ); -} void pg_accumulate_add( const pg_accumulate_entry& pge ) { - g_accumulated_entries.push_back( pge ); + g_accumulatedEntries.push_back( pge ); } wrapped_proxygen_server_handle pg_accumulate_start( pg_on_request_handler_t h, int32_t threads, int32_t threads_limit ) { skutils::http_pg::server* ptrServer = - new skutils::http_pg::server( h, g_accumulated_entries, threads, threads_limit ); + new skutils::http_pg::server( h, g_accumulatedEntries, threads, threads_limit ); ptrServer->start(); return wrapped_proxygen_server_handle( ptrServer ); } -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - }; // namespace http_pg }; // namespace skutils diff --git a/libskutils/src/stats.cpp b/libskutils/src/stats.cpp index d77dcbd20..8fafa0c07 100644 --- a/libskutils/src/stats.cpp +++ b/libskutils/src/stats.cpp @@ -6,16 +6,21 @@ namespace skutils { namespace stats { event_record_item_t::event_record_item_t() : time_stamp_( clock::now() ) {} + event_record_item_t::event_record_item_t( time_point a_time_stamp_ ) : time_stamp_( a_time_stamp_ ) {} + event_record_item_t::event_record_item_t( event_record_item_t::myrct x ) { assign( x ); } + event_record_item_t::~event_record_item_t() {} + event_record_item_t::myrt event_record_item_t::assign( event_record_item_t::myrct x ) { time_stamp_ = x.time_stamp_; return ( *this ); } + int event_record_item_t::compare( event_record_item_t::myrct x ) const { if ( time_stamp_ < x.time_stamp_ ) return -1; @@ -25,14 +30,17 @@ int event_record_item_t::compare( event_record_item_t::myrct x ) const { } named_event_stats::named_event_stats() {} + named_event_stats::named_event_stats( named_event_stats::myrct x ) { init(); assign( x ); } + named_event_stats::named_event_stats( named_event_stats::myrrt x ) { init(); move( x ); } + named_event_stats::~named_event_stats() { clear(); } @@ -93,7 +101,9 @@ named_event_stats::myrt named_event_stats::move( named_event_stats::myrt x ) { x.clear(); return ( *this ); } + void named_event_stats::lock() {} + void named_event_stats::unlock() {} @@ -303,6 +313,7 @@ nlohmann::json named_event_stats::toJSON( } return jo; } + nlohmann::json named_event_stats::toJSON( bool bSkipEmptyStats /*= false*/ ) const { return toJSON( clock::now(), bSkipEmptyStats ); } @@ -317,19 +328,25 @@ std::set< std::string > named_event_stats::all_queue_names() const { } traffic_record_item_t::traffic_record_item_t() : time_stamp_( clock::now() ), bytes_( 0 ) {} + traffic_record_item_t::traffic_record_item_t( time_point a_time_stamp_, bytes_count_t a_bytes_ ) : time_stamp_( a_time_stamp_ ), bytes_( a_bytes_ ) {} + traffic_record_item_t::traffic_record_item_t( bytes_count_t a_bytes_ ) : time_stamp_( clock::now() ), bytes_( a_bytes_ ) {} + traffic_record_item_t::traffic_record_item_t( traffic_record_item_t::myrct x ) { assign( x ); } + traffic_record_item_t::~traffic_record_item_t() {} + traffic_record_item_t::myrt traffic_record_item_t::assign( traffic_record_item_t::myrct x ) { time_stamp_ = x.time_stamp_; bytes_ = x.bytes_; return ( *this ); } + int traffic_record_item_t::compare( traffic_record_item_t::myrct x ) const { if ( time_stamp_ < x.time_stamp_ ) return -1; @@ -390,229 +407,28 @@ double stat_compute_bps_til_now( namespace time_tracker { -const char element::g_strMethodNameUnknown[] = "unknown-method"; -element::element( const char* strSubSystem, const char* strProtocol, const char* strMethod, - int /*nServerIndex*/, int /*ipVer*/ ) - : strSubSystem_( strSubSystem ), - strProtocol_( strProtocol ), - strMethod_( - ( strMethod != nullptr && strMethod[0] != '\0' ) ? strMethod : g_strMethodNameUnknown ), - tpStart_( skutils::stats::clock::now() ) { - if ( strSubSystem_.empty() ) - strSubSystem_ = "N/A"; - if ( strProtocol_.empty() ) - strProtocol_ = "N/A"; - if ( strMethod_.empty() ) - strMethod_ = g_strMethodNameUnknown; -} -element::~element() { - stop(); +element::element() { + m_startTime = std::chrono::duration_cast< std::chrono::milliseconds >( + std::chrono::steady_clock::now().time_since_epoch() ) + .count(); } -void element::do_register() { - element_ptr_t rttElement = this; - queue::getQueueForSubsystem( strSubSystem_.c_str() ).do_register( rttElement ); -} -void element::do_unregister() { - element_ptr_t rttElement = this; - queue::getQueueForSubsystem( strSubSystem_.c_str() ).do_unregister( rttElement ); -} +element::~element(){}; -void element::stop() { - lock_type lock( mtx() ); - if ( isStopped_ ) - return; - isStopped_ = true; - tpEnd_ = skutils::stats::clock::now(); - do_register(); -} -void element::setMethod( const char* strMethod ) const { - lock_type lock( mtx() ); - if ( isStopped_ ) - return; - if ( ( strMethod_.empty() || strMethod_ == g_strMethodNameUnknown ) && strMethod != nullptr && - strMethod[0] != '\0' ) - strMethod_ = strMethod; +void element::stop() { + m_isStopped = true; + m_endTime = std::chrono::duration_cast< std::chrono::milliseconds >( + std::chrono::steady_clock::now().time_since_epoch() ) + .count(); } -void element::setError() const { - lock_type lock( mtx() ); - isError_ = true; -} double element::getDurationInSeconds() const { - lock_type lock( mtx() ); - time_point tpEnd = isStopped_ ? tpEnd_ : skutils::stats::clock::now(); - duration d = tpEnd - tpStart_; - return double( d.count() ) / 1000.0; -} - -queue::queue() {} -queue::~queue() {} - -queue& queue::getQueueForSubsystem( const char* strSubSystem ) { - lock_type lock( mtx() ); - static map_subsystem_time_trackers_t g_map_subsystem_time_trackers; - std::string sn = ( strSubSystem != nullptr && strSubSystem[0] != '\0' ) ? - strSubSystem : - "unknown-time-tracker-subsystem"; - map_subsystem_time_trackers_t::iterator itFind = g_map_subsystem_time_trackers.find( sn ); - skutils::retain_release_ptr< queue > pq; - if ( itFind != g_map_subsystem_time_trackers.end() ) - pq = itFind->second; - else { - pq = new queue; - g_map_subsystem_time_trackers[sn] = pq; - } - return ( *( pq.get() ) ); -} - -void queue::do_register( element_ptr_t& rttElement ) { - if ( !rttElement ) - return; - lock_type lock( mtx() ); - std::string strProtocol = rttElement->getProtocol(); - // std::string strMethod = rttElement->getMethod(); - element::id_t id = rttElement->getID(); - if ( map_pq_.find( strProtocol ) == map_pq_.end() ) - map_pq_[strProtocol] = map_rtte_t(); - map_rtte_t& map_rtte = map_pq_[strProtocol]; - map_rtte[id] = rttElement; - while ( map_rtte.size() > nMaxItemsInQueue && map_rtte.size() > 0 ) { - auto it = map_rtte.begin(); - auto key = it->first; - auto value = it->second; - map_rtte.erase( key ); - value = nullptr; - } + return double( m_endTime - m_startTime ) / 1000.0; } -void queue::do_unregister( element_ptr_t& rttElement ) { - if ( !rttElement ) - return; - lock_type lock( mtx() ); - rttElement->stop(); - std::string strProtocol = rttElement->getProtocol(); - if ( map_pq_.find( strProtocol ) == map_pq_.end() ) - return; - map_rtte_t& map_rtte = map_pq_[strProtocol]; - element::id_t id = rttElement->getID(); - map_rtte.erase( id ); -} - -std::list< std::string > queue::getProtocols() { - std::list< std::string > listProtocols; - lock_type lock( mtx() ); - auto pi = map_pq_.cbegin(), pe = map_pq_.cend(); - for ( ; pi != pe; ++pi ) - listProtocols.push_back( pi->first ); - return listProtocols; -} - -nlohmann::json queue::getProtocolStats( const char* strProtocol ) { - nlohmann::json joStatsProtocol = nlohmann::json::object(); - double callTimeMin( 0.0 ), callTimeMax( 0.0 ), callTimeSum( 0.0 ); - std::string strMethodMin( element::g_strMethodNameUnknown ), - strMethodMax( element::g_strMethodNameUnknown ); - size_t cntEntries = 0; - lock_type lock( mtx() ); - if ( map_pq_.find( strProtocol ) != map_pq_.end() ) { - map_rtte_t& map_rtte = map_pq_[strProtocol]; - map_rtte_t::const_iterator iw = map_rtte.cbegin(), ie = map_rtte.cend(); - for ( ; iw != ie; ++iw, ++cntEntries ) { - double d = iw->second->getDurationInSeconds(); - callTimeSum += d; - const std::string& strMethod = iw->second->getMethod(); - if ( cntEntries == 0 ) { - callTimeMin = callTimeMax = d; - strMethodMin = strMethodMax = strMethod; - continue; - } - if ( callTimeMin > d ) { - callTimeMin = d; - strMethodMin = strMethod; - } else if ( callTimeMax < d ) { - callTimeMax = d; - strMethodMax = strMethod; - } - } - } - double denom = ( cntEntries > 0 ) ? cntEntries : 1; - double callTimeAvg = callTimeSum / denom; - joStatsProtocol["callTimeMin"] = callTimeMin; - joStatsProtocol["callTimeMax"] = callTimeMax; - joStatsProtocol["callTimeAvg"] = callTimeAvg; - joStatsProtocol["callTimeSum"] = - callTimeSum; // for computing callTimeAvg of all protocols only - joStatsProtocol["methodMin"] = strMethodMin; - joStatsProtocol["methodMax"] = strMethodMax; - joStatsProtocol["cntEntries"] = cntEntries; - return joStatsProtocol; -} - -nlohmann::json queue::getAllStats() { - nlohmann::json joStatsAll = nlohmann::json::object(); - nlohmann::json joProtocols = nlohmann::json::object(); - double callTimeMin( 0.0 ), callTimeMax( 0.0 ), callTimeSum( 0.0 ); - std::string protocolMin( "N/A" ), protocolMax( "N/A" ); - std::string strMethodMin( element::g_strMethodNameUnknown ), - strMethodMax( element::g_strMethodNameUnknown ); - size_t cntEntries = 0, i = 0; - lock_type lock( mtx() ); - std::list< std::string > listProtocols = getProtocols(); - std::list< std::string >::const_iterator pi = listProtocols.cbegin(), pe = listProtocols.cend(); - for ( ; pi != pe; ++pi ) { - const std::string& strProtocol = ( *pi ); - nlohmann::json joStatsProtocol = getProtocolStats( strProtocol.c_str() ); - size_t cntProtocolEntries = joStatsProtocol["cntEntries"].get< size_t >(); - if ( cntProtocolEntries == 0 ) - continue; - double protocolTimeMin( joStatsProtocol["callTimeMin"].get< double >() ), - protocolTimeMax( joStatsProtocol["callTimeMax"].get< double >() ); - std::string protocolMethodMin( joStatsProtocol["methodMin"].get< std::string >() ), - protocolMethodMax( joStatsProtocol["methodMax"].get< std::string >() ); - double protocolTimeSum = ( joStatsProtocol["callTimeSum"].get< double >() ); - callTimeSum += protocolTimeSum; - if ( i == 0 ) { - callTimeMin = protocolTimeMin; - callTimeMax = protocolTimeMax; - strMethodMin = protocolMethodMin; - strMethodMax = protocolMethodMax; - protocolMin = protocolMax = strProtocol; - } else { - if ( protocolTimeMin < callTimeMin ) { - callTimeMin = protocolTimeMin; - strMethodMin = protocolMethodMin; - protocolMin = strProtocol; - } else if ( protocolTimeMax > callTimeMax ) { - callTimeMax = protocolTimeMax; - strMethodMax = protocolMethodMax; - protocolMax = strProtocol; - } - } - cntEntries += cntProtocolEntries; - ++i; - joStatsProtocol.erase( "callTimeSum" ); - joStatsProtocol.erase( "cntEntries" ); - joProtocols[strProtocol] = joStatsProtocol; - } - double denom = ( cntEntries > 0 ) ? cntEntries : 1; - double callTimeAvg = callTimeSum / denom; - nlohmann::json joSummary = nlohmann::json::object(); - joSummary["callTimeMin"] = callTimeMin; - joSummary["callTimeMax"] = callTimeMax; - joSummary["callTimeAvg"] = callTimeAvg; - joSummary["methodMin"] = strMethodMin; - joSummary["methodMax"] = strMethodMax; - joSummary["protocolMin"] = protocolMin; - joSummary["protocolMax"] = protocolMax; - // joSummary["cntEntries"] = cntEntries; - joStatsAll["summary"] = joSummary; - joStatsAll["protocols"] = joProtocols; - return joStatsAll; -} }; // namespace time_tracker diff --git a/libskutils/src/task_performance.cpp b/libskutils/src/task_performance.cpp index 9a65cc687..c60e3a3cb 100644 --- a/libskutils/src/task_performance.cpp +++ b/libskutils/src/task_performance.cpp @@ -436,127 +436,6 @@ string tracker::get_first_encountered_stop_reason() const { return s; } -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -action::action( const string& strQueueName, const string& strActionName, const json& jsnAction, - tracker_ptr pTracker ) { - init( strQueueName, strActionName, jsnAction, pTracker ); -} - -action::action( const string& strQueueName, const string& strActionName, const json& jsnAction ) { - init( strQueueName, strActionName, jsnAction, get_default_tracker() ); -} - -action::action( const string& strQueueName, const string& strActionName ) { - init( strQueueName, strActionName, json::object(), get_default_tracker() ); -} - -action::~action() { - finish(); -} - -void action::init( const string& strQueueName, const string& strActionName, const json& jsnAction, - tracker_ptr pTracker ) { - isSkipped_ = false; - if ( !pTracker ) { - pTracker = get_default_tracker(); - if ( !pTracker ) - throw std::runtime_error( - "Attempt to instantiate performance action without tracker provided" ); - } - if ( !pTracker->is_enabled() ) { - isSkipped_ = true; - return; - } - if ( !pTracker->is_running() ) { - isSkipped_ = true; - return; - } - if ( pTracker->get_index() >= pTracker->get_safe_max_item_count() ) { - isSkipped_ = true; - pTracker->came_accross_with_possible_session_stop_reason( "max limit of events reached" ); - return; - } - if ( pTracker->get_index() >= pTracker->get_session_max_item_count() ) { - isSkipped_ = true; - pTracker->came_accross_with_possible_session_stop_reason( - "number of requested of events saved" ); - return; - } - queue_ptr pQueue = pTracker->get_queue( strQueueName ); - pItem_ = pQueue->new_item( strActionName, jsnAction ); -} - -json action::get_json_in() const { - if ( isSkipped_ ) - return json::object(); - item_ptr pItem = get_item(); - if ( !pItem ) - return json::object(); - return get_item()->get_json_in(); -} -json action::get_json_out() const { - if ( isSkipped_ ) - return json::object(); - item_ptr pItem = get_item(); - if ( !pItem ) - return json::object(); - return pItem->get_json_out(); -} -json action::get_json_err() const { - if ( isSkipped_ ) - return json::object(); - item_ptr pItem = get_item(); - if ( !pItem ) - return json::object(); - return pItem->get_json_err(); -} -void action::set_json_in( const json& jsn ) { - if ( isSkipped_ ) - return; - item_ptr pItem = get_item(); - if ( pItem ) - pItem->set_json_in( jsn ); -} -void action::set_json_out( const json& jsn ) { - if ( isSkipped_ ) - return; - item_ptr pItem = get_item(); - if ( pItem ) - pItem->set_json_out( jsn ); -} -void action::set_json_err( const json& jsn ) { - if ( isSkipped_ ) - return; - item_ptr pItem = get_item(); - if ( pItem ) - pItem->set_json_err( jsn ); -} - -item_ptr action::get_item() const { - if ( isSkipped_ ) - throw std::runtime_error( "Attempt to access performance task action in skipped state" ); - return pItem_; -} - -queue_ptr action::get_queue() const { - return get_item()->get_queue(); -} - -tracker_ptr action::get_tracker() const { - return get_queue()->get_tracker(); -} - -void action::finish() { - if ( isSkipped_ ) - return; - get_item()->finish(); -} - -bool action::is_skipped() const { - return isSkipped_; -} //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/libskutils/src/unddos.cpp b/libskutils/src/unddos.cpp index 5d74c63d1..3384dc218 100644 --- a/libskutils/src/unddos.cpp +++ b/libskutils/src/unddos.cpp @@ -1,94 +1,81 @@ #include +#include -namespace skutils { -namespace unddos { +namespace skutils::unddos { -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -origin_entry_setting::origin_entry_setting() { +origin_dos_limits::origin_dos_limits() { clear(); } -origin_entry_setting::origin_entry_setting( const origin_entry_setting& other ) { +origin_dos_limits::origin_dos_limits( const origin_dos_limits& other ) { assign( other ); } -origin_entry_setting::origin_entry_setting( origin_entry_setting&& other ) { +origin_dos_limits::origin_dos_limits( origin_dos_limits&& other ) { assign( other ); other.clear(); } -origin_entry_setting::~origin_entry_setting() { +origin_dos_limits::~origin_dos_limits() { clear(); } -origin_entry_setting& origin_entry_setting::operator=( const origin_entry_setting& other ) { +origin_dos_limits& origin_dos_limits::operator=( const origin_dos_limits& other ) { assign( other ); return ( *this ); } -void origin_entry_setting::load_defaults_for_any_origin() { +void origin_dos_limits::load_defaults_for_any_origin() { load_friendly_for_any_origin(); // load_reasonable_for_any_origin(); } -void origin_entry_setting::load_friendly_for_any_origin() { +void origin_dos_limits::load_friendly_for_any_origin() { clear(); - origin_wildcards_.push_back( "*" ); - max_calls_per_second_ = 500; - max_calls_per_minute_ = 15000; - ban_peak_ = duration( 15 ); - ban_lengthy_ = duration( 120 ); - max_ws_conn_ = 50; + m_originWildcards.push_back( "*" ); + m_defaultMaxCallsPerSec = 500; + m_defaultMaxCallsPerMin = 15000; + m_banPerSecDuration = duration( 15 ); + m_banPerMinDuration = duration( 120 ); + m_maxWSConn = 50; load_recommended_custom_methods_as_multiplier_of_default(); } -void origin_entry_setting::load_reasonable_for_any_origin() { - clear(); - origin_wildcards_.push_back( "*" ); - max_calls_per_second_ = 100; - max_calls_per_minute_ = 5000; - ban_peak_ = duration( 15 ); - ban_lengthy_ = duration( 120 ); - max_ws_conn_ = 10; - load_recommended_custom_methods_as_multiplier_of_default(); -} -void origin_entry_setting::load_unlim_for_any_origin() { +void origin_dos_limits::load_unlim_for_any_origin() { clear(); - origin_wildcards_.push_back( "*" ); - max_calls_per_second_ = std::numeric_limits< size_t >::max(); - max_calls_per_minute_ = std::numeric_limits< size_t >::max(); - ban_peak_ = duration( 0 ); - ban_lengthy_ = duration( 0 ); - max_ws_conn_ = std::numeric_limits< size_t >::max(); + m_originWildcards.push_back( "*" ); + m_defaultMaxCallsPerSec = std::numeric_limits< size_t >::max(); + m_defaultMaxCallsPerMin = std::numeric_limits< size_t >::max(); + m_banPerSecDuration = duration( 0 ); + m_banPerMinDuration = duration( 0 ); + m_maxWSConn = std::numeric_limits< size_t >::max(); load_recommended_custom_methods_as_multiplier_of_default(); } -void origin_entry_setting::load_unlim_for_localhost_only() { +void origin_dos_limits::load_unlim_for_localhost_only() { clear(); - origin_wildcards_.push_back( "127.0.0.*" ); - origin_wildcards_.push_back( "::1" ); - max_calls_per_second_ = std::numeric_limits< size_t >::max(); - max_calls_per_minute_ = std::numeric_limits< size_t >::max(); - ban_peak_ = duration( 0 ); - ban_lengthy_ = duration( 0 ); - max_ws_conn_ = std::numeric_limits< size_t >::max(); + m_originWildcards.push_back( "127.0.0.*" ); + m_originWildcards.push_back( "::1" ); + m_defaultMaxCallsPerSec = std::numeric_limits< size_t >::max(); + m_defaultMaxCallsPerMin = std::numeric_limits< size_t >::max(); + m_banPerSecDuration = duration( 0 ); + m_banPerMinDuration = duration( 0 ); + m_maxWSConn = std::numeric_limits< size_t >::max(); load_recommended_custom_methods_as_multiplier_of_default(); } -void origin_entry_setting::load_custom_method_as_multiplier_of_default( +void origin_dos_limits::load_custom_method_as_multiplier_of_default( const char* strMethod, double lfMultiplier ) { if ( strMethod == nullptr || strMethod[0] == '\0' || lfMultiplier <= 0.0 ) return; - custom_method_setting cme; - cme.max_calls_per_second_ = size_t( max_calls_per_second_ * lfMultiplier ); - cme.max_calls_per_minute_ = size_t( max_calls_per_minute_ * lfMultiplier ); - map_custom_method_settings_[strMethod] = cme; + custom_method_limits cme; + cme.m_maxCallsPerSecond = size_t( m_defaultMaxCallsPerSec * lfMultiplier ); + cme.m_maxCallsPerMinute = size_t( m_defaultMaxCallsPerMin * lfMultiplier ); + m_mapCustomMethodLimits[strMethod] = cme; } -void origin_entry_setting::load_recommended_custom_methods_as_multiplier_of_default( +void origin_dos_limits::load_recommended_custom_methods_as_multiplier_of_default( double lfMultiplier ) { static const char* g_arr[] = { "web3_clientVersion", "web3_sha3", "net_version", "eth_syncing", "eth_protocolVersion", "eth_gasPrice", "eth_blockNumber", "eth_getBalance", @@ -100,170 +87,161 @@ void origin_entry_setting::load_recommended_custom_methods_as_multiplier_of_defa } -bool origin_entry_setting::empty() const { - if ( !origin_wildcards_.empty() ) +bool origin_dos_limits::empty() const { + if ( !m_originWildcards.empty() ) return false; return true; } -void origin_entry_setting::clear() { - origin_wildcards_.clear(); - max_calls_per_second_ = 0; - max_calls_per_minute_ = 0; - ban_peak_ = duration( 0 ); - ban_lengthy_ = duration( 0 ); - max_ws_conn_ = 0; - map_custom_method_settings_.clear(); +void origin_dos_limits::clear() { + m_originWildcards.clear(); + m_defaultMaxCallsPerSec = 0; + m_defaultMaxCallsPerMin = 0; + m_banPerSecDuration = duration( 0 ); + m_banPerMinDuration = duration( 0 ); + m_maxWSConn = 0; + m_mapCustomMethodLimits.clear(); } -origin_entry_setting& origin_entry_setting::assign( const origin_entry_setting& other ) { +origin_dos_limits& origin_dos_limits::assign( const origin_dos_limits& other ) { if ( ( ( void* ) ( this ) ) == ( ( void* ) ( &other ) ) ) return ( *this ); clear(); - origin_wildcards_ = other.origin_wildcards_; - max_calls_per_second_ = other.max_calls_per_second_; - max_calls_per_minute_ = other.max_calls_per_minute_; - ban_peak_ = other.ban_peak_; - ban_lengthy_ = other.ban_lengthy_; - max_ws_conn_ = other.max_ws_conn_; - map_custom_method_settings_ = other.map_custom_method_settings_; + m_originWildcards = other.m_originWildcards; + m_defaultMaxCallsPerSec = other.m_defaultMaxCallsPerSec; + m_defaultMaxCallsPerMin = other.m_defaultMaxCallsPerMin; + m_banPerSecDuration = other.m_banPerSecDuration; + m_banPerMinDuration = other.m_banPerMinDuration; + m_maxWSConn = other.m_maxWSConn; + m_mapCustomMethodLimits = other.m_mapCustomMethodLimits; return ( *this ); } -origin_entry_setting& origin_entry_setting::merge( const origin_entry_setting& other ) { +origin_dos_limits& origin_dos_limits::merge( const origin_dos_limits& other ) { if ( ( ( void* ) ( this ) ) == ( ( void* ) ( &other ) ) ) return ( *this ); - if ( origin_wildcards_ != other.origin_wildcards_ ) + if ( m_originWildcards != other.m_originWildcards ) return ( *this ); - max_calls_per_second_ = std::min( max_calls_per_second_, other.max_calls_per_second_ ); - max_calls_per_minute_ = std::min( max_calls_per_minute_, other.max_calls_per_minute_ ); - ban_peak_ = std::max( ban_peak_, other.ban_peak_ ); - ban_lengthy_ = std::max( ban_lengthy_, other.ban_lengthy_ ); - max_ws_conn_ = std::min( max_ws_conn_, other.max_ws_conn_ ); - if ( !other.map_custom_method_settings_.empty() ) { + m_defaultMaxCallsPerSec = std::min( m_defaultMaxCallsPerSec, other.m_defaultMaxCallsPerSec ); + m_defaultMaxCallsPerMin = std::min( m_defaultMaxCallsPerMin, other.m_defaultMaxCallsPerMin ); + m_banPerSecDuration = std::max( m_banPerSecDuration, other.m_banPerSecDuration ); + m_banPerMinDuration = std::max( m_banPerMinDuration, other.m_banPerMinDuration ); + m_maxWSConn = std::min( m_maxWSConn, other.m_maxWSConn ); + if ( !other.m_mapCustomMethodLimits.empty() ) { nlohmann::json joCMS = nlohmann::json::object(); - map_custom_method_settings_t::const_iterator itWalk = - other.map_custom_method_settings_.cbegin(), - itEnd = - other.map_custom_method_settings_.cend(); + map_custom_method_limits_t::const_iterator itWalk = other.m_mapCustomMethodLimits.cbegin(), + itEnd = other.m_mapCustomMethodLimits.cend(); for ( ; itWalk != itEnd; ++itWalk ) { - const custom_method_setting& cme = itWalk->second; - map_custom_method_settings_t::iterator itFind = - map_custom_method_settings_.find( itWalk->first ); - if ( itFind != map_custom_method_settings_.end() ) { + const custom_method_limits& cme = itWalk->second; + map_custom_method_limits_t::iterator itFind = + m_mapCustomMethodLimits.find( itWalk->first ); + if ( itFind != m_mapCustomMethodLimits.end() ) { itFind->second.merge( cme ); // merge with existing continue; } - map_custom_method_settings_[itWalk->first] = cme; // add mew + m_mapCustomMethodLimits[itWalk->first] = cme; // add mew } } return ( *this ); } -void origin_entry_setting::fromJSON( const nlohmann::json& jo ) { +void origin_dos_limits::fromJSON( const nlohmann::json& jo ) { clear(); if ( jo.find( "origin" ) != jo.end() ) { nlohmann::json jarrWildcards = jo["origin"]; if ( jarrWildcards.is_string() ) - origin_wildcards_.push_back( jarrWildcards.get< std::string >() ); + m_originWildcards.push_back( jarrWildcards.get< std::string >() ); else if ( jarrWildcards.is_array() ) { for ( const nlohmann::json& joWildcard : jarrWildcards ) { if ( joWildcard.is_string() ) - origin_wildcards_.push_back( joWildcard.get< std::string >() ); + m_originWildcards.push_back( joWildcard.get< std::string >() ); } } } if ( jo.find( "max_calls_per_second" ) != jo.end() ) - max_calls_per_second_ = jo["max_calls_per_second"].get< size_t >(); + m_defaultMaxCallsPerSec = jo["max_calls_per_second"].get< size_t >(); if ( jo.find( "max_calls_per_minute" ) != jo.end() ) - max_calls_per_minute_ = jo["max_calls_per_minute"].get< size_t >(); + m_defaultMaxCallsPerMin = jo["max_calls_per_minute"].get< size_t >(); if ( jo.find( "ban_peak" ) != jo.end() ) - ban_peak_ = jo["ban_peak"].get< size_t >(); + m_banPerSecDuration = jo["ban_peak"].get< size_t >(); if ( jo.find( "ban_lengthy" ) != jo.end() ) - ban_lengthy_ = jo["ban_lengthy"].get< size_t >(); + m_banPerMinDuration = jo["ban_lengthy"].get< size_t >(); if ( jo.find( "max_ws_conn" ) != jo.end() ) - max_ws_conn_ = jo["max_ws_conn"].get< size_t >(); + m_maxWSConn = jo["max_ws_conn"].get< size_t >(); if ( jo.find( "custom_method_settings" ) != jo.end() ) { const nlohmann::json& joCMS = jo["custom_method_settings"]; for ( auto it = joCMS.cbegin(); it != joCMS.cend(); ++it ) { const nlohmann::json& joMethod = it.value(); - custom_method_setting cme; + custom_method_limits cme; if ( joMethod.find( "max_calls_per_second" ) != jo.end() ) - cme.max_calls_per_second_ = joMethod["max_calls_per_second"].get< size_t >(); + cme.m_maxCallsPerSecond = joMethod["max_calls_per_second"].get< size_t >(); if ( joMethod.find( "max_calls_per_minute" ) != jo.end() ) - cme.max_calls_per_minute_ = joMethod["max_calls_per_minute"].get< size_t >(); - map_custom_method_settings_[it.key()] = cme; + cme.m_maxCallsPerMinute = joMethod["max_calls_per_minute"].get< size_t >(); + m_mapCustomMethodLimits[it.key()] = cme; } } } -void origin_entry_setting::toJSON( nlohmann::json& jo ) const { +void origin_dos_limits::toJSON( nlohmann::json& jo ) const { jo = nlohmann::json::object(); nlohmann::json jarrWildcards = nlohmann::json::array(); - for ( const std::string& wildcard : origin_wildcards_ ) + for ( const std::string& wildcard : m_originWildcards ) jarrWildcards.push_back( wildcard ); jo["origin"] = jarrWildcards; - jo["max_calls_per_second"] = max_calls_per_second_; - jo["max_calls_per_minute"] = max_calls_per_minute_; - jo["ban_peak"] = ban_peak_; - jo["ban_lengthy"] = ban_lengthy_; - jo["max_ws_conn"] = max_ws_conn_; - if ( !map_custom_method_settings_.empty() ) { + jo["max_calls_per_second"] = m_defaultMaxCallsPerSec; + jo["max_calls_per_minute"] = m_defaultMaxCallsPerMin; + jo["ban_peak"] = m_banPerSecDuration; + jo["ban_lengthy"] = m_banPerMinDuration; + jo["max_ws_conn"] = m_maxWSConn; + if ( !m_mapCustomMethodLimits.empty() ) { nlohmann::json joCMS = nlohmann::json::object(); - map_custom_method_settings_t::const_iterator itWalk = map_custom_method_settings_.cbegin(), - itEnd = map_custom_method_settings_.cend(); + map_custom_method_limits_t::const_iterator itWalk = m_mapCustomMethodLimits.cbegin(), + itEnd = m_mapCustomMethodLimits.cend(); for ( ; itWalk != itEnd; ++itWalk ) { - const custom_method_setting& cme = itWalk->second; + const custom_method_limits& cme = itWalk->second; nlohmann::json joMethod = nlohmann::json::object(); - joMethod["max_calls_per_second"] = cme.max_calls_per_second_; - joMethod["max_calls_per_minute"] = cme.max_calls_per_minute_; + joMethod["max_calls_per_second"] = cme.m_maxCallsPerSecond; + joMethod["max_calls_per_minute"] = cme.m_maxCallsPerMinute; joCMS[itWalk->first] = joMethod; } jo["custom_method_settings"] = joCMS; } } -bool origin_entry_setting::match_origin( const char* origin ) const { +bool origin_dos_limits::match_origin( const char* origin ) const { if ( origin == nullptr || ( *origin ) == '\0' ) return false; - for ( const std::string& wildcard : origin_wildcards_ ) { + for ( const std::string& wildcard : m_originWildcards ) { if ( skutils::tools::wildcmp( wildcard.c_str(), origin ) ) return true; } return false; } -bool origin_entry_setting::match_origin( const std::string& origin ) const { - return match_origin( origin.c_str() ); -} -size_t origin_entry_setting::max_calls_per_second( const char* strMethod ) const { +size_t origin_dos_limits::max_calls_per_second( const char* strMethod ) const { if ( strMethod == nullptr || strMethod[0] == '\0' ) - return max_calls_per_second_; - map_custom_method_settings_t::const_iterator itFind = - map_custom_method_settings_.find( strMethod ), - itEnd = map_custom_method_settings_.cend(); + return m_defaultMaxCallsPerSec; + map_custom_method_limits_t::const_iterator itFind = m_mapCustomMethodLimits.find( strMethod ), + itEnd = m_mapCustomMethodLimits.cend(); if ( itFind == itEnd ) - return max_calls_per_second_; - const custom_method_setting& cme = itFind->second; - const size_t cnt = std::max( max_calls_per_second_, cme.max_calls_per_second_ ); + return m_defaultMaxCallsPerSec; + const custom_method_limits& cme = itFind->second; + const size_t cnt = std::max( m_defaultMaxCallsPerSec, cme.m_maxCallsPerSecond ); return cnt; } -size_t origin_entry_setting::max_calls_per_minute( const char* strMethod ) const { +size_t origin_dos_limits::max_calls_per_minute( const char* strMethod ) const { if ( strMethod == nullptr || strMethod[0] == '\0' ) - return max_calls_per_minute_; - map_custom_method_settings_t::const_iterator itFind = - map_custom_method_settings_.find( strMethod ), - itEnd = map_custom_method_settings_.cend(); + return m_defaultMaxCallsPerMin; + map_custom_method_limits_t::const_iterator itFind = m_mapCustomMethodLimits.find( strMethod ), + itEnd = m_mapCustomMethodLimits.cend(); if ( itFind == itEnd ) - return max_calls_per_minute_; - const custom_method_setting& cme = itFind->second; - const size_t cnt = std::max( max_calls_per_minute_, cme.max_calls_per_minute_ ); + return m_defaultMaxCallsPerMin; + const custom_method_limits& cme = itFind->second; + const size_t cnt = std::max( m_defaultMaxCallsPerMin, cme.m_maxCallsPerMinute ); return cnt; } -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// settings::settings() { clear(); @@ -288,70 +266,73 @@ settings& settings::operator=( const settings& other ) { } bool settings::empty() const { - if ( !enabled_ ) + if ( !m_enabled ) return true; - if ( !origins_.empty() ) + if ( !m_originDosLimits.empty() ) return false; - if ( !global_limit_.empty() ) + if ( !m_globalLimitSetting.empty() ) return false; return true; } void settings::clear() { - enabled_ = true; - origins_.clear(); - global_limit_.clear(); + m_enabled = true; + m_originDosLimits.clear(); + m_globalLimitSetting.clear(); } settings& settings::assign( const settings& other ) { if ( ( ( void* ) ( this ) ) == ( ( void* ) ( &other ) ) ) return ( *this ); clear(); - enabled_ = other.enabled_; - origins_ = other.origins_; - global_limit_ = other.global_limit_; + m_enabled = other.m_enabled; + m_originDosLimits = other.m_originDosLimits; + m_globalLimitSetting = other.m_globalLimitSetting; return ( *this ); } settings& settings::merge( const settings& other ) { if ( ( ( void* ) ( this ) ) == ( ( void* ) ( &other ) ) ) return ( *this ); - for ( const origin_entry_setting& oe : other.origins_ ) + for ( const origin_dos_limits& oe : other.m_originDosLimits ) merge( oe ); - global_limit_.merge( other.global_limit_ ); + m_globalLimitSetting.merge( other.m_globalLimitSetting ); return ( *this ); } -settings& settings::merge( const origin_entry_setting& oe ) { + +settings& settings::merge( const origin_dos_limits& oe ) { size_t i = indexOfOrigin( oe ); if ( i == std::string::npos ) - origins_.push_back( oe ); + m_originDosLimits.push_back( oe ); else - origins_[i].merge( oe ); + m_originDosLimits[i].merge( oe ); return ( *this ); } -size_t settings::indexOfOrigin( const origin_entry_setting& oe, size_t idxStart ) { - for ( const std::string& wildcard : oe.origin_wildcards_ ) { +size_t settings::indexOfOrigin( const origin_dos_limits& oe, size_t idxStart ) { + for ( const std::string& wildcard : oe.m_originWildcards ) { size_t i = indexOfOrigin( wildcard, idxStart ); if ( i != std::string::npos ) return i; } return std::string::npos; } + size_t settings::indexOfOrigin( const char* origin_wildcard, size_t idxStart ) { if ( origin_wildcard == nullptr || ( *origin_wildcard ) == '\0' ) return std::string::npos; - size_t cnt = origins_.size(); + size_t cnt = m_originDosLimits.size(); size_t i = ( idxStart == std::string::npos ) ? 0 : ( idxStart + 1 ); for ( ; i < cnt; ++i ) { - const origin_entry_setting& oe = origins_[i]; - for ( const std::string& wildcard : oe.origin_wildcards_ ) { + const origin_dos_limits& oe = m_originDosLimits[i]; + for ( const std::string& wildcard : oe.m_originWildcards ) { if ( wildcard == origin_wildcard ) return i; } } return std::string::npos; } + size_t settings::indexOfOrigin( const std::string& origin_wildcard, size_t idxStart ) { if ( origin_wildcard.empty() ) return std::string::npos; @@ -364,474 +345,295 @@ void settings::fromJSON( const nlohmann::json& jo ) { const nlohmann::json& joOrigins = jo["origins"]; if ( joOrigins.is_array() ) { for ( const nlohmann::json& joOrigin : joOrigins ) { - origin_entry_setting oe; + origin_dos_limits oe; oe.fromJSON( joOrigin ); - origins_.push_back( oe ); + m_originDosLimits.push_back( oe ); } } } if ( jo.find( "global" ) != jo.end() ) { const nlohmann::json& joGlobalLimit = jo["global"]; - origin_entry_setting oe; + origin_dos_limits oe; oe.fromJSON( joGlobalLimit ); - global_limit_ = oe; + m_globalLimitSetting = oe; } else - global_limit_.load_unlim_for_any_origin(); + m_globalLimitSetting.load_unlim_for_any_origin(); bool isEnabled = true; if ( jo.find( "enabled" ) != jo.end() ) { const nlohmann::json& joEnabled = jo["enabled"]; if ( joEnabled.is_boolean() ) isEnabled = joEnabled.get< bool >(); } - enabled_ = isEnabled; + m_enabled = isEnabled; } void settings::toJSON( nlohmann::json& jo ) const { jo = nlohmann::json::object(); nlohmann::json joOrigins = nlohmann::json::array(); - for ( const origin_entry_setting& oe : origins_ ) { + for ( const origin_dos_limits& oe : m_originDosLimits ) { nlohmann::json joOrigin = nlohmann::json::object(); oe.toJSON( joOrigin ); joOrigins.push_back( joOrigin ); } nlohmann::json joGlobalLimit = nlohmann::json::object(); - global_limit_.toJSON( joGlobalLimit ); - jo["enabled"] = enabled_; + m_globalLimitSetting.toJSON( joGlobalLimit ); + jo["enabled"] = m_enabled; jo["origins"] = joOrigins; jo["global"] = joGlobalLimit; } -size_t settings::find_origin_entry_setting_match( const char* origin, size_t idxStart ) const { +size_t settings::findOriginLimitsMatch( const char* origin, size_t idxStart ) const { if ( origin == nullptr || ( *origin ) == '\0' ) return std::string::npos; - size_t cnt = origins_.size(); + size_t cnt = m_originDosLimits.size(); size_t i = ( idxStart == std::string::npos ) ? 0 : ( idxStart + 1 ); for ( ; i < cnt; ++i ) { - const origin_entry_setting& oe = origins_[i]; + const origin_dos_limits& oe = m_originDosLimits[i]; if ( oe.match_origin( origin ) ) return i; } return std::string::npos; } -origin_entry_setting& settings::find_origin_entry_setting( const char* origin ) { - size_t i = find_origin_entry_setting_match( origin ); +origin_dos_limits& settings::findOriginDosLimits( const char* _origin ) { + size_t i = findOriginLimitsMatch( _origin ); if ( i != std::string::npos ) - return origins_[i]; + return m_originDosLimits[i]; return auto_append_any_origin_rule(); } -origin_entry_setting& settings::auto_append_any_origin_rule() { - if ( !origins_.empty() ) { - size_t i = find_origin_entry_setting_match( "*" ); +origin_dos_limits& settings::auto_append_any_origin_rule() { + if ( !m_originDosLimits.empty() ) { + size_t i = findOriginLimitsMatch( "*" ); if ( i != std::string::npos ) - return origins_[i]; + return m_originDosLimits[i]; } - origin_entry_setting oe; + origin_dos_limits oe; oe.load_defaults_for_any_origin(); - origins_.push_back( oe ); - return origins_[origins_.size() - 1]; + m_originDosLimits.push_back( oe ); + return m_originDosLimits[m_originDosLimits.size() - 1]; } -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -time_entry::time_entry( time_tick_mark ttm ) : ttm_( ttm ) {} +tracked_origin::tracked_origin( const char* origin ) + : m_origin( ( origin != nullptr && origin[0] != '\0' ) ? origin : "" ) {} -time_entry::time_entry( const time_entry& other ) { - assign( other ); -} -time_entry::time_entry( time_entry&& other ) { - assign( other ); - other.clear(); +void tracked_origin::setDosLimits( const origin_dos_limits& _dosLimits ) { + m_dosLimits = _dosLimits; } -time_entry::~time_entry() { - clear(); -} +e_high_load_detection_result_t tracked_origin::recordMethodUseAndDetectBan( + uint64_t _callTimeSec, const char* _strMethod ) { + recordUse( _callTimeSec, _strMethod ); -time_entry& time_entry::operator=( const time_entry& other ) { - return assign( other ); -} + if ( isBanned( _callTimeSec ) ) { + return e_high_load_detection_result_t::ehldr_already_banned; // still banned + } -bool time_entry::empty() const { - if ( ttm_ != time_tick_mark( 0 ) ) - return false; - return true; + return detectBan( _callTimeSec, _strMethod ); } -void time_entry::clear() { - ttm_ = time_tick_mark( 0 ); -} +e_high_load_detection_result_t tracked_origin::detectBan( + uint64_t _callTimeSec, const char* _strMethod ) { + auto maxCallsPerMinute = m_dosLimits.max_calls_per_minute( _strMethod ); -time_entry& time_entry::assign( const time_entry& other ) { - clear(); - ttm_ = other.ttm_; - return ( *this ); -} + std::string method = ( _strMethod ? _strMethod : "" ); -int time_entry::compare( const time_entry& other ) const { - if ( ttm_ < other.ttm_ ) - return -1; - if ( ttm_ > other.ttm_ ) - return 1; - return 0; -} + if ( maxCallsPerMinute > 0 ) { + if ( m_currentMinUseCounterPerMethod[method] > maxCallsPerMinute ) { + m_banUntilSec = _callTimeSec + m_dosLimits.m_banPerMinDuration; + return e_high_load_detection_result_t::ehldr_detected_ban_per_min; // ban by too high + // load per min + } + } -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + auto maxCallsPerSecond = m_dosLimits.max_calls_per_second( method.c_str() ); + if ( maxCallsPerSecond > 0 ) { + if ( m_currentSecUseCounterPerMethod[method] > maxCallsPerSecond ) { + m_banUntilSec = _callTimeSec + m_dosLimits.m_banPerSecDuration; + return e_high_load_detection_result_t::ehldr_detected_ban_per_sec; + } + } -tracked_origin::tracked_origin( const char* origin, time_tick_mark ttm ) - : origin_( ( origin != nullptr && origin[0] != '\0' ) ? origin : "" ) { - if ( ttm != time_tick_mark( 0 ) ) - time_entries_.push_back( time_entry( ttm ) ); + return e_high_load_detection_result_t::ehldr_no_error; } -tracked_origin::tracked_origin( const std::string& origin, time_tick_mark ttm ) - : origin_( origin ) { - if ( ttm != time_tick_mark( 0 ) ) - time_entries_.push_back( time_entry( ttm ) ); -} -tracked_origin::tracked_origin( const tracked_origin& other ) { - assign( other ); -} +tracked_origin::~tracked_origin() {} -tracked_origin::tracked_origin( tracked_origin&& other ) { - assign( other ); - other.clear(); -} -tracked_origin::~tracked_origin() { - clear(); +bool tracked_origin::isBanned( uint64_t _timeSec ) { + return ( _timeSec <= m_banUntilSec ); } -tracked_origin& tracked_origin::operator=( const tracked_origin& other ) { - return assign( other ); -} +void tracked_origin::recordUse( uint64_t _useTimeSec, const char* _strMethod ) { + std::string method = ( _strMethod ? _strMethod : "" ); -bool tracked_origin::empty() const { - if ( !origin_.empty() ) - return false; - if ( !time_entries_.empty() ) - return false; - return true; -} -void tracked_origin::clear() { - origin_.clear(); - time_entries_.clear(); - clear_ban(); -} + static constexpr uint64_t SECONDS_IN_MINUTE = 60; + auto minute = _useTimeSec / SECONDS_IN_MINUTE; -tracked_origin& tracked_origin::assign( const tracked_origin& other ) { - clear(); - origin_ = other.origin_; - time_entries_ = other.time_entries_; - ban_until_ = other.ban_until_; - return ( *this ); -} + std::lock_guard lock( x_mutex ); -int tracked_origin::compare( const tracked_origin& other ) const { - int n = origin_.compare( other.origin_ ); - return n; -} -int tracked_origin::compare( const char* origin ) const { - int n = origin_.compare( origin ? origin : "" ); - return n; -} -int tracked_origin::compare( const std::string& origin ) const { - int n = origin_.compare( origin ); - return n; -} - -size_t tracked_origin::unload_old_data_by_time_to_past( - time_tick_mark ttmNow, duration durationToPast ) { - if ( durationToPast == duration( 0 ) ) - return 0; - adjust_now_tick_mark( ttmNow ); - time_tick_mark ttmUntil = ttmNow - durationToPast; - size_t cntRemoved = 0; - adjust_now_tick_mark( ttmNow ); - while ( !time_entries_.empty() ) { - const time_entry& te = time_entries_.front(); - if ( te.ttm_ < ttmUntil ) { - time_entries_.erase( time_entries_.begin() ); // time_entries_.pop_front(); - ++cntRemoved; - } else - break; + if ( ( uint64_t ) _useTimeSec > m_currentSec ) { + // next hour arrived. Reset use counter + m_currentSecUseCounterPerMethod.clear(); + m_currentSec = ( uint64_t ) _useTimeSec; } - return cntRemoved; -} -size_t tracked_origin::unload_old_data_by_count( size_t cntEntriesMax ) { - size_t cntRemoved = 0; - while ( time_entries_.size() > cntEntriesMax ) { - time_entries_.erase( time_entries_.begin() ); // time_entries_.pop_front(); - ++cntRemoved; - } - return cntRemoved; -} - -size_t tracked_origin::count_to_past( time_tick_mark ttmNow, duration durationToPast, - size_t cntOptimizedMaxSteps, size_t cntTargetUnDDoS ) const { - // if ( durationToPast == duration( 0 ) ) - // return 0; - if ( cntOptimizedMaxSteps == 0 ) - return 0; - adjust_now_tick_mark( ttmNow ); - time_tick_mark ttmUntil = ttmNow - durationToPast; - size_t cnt = 0, idxStep; - bool bNeedReScaling = false; - time_tick_mark ttRescaling = ttmUntil; - time_entries_t::const_reverse_iterator itWalk = time_entries_.crbegin(), - itEnd = time_entries_.crend(); - for ( idxStep = 0; itWalk != itEnd; ++itWalk, ++idxStep ) { - const time_entry& te = ( *itWalk ); - if ( ttmUntil <= te.ttm_ && te.ttm_ <= ttmNow ) { - ++cnt; - ttRescaling = te.ttm_ - ttmUntil; - } - if ( cntOptimizedMaxSteps != 0 && cntOptimizedMaxSteps != size_t( -1 ) && - idxStep >= cntOptimizedMaxSteps ) { - bNeedReScaling = true; - break; - } + if ( minute > m_currentMin ) { + // next minute arrived. Reset use counters + m_currentMinUseCounterPerMethod.clear(); + m_currentMin = minute; } - if ( bNeedReScaling && cnt > 0 ) { - bool isNeedRescan = false; - if ( ttRescaling > 0 ) { - cnt *= durationToPast; - cnt /= ttRescaling; - if ( cntTargetUnDDoS != 0 && cntTargetUnDDoS != size_t( -1 ) && cnt >= cntTargetUnDDoS ) - isNeedRescan = true; - } else - isNeedRescan = true; - if ( isNeedRescan ) { - // need exact full result - cnt = 0; - time_entries_.crbegin(); - itEnd = time_entries_.crend(); - for ( idxStep = 0; itWalk != itEnd; ++itWalk, ++idxStep ) { - const time_entry& te = ( *itWalk ); - if ( ttmUntil <= te.ttm_ && te.ttm_ <= ttmNow ) - ++cnt; - } - } - } - return cnt; -} -bool tracked_origin::clear_ban() { - if ( ban_until_ == time_tick_mark( 0 ) ) - return false; - ban_until_ = time_tick_mark( 0 ); - return true; // was cleared -} -bool tracked_origin::check_ban( time_tick_mark ttmNow, bool isAutoClear ) { - if ( ban_until_ == time_tick_mark( 0 ) ) - return false; - adjust_now_tick_mark( ttmNow ); - if ( ttmNow <= ban_until_ ) - return true; - if ( isAutoClear ) - clear_ban(); - return false; -} + // increment counters + + if ( m_currentSecUseCounterPerMethod.count( method ) > 0 ) { + m_currentSecUseCounterPerMethod[method]++; + } else { + m_currentSecUseCounterPerMethod[method] = 1; + } -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + if ( m_currentMinUseCounterPerMethod.count( method ) > 0 ) { + m_currentMinUseCounterPerMethod[method]++; + } else { + m_currentMinUseCounterPerMethod[method] = 1; + } +} -algorithm::algorithm() {} +algorithm::algorithm() : m_globalOrigin( nullptr ) {} -algorithm::algorithm( const settings& st ) { - settings_ = st; +algorithm::algorithm( const settings& st ) : m_globalOrigin( nullptr ) { + m_settings = st; + m_globalOrigin.setDosLimits( m_settings.m_globalLimitSetting ); } algorithm::~algorithm() {} algorithm& algorithm::operator=( const settings& st ) { - lock_type lock( mtx_ ); - settings_ = st; + m_settings = st; return ( *this ); } -size_t algorithm::unload_old_data_by_time_to_past( - time_tick_mark ttmNow, duration durationToPast ) { - if ( !settings_.enabled_ ) - return 0; - if ( durationToPast == duration( 0 ) ) - return 0; - adjust_now_tick_mark( ttmNow ); - lock_type lock( mtx_ ); - size_t cnt = 0; - std::set< std::string > setOriginsTorRemove; - tracked_origins_t::iterator itWalk = tracked_origins_.begin(), itEnd = tracked_origins_.end(); - for ( ; itWalk != itEnd; ++itWalk ) { - tracked_origin& to = const_cast< tracked_origin& >( *itWalk ); - size_t cntWalk = to.unload_old_data_by_time_to_past( ttmNow, durationToPast ); - cnt += cntWalk; - if ( to.time_entries_.empty() ) { - setOriginsTorRemove.insert( to.origin_ ); // TO-FIX: do not unload banned - } - } - for ( const std::string& origin : setOriginsTorRemove ) - tracked_origins_.erase( origin ); - // - tracked_global_.unload_old_data_by_time_to_past( ttmNow, durationToPast ); - // - return cnt; -} +constexpr uint64_t MAX_UNDDOS_MAP_ENTRIES = 256 * 1024; e_high_load_detection_result_t algorithm::register_call_from_origin( - const char* origin, const char* strMethod, time_tick_mark ttmNow, duration durationToPast ) { - if ( !settings_.enabled_ ) - return e_high_load_detection_result_t::ehldr_no_error; - if ( origin == nullptr || origin[0] == '\0' ) - return e_high_load_detection_result_t::ehldr_bad_origin; - adjust_now_tick_mark( ttmNow ); - lock_type lock( mtx_ ); - // - tracked_global_.time_entries_.push_back( time_entry( ttmNow ) ); - if ( tracked_global_.check_ban( ttmNow ) ) - return e_high_load_detection_result_t::ehldr_ban; // still banned - // - unload_old_data_by_time_to_past( ttmNow, durationToPast ); // unload first - tracked_origins_t::iterator itFind = tracked_origins_.find( origin ), - itEnd = tracked_origins_.end(); - if ( itFind == itEnd ) { - tracked_origin to( origin, ttmNow ); - tracked_origins_.insert( to ); + const char* _origin, const char* _strMethod, time_tick_mark _callTime, duration ) { + if ( !m_settings.m_enabled ) { + // DOS protection disabled return e_high_load_detection_result_t::ehldr_no_error; } - // return detect_high_load( origin.ttmNow, durationToPast ) - tracked_origin& to = const_cast< tracked_origin& >( *itFind ); - to.time_entries_.push_back( time_entry( ttmNow ) ); - if ( to.check_ban( ttmNow ) ) - return e_high_load_detection_result_t::ehldr_ban; // still banned - const origin_entry_setting& oe = settings_.find_origin_entry_setting( origin ); - // const size_t cntUnloaded = to.unload_old_data_by_count( oe.max_calls_per_minute( strMethod ) - // ); if ( cntUnloaded > oe.max_calls_per_minute_ ) { - // to.ban_until_ = ttmNow + oe.ban_lengthy_; - // return e_high_load_detection_result_t::ehldr_peak; // ban by too high load per minute - //} - size_t nMaxCallsPerTimeUnit = oe.max_calls_per_minute( strMethod ); - if ( nMaxCallsPerTimeUnit > 0 ) { - size_t cntPast = to.count_to_past( - ttmNow, durationToPast, cntOptimizedMaxSteps4cm_, nMaxCallsPerTimeUnit ); - if ( cntPast > nMaxCallsPerTimeUnit ) { - to.ban_until_ = ttmNow + oe.ban_lengthy_; - return e_high_load_detection_result_t::ehldr_lengthy; // ban by too high load per - // second + + if ( _origin == nullptr || _origin[0] == '\0' ) + return e_high_load_detection_result_t::ehldr_bad_origin; + + // set the call time to current time if it was not provided + setCallTimeToNowIfZero( _callTime ); + + // first check for global ban since it does not need to acces the map + + auto result = m_globalOrigin.recordMethodUseAndDetectBan( _callTime, _strMethod ); + + if ( result != e_high_load_detection_result_t::ehldr_no_error ) + return result; + + // now we checked for global ban, check for a ban based on origin + // we need to read lock to do it + std::shared_ptr< tracked_origin > trackedOrigin = nullptr; + { + std::shared_lock< std::shared_mutex > lock( x_mtx ); + auto iterator = m_trackedOriginsMap.find( _origin ); + if ( iterator != m_trackedOriginsMap.end() ) { + trackedOrigin = iterator->second; } } - nMaxCallsPerTimeUnit = oe.max_calls_per_second( strMethod ); - if ( nMaxCallsPerTimeUnit > 0 ) { - size_t cntPast = - to.count_to_past( ttmNow, 1, cntOptimizedMaxSteps4cs_, nMaxCallsPerTimeUnit ); - if ( cntPast > nMaxCallsPerTimeUnit ) { - to.ban_until_ = ttmNow + oe.ban_peak_; - return e_high_load_detection_result_t::ehldr_peak; // ban by too high load per second - } + + // if we did not find the tracked origin, it is not in the map yet. We need to init it under + // write lock + + if ( !trackedOrigin ) { + addNewOriginToMap( _origin ); + return e_high_load_detection_result_t::ehldr_no_error; + } else { + // since we now have trackedOrigin the rest can be done without holding any lock on the map + return trackedOrigin->recordMethodUseAndDetectBan( _callTime, _strMethod ); } - // - // - nMaxCallsPerTimeUnit = settings_.global_limit_.max_calls_per_minute( strMethod ); - if ( nMaxCallsPerTimeUnit > 0 ) { - size_t cntPast = tracked_global_.count_to_past( - ttmNow, durationToPast, cntOptimizedMaxSteps4gm_, nMaxCallsPerTimeUnit ); - if ( cntPast > nMaxCallsPerTimeUnit ) { - tracked_global_.ban_until_ = ttmNow + settings_.global_limit_.ban_lengthy_; - return e_high_load_detection_result_t::ehldr_lengthy; // ban by too high load per - // second +} + +void algorithm::addNewOriginToMap( const char* _origin ) { + const origin_dos_limits& oe = m_settings.findOriginDosLimits( _origin ); + { + std::unique_lock< std::shared_mutex > writeLock( x_mtx ); + if ( m_trackedOriginsMap.size() > MAX_UNDDOS_MAP_ENTRIES ) { + // the map grows in size, we clear it from time to time + // so that it does not grow indefinitely because of old accesses + // that will happen very infrequently + // to fill the map + m_trackedOriginsMap.clear(); } - } - nMaxCallsPerTimeUnit = settings_.global_limit_.max_calls_per_second( strMethod ); - if ( nMaxCallsPerTimeUnit > 0 ) { - size_t cntPast = tracked_global_.count_to_past( - ttmNow, 1, cntOptimizedMaxSteps4gs_, nMaxCallsPerTimeUnit ); - if ( cntPast > nMaxCallsPerTimeUnit ) { - tracked_global_.ban_until_ = ttmNow + settings_.global_limit_.ban_peak_; - return e_high_load_detection_result_t::ehldr_peak; // ban by too high load per second + if ( m_trackedOriginsMap.count( _origin ) == 0 ) { + m_trackedOriginsMap.emplace( _origin, std::make_shared< tracked_origin >( _origin ) ); + m_trackedOriginsMap.at( _origin )->setDosLimits( oe ); } } - // - // - return e_high_load_detection_result_t::ehldr_no_error; } -bool algorithm::is_ban_ws_conn_for_origin( const char* origin ) const { - if ( !settings_.enabled_ ) - return false; - if ( origin == nullptr || origin[0] == '\0' ) - return true; - lock_type lock( mtx_ ); - if ( ws_conn_count_global_ > settings_.global_limit_.max_ws_conn_ ) - return true; - map_ws_conn_counts_t::const_iterator itFind = map_ws_conn_counts_.find( origin ), - itEnd = map_ws_conn_counts_.end(); - if ( itFind == itEnd ) - return false; - const origin_entry_setting& oe = settings_.find_origin_entry_setting( origin ); - if ( itFind->second > oe.max_ws_conn_ ) - return true; - return false; -} e_high_load_detection_result_t algorithm::register_ws_conn_for_origin( const char* origin ) { - if ( !settings_.enabled_ ) + if ( !m_settings.m_enabled ) return e_high_load_detection_result_t::ehldr_no_error; if ( origin == nullptr || origin[0] == '\0' ) return e_high_load_detection_result_t::ehldr_bad_origin; - lock_type lock( mtx_ ); - ++ws_conn_count_global_; - if ( ws_conn_count_global_ > settings_.global_limit_.max_ws_conn_ ) - return e_high_load_detection_result_t::ehldr_peak; - map_ws_conn_counts_t::iterator itFind = map_ws_conn_counts_.find( origin ), - itEnd = map_ws_conn_counts_.end(); + std::unique_lock< std::shared_mutex > lock( x_mtx ); + ++m_WsConnCountGlobal; + if ( m_WsConnCountGlobal > m_settings.m_globalLimitSetting.m_maxWSConn ) + return e_high_load_detection_result_t::ehldr_detected_ban_per_sec; + map_ws_conn_counts_t::iterator itFind = m_mapWsConnCounts.find( origin ), + itEnd = m_mapWsConnCounts.end(); if ( itFind == itEnd ) { - map_ws_conn_counts_[origin] = 1; - itFind = map_ws_conn_counts_.find( origin ); + m_mapWsConnCounts[origin] = 1; + itFind = m_mapWsConnCounts.find( origin ); } else ++itFind->second; - const origin_entry_setting& oe = settings_.find_origin_entry_setting( origin ); - if ( itFind->second > oe.max_ws_conn_ ) - return e_high_load_detection_result_t::ehldr_peak; + const origin_dos_limits& oe = m_settings.findOriginDosLimits( origin ); + if ( itFind->second > oe.m_maxWSConn ) + return e_high_load_detection_result_t::ehldr_detected_ban_per_sec; return e_high_load_detection_result_t::ehldr_no_error; } bool algorithm::unregister_ws_conn_for_origin( const char* origin ) { if ( origin == nullptr || origin[0] == '\0' ) { - if ( !settings_.enabled_ ) + if ( !m_settings.m_enabled ) return true; return false; } - lock_type lock( mtx_ ); - if ( ws_conn_count_global_ > 0 ) - --ws_conn_count_global_; - map_ws_conn_counts_t::iterator itFind = map_ws_conn_counts_.find( origin ), - itEnd = map_ws_conn_counts_.end(); + std::unique_lock< std::shared_mutex > lock( x_mtx ); + if ( m_WsConnCountGlobal > 0 ) + --m_WsConnCountGlobal; + map_ws_conn_counts_t::iterator itFind = m_mapWsConnCounts.find( origin ), + itEnd = m_mapWsConnCounts.end(); if ( itFind == itEnd ) { - if ( !settings_.enabled_ ) + if ( !m_settings.m_enabled ) return true; return false; } if ( itFind->second >= 1 ) --itFind->second; if ( itFind->second == 0 ) - map_ws_conn_counts_.erase( itFind ); + m_mapWsConnCounts.erase( itFind ); return true; } bool algorithm::load_settings_from_json( const nlohmann::json& joUnDdosSettings ) { - lock_type lock( mtx_ ); + std::unique_lock< std::shared_mutex > lock( x_mtx ); try { settings new_settings; new_settings.fromJSON( joUnDdosSettings ); - settings_ = new_settings; - settings_.auto_append_any_origin_rule(); + m_settings = new_settings; + m_settings.auto_append_any_origin_rule(); return true; } catch ( ... ) { return false; @@ -839,81 +641,24 @@ bool algorithm::load_settings_from_json( const nlohmann::json& joUnDdosSettings } settings algorithm::get_settings() const { - lock_type lock( mtx_ ); - settings_.auto_append_any_origin_rule(); - settings copied = settings_; + std::shared_lock< std::shared_mutex > lock( x_mtx ); + m_settings.auto_append_any_origin_rule(); + settings copied = m_settings; return copied; } void algorithm::set_settings( const settings& new_settings ) const { - lock_type lock( mtx_ ); - settings_ = new_settings; - settings_.auto_append_any_origin_rule(); + std::unique_lock< std::shared_mutex > lock( x_mtx ); + m_settings = new_settings; + m_settings.auto_append_any_origin_rule(); } nlohmann::json algorithm::get_settings_json() const { - lock_type lock( mtx_ ); - settings_.auto_append_any_origin_rule(); + std::shared_lock< std::shared_mutex > lock( x_mtx ); + m_settings.auto_append_any_origin_rule(); nlohmann::json joUnDdosSettings = nlohmann::json::object(); - settings_.toJSON( joUnDdosSettings ); + m_settings.toJSON( joUnDdosSettings ); return joUnDdosSettings; } -nlohmann::json algorithm::stats( time_tick_mark ttmNow, duration durationToPast ) const { - lock_type lock( mtx_ ); - ( const_cast< algorithm* >( this ) ) - ->unload_old_data_by_time_to_past( ttmNow, durationToPast ); // unload first - nlohmann::json joStats = nlohmann::json::object(); - nlohmann::json joCounts = nlohmann::json::object(); - nlohmann::json joCalls = nlohmann::json::object(); - nlohmann::json joWsConns = nlohmann::json::object(); - size_t cntRpcBan = 0, cntRpcNormal = 0, cntWsBan = 0, cntWsNormal = 0; - for ( const tracked_origin& to : tracked_origins_ ) { - nlohmann::json joOriginCallInfo = nlohmann::json::object(); - bool isBan = ( to.ban_until_ != time_tick_mark( 0 ) ) ? true : false; - joOriginCallInfo["cps"] = - to.count_to_past( ttmNow, 1, cntOptimizedMaxSteps4cs_, size_t( -1 ) ); - joOriginCallInfo["cpm"] = - to.count_to_past( ttmNow, durationToPast, cntOptimizedMaxSteps4cm_, size_t( -1 ) ); - joOriginCallInfo["ban"] = isBan; - joCalls[to.origin_] = joOriginCallInfo; - if ( isBan ) - ++cntRpcBan; - else - ++cntRpcNormal; - } - for ( const map_ws_conn_counts_t::value_type& pr : map_ws_conn_counts_ ) { - nlohmann::json joWsConnInfo = nlohmann::json::object(); - bool isBan = is_ban_ws_conn_for_origin( pr.first ); - joWsConnInfo["cnt"] = pr.second; - joWsConnInfo["ban"] = isBan; - joWsConns[pr.first] = joWsConnInfo; - if ( isBan ) - ++cntWsBan; - else - ++cntWsNormal; - } - joCounts["rpc_ban"] = cntRpcBan; - joCounts["rpc_normal"] = cntRpcNormal; - joCounts["ws_ban"] = cntWsBan; - joCounts["ws_normal"] = cntWsNormal; - joStats["counts"] = joCounts; - joStats["calls"] = joCalls; - joStats["ws_conns"] = joWsConns; - // - joStats["global_ws_conns_count"] = ws_conn_count_global_; - joStats["global_cps"] = - tracked_global_.count_to_past( ttmNow, 1, cntOptimizedMaxSteps4gs_, size_t( -1 ) ); - joStats["global_cpm"] = tracked_global_.count_to_past( - ttmNow, durationToPast, cntOptimizedMaxSteps4gm_, size_t( -1 ) ); - bool isGlobalBan = ( tracked_global_.ban_until_ != time_tick_mark( 0 ) ) ? true : false; - joStats["global_ban"] = isGlobalBan; - // - return joStats; -} - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -}; // namespace unddos -}; // namespace skutils +}; // namespace skutils::unddos diff --git a/libskutils/src/utils.cpp b/libskutils/src/utils.cpp index abb760c96..85aa107b5 100644 --- a/libskutils/src/utils.cpp +++ b/libskutils/src/utils.cpp @@ -544,9 +544,6 @@ std::string nanoseconds_2_lifetime_str( uint64_t ns, bool isColored /*= false*/ return ss.str(); } -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - bool convert_json_string_value_to_boolean( const std::string& r ) { if ( r.empty() ) return false; @@ -557,270 +554,10 @@ bool convert_json_string_value_to_boolean( const std::string& r ) { return ( lf != 0.0 ) ? true : false; } -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - size_t cpu_count() { static const size_t g_cntCPUs = size_t( ::sysconf( _SC_NPROCESSORS_ONLN ) ); return g_cntCPUs; } -#if ( defined __BUILDING_4_MAC_OS_X__ ) -static double stat_ParseMemValue( const char* b ) { - while ( ( *b ) && ( isdigit( *b ) == false ) ) - b++; - return isdigit( *b ) ? atof( b ) : -1.0; -} -// returns a number between 0.0f and 1.0f, with 0.0f meaning all RAM is available, and 1.0f meaning -// all RAM is currently in use -float osx_GetSystemMemoryUsagePercentage() { - FILE* fpIn = popen( "/usr/bin/vm_stat", "r" ); - if ( fpIn ) { - double pagesUsed = 0.0, totalPages = 0.0; - char buf[512]; - while ( fgets( buf, sizeof( buf ), fpIn ) != nullptr ) { - if ( strncmp( buf, "Pages", 5 ) == 0 ) { - double val = stat_ParseMemValue( buf ); - if ( val >= 0.0 ) { - if ( ( strncmp( buf, "Pages wired", 11 ) == 0 ) || - ( strncmp( buf, "Pages active", 12 ) == 0 ) ) - pagesUsed += val; - totalPages += val; - } - } else if ( strncmp( buf, "Mach Virtual Memory Statistics", 30 ) != 0 ) - break; // Stop at "Translation Faults", we don't care about anything at or below - // that - } - pclose( fpIn ); - if ( totalPages > 0.0 ) - return ( float ) ( pagesUsed / totalPages ); - } - return -1.0f; // indicate failure -} -static unsigned long long _previousTotalTicks = 0; -static unsigned long long _previousIdleTicks = 0; -static float stat_CalculateCPULoad( unsigned long long idleTicks, unsigned long long totalTicks ) { - unsigned long long totalTicksSinceLastTime = totalTicks - _previousTotalTicks; - unsigned long long idleTicksSinceLastTime = idleTicks - _previousIdleTicks; - float ret = 1.0f - ( ( totalTicksSinceLastTime > 0 ) ? - ( ( float ) idleTicksSinceLastTime ) / totalTicksSinceLastTime : - 0 ); - _previousTotalTicks = totalTicks; - _previousIdleTicks = idleTicks; - return ret; -} -// returns 1.0f for "CPU fully pinned", 0.0f for "CPU idle", or somewhere in between -// you'll need to call this at regular intervals, since it measures the load between the previous -// call and the current one. -float osx_GetCPULoad() { - host_cpu_load_info_data_t cpuinfo; - mach_msg_type_number_t count = HOST_CPU_LOAD_INFO_COUNT; - if ( host_statistics( mach_host_self(), HOST_CPU_LOAD_INFO, ( host_info_t ) &cpuinfo, - &count ) == KERN_SUCCESS ) { - unsigned long long totalTicks = 0; - for ( int i = 0; i < CPU_STATE_MAX; i++ ) - totalTicks += cpuinfo.cpu_ticks[i]; - return stat_CalculateCPULoad( cpuinfo.cpu_ticks[CPU_STATE_IDLE], totalTicks ); - } else - return -1.0f; -} -#else -std::atomic_size_t g_nSleepMillisecondsBetweenCpuLoadMeasurements( 1000 ); - -std::vector< long double > cpu_load() { - std::vector< long double > cpuLoad( 4 ); - // - FILE* fp = fopen( "/proc/stat", "r" ); - if ( !fp ) - return cpuLoad; - if ( fscanf( fp, "%*s %Lf %Lf %Lf %Lf", &cpuLoad[0], &cpuLoad[1], &cpuLoad[2], &cpuLoad[3] ) != - 4 ) { - fclose( fp ); - throw std::runtime_error( "Can't parse /proc/stat" ); - }; - fclose( fp ); - - return cpuLoad; -} - -/* this function returns read/write bytes per second */ -std::map< std::string, DiskInfo > disk_load() { - std::map< std::string, DiskInfo > readWritePerDevice; - FILE* fp = fopen( DISKSTATS, "r" ); - if ( !fp ) - return readWritePerDevice; - - char line[MAX_LINE_LEN]; - char dev_name[MAX_NAME_LEN]; - memset( dev_name, 0, MAX_NAME_LEN ); - memset( line, 0, MAX_LINE_LEN ); - unsigned int ios_pgr, tot_ticks, rq_ticks, wr_ticks; - unsigned long rd_ios, rd_merges_or_rd_sec, rd_ticks_or_wr_sec, wr_ios; - unsigned long wr_merges, rd_sec_or_wr_ios, wr_sec; - unsigned int major, minor; - while ( fgets( line, sizeof( line ), fp ) ) { - int i = sscanf( line, "%u %u %s %lu %lu %lu %lu %lu %lu %lu %u %u %u %u", &major, &minor, - dev_name, &rd_ios, &rd_merges_or_rd_sec, &rd_sec_or_wr_ios, &rd_ticks_or_wr_sec, - &wr_ios, &wr_merges, &wr_sec, &wr_ticks, &ios_pgr, &tot_ticks, &rq_ticks ); - - if ( !strstr( dev_name, "sd" ) ) - continue; - - DiskInfo currInfo; - switch ( i ) { - case EXT_PART_NUM: - currInfo.readIOS = rd_ios; - currInfo.writeIOS = wr_ios; - currInfo.readSectors = rd_sec_or_wr_ios; - currInfo.writeSectors = wr_sec; - break; - case PART_NUM: - currInfo.readIOS = rd_ios; - currInfo.writeIOS = rd_sec_or_wr_ios; - currInfo.readSectors = rd_merges_or_rd_sec; - currInfo.writeSectors = rd_ticks_or_wr_sec; - break; - default: - continue; - } - - readWritePerDevice.insert( std::make_pair( dev_name, currInfo ) ); - } - - fclose( fp ); - // TODO: merge statistic for different partitions - - return readWritePerDevice; -} - - -nlohmann::json calculate_load_interval( const std::map< std::string, DiskInfo >& prevLoad, - const std::map< std::string, DiskInfo >& currentLoad, size_t nSleepMs ) { -#define S_VALUE( m, n, p ) ( ( ( double ) ( ( n ) - ( m ) ) ) / ( p ) *100 ) - nlohmann::json jo = nlohmann::json::object(); - if ( prevLoad.size() != currentLoad.size() ) - return jo; // some device missed - for ( auto itPrevLoad = prevLoad.cbegin(), itCurrLoad = currentLoad.cbegin(); - itPrevLoad != prevLoad.cend() && itCurrLoad != currentLoad.cend(); - ++itPrevLoad, ++itCurrLoad ) { - nlohmann::json currentDevice = nlohmann::json::object(); - const auto& prevStat = itPrevLoad->second; - const auto& currStat = itCurrLoad->second; - size_t rd_sec = currStat.readSectors - prevStat.readSectors; - size_t wr_sec = currStat.writeSectors - prevStat.writeSectors; - - const double rSectors = S_VALUE( prevStat.readSectors, currStat.readSectors, nSleepMs ); - const double wSectors = S_VALUE( prevStat.writeSectors, currStat.writeSectors, nSleepMs ); - const double perIter = S_VALUE( - prevStat.readIOS + prevStat.writeIOS, currStat.readIOS + currStat.writeIOS, nSleepMs ); - - currentDevice["kb_read_s"] = rd_sec; - currentDevice["kb_write_s"] = wr_sec; - currentDevice["kb_read"] = rSectors; - currentDevice["kb_write"] = wSectors; - currentDevice["tps"] = perIter; - - const std::string devName = itCurrLoad->first; - jo[devName] = currentDevice; - } - - - return jo; -} - - -#endif - -load_monitor::load_monitor( size_t - nSleepMillisecondsBetweenCpuLoadMeasurements /*= 0*/ ) // 0 means use - // g_nSleepMillisecondsBetweenCpuLoadMeasurements - : stop_flag_( false ), - cpu_load_( 0.0 ), - nSleepMillisecondsBetweenCpuLoadMeasurements_( - nSleepMillisecondsBetweenCpuLoadMeasurements ) { - thread_ = std::thread( [this]() { - skutils::multithreading::setThreadName( - skutils::tools::format( "sklm-%p", ( void* ) this ) ); - thread_proc(); - } ); -} -load_monitor::~load_monitor() { - try { - stop_flag_ = true; - if ( thread_.joinable() ) - thread_.join(); - } catch ( ... ) { - } -} -double load_monitor::last_cpu_load() const { - double lf = cpu_load_; - return lf; -} - -nlohmann::json load_monitor::last_disk_load() const { -#if ( !defined __BUILDING_4_MAC_OS_X__ ) - std::lock_guard< std::mutex > lock{ diskLoadMutex_ }; - return diskLoad_; -#else - nlohmann::json jo = nullptr; - return jo; -#endif -} - -void load_monitor::thread_proc() { - for ( ; !stop_flag_; ) -#if ( defined __BUILDING_4_MAC_OS_X__ ) - cpu_load_ = osx_GetCPULoad() / 100.0; - size_t nMS = nSleepMillisecondsBetweenCpuLoadMeasurements_; - if ( nMS < 1000 ) - nMS = 1000; - std::this_thread::sleep_for( std::chrono::milliseconds( nMS ) ); -#else - calculate_load( nSleepMillisecondsBetweenCpuLoadMeasurements_ ); - -#endif -} - -#if ( !defined __BUILDING_4_MAC_OS_X__ ) -void load_monitor::calculate_load( size_t nSleep ) { - const auto prevDiskLoad = disk_load(); - const auto cpuPrevLoad = cpu_load(); - - size_t nSleepMilliseconds = nSleep; - if ( nSleepMilliseconds == 0 ) - nSleepMilliseconds = g_nSleepMillisecondsBetweenCpuLoadMeasurements; - std::this_thread::sleep_for( std::chrono::milliseconds( nSleepMilliseconds ) ); - - const auto currentDiskLoad = disk_load(); - auto res = calculate_load_interval( prevDiskLoad, currentDiskLoad, nSleepMilliseconds ); - { - std::lock_guard< std::mutex > lock{ diskLoadMutex_ }; - diskLoad_ = res; - } - const auto cpuCurrentLoad = cpu_load(); - cpu_load_ = - ( ( cpuCurrentLoad[0] + cpuCurrentLoad[1] + cpuCurrentLoad[2] ) - - ( cpuPrevLoad[0] + cpuPrevLoad[1] + cpuPrevLoad[2] ) ) / - ( ( cpuCurrentLoad[0] + cpuCurrentLoad[1] + cpuCurrentLoad[2] + cpuCurrentLoad[3] ) - - ( cpuPrevLoad[0] + cpuPrevLoad[1] + cpuPrevLoad[2] + cpuPrevLoad[3] ) ); -} -#endif - -double mem_usage() { // 0.0...1.0 -#if ( defined __BUILDING_4_MAC_OS_X__ ) - float f = osx_GetSystemMemoryUsagePercentage(); - if ( f <= 0.0f ) - return 0.0; - return double( f ); -#else - double lfTotalPages = double( ::sysconf( _SC_PHYS_PAGES ) ); - if ( lfTotalPages == 0.0 ) - return 0.0; - double lfFreePages = double( ::sysconf( _SC_AVPHYS_PAGES ) ); - double lfPercentAvail = - double( lfTotalPages - lfFreePages ) / double( lfTotalPages ); // 0.0...1.0 - return lfPercentAvail; -#endif -} std::string create_random_uuid( const char* strSeparator ) { char strUuid[256]; @@ -863,9 +600,6 @@ std::string create_uuid() { #endif } -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - std::string generate_random_text_string( size_t cntCharacters /*= 10*/ ) { static const char possible[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; std::string s; diff --git a/libskutils/src/ws.cpp b/libskutils/src/ws.cpp index 17ec59a09..59f8f34e5 100644 --- a/libskutils/src/ws.cpp +++ b/libskutils/src/ws.cpp @@ -138,524 +138,6 @@ bool is_ping_or_pong( const nlohmann::json& jo ) { }; // namespace utils -traffic_stats::traffic_stats() { - init(); -} -traffic_stats::traffic_stats( traffic_stats::myrct x ) : skutils::stats::named_event_stats( x ) { - init(); - assign( x ); -} -traffic_stats::traffic_stats( traffic_stats::myrrt x ) : skutils::stats::named_event_stats( x ) { - init(); - move( x ); -} -traffic_stats::~traffic_stats() { - clear(); -} - -traffic_stats::bytes_count_t traffic_stats::text_tx() const { - lock_type lock( const_cast< myrt >( *this ) ); - bytes_count_t n = text_tx_; - return n; -} -traffic_stats::bytes_count_t traffic_stats::text_rx() const { - lock_type lock( const_cast< myrt >( *this ) ); - bytes_count_t n = text_rx_; - return n; -} -traffic_stats::bytes_count_t traffic_stats::bin_tx() const { - lock_type lock( const_cast< myrt >( *this ) ); - bytes_count_t n = bin_tx_; - return n; -} -traffic_stats::bytes_count_t traffic_stats::bin_rx() const { - lock_type lock( const_cast< myrt >( *this ) ); - bytes_count_t n = bin_rx_; - return n; -} -traffic_stats::bytes_count_t traffic_stats::tx() const { - lock_type lock( const_cast< myrt >( *this ) ); - bytes_count_t n = text_tx_ + bin_tx_; - return n; -} -traffic_stats::bytes_count_t traffic_stats::rx() const { - lock_type lock( const_cast< myrt >( *this ) ); - bytes_count_t n = text_rx_ + bin_rx_; - return n; -} - -using namespace skutils::stats; -double traffic_stats::bps_text_tx( time_point tpNow ) const { - lock_type lock( const_cast< myrt >( *this ) ); - double lf = named_traffic_stats::stat_compute_bps( traffic_queue_text_tx_, tpNow ); - return lf; -} -double traffic_stats::bps_text_tx_last_known() const { - lock_type lock( const_cast< myrt >( *this ) ); - double lf = named_traffic_stats::stat_compute_bps_last_known( traffic_queue_text_tx_ ); - return lf; -} -double traffic_stats::bps_text_tx() const { - lock_type lock( const_cast< myrt >( *this ) ); - double lf = named_traffic_stats::stat_compute_bps_til_now( traffic_queue_text_tx_ ); - return lf; -} - -double traffic_stats::bps_text_rx( time_point tpNow ) const { - lock_type lock( const_cast< myrt >( *this ) ); - double lf = named_traffic_stats::stat_compute_bps( traffic_queue_text_rx_, tpNow ); - return lf; -} -double traffic_stats::bps_text_rx_last_known() const { - lock_type lock( const_cast< myrt >( *this ) ); - double lf = named_traffic_stats::stat_compute_bps_last_known( traffic_queue_text_rx_ ); - return lf; -} -double traffic_stats::bps_text_rx() const { - lock_type lock( const_cast< myrt >( *this ) ); - double lf = named_traffic_stats::stat_compute_bps_til_now( traffic_queue_text_rx_ ); - return lf; -} - -double traffic_stats::bps_bin_tx( time_point tpNow ) const { - lock_type lock( const_cast< myrt >( *this ) ); - double lf = named_traffic_stats::stat_compute_bps( traffic_queue_bin_tx_, tpNow ); - return lf; -} -double traffic_stats::bps_bin_tx_last_known() const { - lock_type lock( const_cast< myrt >( *this ) ); - double lf = named_traffic_stats::stat_compute_bps_last_known( traffic_queue_bin_tx_ ); - return lf; -} -double traffic_stats::bps_bin_tx() const { - lock_type lock( const_cast< myrt >( *this ) ); - double lf = named_traffic_stats::stat_compute_bps_til_now( traffic_queue_bin_tx_ ); - return lf; -} - -double traffic_stats::bps_bin_rx( time_point tpNow ) const { - lock_type lock( const_cast< myrt >( *this ) ); - double lf = named_traffic_stats::stat_compute_bps( traffic_queue_bin_rx_, tpNow ); - return lf; -} -double traffic_stats::bps_bin_rx_last_known() const { - lock_type lock( const_cast< myrt >( *this ) ); - double lf = named_traffic_stats::stat_compute_bps_last_known( traffic_queue_bin_rx_ ); - return lf; -} -double traffic_stats::bps_bin_rx() const { - lock_type lock( const_cast< myrt >( *this ) ); - double lf = named_traffic_stats::stat_compute_bps_til_now( traffic_queue_bin_rx_ ); - return lf; -} - -double traffic_stats::bps_tx( time_point tpNow ) const { - lock_type lock( const_cast< myrt >( *this ) ); - double lf = named_traffic_stats::stat_compute_bps( traffic_queue_all_tx_, tpNow ); - return lf; -} -double traffic_stats::bps_tx_last_known() const { - lock_type lock( const_cast< myrt >( *this ) ); - double lf = named_traffic_stats::stat_compute_bps_last_known( traffic_queue_all_tx_ ); - return lf; -} -double traffic_stats::bps_tx() const { - lock_type lock( const_cast< myrt >( *this ) ); - double lf = named_traffic_stats::stat_compute_bps_til_now( traffic_queue_all_tx_ ); - return lf; -} - -double traffic_stats::bps_rx( time_point tpNow ) const { - lock_type lock( const_cast< myrt >( *this ) ); - double lf = named_traffic_stats::stat_compute_bps( traffic_queue_all_rx_, tpNow ); - return lf; -} -double traffic_stats::bps_rx_last_known() const { - lock_type lock( const_cast< myrt >( *this ) ); - double lf = named_traffic_stats::stat_compute_bps_last_known( traffic_queue_all_rx_ ); - return lf; -} -double traffic_stats::bps_rx() const { - lock_type lock( const_cast< myrt >( *this ) ); - double lf = named_traffic_stats::stat_compute_bps_til_now( traffic_queue_all_rx_ ); - return lf; -} - -traffic_stats::myrt traffic_stats::log_text_tx( bytes_count_t n ) { - lock_type lock( *this ); - text_tx_ += n; - traffic_record_item_t recNow( n ); - traffic_queue_all_tx_.push_back( recNow ); - traffic_queue_text_tx_.push_back( recNow ); - return ( *this ); -} -traffic_stats::myrt traffic_stats::log_text_rx( traffic_stats::bytes_count_t n ) { - lock_type lock( *this ); - text_rx_ += n; - traffic_record_item_t recNow( n ); - traffic_queue_all_rx_.push_back( recNow ); - traffic_queue_text_rx_.push_back( recNow ); - return ( *this ); -} -traffic_stats::myrt traffic_stats::log_bin_tx( traffic_stats::bytes_count_t n ) { - lock_type lock( *this ); - bin_tx_ += n; - traffic_record_item_t recNow( n ); - traffic_queue_all_tx_.push_back( recNow ); - traffic_queue_bin_tx_.push_back( recNow ); - return ( *this ); -} -traffic_stats::myrt traffic_stats::log_bin_rx( traffic_stats::bytes_count_t n ) { - lock_type lock( *this ); - bin_rx_ += n; - traffic_record_item_t recNow( n ); - traffic_queue_all_rx_.push_back( recNow ); - traffic_queue_bin_rx_.push_back( recNow ); - return ( *this ); -} - -traffic_stats::e_last_instance_state_changing_type_t -traffic_stats::last_instance_state_changing_type() const { - lock_type lock( const_cast< myrt >( *this ) ); - e_last_instance_state_changing_type_t e = elisctt_; - return e; -} -std::string traffic_stats::last_instance_state_changing_type_as_str() const { - lock_type lock( const_cast< myrt >( *this ) ); - switch ( elisctt_ ) { - case elisctt_instantiated: - return "instantiated"; - case elisctt_opened: - return "opened"; - case elisctt_closed: - return "closed"; - default: - return "N/A-state"; - } -} -traffic_stats::time_point traffic_stats::instantiated() const { - lock_type lock( const_cast< myrt >( *this ) ); - return time_stamp_instantiated_; -} -traffic_stats::nanoseconds traffic_stats::instantiated_ago( - traffic_stats::time_point tpNow ) const { - // lock_type lock( const_cast < myrt > ( *this ) ); - return std::chrono::duration_cast< nanoseconds >( tpNow - instantiated() ); -} -traffic_stats::nanoseconds traffic_stats::instantiated_ago() const { - // lock_type lock( const_cast < myrt > ( *this ) ); - return instantiated_ago( clock::now() ); -} -traffic_stats::time_point traffic_stats::changed() const { - lock_type lock( const_cast< myrt >( *this ) ); - switch ( elisctt_ ) { - case elisctt_instantiated: - return time_stamp_instantiated_; - case elisctt_opened: - return time_stamp_opened_; - case elisctt_closed: - return time_stamp_closed_; - default: - return clock::now(); - } -} -traffic_stats::nanoseconds traffic_stats::changed_ago( traffic_stats::time_point tpNow ) const { - // lock_type lock( const_cast < myrt > ( *this ) ); - return std::chrono::duration_cast< nanoseconds >( tpNow - changed() ); -} -traffic_stats::nanoseconds traffic_stats::changed_ago() const { - // lock_type lock( const_cast < myrt > ( *this ) ); - return changed_ago( clock::now() ); -} - -void traffic_stats::log_open() { - lock_type lock( *this ); - elisctt_ = elisctt_opened; - time_stamp_opened_ = clock::now(); -} -void traffic_stats::log_close() { - lock_type lock( *this ); - elisctt_ = elisctt_closed; - time_stamp_closed_ = clock::now(); -} - -size_t traffic_stats::g_nSizeDefaultOnQueueAdd = 10; -const char traffic_stats::g_strEventNameWebSocketFail[] = "fail"; -const char traffic_stats::g_strEventNameWebSocketMessagesRecvText[] = "rx-txt"; -const char traffic_stats::g_strEventNameWebSocketMessagesRecvBinary[] = "rx-bin"; -const char traffic_stats::g_strEventNameWebSocketMessagesRecv[] = "rx"; -const char traffic_stats::g_strEventNameWebSocketMessagesSentText[] = "tx-txt"; -const char traffic_stats::g_strEventNameWebSocketMessagesSentBinary[] = "tx-bin"; -const char traffic_stats::g_strEventNameWebSocketMessagesSent[] = "tx"; -void traffic_stats::register_default_event_queues_for_web_socket() { - event_queue_add( g_strEventNameWebSocketFail, g_nSizeDefaultOnQueueAdd ); - event_queue_add( g_strEventNameWebSocketMessagesRecvText, g_nSizeDefaultOnQueueAdd ); - event_queue_add( g_strEventNameWebSocketMessagesRecvBinary, g_nSizeDefaultOnQueueAdd ); - event_queue_add( g_strEventNameWebSocketMessagesRecv, g_nSizeDefaultOnQueueAdd ); - event_queue_add( g_strEventNameWebSocketMessagesSentText, g_nSizeDefaultOnQueueAdd ); - event_queue_add( g_strEventNameWebSocketMessagesSentBinary, g_nSizeDefaultOnQueueAdd ); - event_queue_add( g_strEventNameWebSocketMessagesSent, g_nSizeDefaultOnQueueAdd ); -} -const char traffic_stats::g_strEventNameWebSocketPeerConnect[] = "peer connect"; -const char traffic_stats::g_strEventNameWebSocketPeerDisconnect[] = "peer disconnect"; -const char traffic_stats::g_strEventNameWebSocketPeerDisconnectFail[] = "peer disconnect fail"; -void traffic_stats::register_default_event_queues_for_web_socket_peer() { - register_default_event_queues_for_web_socket(); - event_queue_add( g_strEventNameWebSocketPeerConnect, g_nSizeDefaultOnQueueAdd ); - event_queue_add( g_strEventNameWebSocketPeerDisconnect, g_nSizeDefaultOnQueueAdd ); - event_queue_add( g_strEventNameWebSocketPeerDisconnectFail, g_nSizeDefaultOnQueueAdd ); -} -const char traffic_stats::g_strEventNameWebSocketServerStart[] = "server start"; -const char traffic_stats::g_strEventNameWebSocketServerStartFail[] = "server start fail"; -const char traffic_stats::g_strEventNameWebSocketServerStop[] = "server stop"; -void traffic_stats::register_default_event_queues_for_web_socket_server() { - register_default_event_queues_for_web_socket(); - event_queue_add( g_strEventNameWebSocketPeerConnect, g_nSizeDefaultOnQueueAdd ); - event_queue_add( g_strEventNameWebSocketPeerDisconnect, g_nSizeDefaultOnQueueAdd ); - event_queue_add( g_strEventNameWebSocketPeerDisconnectFail, g_nSizeDefaultOnQueueAdd ); - event_queue_add( g_strEventNameWebSocketServerStart, g_nSizeDefaultOnQueueAdd ); - event_queue_add( g_strEventNameWebSocketServerStartFail, g_nSizeDefaultOnQueueAdd ); - event_queue_add( g_strEventNameWebSocketServerStop, g_nSizeDefaultOnQueueAdd ); -} -const char traffic_stats::g_strEventNameWebSocketClientConnect[] = "connect"; -const char traffic_stats::g_strEventNameWebSocketClientConnectFail[] = "fail connect"; -const char traffic_stats::g_strEventNameWebSocketClientDisconnect[] = "disconnect"; -const char traffic_stats::g_strEventNameWebSocketClientReconnect[] = "reconnect attempt"; -void traffic_stats::register_default_event_queues_for_web_socket_client() { - register_default_event_queues_for_web_socket(); - event_queue_add( g_strEventNameWebSocketClientConnect, g_nSizeDefaultOnQueueAdd ); - event_queue_add( g_strEventNameWebSocketClientConnectFail, g_nSizeDefaultOnQueueAdd ); - event_queue_add( g_strEventNameWebSocketClientDisconnect, g_nSizeDefaultOnQueueAdd ); - event_queue_add( g_strEventNameWebSocketClientReconnect, g_nSizeDefaultOnQueueAdd ); -} - -bool traffic_stats::empty() const { - lock_type lock( const_cast< myrt >( *this ) ); - if ( text_tx_ != 0 || text_rx_ != 0 || bin_tx_ != 0 || bin_rx_ != 0 ) - return false; - return true; -} -void traffic_stats::clear() { - lock_type lock( *this ); - text_tx_ = text_rx_ = bin_tx_ = bin_rx_ = 0; - elisctt_ = elisctt_instantiated; - time_stamp_instantiated_ = time_stamp_opened_ = time_stamp_closed_ = clock::now(); - traffic_queue_all_tx_.clear(); - traffic_queue_all_rx_.clear(); - traffic_queue_text_tx_.clear(); - traffic_queue_text_rx_.clear(); - traffic_queue_bin_tx_.clear(); - traffic_queue_bin_rx_.clear(); - named_event_stats::clear(); -} -void traffic_stats::init() { - lock_type lock( *this ); - clear(); - limit( 50 ); -} -traffic_stats::myrt traffic_stats::limit( size_t lim ) { - traffic_queue_all_tx_.limit( lim ); - traffic_queue_all_rx_.limit( lim ); - traffic_queue_text_tx_.limit( lim ); - traffic_queue_text_rx_.limit( lim ); - traffic_queue_bin_tx_.limit( lim ); - traffic_queue_bin_rx_.limit( lim ); - return ( *this ); -} -int traffic_stats::compare( traffic_stats::myrct x ) const { - lock_type lock1( const_cast< myrt >( *this ) ); - lock_type lock2( const_cast< myrt >( x ) ); - if ( int( elisctt_ ) < int( x.elisctt_ ) ) - return -1; - if ( int( elisctt_ ) > int( x.elisctt_ ) ) - return 1; - // time_stamp_instantiated_, time_stamp_opened_, time_stamp_closed_ ... not used - if ( bytes_count_t( text_tx_ ) < bytes_count_t( x.text_tx_ ) ) - return -1; - if ( bytes_count_t( text_tx_ ) > bytes_count_t( x.text_tx_ ) ) - return 1; - if ( bytes_count_t( text_rx_ ) < bytes_count_t( x.text_rx_ ) ) - return -1; - if ( bytes_count_t( text_rx_ ) > bytes_count_t( x.text_rx_ ) ) - return 1; - if ( bytes_count_t( bin_tx_ ) < bytes_count_t( x.bin_tx_ ) ) - return -1; - if ( bytes_count_t( bin_tx_ ) > bytes_count_t( x.bin_tx_ ) ) - return 1; - if ( bytes_count_t( bin_rx_ ) < bytes_count_t( x.bin_rx_ ) ) - return -1; - if ( bytes_count_t( bin_rx_ ) > bytes_count_t( x.bin_rx_ ) ) - return 1; - int n; - n = traffic_queue_all_tx_.compare( x.traffic_queue_all_tx_ ); - if ( n ) - return n; - n = traffic_queue_all_rx_.compare( x.traffic_queue_all_rx_ ); - if ( n ) - return n; - n = traffic_queue_text_tx_.compare( x.traffic_queue_text_tx_ ); - if ( n ) - return n; - n = traffic_queue_text_rx_.compare( x.traffic_queue_text_rx_ ); - if ( n ) - return n; - n = traffic_queue_bin_tx_.compare( x.traffic_queue_bin_tx_ ); - if ( n ) - return n; - n = traffic_queue_bin_rx_.compare( x.traffic_queue_bin_rx_ ); - if ( n ) - return n; - n = named_event_stats::compare( x ); - if ( n ) - return n; - return 0; -} -traffic_stats::myrt traffic_stats::assign( traffic_stats::myrct x ) { - lock_type lock1( *this ); - lock_type lock2( const_cast< myrt >( x ) ); - elisctt_ = x.elisctt_; - time_stamp_instantiated_ = x.time_stamp_instantiated_; - time_stamp_opened_ = x.time_stamp_opened_; - time_stamp_closed_ = x.time_stamp_closed_; - text_tx_ = bytes_count_t( x.text_tx_ ); - text_rx_ = bytes_count_t( x.text_rx_ ); - bin_tx_ = bytes_count_t( x.bin_tx_ ); - bin_rx_ = bytes_count_t( x.bin_rx_ ); - traffic_queue_all_tx_ = x.traffic_queue_all_tx_; - traffic_queue_all_rx_ = x.traffic_queue_all_rx_; - traffic_queue_text_tx_ = x.traffic_queue_text_tx_; - traffic_queue_text_rx_ = x.traffic_queue_text_rx_; - traffic_queue_bin_tx_ = x.traffic_queue_bin_tx_; - traffic_queue_bin_rx_ = x.traffic_queue_bin_rx_; - named_event_stats::assign( x ); - return ( *this ); -} -traffic_stats::myrt traffic_stats::move( traffic_stats::myrt x ) { - lock_type lock1( *this ); - lock_type lock2( x ); - assign( x ); - x.clear(); - return ( *this ); -} - -void traffic_stats::lock() {} -void traffic_stats::unlock() {} - -std::string traffic_stats::getLifeTimeDescription( - traffic_stats::time_point tpNow, bool isColored /*= false*/ ) const { - // lock_type lock( const_cast < myrt > ( *this ) ); - std::string strChangeType( last_instance_state_changing_type_as_str() ), strAgoSuffix( " ago" ), - strSpace( " " ); - if ( isColored ) { - strChangeType = cc::debug( strChangeType ); - strAgoSuffix = cc::debug( strAgoSuffix ); - strSpace = cc::debug( strSpace ); - } - nanoseconds nsx = changed_ago( tpNow ); - uint64_t ns = nsx.count(); - std::stringstream ss; - ss << strChangeType << strSpace << skutils::tools::nanoseconds_2_lifetime_str( ns, isColored ) - << strAgoSuffix; - return ss.str(); -} -std::string traffic_stats::getLifeTimeDescription( bool isColored /*= false*/ ) const { - return getLifeTimeDescription( clock::now(), isColored ); -} -std::string traffic_stats::getTrafficStatsDescription( - traffic_stats::time_point tpNow, bool isColored /*= false*/ ) const { - // lock_type lock( const_cast < myrt > ( *this ) ); - traffic_stats copy_of_this( *this ); // lock-free copy of this - std::stringstream ss; - bytes_count_t nTx = bytes_count_t( copy_of_this.tx() ), nRx = - bytes_count_t( copy_of_this.rx() ); - double lfTxBPS = copy_of_this.bps_tx( tpNow ), lfRxBPS = copy_of_this.bps_rx( tpNow ); - std::string strBytesPrefix( "traffic " ), strBytesSuffix( " byte(s)" ), strTx( "Tx" ), - strRx( "Rx" ), strTxValue( skutils::tools::to_string( nTx ) ), - strRxValue( skutils::tools::to_string( nRx ) ), strBpsPrefix( " at " ), - strBpsSuffix( " bps" ), strTxBPS, strRxBPS, strBpsComposed, strSlash( "/" ), - strSpace( " " ); - bool bHaveBpsInfo = ( lfTxBPS > 0.0 || lfRxBPS > 0.0 ) ? true : false; - if ( bHaveBpsInfo ) { - strTxBPS = skutils::tools::format( "%.03lf", lfTxBPS ); - strRxBPS = skutils::tools::format( "%.03lf", lfRxBPS ); - } else { - strBpsComposed = "N/A"; - } - if ( isColored ) { - strBytesPrefix = cc::debug( strBytesPrefix ); - strBytesSuffix = cc::debug( strBytesSuffix ); - strTx = cc::ws_tx( strTx ); - strRx = cc::ws_rx( strRx ); - strTxValue = cc::ws_tx( strTxValue ); - strRxValue = cc::ws_rx( strRxValue ); - if ( !strTxBPS.empty() ) - strTxBPS = cc::ws_tx( strTxBPS ); - if ( !strRxBPS.empty() ) - strRxBPS = cc::ws_rx( strRxBPS ); - if ( !strBpsComposed.empty() ) - strBpsComposed = cc::error( strBpsComposed ); - strSlash = cc::debug( strSlash ); - strSpace = cc::debug( strSpace ); - if ( !strBpsPrefix.empty() ) - strBpsPrefix = cc::debug( strBpsPrefix ); - if ( !strBpsSuffix.empty() ) - strBpsSuffix = cc::debug( strBpsSuffix ); - } - if ( bHaveBpsInfo ) - strBpsComposed = strTxBPS + strSlash + strRxBPS; - ss << strBytesPrefix << strTx << strSlash << strRx << strSpace << strTxValue << strSlash - << strRxValue << strBytesSuffix << strBpsPrefix << strBpsComposed << strBpsSuffix; - return ss.str(); -} -std::string traffic_stats::getTrafficStatsDescription( bool isColored /*= false*/ ) const { - return getTrafficStatsDescription( clock::now(), isColored ); -} - -nlohmann::json traffic_stats::toJSON( time_point tpNow, bool bSkipEmptyStats /*= true*/ ) const { - // lock_type lock( const_cast < myrt > ( *this ) ); - nlohmann::json jo = - skutils::stats::named_event_stats::toJSON( tpNow, bSkipEmptyStats, "events" ); - traffic_stats copy_of_this( *this ); // lock-free copy of this - double lfTxBPS = copy_of_this.bps_tx( tpNow ); - double lfRxBPS = copy_of_this.bps_rx( tpNow ); - bytes_count_t nTx = bytes_count_t( copy_of_this.tx() ); - bytes_count_t nRx = bytes_count_t( copy_of_this.rx() ); - jo["life_time"] = skutils::tools::nanoseconds_2_lifetime_str( - copy_of_this.instantiated_ago( tpNow ).count(), false ); - jo["state"]["name"] = copy_of_this.last_instance_state_changing_type_as_str(); - jo["state"]["time_stamp"] = skutils::tools::nanoseconds_2_lifetime_str( - copy_of_this.changed_ago( tpNow ).count(), false ); - jo["traffic"]["tx"] = nTx; - jo["traffic"]["rx"] = nRx; - jo["bps"]["tx"] = lfTxBPS; - jo["bps"]["rx"] = lfRxBPS; - return jo; -} -nlohmann::json traffic_stats::toJSON( bool bSkipEmptyStats /*= false*/ ) const { - return toJSON( clock::now(), bSkipEmptyStats ); -} - -guarded_traffic_stats::guarded_traffic_stats() -//: traffic_stats_mtx_( "RMTX-TRAFFIC-STATS" ) -{} -guarded_traffic_stats::guarded_traffic_stats( traffic_stats::myrct x ) - : traffic_stats( x ) -//, traffic_stats_mtx_( "RMTX-TRAFFIC-STATS" ) -{} -guarded_traffic_stats::guarded_traffic_stats( traffic_stats::myrrt x ) - : traffic_stats( x ) -//, traffic_stats_mtx_( "RMTX-TRAFFIC-STATS" ) -{} -guarded_traffic_stats::~guarded_traffic_stats() {} -void guarded_traffic_stats::lock() { - // traffic_stats_mtx_.lock(); - skutils::get_ref_mtx().lock(); -} -void guarded_traffic_stats::unlock() { - // traffic_stats_mtx_.unlock(); - skutils::get_ref_mtx().unlock(); -} - basic_network_settings::basic_network_settings( basic_network_settings* pBNS ) // interval_ping_( 20 ) // seconds, ping-pong interval, 0 means not use : timeout_pong_( /*300*/ 60 * 60 * 24 * 365 ) // seconds, default value in wspp is 5000, 0 @@ -3313,7 +2795,6 @@ peer::peer( server& srv, const hdl_t& hdl ) hdl_( hdl ), cid_( 0 ), was_disconnected_( false ) { - traffic_stats::register_default_event_queues_for_web_socket_peer(); cid_ = stat_getCid( hdl ); } peer::~peer() { @@ -3330,7 +2811,6 @@ nlohmann::json peer::toJSON( bool bSkipEmptyStats /*= true*/ ) const { jo["connection_id"] = getCidString(); jo["serial_number"] = serial_number(); jo["scheme"] = srv().last_scheme_cached_; - jo["stats"] = traffic_stats::toJSON( bSkipEmptyStats ); return jo; } std::string peer::getShortTypeDescrition( bool isColored /*= false*/ ) const { @@ -3353,13 +2833,9 @@ std::string peer::getShortPeerDescription( if ( !strIP.empty() ) strIP = cc::u( strIP ); } - traffic_stats::time_point tpNow = traffic_stats::clock::now(); + ss << unique_string_identifier( isColored ) << strSpace << getShortTypeDescrition( isColored ) << strSpace << strIP; - if ( isLifetime ) - ss << strCommaSpace << getLifeTimeDescription( tpNow, isColored ); - if ( isTrafficStats ) - ss << strCommaSpace << getTrafficStatsDescription( tpNow, isColored ); return ss.str(); } std::string peer::unique_string_identifier( bool isColored /*= false*/ ) const { @@ -3377,12 +2853,9 @@ std::string peer::unique_string_identifier( bool isColored /*= false*/ ) const { ss << strCid << strSlash << strPeerSerialNumber; return ss.str(); } -void peer::onPeerRegister() { - traffic_stats::log_open(); -} +void peer::onPeerRegister() {} void peer::onPeerUnregister() { // peer will no longer receive onMessage after call to this opened_ = false; - traffic_stats::log_close(); } bool peer::isServerSide() const { return true; @@ -3461,7 +2934,6 @@ void peer::close( const std::string& msg, ref_retain(); try { srv_.close( hdl_, nCloseStatus, msg ); - traffic_stats::event_add( g_strEventNameWebSocketPeerDisconnect ); } catch ( const std::exception& ex ) { const char* strWhat = ex.what(); if ( strWhat == nullptr || strWhat[0] == '\0' ) @@ -3469,16 +2941,11 @@ void peer::close( const std::string& msg, std::stringstream ss; ss << cc::error( "Exception: " ) << cc::warn( strWhat ); srv_.onLogMessage( e_ws_log_message_type_t::eWSLMT_error, ss.str() ); - // clean_up( cid_ ); - traffic_stats::event_add( g_strEventNameWebSocketPeerDisconnectFail ); } catch ( ... ) { std::stringstream ss; ss << cc::error( "Unknown exception" ); srv_.onLogMessage( e_ws_log_message_type_t::eWSLMT_error, ss.str() ); - // clean_up( cid_ ); - traffic_stats::event_add( g_strEventNameWebSocketPeerDisconnectFail ); } - traffic_stats::log_close(); ref_release(); } void peer::cancel() { @@ -3496,48 +2963,24 @@ void peer::pause_reading() { void peer::onMessage( const std::string& msg, opcv eOpCode ) { if ( onPeerMessage_ ) onPeerMessage_( *this, msg, eOpCode ); - if ( eOpCode == opcv::text ) { - traffic_stats::log_text_rx( msg.length() ); - traffic_stats::event_add( g_strEventNameWebSocketMessagesRecvText ); - traffic_stats::event_add( g_strEventNameWebSocketMessagesRecv ); - } else if ( eOpCode == opcv::binary ) { - traffic_stats::log_bin_rx( msg.size() ); - traffic_stats::event_add( g_strEventNameWebSocketMessagesRecvBinary ); - traffic_stats::event_add( g_strEventNameWebSocketMessagesRecv ); - } } void peer::onClose( const std::string& reason, int local_close_code, const std::string& local_close_code_as_str ) { opened_ = false; if ( onPeerClose_ ) onPeerClose_( *this, reason, local_close_code, local_close_code_as_str ); - traffic_stats::log_close(); } void peer::onFail() { - traffic_stats::event_add( traffic_stats::g_strEventNameWebSocketFail ); - srv().event_add( traffic_stats::g_strEventNameWebSocketFail ); opened_ = false; if ( onPeerFail_ ) onPeerFail_( *this ); - traffic_stats::log_close(); } bool peer::sendMessage( const std::string& msg, opcv eOpCode ) { - // ss << cc::debug(">>> ") << cc::warn(getSender()) << cc::debug(", ") << - // cc::warn(getCidString()) << cc::debug(", ") << cc::c(msg) << "/n"; std::string strCid = getCidString(); std::string strRemoteIp = getRemoteIp(); try { if ( !srv_.sendMessage( hdl_, msg, eOpCode ) ) return false; - if ( eOpCode == opcv::text ) { - traffic_stats::log_text_tx( msg.length() ); - traffic_stats::event_add( g_strEventNameWebSocketMessagesSentText ); - traffic_stats::event_add( g_strEventNameWebSocketMessagesSent ); - } else if ( eOpCode == opcv::binary ) { - traffic_stats::log_bin_tx( msg.size() ); - traffic_stats::event_add( g_strEventNameWebSocketMessagesSentBinary ); - traffic_stats::event_add( g_strEventNameWebSocketMessagesSent ); - } return true; } catch ( const std::exception& ex ) { const char* strWhat = ex.what(); @@ -3576,7 +3019,6 @@ std::string peer::getCidString() const { server::server( basic_network_settings* pBNS ) : api_( pBNS ), server_serial_number_( 0 ), listen_backlog_( 0 ) { - traffic_stats::register_default_event_queues_for_web_socket_server(); api_.onConnect_ = [this]( connection_identifier_t cid, struct lws* /*wsi*/, const char* /*strPeerClientAddressName*/, const char* /*strPeerRemoteIP*/ ) { onOpen( cid ); }; @@ -3618,7 +3060,6 @@ nlohmann::json server::toJSON( bool bSkipEmptyStats /*= true*/ ) const { jo["portal_monitoring"] = ""; jo["port"] = port(); jo["scheme"] = last_scheme_cached_; - jo["stats"] = traffic_stats::toJSON( bSkipEmptyStats ); return jo; } size_t server::request_new_peer_serial_number() { @@ -3645,19 +3086,13 @@ bool server::open( const std::string& scheme, int nPort, const char* strInterfac basic_network_settings &bns_api = api_, bns_this = ( *this ); bns_api = bns_this; if ( !api_.init( isSSL, nPort, this, strInterfaceName ) ) { - traffic_stats::event_add( g_strEventNameWebSocketServerStartFail ); return false; } - traffic_stats::log_open(); - traffic_stats::event_add( g_strEventNameWebSocketServerStart ); return true; } void server::close() { server_api::lock_type lock( api_.mtx_api() ); api_.deinit(); - traffic_stats::log_close(); - // server_serial_number_ = 0; - traffic_stats::event_add( g_strEventNameWebSocketServerStop ); } void server::close( hdl_t hdl, int nCloseStatus, const std::string& msg ) { api_.close( hdl, nCloseStatus, msg ); @@ -3697,15 +3132,6 @@ bool server::sendMessage( hdl_t hdl, const std::string& msg, opcv eOpCode /*= op data.set_text( msg ); if ( !api_.send( hdl, data ) ) return false; - if ( eOpCode == opcv::text ) { - traffic_stats::log_text_tx( msg.length() ); - traffic_stats::event_add( g_strEventNameWebSocketMessagesSentText ); - traffic_stats::event_add( g_strEventNameWebSocketMessagesSent ); - } else if ( eOpCode == opcv::binary ) { - traffic_stats::log_bin_tx( msg.size() ); - traffic_stats::event_add( g_strEventNameWebSocketMessagesSentBinary ); - traffic_stats::event_add( g_strEventNameWebSocketMessagesSent ); - } return true; } // @@ -3736,7 +3162,6 @@ bool server::onPeerRegister( peer_ptr_t pPeer ) { if ( onPeerRegister_ ) onPeerRegister_( pPeer ); pPeer->onPeerRegister(); - traffic_stats::event_add( g_strEventNameWebSocketPeerConnect ); } catch ( ... ) { return false; } @@ -3748,7 +3173,6 @@ bool server::onPeerUnregister( peer_ptr_t pPeer ) { pPeer->ref_retain(); // exrra ref, to protect onPeerUnregister_ specific implementatoion, such // as un-ddos accept try { - traffic_stats::event_add( g_strEventNameWebSocketPeerDisconnect ); if ( onPeerUnregister_ ) onPeerUnregister_( pPeer ); } catch ( ... ) { @@ -3804,22 +3228,12 @@ void server::onClose( hdl_t hdl, const std::string& reason, int local_close_code } } void server::onFail( hdl_t hdl ) { - traffic_stats::event_add( traffic_stats::g_strEventNameWebSocketFail ); basic_socket::onFail( hdl ); } void server::onMessage( hdl_t hdl, opcv eOpCode, const std::string& msg ) { peer_ptr_t pPeer = getPeer( hdl ); if ( pPeer ) { pPeer->onMessage( msg, eOpCode ); - if ( eOpCode == opcv::text ) { - traffic_stats::log_text_rx( msg.length() ); - traffic_stats::event_add( g_strEventNameWebSocketMessagesRecvText ); - traffic_stats::event_add( g_strEventNameWebSocketMessagesRecv ); - } else if ( eOpCode == opcv::binary ) { - traffic_stats::log_bin_rx( msg.size() ); - traffic_stats::event_add( g_strEventNameWebSocketMessagesRecvBinary ); - traffic_stats::event_add( g_strEventNameWebSocketMessagesRecv ); - } return; } // @@ -3830,15 +3244,6 @@ void server::onMessage( hdl_t hdl, opcv eOpCode, const std::string& msg ) { onLogMessage( e_ws_log_message_type_t::eWSLMT_warning, ss.str() ); // basic_socket::onMessage( hdl, eOpCode, msg ); - if ( eOpCode == opcv::text ) { - traffic_stats::log_text_rx( msg.length() ); - traffic_stats::event_add( g_strEventNameWebSocketMessagesRecvText ); - traffic_stats::event_add( g_strEventNameWebSocketMessagesRecv ); - } else if ( eOpCode == opcv::binary ) { - traffic_stats::log_bin_rx( msg.size() ); - traffic_stats::event_add( g_strEventNameWebSocketMessagesRecvBinary ); - traffic_stats::event_add( g_strEventNameWebSocketMessagesRecv ); - } } bool server::onHttp( hdl_t hdl ) { return onHttp_ ? onHttp_( *this, hdl ) : false; @@ -3856,7 +3261,6 @@ const security_args& server::onGetSecurityArgs() const { client::client( basic_network_settings* pBNS ) : api_( pBNS ) { - traffic_stats::register_default_event_queues_for_web_socket_client(); api_.onConnect_ = [this]() { onOpen( api_.cid_ ); setConnected( true ); @@ -3890,7 +3294,6 @@ nlohmann::json client::toJSON( bool bSkipEmptyStats /*= true*/ ) const { nlohmann::json jo = nlohmann::json::object(); jo["type"] = "client"; jo["url"] = uri(); - jo["stats"] = traffic_stats::toJSON( bSkipEmptyStats ); return jo; } bool client::isServerSide() const { @@ -3914,11 +3317,8 @@ bool client::open( const std::string& uri, const char* strInterfaceName ) { basic_network_settings &bns_api = api_, bns_this = ( *this ); bns_api = bns_this; if ( !api_.init( uri, this, strInterfaceName ) ) { - traffic_stats::event_add( g_strEventNameWebSocketClientConnectFail ); return false; } - traffic_stats::log_open(); - traffic_stats::event_add( g_strEventNameWebSocketClientConnect ); return true; } catch ( const std::exception& ex ) { const char* strWhat = ex.what(); @@ -3932,7 +3332,6 @@ bool client::open( const std::string& uri, const char* strInterfaceName ) { ss << cc::error( "open: " ) << cc::warn( "unknown exception" ); onLogMessage( e_ws_log_message_type_t::eWSLMT_error, ss.str() ); } - traffic_stats::event_add( g_strEventNameWebSocketClientConnectFail ); return false; } bool client::openLocalHost( int nPort ) { @@ -3945,8 +3344,6 @@ void client::close() { if ( !isRestartTimerEnabled() ) restart_timer_.stop(); api_.deinit(); - traffic_stats::log_close(); - traffic_stats::event_add( g_strEventNameWebSocketClientDisconnect ); } void client::resetConnection() { enableRestartTimer( false ); @@ -3976,9 +3373,6 @@ void client::async_close( const std::string& msg, } void client::close( const std::string& msg, int nCloseStatus /*= int(close_status::going_away)*/ ) { api_.close( nCloseStatus, msg ); - // api_.deinit(); - traffic_stats::log_close(); - traffic_stats::event_add( g_strEventNameWebSocketClientDisconnect ); } void client::cancel() { // TO-FIX: cancel() not yet implemented @@ -4002,33 +3396,14 @@ bool client::sendMessage( const std::string& msg, opcv eOpCode ) { data.set_text( msg ); if ( !api_.send( data ) ) return false; - if ( eOpCode == opcv::text ) { - traffic_stats::log_text_tx( msg.length() ); - traffic_stats::event_add( g_strEventNameWebSocketMessagesSentText ); - traffic_stats::event_add( g_strEventNameWebSocketMessagesSent ); - } else if ( eOpCode == opcv::binary ) { - traffic_stats::log_bin_tx( msg.size() ); - traffic_stats::event_add( g_strEventNameWebSocketMessagesSentBinary ); - traffic_stats::event_add( g_strEventNameWebSocketMessagesSent ); - } return true; } void client::onMessage( hdl_t hdl, opcv eOpCode, const std::string& msg ) { basic_socket::onMessage( hdl, eOpCode, msg ); - if ( eOpCode == opcv::text ) { - traffic_stats::log_text_rx( msg.length() ); - traffic_stats::event_add( g_strEventNameWebSocketMessagesRecvText ); - traffic_stats::event_add( g_strEventNameWebSocketMessagesRecv ); - } else if ( eOpCode == opcv::binary ) { - traffic_stats::log_bin_rx( msg.size() ); - traffic_stats::event_add( g_strEventNameWebSocketMessagesRecvBinary ); - traffic_stats::event_add( g_strEventNameWebSocketMessagesRecv ); - } } void client::onDisconnected() { if ( onDisconnected_ ) onDisconnected_( *this ); - traffic_stats::log_close(); } void client::onOpen( hdl_t hdl ) { basic_socket::onOpen( hdl ); @@ -4056,20 +3431,14 @@ void client::onClose( hdl_t hdl, const std::string& reason, int local_close_code const std::string& local_close_code_as_str ) { basic_socket::onClose( hdl, reason, local_close_code, local_close_code_as_str ); impl_ensure_restart_timer_is_running(); - traffic_stats::log_close(); - traffic_stats::event_add( g_strEventNameWebSocketClientDisconnect ); } void client::onFail( hdl_t hdl ) { - traffic_stats::event_add( traffic_stats::g_strEventNameWebSocketFail ); basic_socket::onFail( hdl ); impl_ensure_restart_timer_is_running(); - traffic_stats::log_close(); } void client::onDelayDeinit() { // NLWS-specific } -// void client::onStreamSocketInit( int native_fd ) { -// basic_socket::onStreamSocketInit( native_fd ); -//} + void client::onLogMessage( e_ws_log_message_type_t eWSLMT, const std::string& msg ) { basic_socket::onLogMessage( eWSLMT, msg ); } diff --git a/libweb3jsonrpc/AdminEth.cpp b/libweb3jsonrpc/AdminEth.cpp index 983dcdb7c..02f2a8057 100644 --- a/libweb3jsonrpc/AdminEth.cpp +++ b/libweb3jsonrpc/AdminEth.cpp @@ -144,34 +144,9 @@ h256 AdminEth::blockHash( string const& _blockNumberOrHash ) const { } } -Json::Value AdminEth::admin_eth_vmTrace( - string const& /*_blockNumberOrHash*/, int _txIndex, string const& _session ) { +Json::Value AdminEth::admin_eth_vmTrace( string const&, int, string const& _session ) { RPC_ADMIN; - - Json::Value ret; - - if ( _txIndex < 0 ) - throw jsonrpc::JsonRpcException( "Negative index" ); - Block block = m_eth.latestBlock(); - if ( ( unsigned ) _txIndex < block.pending().size() ) { - try { - Transaction t = block.pending()[_txIndex]; - State s; - throw std::logic_error( "Historical state is not supported in Skale state" ); - // Executive e(s, block, _txIndex, m_eth.blockChain()); - // StandardTrace st; - // st.setShowMnemonics(); - // e.initialize(t); - // if (!e.execute()) - // e.go(st.functionToExecuteOnEachOperation()); - // e.finalize(); - // Json::Reader().parse(st.json(), ret); - } catch ( Exception const& _e ) { - cwarn << diagnostic_information( _e ); - } - } - - return ret; + throw jsonrpc::JsonRpcException( "Usupported API call" ); } Json::Value AdminEth::admin_eth_getReceiptByHashAndIndex( diff --git a/libweb3jsonrpc/Eth.cpp b/libweb3jsonrpc/Eth.cpp index 6a39183fd..26d4c9d5f 100644 --- a/libweb3jsonrpc/Eth.cpp +++ b/libweb3jsonrpc/Eth.cpp @@ -428,7 +428,22 @@ string Eth::eth_sendRawTransaction( std::string const& _rlp ) { // will be checked as a part of transaction import Transaction t( jsToBytes( _rlp, OnFailed::Throw ), CheckTransaction::None, false, EIP1559TransactionsPatch::isEnabledInWorkingBlock() ); - return toJS( client()->importTransaction( t ) ); + try { + return toJS( client()->importTransaction( t, TransactionBroadcast::BroadcastToAll ) ); + } catch ( PendingTransactionAlreadyExists& ) { + throw std::runtime_error( "Transaction with same nonce already exists in the queue." ); + } catch ( TransactionAlreadyInChain& ) { + // make it similar to what geth does + throw std::runtime_error( "Nonce too low." ); + } catch ( InvalidNonce& ) { + if ( !client()->chainParams().sChain.multiTransactionMode ) { + // make it similar to what geth does + throw std::runtime_error( "Nonce in the future." ); + } else { + // make it similar to what geth does + throw std::runtime_error( "Invalid nonce." ); + } + } } diff --git a/libweb3jsonrpc/JsonHelper.h b/libweb3jsonrpc/JsonHelper.h index f5cb095fa..c1590a8c6 100644 --- a/libweb3jsonrpc/JsonHelper.h +++ b/libweb3jsonrpc/JsonHelper.h @@ -30,10 +30,6 @@ #include #include -#define RAPIDJSON_ASSERT( x ) \ - if ( !( x ) ) { \ - throw std::out_of_range( #x " failed with provided JSON" ); \ - } #define RAPIDJSON_ASSERT_THROWS #include diff --git a/libweb3jsonrpc/SkaleStats.cpp b/libweb3jsonrpc/SkaleStats.cpp index a79a01c47..f5815e9a7 100644 --- a/libweb3jsonrpc/SkaleStats.cpp +++ b/libweb3jsonrpc/SkaleStats.cpp @@ -14,7 +14,7 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with skaled. If not, see . + along with skaled. If not, see . */ /** @file SkaleStats.cpp * @authors: @@ -52,86 +52,21 @@ #include #include -//#include "../libconsensus/libBLS/bls/bls.h" #include - -#include #include #include -#include - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// namespace dev { -static dev::u256 stat_str2u256( const std::string& saIn ) { - std::string sa; - if ( !( saIn.length() > 2 && saIn[0] == '0' && ( saIn[1] == 'x' || saIn[1] == 'X' ) ) ) - sa = "0x" + saIn; - else - sa = saIn; - dev::u256 u( sa.c_str() ); - return u; -} - -static nlohmann::json stat_parse_json_with_error_conversion( - const std::string& s, bool isThrowException = false ) { - nlohmann::json joAnswer; - std::string strError; - try { - joAnswer = nlohmann::json::parse( s ); - return joAnswer; - } catch ( std::exception const& ex ) { - strError = ex.what(); - if ( strError.empty() ) - strError = "exception without description"; - } catch ( ... ) { - strError = "unknown exception"; - } - if ( strError.empty() ) - strError = "unknown error"; - std::string strErrorDescription = - "JSON parser error \"" + strError + "\" while parsing JSON text \"" + s + "\""; - if ( isThrowException ) - throw std::runtime_error( strErrorDescription ); - joAnswer = nlohmann::json::object(); - joAnswer["error"] = strErrorDescription; - return joAnswer; -} - -static bool stat_trim_func_with_quotes( unsigned char ch ) { - return skutils::tools::default_trim_what( ch ) || ch == '\"' || ch == '\''; -} - -static void stat_check_rpc_call_error_and_throw( - const nlohmann::json& joAnswer, const std::string& strMethodName ) { - if ( joAnswer.count( "error" ) > 0 ) { - std::string strError = joAnswer["error"].dump(); - strError = skutils::tools::trim_copy( strError, stat_trim_func_with_quotes ); - if ( !strError.empty() ) - throw std::runtime_error( - "Got \"" + strMethodName + "\" call error \"" + strError + "\"" ); - } - if ( joAnswer.count( "errorMessage" ) > 0 ) { - std::string strError = joAnswer["errorMessage"].dump(); - strError = skutils::tools::trim_copy( strError, stat_trim_func_with_quotes ); - if ( !strError.empty() ) - throw std::runtime_error( - "Got \"" + strMethodName + "\" call error \"" + strError + "\"" ); - } -} - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// namespace rpc { SkaleStats::SkaleStats( const std::string& configPath, eth::Interface& _eth, const dev::eth::ChainParams& chainParams ) : skutils::json_config_file_accessor( configPath ), chainParams_( chainParams ), m_eth( _eth ) { + initStatsCounters(); nThisNodeIndex_ = findThisNodeIndex(); // try { @@ -185,13 +120,15 @@ Json::Value SkaleStats::skale_stats() { try { nlohmann::json joStats = consumeSkaleStats(); - // HACK Add stats from SkalePerformanceTracker - // TODO Why we need all this absatract infrastructure? - const dev::eth::Client* c = dynamic_cast< dev::eth::Client* const >( this->client() ); + const dev::eth::Client* c = dynamic_cast< dev::eth::Client* const >( client() ); if ( c ) { nlohmann::json joTrace; std::shared_ptr< SkaleHost > h = c->skaleHost(); + if ( !h ) { + throw jsonrpc::JsonRpcException( "No skaleHost in client()" ); + } + std::istringstream list( h->getDebugHandler()( "trace list" ) ); std::string key; while ( list >> key ) { @@ -359,18 +296,18 @@ Json::Value SkaleStats::skale_nodesRpcInfo() { jo["schainName"] = joSkaleConfig_sChain["schainName"].get< std::string >(); else joThisNode["schainName"] = ""; - // + nlohmann::json jarrNetwork = nlohmann::json::array(); size_t i, cnt = joSkaleConfig_sChain_nodes.size(); for ( i = 0; i < cnt; ++i ) { const nlohmann::json& joNC = joSkaleConfig_sChain_nodes[i]; nlohmann::json joNode = nlohmann::json::object(); - // + if ( joNC.count( "nodeID" ) > 0 && joNC["nodeID"].is_number() ) joNode["nodeID"] = joNC["nodeID"].get< int >(); else joNode["nodeID"] = 1; - // + if ( joNC.count( "publicIP" ) > 0 && joNC["publicIP"].is_string() ) joNode["ip"] = joNC["publicIP"].get< std::string >(); else { @@ -379,7 +316,7 @@ Json::Value SkaleStats::skale_nodesRpcInfo() { else joNode["ip"] = ""; } - // + if ( joNC.count( "publicIP6" ) > 0 && joNC["publicIP6"].is_string() ) joNode["ip6"] = joNC["publicIP6"].get< std::string >(); else { @@ -388,55 +325,55 @@ Json::Value SkaleStats::skale_nodesRpcInfo() { else joNode["ip6"] = ""; } - // + if ( joNC.count( "schainIndex" ) > 0 && joNC["schainIndex"].is_number() ) joNode["schainIndex"] = joNC["schainIndex"].get< int >(); else joNode["schainIndex"] = -1; - // + if ( joNC.count( "httpRpcPort" ) > 0 && joNC["httpRpcPort"].is_number() ) joNode["httpRpcPort"] = joNC["httpRpcPort"].get< int >(); else joNode["httpRpcPort"] = 0; - // + if ( joNC.count( "httpsRpcPort" ) > 0 && joNC["httpsRpcPort"].is_number() ) joNode["httpsRpcPort"] = joNC["httpsRpcPort"].get< int >(); else joNode["httpsRpcPort"] = 0; - // + if ( joNC.count( "wsRpcPort" ) > 0 && joNC["wsRpcPort"].is_number() ) joNode["wsRpcPort"] = joNC["wsRpcPort"].get< int >(); else joNode["wsRpcPort"] = 0; - // + if ( joNC.count( "wssRpcPort" ) > 0 && joNC["wssRpcPort"].is_number() ) joNode["wssRpcPort"] = joNC["wssRpcPort"].get< int >(); else joNode["wssRpcPort"] = 0; - // + if ( joNC.count( "httpRpcPort6" ) > 0 && joNC["httpRpcPort6"].is_number() ) joNode["httpRpcPort6"] = joNC["httpRpcPort6"].get< int >(); else joNode["httpRpcPort6"] = 0; - // + if ( joNC.count( "httpsRpcPort6" ) > 0 && joNC["httpsRpcPort6"].is_number() ) joNode["httpsRpcPort6"] = joNC["httpsRpcPort6"].get< int >(); else joNode["httpsRpcPort6"] = 0; - // + if ( joNC.count( "wsRpcPort6" ) > 0 && joNC["wsRpcPort6"].is_number() ) joNode["wsRpcPort6"] = joNC["wsRpcPort6"].get< int >(); else joNode["wsRpcPort6"] = 0; - // + if ( joNC.count( "wssRpcPort6" ) > 0 && joNC["wssRpcPort6"].is_number() ) joNode["wssRpcPort6"] = joNC["wssRpcPort6"].get< int >(); else joNode["wssRpcPort6"] = 0; - // + jarrNetwork.push_back( joNode ); } - // + jo["node"] = joThisNode; jo["network"] = jarrNetwork; jo["node"] = joThisNode; @@ -457,24 +394,24 @@ Json::Value SkaleStats::skale_imaInfo() { if ( joConfig.count( "skaleConfig" ) == 0 ) throw std::runtime_error( "error in config.json file, cannot find \"skaleConfig\"" ); const nlohmann::json& joSkaleConfig = joConfig["skaleConfig"]; - // + if ( joSkaleConfig.count( "nodeInfo" ) == 0 ) throw std::runtime_error( "error in config.json file, cannot find \"skaleConfig\"/\"nodeInfo\"" ); const nlohmann::json& joSkaleConfig_nodeInfo = joSkaleConfig["nodeInfo"]; - // + if ( joSkaleConfig_nodeInfo.count( "wallets" ) == 0 ) throw std::runtime_error( "error in config.json file, cannot find \"skaleConfig\"/\"nodeInfo\"/\"wallets\"" ); const nlohmann::json& joSkaleConfig_nodeInfo_wallets = joSkaleConfig_nodeInfo["wallets"]; - // + if ( joSkaleConfig_nodeInfo_wallets.count( "ima" ) == 0 ) throw std::runtime_error( "error in config.json file, cannot find " "\"skaleConfig\"/\"nodeInfo\"/\"wallets\"/\"ima\"" ); const nlohmann::json& joSkaleConfig_nodeInfo_wallets_ima = joSkaleConfig_nodeInfo_wallets["ima"]; - // + // validate wallet description static const char* g_arrMustHaveWalletFields[] = { // "url", "keyShareName", "t", "n", "BLSPublicKey0", "BLSPublicKey1", "BLSPublicKey2", @@ -505,14 +442,14 @@ Json::Value SkaleStats::skale_imaInfo() { "\"skaleConfig\"/\"nodeInfo\"/\"wallets\"/\"ima\"/" + strFieldName + " must be a string" ); } - // + nlohmann::json jo = nlohmann::json::object(); - // + jo["thisNodeIndex"] = nThisNodeIndex_; // 1-based "schainIndex" - // + jo["t"] = joSkaleConfig_nodeInfo_wallets_ima["t"]; jo["n"] = joSkaleConfig_nodeInfo_wallets_ima["n"]; - // + jo["BLSPublicKey0"] = joSkaleConfig_nodeInfo_wallets_ima["BLSPublicKey0"].get< std::string >(); jo["BLSPublicKey1"] = @@ -521,7 +458,7 @@ Json::Value SkaleStats::skale_imaInfo() { joSkaleConfig_nodeInfo_wallets_ima["BLSPublicKey2"].get< std::string >(); jo["BLSPublicKey3"] = joSkaleConfig_nodeInfo_wallets_ima["BLSPublicKey3"].get< std::string >(); - // + jo["commonBLSPublicKey0"] = joSkaleConfig_nodeInfo_wallets_ima["commonBLSPublicKey0"].get< std::string >(); jo["commonBLSPublicKey1"] = @@ -530,7 +467,7 @@ Json::Value SkaleStats::skale_imaInfo() { joSkaleConfig_nodeInfo_wallets_ima["commonBLSPublicKey2"].get< std::string >(); jo["commonBLSPublicKey3"] = joSkaleConfig_nodeInfo_wallets_ima["commonBLSPublicKey3"].get< std::string >(); - // + std::string s = jo.dump(); Json::Value ret; Json::Reader().parse( s, ret ); @@ -542,312 +479,44 @@ Json::Value SkaleStats::skale_imaInfo() { } } -static std::string stat_prefix_align( const std::string& strSrc, size_t n, char ch ) { - std::string strDst = strSrc; - while ( strDst.length() < n ) - strDst.insert( 0, 1, ch ); - return strDst; -} - -static std::string stat_encode_eth_call_data_chunck_address( - const std::string& strSrc, size_t alignWithZerosTo = 64 ) { - std::string strDst = strSrc; - strDst = skutils::tools::replace_all_copy( strDst, "0x", "" ); - strDst = skutils::tools::replace_all_copy( strDst, "0X", "" ); - strDst = stat_prefix_align( strDst, alignWithZerosTo, '0' ); - return strDst; -} - -static std::string stat_encode_eth_call_data_chunck_size_t( - const dev::u256& uSrc, size_t alignWithZerosTo = 64 ) { - std::string strDst = dev::toJS( uSrc ); - strDst = skutils::tools::replace_all_copy( strDst, "0x", "" ); - strDst = skutils::tools::replace_all_copy( strDst, "0X", "" ); - strDst = stat_prefix_align( strDst, alignWithZerosTo, '0' ); - return strDst; -} -static std::string stat_encode_eth_call_data_chunck_size_t( - const std::string& strSrc, size_t alignWithZerosTo = 64 ) { - dev::u256 uSrc( strSrc ); - return stat_encode_eth_call_data_chunck_size_t( uSrc, alignWithZerosTo ); -} - -static std::string stat_encode_eth_call_data_chunck_size_t( - const size_t nSrc, size_t alignWithZerosTo = 64 ) { - dev::u256 uSrc( nSrc ); - return stat_encode_eth_call_data_chunck_size_t( uSrc, alignWithZerosTo ); -} - -bool SkaleStats::isEnabledImaMessageSigning() const { - bool isEnabled = true; - try { - nlohmann::json joConfig = getConfigJSON(); - if ( joConfig.count( "skaleConfig" ) == 0 ) - throw std::runtime_error( "error in config.json file, cannot find \"skaleConfig\"" ); - const nlohmann::json& joSkaleConfig = joConfig["skaleConfig"]; - if ( joSkaleConfig.count( "nodeInfo" ) == 0 ) - throw std::runtime_error( - "error in config.json file, cannot find \"skaleConfig\"/\"nodeInfo\"" ); - const nlohmann::json& joSkaleConfig_nodeInfo = joSkaleConfig["nodeInfo"]; - if ( joSkaleConfig_nodeInfo.count( "no-ima-signing" ) == 0 ) - throw std::runtime_error( - "error in config.json file, cannot find " - "\"skaleConfig\"/\"nodeInfo\"/\"no-ima-signing\"" ); - const nlohmann::json& joSkaleConfig_nodeInfo_isEnabled = - joSkaleConfig_nodeInfo["no-ima-signing"]; - isEnabled = joSkaleConfig_nodeInfo_isEnabled.get< bool >() ? false : true; - } catch ( ... ) { +void SkaleStats::initStatsCounters() { + if ( !statsCounters.empty() > 0 ) { + return; } - return isEnabled; -} -static void stat_array_invert( uint8_t* arr, size_t cnt ) { - size_t n = cnt / 2; - for ( size_t i = 0; i < n; ++i ) { - uint8_t b1 = arr[i]; - uint8_t b2 = arr[cnt - i - 1]; - arr[i] = b2; - arr[cnt - i - 1] = b1; + std::vector< std::string > ethJsonRpcMethods = { // Web3 Namespace + "web3_clientVersion", "web3_sha3", + + // Net Namespace + "net_version", "net_peerCount", "net_listening", + + // Eth Namespace + "eth_protocolVersion", "eth_syncing", "eth_gasPrice", "eth_blockNumber", + "eth_getBlockByNumber", "eth_getBlockByHash", "eth_getBlockTransactionCountByHash", + "eth_getBlockTransactionCountByNumber", "eth_getUncleCountByBlockHash", + "eth_getUncleCountByBlockNumber", "eth_getTransactionByHash", + "eth_getTransactionByBlockHashAndIndex", "eth_getTransactionByBlockNumberAndIndex", + "eth_getTransactionReceipt", "eth_getTransactionCount", "eth_sendRawTransaction", + "eth_call", "eth_estimateGas", "eth_getCode", "eth_getBalance", "eth_getStorageAt", + "eth_newFilter", "eth_newBlockFilter", "eth_newPendingTransactionFilter", + "eth_uninstallFilter", "eth_getFilterChanges", "eth_getFilterLogs", "eth_getLogs", + "eth_accounts", "eth_sign", "eth_signTransaction", "eth_sendTransaction", "eth_coinbase", + "debug_traceTransaction", "debug_traceBlock", "debug_getRawTransaction" + }; + + for ( auto&& methodName : ethJsonRpcMethods ) { + // this will initiate counters with zeros + statsCounters["http:" + methodName]; + statsCounters["https:" + methodName]; + statsCounters["ws:" + methodName]; + statsCounters["wss:" + methodName]; } } -static dev::bytes& stat_bytes_align_left( dev::bytes& vec, size_t cnt ) { - while ( vec.size() < cnt ) - vec.insert( vec.begin(), 0 ); - return vec; -} - -static dev::bytes& stat_array_align_right( dev::bytes& vec, size_t cnt ) { - while ( vec.size() < cnt ) - vec.push_back( 0 ); - return vec; -} -static std::string stat_data_2_hex_string( const uint8_t* p, size_t cnt ) { - std::string s; - if ( p == nullptr || cnt == 0 ) - return s; - char hs[10]; - for ( size_t i = 0; i < cnt; ++i ) { - sprintf( hs, "%02x", p[i] ); - s += hs; - } - return s; // there is no "0x" prefix at start of return value -} +std::unordered_map< std::string, StatsCounter > SkaleStats::statsCounters; -static std::string stat_bytes_2_hex_string( const dev::bytes& vec ) { - return stat_data_2_hex_string( - ( uint8_t* ) vec.data(), vec.size() ); // there is no "0x" prefix at start of return value -} - -static dev::bytes stat_hex_string_2_bytes( const std::string& src ) { - std::string s = src; - if ( ( s.length() % 2 ) != 0 ) - s = "0" + s; - bytes vec = dev::fromHex( s ); - return vec; -} - -static std::string& stat_ensure_have_0x_at_start( std::string& s ) { - if ( s.length() < 2 || ( !( s[0] == '0' && ( s[1] == 'x' || s[1] == 'X' ) ) ) ) - s = "0x" + s; - return s; -} - -static std::string& stat_remove_0x_from_start( std::string& s ) { - if ( s.length() >= 2 && s[0] == '0' && ( s[1] == 'x' || s[1] == 'X' ) ) - s = s.substr( 2 ); - return s; -} - -static dev::bytes& stat_remove_leading_zeros( dev::bytes& vec ) { - while ( vec.size() > 0 ) { - if ( vec[0] != 0 ) - break; - vec.erase( vec.begin(), vec.begin() + 1 ); - } - return vec; -} - -// static dev::u256 stat_h256_2_u256( const dev::h256& h ) { -// std::string s = h.hex(); -// std::string sh = stat_ensure_have_0x_at_start( stat_ensure_have_0x_at_start( s ) ); -// const dev::u256 val( sh ); -// return val; -// } - -static dev::bytes& stat_append_hash_str_2_vec( dev::bytes& vec, const std::string& s ) { - dev::u256 val( s ); - bytes v = dev::BMPBN::encode2vec< dev::u256 >( val, true ); - stat_bytes_align_left( v, 32 ); - vec.insert( vec.end(), v.begin(), v.end() ); - return vec; -} - -static dev::bytes& stat_append_u256_2_vec( dev::bytes& vec, const dev::u256& val ) { - bytes v = dev::BMPBN::encode2vec< dev::u256 >( val, true ); - stat_bytes_align_left( v, 32 ); - vec.insert( vec.end(), v.begin(), v.end() ); - return vec; -} - -static dev::bytes& stat_append_address_2_vec( dev::bytes& vec, const dev::u256& val ) { - std::string s = dev::toJS( val ); - s = stat_remove_0x_from_start( s ); - dev::bytes v = stat_hex_string_2_bytes( s ); - stat_remove_leading_zeros( v ); - stat_bytes_align_left( v, 32 ); - vec.insert( vec.end(), v.begin(), v.end() ); - return vec; -} - -static dev::bytes stat_re_compute_vec_2_h256vec( dev::bytes& vec ) { - dev::h256 h = dev::sha3( vec ); - std::string s = h.hex(); - stat_remove_0x_from_start( s ); - vec.clear(); - vec = stat_hex_string_2_bytes( s ); - return vec; -} - -// static dev::bytes& stat_append_h256_2_vec( dev::bytes& vec, const dev::h256& val ) { -// return stat_append_u256_2_vec( vec, stat_h256_2_u256( val ) ); -// } - -std::string SkaleStats::pick_own_s_chain_url_s() { - std::string strURL; - try { - nlohmann::json joConfig = getConfigJSON(); - // - if ( joConfig.count( "skaleConfig" ) == 0 ) - throw std::runtime_error( "error in config.json file, cannot find \"skaleConfig\"" ); - const nlohmann::json& joSkaleConfig = joConfig["skaleConfig"]; - // - if ( joSkaleConfig.count( "nodeInfo" ) == 0 ) - throw std::runtime_error( - "error in config.json file, cannot find \"skaleConfig\"/\"nodeInfo\"" ); - const nlohmann::json& joSkaleConfig_nodeInfo = joSkaleConfig["nodeInfo"]; - // - if ( joSkaleConfig_nodeInfo.count( "bindIP" ) > 0 ) { - std::string strIpAddress = - skutils::tools::trim_copy( joSkaleConfig_nodeInfo["bindIP"].get< std::string >() ); - if ( !strIpAddress.empty() ) { - if ( joSkaleConfig_nodeInfo.count( "httpRpcPort" ) > 0 ) { - int nPort = joSkaleConfig_nodeInfo["httpRpcPort"].get< int >(); - if ( 0 < nPort && nPort <= 65535 ) - return std::string( "http://" ) + strIpAddress + ":" + - skutils::tools::format( "%d", nPort ); - } - if ( joSkaleConfig_nodeInfo.count( "wsRpcPort" ) > 0 ) { - int nPort = joSkaleConfig_nodeInfo["wsRpcPort"].get< int >(); - if ( 0 < nPort && nPort <= 65535 ) - return std::string( "ws://" ) + strIpAddress + ":" + - skutils::tools::format( "%d", nPort ); - } - if ( joSkaleConfig_nodeInfo.count( "httpsRpcPort" ) > 0 ) { - int nPort = joSkaleConfig_nodeInfo["httpsRpcPort"].get< int >(); - if ( 0 < nPort && nPort <= 65535 ) - return std::string( "https://" ) + strIpAddress + ":" + - skutils::tools::format( "%d", nPort ); - } - if ( joSkaleConfig_nodeInfo.count( "wssRpcPort" ) > 0 ) { - int nPort = joSkaleConfig_nodeInfo["wssRpcPort"].get< int >(); - if ( 0 < nPort && nPort <= 65535 ) - return std::string( "wss://" ) + strIpAddress + ":" + - skutils::tools::format( "%d", nPort ); - } - } // if ( !strIpAddress.empty() ) - } else if ( joSkaleConfig_nodeInfo.count( "bindIP6" ) > 0 ) { - std::string strIpAddress = - skutils::tools::trim_copy( joSkaleConfig_nodeInfo["bindIP"].get< std::string >() ); - if ( !strIpAddress.empty() ) { - if ( joSkaleConfig_nodeInfo.count( "httpRpcPort6" ) > 0 ) { - int nPort = joSkaleConfig_nodeInfo["httpRpcPort6"].get< int >(); - if ( 0 < nPort && nPort <= 65535 ) - return std::string( "http://[" ) + strIpAddress + - "]:" + skutils::tools::format( "%d", nPort ); - } - if ( joSkaleConfig_nodeInfo.count( "wsRpcPort6" ) > 0 ) { - int nPort = joSkaleConfig_nodeInfo["wsRpcPort6"].get< int >(); - if ( 0 < nPort && nPort <= 65535 ) - return std::string( "ws://[" ) + strIpAddress + - "]:" + skutils::tools::format( "%d", nPort ); - } - if ( joSkaleConfig_nodeInfo.count( "httpsRpcPort6" ) > 0 ) { - int nPort = joSkaleConfig_nodeInfo["httpsRpcPort6"].get< int >(); - if ( 0 < nPort && nPort <= 65535 ) - return std::string( "https://[" ) + strIpAddress + - "]:" + skutils::tools::format( "%d", nPort ); - } - if ( joSkaleConfig_nodeInfo.count( "wssRpcPort6" ) > 0 ) { - int nPort = joSkaleConfig_nodeInfo["wssRpcPort6"].get< int >(); - if ( 0 < nPort && nPort <= 65535 ) - return std::string( "wss://[" ) + strIpAddress + - "]:" + skutils::tools::format( "%d", nPort ); - } - } // if ( !strIpAddress.empty() ) - } - } catch ( ... ) { - } - strURL.clear(); - return strURL; -} - -skutils::url SkaleStats::pick_own_s_chain_url() { - std::string strURL = pick_own_s_chain_url_s(); - skutils::url u( strURL ); - return u; -} }; // namespace rpc }; // namespace dev - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -// void ttt123() { -// const char strLogPrefix[] = "----------- "; -// dev::bytes vecComputeMessagesHash; -// vecComputeMessagesHash.push_back( 'M' ); -// vecComputeMessagesHash.push_back( 'a' ); -// vecComputeMessagesHash.push_back( 'i' ); -// vecComputeMessagesHash.push_back( 'n' ); -// vecComputeMessagesHash.push_back( 'n' ); -// vecComputeMessagesHash.push_back( 'e' ); -// vecComputeMessagesHash.push_back( 't' ); -// std::cout << ( strLogPrefix + cc::debug( " Accumulated vector " ) + -// cc::binary_singleline( ( void* ) vecComputeMessagesHash.data(), -// vecComputeMessagesHash.size(), "" ) ) -// << "\n"; -// dev::rpc::stat_re_compute_vec_2_h256vec( vecComputeMessagesHash ); -// std::cout << ( strLogPrefix + cc::debug( " Computed hash from vector " ) + -// cc::binary_singleline( ( void* ) vecComputeMessagesHash.data(), -// vecComputeMessagesHash.size(), "" ) ) -// << "\n"; -// // we should get 8d646f556e5d9d6f1edcf7a39b77f5ac253776eb34efcfd688aacbee518efc26 -//} - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -// void ttt123() { -// const char strLogPrefix[] = "----------- "; -// dev::bytes vecComputeMessagesHash; -// dev::u256 uAddr( "0xd2aaa00300000000000000000000000000000000" ); -// std::cout << ( strLogPrefix + cc::debug( " Test address " ) + cc::notice( dev::toJS( uAddr ) ) -// ) -// << "\n"; -// std::cout << ( strLogPrefix + cc::debug( " Initial vector " ) + -// cc::binary_singleline( ( void* ) vecComputeMessagesHash.data(), -// vecComputeMessagesHash.size(), "" ) ) -// << "\n"; -// dev::rpc::stat_append_address_2_vec( vecComputeMessagesHash, uAddr ); -// std::cout << ( strLogPrefix + cc::debug( " Vector with appended address " ) + -// cc::binary_singleline( ( void* ) vecComputeMessagesHash.data(), -// vecComputeMessagesHash.size(), "" ) ) -// << "\n"; -//} - -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/libweb3jsonrpc/SkaleStats.h b/libweb3jsonrpc/SkaleStats.h index 2d2e1e497..3c6eed439 100644 --- a/libweb3jsonrpc/SkaleStats.h +++ b/libweb3jsonrpc/SkaleStats.h @@ -44,6 +44,7 @@ #include #include #include +#include ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -73,6 +74,25 @@ class Interface; namespace rpc { +constexpr uint64_t ANSWER_TIME_HISTORY_SIZE = 128; + +class StatsCounter { +public: + StatsCounter() = default; + + void reset() { + calls = 0; + answers = 0; + errors = 0; + } + + std::atomic< uint64_t > calls; + std::atomic< uint64_t > answers; + std::atomic< uint64_t > errors; + std::array< std::atomic< uint64_t >, ANSWER_TIME_HISTORY_SIZE > answerTimeHistory; +}; + + /** * @brief JSON-RPC api implementation */ @@ -94,18 +114,62 @@ class SkaleStats : public dev::rpc::SkaleStatsFace, return RPCModules{ RPCModule{ "skaleStats", "1.0" } }; } - bool isEnabledImaMessageSigning() const; - virtual Json::Value skale_stats() override; - virtual Json::Value skale_nodesRpcInfo() override; - virtual Json::Value skale_imaInfo() override; + Json::Value skale_stats() override; + Json::Value skale_nodesRpcInfo() override; + Json::Value skale_imaInfo() override; + + static void countCall( const std::string& _origin, const std::string& _method ) { + auto iterator = statsCounters.find( getProtocol( _origin ) + _method ); + + if ( iterator != statsCounters.end() ) { + ++iterator->second.calls; + } + } + + static void countAnswer( const std::string& _origin, const std::string& _method, + std::chrono::microseconds _beginTime ) { + auto iterator = statsCounters.find( getProtocol( _origin ) + _method ); + + if ( iterator != statsCounters.end() ) { + StatsCounter& statsCounter = iterator->second; + int64_t answerTime = ( std::chrono::duration_cast< std::chrono::microseconds >( + std::chrono::system_clock::now().time_since_epoch() ) - + _beginTime ) + .count(); + statsCounter.answerTimeHistory.at( statsCounter.answers % ANSWER_TIME_HISTORY_SIZE ) + .store( answerTime ); + ++statsCounter.answers; + } + } + + static void countError( const std::string& _origin, const std::string& _method ) { + auto iterator = statsCounters.find( getProtocol( _origin ) + _method ); + + if ( iterator != statsCounters.end() ) { + ++iterator->second.errors; + } + } + + // return http: https: ws: or wss: + static std::string getProtocol( const std::string& _origin ) { + auto pos = _origin.find( ':' ); + + if ( pos == std::string::npos ) { + return ""; + } + return _origin.substr( 0, pos + 1 ); + } + protected: eth::Interface* client() const { return &m_eth; } eth::Interface& m_eth; - std::string pick_own_s_chain_url_s(); - skutils::url pick_own_s_chain_url(); + +public: + static std::unordered_map< std::string, StatsCounter > statsCounters; + static void initStatsCounters(); }; ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/libweb3jsonrpc/SkaleStatsSite.h b/libweb3jsonrpc/SkaleStatsSite.h index 91d688496..188eb59c5 100644 --- a/libweb3jsonrpc/SkaleStatsSite.h +++ b/libweb3jsonrpc/SkaleStatsSite.h @@ -33,8 +33,6 @@ namespace rpc { struct ISkaleStatsProvider; struct ISkaleStatsConsumer; -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// struct ISkaleStatsProvider { ISkaleStatsProvider() {} @@ -42,22 +40,16 @@ struct ISkaleStatsProvider { virtual ISkaleStatsConsumer* getConsumer() = 0; virtual void setConsumer( ISkaleStatsConsumer* pConsumer ) = 0; virtual nlohmann::json provideSkaleStats() = 0; -}; /// struct ISkaleStatsProvider +}; -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - struct ISkaleStatsConsumer { ISkaleStatsConsumer() {} virtual ~ISkaleStatsConsumer() {} virtual ISkaleStatsProvider* getProvider() = 0; virtual void setProvider( ISkaleStatsProvider* pProvider ) = 0; virtual nlohmann::json consumeSkaleStats() = 0; -}; /// struct ISkaleStatsConsumer - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +}; class SkaleStatsProviderImpl : public ISkaleStatsProvider { ISkaleStatsConsumer* m_pConsumer; @@ -74,10 +66,8 @@ class SkaleStatsProviderImpl : public ISkaleStatsProvider { if ( pPrev && pPrev->getProvider() == this ) pPrev->setProvider( nullptr ); } -}; /// class SkaleStatsProviderImpl +}; -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// class SkaleStatsConsumerImpl : public ISkaleStatsConsumer { ISkaleStatsProvider* m_pProvider; @@ -100,10 +90,7 @@ class SkaleStatsConsumerImpl : public ISkaleStatsConsumer { return nlohmann::json::object(); return pProvider->provideSkaleStats(); } -}; /// class SkaleStatsConsumerImpl - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +}; }; // namespace rpc }; // namespace dev diff --git a/skale-vm/main.cpp b/skale-vm/main.cpp index 117da3cfe..091338133 100644 --- a/skale-vm/main.cpp +++ b/skale-vm/main.cpp @@ -288,11 +288,11 @@ int main( int argc, char** argv ) { ChainParams chainParams( genesisInfo( networkName ) ); LastBlockHashes lastBlockHashes; + EnvInfo const envInfo( blockHeader, lastBlockHashes, 0 /*_committedBlockTimestamp*/, 0 /* gasUsed */, chainParams.chainID ); EVMSchedule evmSchedule = chainParams.makeEvmSchedule( 0, envInfo.number() ); - state = state.createStateModifyCopy(); Transaction t; Address contractDestination( "1122334455667788991011121314151617181920" ); @@ -314,8 +314,9 @@ int main( int argc, char** argv ) { state.addBalance( sender, value ); - // HACK 1st 0 here is for gasPrice + // H1st 0 here is for gasPrice Executive executive( state, envInfo, chainParams, 0, 0 ); + ExecutionResult res; executive.setResultRecipient( res ); t.forceSender( sender ); @@ -353,6 +354,7 @@ int main( int argc, char** argv ) { if ( mode == Mode::Statistics ) { cout << "Gas used: " << res.gasUsed << " (+" << t.baseGasRequired( evmSchedule ) << " for transaction, -" << res.gasRefunded << " refunded)\n"; + cout << "Output: " << toHex( output ) << "\n"; LogEntries logs = executive.logs(); cout << logs.size() << " logs" << ( logs.empty() ? "." : ":" ) << "\n"; @@ -390,7 +392,6 @@ int main( int argc, char** argv ) { cout << "exec time: " << fixed << setprecision( 6 ) << execTime << '\n'; } - state.releaseWriteLock(); return 0; } diff --git a/skaled/main.cpp b/skaled/main.cpp index 015f81eac..69bd171b3 100644 --- a/skaled/main.cpp +++ b/skaled/main.cpp @@ -35,6 +35,7 @@ #include #include #include +#include #include #include @@ -148,6 +149,9 @@ static void version() { std::cout << cc::info( "Build" ) << cc::debug( "............................." ) << cc::attention( buildinfo->system_name ) << cc::debug( "/" ) << cc::attention( buildinfo->build_type ) << "\n"; + std::cout << "Working dir" + << "......................" << std::filesystem::current_path().string() << endl; + std::cout.flush(); } @@ -1037,8 +1041,9 @@ int main( int argc, char** argv ) try { setupLogging( loggingOptions ); - const size_t nCpuCount = skutils::tools::cpu_count(); - size_t nDispatchThreads = nCpuCount * 2; + // we do not really use these threads anymore + // so setting default value to 1 + size_t nDispatchThreads = 1; if ( vm.count( "dispatch-threads" ) ) { size_t n = vm["dispatch-threads"].as< size_t >(); const size_t nMin = 4; @@ -1067,6 +1072,7 @@ int main( int argc, char** argv ) try { if ( vm.count( "config" ) ) { try { configPath = vm["config"].as< string >(); + std::cout << "Using config file:" << configPath << endl; if ( !fs::is_regular_file( configPath.string() ) ) throw std::runtime_error( "Bad config file path" ); configJSON = contentsString( configPath.string() ); diff --git a/skaled_ssl_test/main.h b/skaled_ssl_test/main.h index 209eb6671..c25d40877 100644 --- a/skaled_ssl_test/main.h +++ b/skaled_ssl_test/main.h @@ -22,7 +22,6 @@ #include #include #include -#include #include #include #include diff --git a/storage_benchmark/main.cpp b/storage_benchmark/main.cpp index 9cfb61af9..4d18780be 100644 --- a/storage_benchmark/main.cpp +++ b/storage_benchmark/main.cpp @@ -118,7 +118,7 @@ void testState() { cout << "Balances writes:" << endl; cout << measure_performance( [&state, &address]() { - State writeState = state.createStateModifyCopy(); + State writeState = state.createStateCopyAndClearCaches(); writeState.addBalance( address, 1 ); writeState.commit( dev::eth::CommitBehaviour::KeepEmptyAccounts ); }, @@ -128,7 +128,7 @@ void testState() { cout << "Balances reads:" << endl; cout << measure_performance( - [&state, &address]() { state.createStateModifyCopy().balance( address ); }, + [&state, &address]() { state.createStateCopyAndClearCaches().balance( address ); }, 100000 ) / 1e6 << " Mreads per second" << endl; @@ -138,7 +138,7 @@ void testState() { size_t memory_address = 0; cout << measure_performance( [&state, &address, &memory_address]() { - State writeState = state.createStateModifyCopy(); + State writeState = state.createStateCopyAndClearCaches(); writeState.setStorage( address, memory_address, memory_address ); memory_address = ( memory_address + 1 ) % 1024; writeState.commit( dev::eth::CommitBehaviour::KeepEmptyAccounts ); @@ -150,7 +150,7 @@ void testState() { cout << "EVM storate reads:" << endl; cout << measure_performance( [&state, &address, &memory_address]() { - state.createStateReadOnlyCopy().storage( address, memory_address ); + state.createReadOnlySnapBasedCopy().storage( address, memory_address ); memory_address = ( memory_address + 1 ) % 1024; }, 1000 ) / @@ -166,7 +166,7 @@ void testState() { } cout << measure_performance( [&state, &address, &code]() { - State writeState = state.createStateModifyCopy(); + State writeState = state.createStateCopyAndClearCaches(); writeState.setCode( address, code, 0 ); writeState.commit( dev::eth::CommitBehaviour::KeepEmptyAccounts ); }, @@ -176,7 +176,8 @@ void testState() { cout << "EVM code reads:" << endl; cout << measure_performance( - [&state, &address]() { state.createStateReadOnlyCopy().code( address ); }, 1000 ) / + [&state, &address]() { state.createReadOnlySnapBasedCopy().code( address ); }, + 1000 ) / 1e6 << " Mreads per second" << endl; } diff --git a/test/.clang-format b/test/.clang-format deleted file mode 100644 index 9d159247d..000000000 --- a/test/.clang-format +++ /dev/null @@ -1,2 +0,0 @@ -DisableFormat: true -SortIncludes: false diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index a0a15a45e..bae4a33c0 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -1,3 +1,15 @@ +# do not use new CMP0110 feature of cmake +if(POLICY CMP0110) + cmake_policy(SET CMP0110 OLD) +endif() + + +macro(assert condition) + if (NOT ${condition}) + message(FATAL_ERROR "Assertion failed: ${condition}") + endif() +endmacro() + file(GLOB_RECURSE sources "*.cpp" "*.h" "*.sol") if( NOT CONSENSUS ) @@ -14,24 +26,31 @@ foreach(file ${sources}) file(STRINGS ${file} test_list_raw REGEX "BOOST_.*TEST_(SUITE|CASE|SUITE_END)") set(TestSuite "DEFAULT") set(TestSuitePath "") + # read source of each test file into a list of string foreach(test_raw ${test_list_raw}) + # we match strings like BOOST_AUTO_TEST_SUITE(JsonRpcSuite) and strip beginning turning them into + # string "SUITE JsonRpcSuite" string(REGEX REPLACE ".*TEST_(SUITE|CASE)\\(( [^ ,\\)]*).*" "\\1 \\2" test ${test_raw}) + assert(test) #skip disabled if (";${excludeSuites};" MATCHES ";${TestSuite};") continue() endif() + # we match string like SUITE JsonRpcSuite These are suite names if(test MATCHES "^SUITE .*") - + # now we cut the beginning to get just JsonRpcSuite string(SUBSTRING ${test} 6 -1 TestSuite) + assert(TestSuite) set(TestSuitePath "${TestSuitePath}/${TestSuite}") - + assert(TestSuitePath) if(FASTCTEST) if (";${excludeSuites};" MATCHES ";${TestSuite};") continue() endif() if (NOT ";${allSuites};" MATCHES ";${TestSuite};") + message(STATUS "TestSuite value: ${TestSuite}") string(SUBSTRING ${TestSuitePath} 1 -1 TestSuitePathFixed) list(APPEND allSuites ${TestSuite}) separate_arguments(TESTETH_ARGS) diff --git a/test/historicstate/configs/generate_testeth_configs.py b/test/historicstate/configs/generate_testeth_configs.py new file mode 100644 index 000000000..ade985dfa --- /dev/null +++ b/test/historicstate/configs/generate_testeth_configs.py @@ -0,0 +1,55 @@ +import json + +from deps.boost_1_68_0.libs.mpl.preprocessed.pp import pretty + + +def calculate_base_port_from_index(_index): + return 1231 + (_index - 1) * 100 + + +def calculate_node_id(_chain_size, _index): + node_id_start = _chain_size * 100 + return node_id_start + _index + + +def generate_config_file(_chain_size, _schain_index): + node_id = calculate_node_id(_chain_size, _schain_index) + try: + with open('testeth_config.json', 'r') as file: + data = json.load(file) + except FileNotFoundError: + print("File not found. Please check the file path.") + except json.JSONDecodeError: + print("Error parsing JSON. Please check the JSON structure.") + + data["skaleConfig"]["nodeInfo"]["nodeID"] = node_id + base_port = calculate_base_port_from_index(_schain_index) + data["skaleConfig"]["nodeInfo"]["basePort"] = base_port + data["skaleConfig"]["nodeInfo"]["httpRpcPort"] = base_port + 3 + data["skaleConfig"]["nodeInfo"]["wsRpcPort"] = base_port + 2 + data["skaleConfig"]["nodeInfo"]["wssRpcPort"] = base_port + 7 + nodes_array = [] + for index in range(1, _chain_size + 1): + nodes_array.append( + {"basePort": calculate_base_port_from_index(index), "ip": "127.0.0.1", + "nodeID": calculate_node_id(_chain_size, index), "publicKey": "", + "schainIndex": index}) + data["skaleConfig"]["sChain"]["nodes"] = nodes_array + data["skaleConfig"]["nodeInfo"]["db-path"] = f'/tmp/test_eth_{_schain_index}_of_{_chain_size}' + + # Convert Python dictionary to a pretty-printed JSON string + pretty_json = json.dumps(data, indent=4, sort_keys=True, ensure_ascii=False) + # Print the nicely formatted JSON + # Write the JSON string to the file + with open(f'test_{_schain_index}_of_{_chain_size}.json', 'w') as file: + file.write(pretty_json) + + +def generate_test_configs_set(_chain_size): + node_id_start = _chain_size * 100 + for schain_index in range(1, _chain_size + 1): + generate_config_file(_chain_size, schain_index) + + +generate_test_configs_set(4) +generate_test_configs_set(16) diff --git a/test/historicstate/configs/test_10_of_16.json b/test/historicstate/configs/test_10_of_16.json new file mode 100644 index 000000000..8cb721d9b --- /dev/null +++ b/test/historicstate/configs/test_10_of_16.json @@ -0,0 +1,910 @@ +{ + "accounts": { + "0000000000000000000000000000000000000001": { + "precompiled": { + "linear": { + "base": 3000, + "word": 0 + }, + "name": "ecrecover" + } + }, + "0000000000000000000000000000000000000002": { + "precompiled": { + "linear": { + "base": 60, + "word": 12 + }, + "name": "sha256" + } + }, + "0000000000000000000000000000000000000003": { + "precompiled": { + "linear": { + "base": 600, + "word": 120 + }, + "name": "ripemd160" + } + }, + "0000000000000000000000000000000000000004": { + "precompiled": { + "linear": { + "base": 15, + "word": 3 + }, + "name": "identity" + } + }, + "0000000000000000000000000000000000000005": { + "precompiled": { + "name": "modexp", + "startingBlock": "0x2dc6c0" + } + }, + "0000000000000000000000000000000000000006": { + "precompiled": { + "linear": { + "base": 500, + "word": 0 + }, + "name": "alt_bn128_G1_add", + "startingBlock": "0x2dc6c0" + } + }, + "0000000000000000000000000000000000000007": { + "precompiled": { + "linear": { + "base": 40000, + "word": 0 + }, + "name": "alt_bn128_G1_mul", + "startingBlock": "0x2dc6c0" + } + }, + "0000000000000000000000000000000000000008": { + "precompiled": { + "name": "alt_bn128_pairing_product", + "startingBlock": "0x2dc6c0" + } + }, + "000000000000000000000000000000000000000A": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "readChunk", + "startingBlock": "0x0" + } + }, + "000000000000000000000000000000000000000B": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "createFile", + "restrictAccess": [ + "69362535ec535F0643cBf62D16aDeDCAf32Ee6F7" + ], + "startingBlock": "0x0" + } + }, + "000000000000000000000000000000000000000C": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "uploadChunk", + "startingBlock": "0x0" + } + }, + "000000000000000000000000000000000000000D": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "getFileSize", + "startingBlock": "0x0" + } + }, + "000000000000000000000000000000000000000E": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "deleteFile", + "startingBlock": "0x0" + } + }, + "000000000000000000000000000000000000000F": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "createDirectory", + "startingBlock": "0x0" + } + }, + "0000000000000000000000000000000000000010": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "deleteDirectory", + "startingBlock": "0x0" + } + }, + "0x006d8e49ce0b9eb5646e34a4d91934801b9044fd": { + "balance": "1000000000000000000000000000000" + }, + "0x0150b461b06922a5030784ba888962c28bb1f188": { + "balance": "1000000000000000000000000000000" + }, + "0x03309956988ae70152ae4469daf99b0cac2306c5": { + "balance": "1000000000000000000000000000000" + }, + "0x06104a85a380895b6dd4030113806df2b044905e": { + "balance": "1000000000000000000000000000000" + }, + "0x079cf317ef40b16141784b6fabff812d64f7c0fd": { + "balance": "1000000000000000000000000000000" + }, + "0x0966454f51166c68b73b2865473c8fb2fcdefdd5": { + "balance": "1000000000000000000000000000000" + }, + "0x099452fedc71897880f584b1bc1706efc4e76e36": { + "balance": "1000000000000000000000000000000" + }, + "0x0aa6a44690ef52354e976990292cf9c5cd36ad59": { + "balance": "1000000000000000000000000000000" + }, + "0x0fbbe17a0e5a61ee3e8661f442d7f6b177c49820": { + "balance": "1000000000000000000000000000000" + }, + "0x1239fe658b410dbbac5bbd572035f5041542f9e5": { + "balance": "1000000000000000000000000000000" + }, + "0x12d5d7340a93be7be28ea7a3ae198242f8e1282c": { + "balance": "1000000000000000000000000000000" + }, + "0x137048b9fa4f1234d6519271b2c5ec64f480db0f": { + "balance": "1000000000000000000000000000000" + }, + "0x13867af77a63048e17380e39248ada90521e97e4": { + "balance": "1000000000000000000000000000000" + }, + "0x138ea4bdf0382c2deffd5b0bff0afe59f471467f": { + "balance": "1000000000000000000000000000000" + }, + "0x13d19c55ee0a212249d26b9d741ff6d7f416db01": { + "balance": "1000000000000000000000000000000" + }, + "0x157d38b52196b248e9fe6a2172e32ce2b8c078e6": { + "balance": "1000000000000000000000000000000" + }, + "0x16e8c390f8e576161cfe966f2c3e5dd303eb9039": { + "balance": "1000000000000000000000000000000" + }, + "0x194cb9991d3d94c43e400becf21dfea45e7b3b4c": { + "balance": "1000000000000000000000000000000" + }, + "0x1C9abe4ff0CcECa40fc404c74AB7d4923fEF8901": { + "balance": "100000000000000000000000" + }, + "0x1a66fc89809112c20aa76a993db712fa9e003e4e": { + "balance": "1000000000000000000000000000000" + }, + "0x1f1d6041e12a18cf1202019f146f2fc150915e8d": { + "balance": "1000000000000000000000000000000" + }, + "0x1feaf1671c1f0faf0d44c152f72dc755db932569": { + "balance": "1000000000000000000000000000000" + }, + "0x236bf02dfafaf03851a4e6f5d69052f4884cec32": { + "balance": "1000000000000000000000000000000" + }, + "0x26d88f6a8b659be4165ee53774a057e41b5201c9": { + "balance": "1000000000000000000000000000000" + }, + "0x28353685b0b986a724b92113debb3d8cd9a6b263": { + "balance": "1000000000000000000000000000000" + }, + "0x29d83322219fdfb821459d5fdf796360faf3166a": { + "balance": "1000000000000000000000000000000" + }, + "0x2bee474be207bdbeac83d6672da5ed2fd417eac9": { + "balance": "1000000000000000000000000000000" + }, + "0x2d93455b07bccf38e8d019f7f43a2c2d70b46b4e": { + "balance": "1000000000000000000000000000000" + }, + "0x2f971bd38806c3ca45ae0a125d1267118bf5619c": { + "balance": "1000000000000000000000000000000" + }, + "0x30aaab366dfac8331f3e827495c789cde9b437c0": { + "balance": "1000000000000000000000000000000" + }, + "0x32ea0400dc2d20664cc4744b2fab04ecb709445c": { + "balance": "1000000000000000000000000000000" + }, + "0x3760dc9594ccac0f33ade5cc5371402131696341": { + "balance": "1000000000000000000000000000000" + }, + "0x38855e430611bc179cd777a8704679ffc43921de": { + "balance": "1000000000000000000000000000000" + }, + "0x3a921471a2397644c37c88ef9572c421ab37145d": { + "balance": "1000000000000000000000000000000" + }, + "0x3bcca8a8471d55a1a668bc163c0336e4a57e5c99": { + "balance": "1000000000000000000000000000000" + }, + "0x3d46ee560227c1d73cd6042b47fc8fddd8a06ecb": { + "balance": "1000000000000000000000000000000" + }, + "0x3f5bdf5d4c274c82b8d17aa2810b00d2cf050f24": { + "balance": "1000000000000000000000000000000" + }, + "0x3ffe1c9183e0f97f52a816405a7d2350624ec88b": { + "balance": "1000000000000000000000000000000" + }, + "0x426ec5f07847674aada3856609d8baaa16805d88": { + "balance": "1000000000000000000000000000000" + }, + "0x482d7f53cba6ae73a354533673c48e2dfd560949": { + "balance": "1000000000000000000000000000000" + }, + "0x48acbd6a2724eadcc2a11144ab84b6a617d1a241": { + "balance": "1000000000000000000000000000000" + }, + "0x49ef89840e400026eb5c8d79bd1b0adc152fe86d": { + "balance": "1000000000000000000000000000000" + }, + "0x4bf989fa6572af36b190032505506f1db888357f": { + "balance": "1000000000000000000000000000000" + }, + "0x4cf9b195f7cb5f86694d9b399fe21a5f34616fd3": { + "balance": "1000000000000000000000000000000" + }, + "0x4e9b85904bca60aeb5b916ca86ac622096908427": { + "balance": "1000000000000000000000000000000" + }, + "0x50120c17d7b59200e9b76e89e4e3de2f0cd00090": { + "balance": "1000000000000000000000000000000" + }, + "0x54db355342c35085a1a53184162b2fddd0a43b0f": { + "balance": "1000000000000000000000000000000" + }, + "0x54e228d8fea148cfe2b109b3b152ff21321d09a2": { + "balance": "1000000000000000000000000000000" + }, + "0x5667601b7dcde6f24d06bccc4f291cb06976f4ee": { + "balance": "1000000000000000000000000000000" + }, + "0x57829f2ecca390cd9d1c41f92328bad4d1073bbb": { + "balance": "1000000000000000000000000000000" + }, + "0x5EF25557E2ed6AFfF321B266C93e95A0B4B05AbC": { + "balance": "1000000000000000000000000" + }, + "0x5a3adad4382b3eb1e0c65f2de2845901081039b5": { + "balance": "1000000000000000000000000000000" + }, + "0x5cdb7392efdce502ccc6fba5c3c1dd1653967b4d": { + "balance": "1000000000000000000000000000000" + }, + "0x5d012c13b2854bda8b7b6580e97e52751884f827": { + "balance": "1000000000000000000000000000000" + }, + "0x5d9326c6504833d84f8a0d65ded59b1a6e768ca2": { + "balance": "1000000000000000000000000000000" + }, + "0x60268f799d8f1808e4a32c2eb898e73a8881f6f0": { + "balance": "1000000000000000000000000000000" + }, + "0x605ba4a05d779f9869bd9a10234c22f516766cfe": { + "balance": "1000000000000000000000000000000" + }, + "0x6093f0f2a7b5148b71603ac439adbc4c0e5aa5da": { + "balance": "1000000000000000000000000000000" + }, + "0x6196d135CdDb9d73A0756C1E44b5b02B11acf594": { + "balance": "2000000000000000000000", + "code": "", + "nonce": "5076", + "storage": {} + }, + "0x62712ceccb50f62ca4c5402fff6da9c819c866cf": { + "balance": "1000000000000000000000000000000" + }, + "0x62971de462ea1ec0d3b43a6a85b6fb975e6c6f64": { + "balance": "1000000000000000000000000000000" + }, + "0x62cf32dfb9eb6358dc5deb006aef1d75fb153e5f": { + "balance": "1000000000000000000000000000000" + }, + "0x62d8b22c1d71577829b2fee20a5c3fff43aed0ec": { + "balance": "100000000000000000000000" + }, + "0x6314956b78bb2eaed1c49b3ae71d4d0ec501cfab": { + "balance": "1000000000000000000000000000000" + }, + "0x661bda4daeba3ce9ac2aa30b80d463580f90d31a": { + "balance": "1000000000000000000000000000000" + }, + "0x66c5a87f4a49DD75e970055A265E8dd5C3F8f852": { + "balance": "1000000000000000000000" + }, + "0x66cd465ddcd85504c0d2cfb1728acee994d55a3f": { + "balance": "1000000000000000000000000000000" + }, + "0x68bca79ae7aae796027ff843d2303444da5cf5d8": { + "balance": "1000000000000000000000000000000" + }, + "0x6923877b65e24966efa9efd1207822fa2eaf601a": { + "balance": "1000000000000000000000000000000" + }, + "0x69362535ec535F0643cBf62D16aDeDCAf32Ee6F7": { + "balance": "0", + "code": "0x608060405234801561001057600080fd5b50600436106100b45760003560e01c806379210e8e1161007157806379210e8e1461017757806381a8235a146101a757806385aeeb17146101c35780639a9a5593146101f3578063a99100541461020f578063b57321221461022b576100b4565b806307c6e7d3146100b9578063122f4fba146100d55780631c6ec7a9146101055780631cfe4e3b14610121578063373dedb41461013d57806361e46db51461015b575b600080fd5b6100d360048036036100ce9190810190613cff565b61025b565b005b6100ef60048036036100ea9190810190613cff565b610804565b6040516100fc9190614963565b60405180910390f35b61011f600480360361011a9190810190613cff565b610b43565b005b61013b60048036036101369190810190613cc3565b610f72565b005b610145611190565b6040516101529190614cbe565b60405180910390f35b61017560048036036101709190810190613d94565b611199565b005b610191600480360361018c9190810190613e13565b6113f9565b60405161019e9190614924565b60405180910390f35b6101c160048036036101bc9190810190613cff565b6116f9565b005b6101dd60048036036101d89190810190613cff565b61189e565b6040516101ea9190614941565b60405180910390f35b61020d60048036036102089190810190613d40565b611b9d565b005b61022960048036036102249190810190613cff565b61202c565b005b61024560048036036102409190810190613cff565b612682565b6040516102529190614cbe565b60405180910390f35b6000339050606061026b83612902565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b825181101561037c576000826001018460018403815181106102d557fe5b60200260200101516040516102ea91906148cc565b90815260200160405180910390205411610339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161033090614ade565b60405180910390fd5b8160020183600183038151811061034c57fe5b602002602001015160405161036191906148cc565b908152602001604051809103902091508060010190506102b7565b506060600183511161038e57846103a7565b8260018451038151811061039e57fe5b60200260200101515b9050600082600101826040516103bd91906148e3565b9081526020016040518091039020541161040c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161040390614ade565b60405180910390fd5b6000826002018260405161042091906148e3565b90815260200160405180910390206000018054905014610475576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161046c90614b5e565b60405180910390fd5b60006104818587612b02565b9050806104c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ba90614a7e565b60405180910390fd5b6104cb613888565b836000016001856000018054905003815481106104e457fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156105965780601f1061056b57610100808354040283529160200191610596565b820191906000526020600020905b81548152906001019060200180831161057957829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff1660028111156105e257fe5b60028111156105ed57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561066557602002820191906000526020600020906000905b82829054906101000a900460ff1615158152602001906001019060208260000104928301926001038202915080841161062f5790505b505050505081525050905080846000016001866001018660405161068991906148e3565b90815260200160405180910390205403815481106106a357fe5b906000526020600020906005020160008201518160000190805190602001906106cd9291906138c4565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561071c57fe5b0217905550608082015181600401908051906020019061073d929190613944565b50905050836001018360405161075391906148e3565b90815260200160405180910390205484600101826000015160405161077891906148cc565b9081526020016040518091039020819055506000846001018460405161079e91906148e3565b908152602001604051809103902081905550836000018054809190600190036107c791906139ea565b5083600201836040516107da91906148e3565b9081526020016040518091039020600080820160006107f99190613a1c565b505050505050505050565b600080606061081284612b66565b91509150606061082182612902565b90506000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b82518110156109065760008260010184600184038151811061088b57fe5b60200260200101516040516108a091906148cc565b90815260200160405180910390205414156108c357600095505050505050610b3e565b816002018360018303815181106108d657fe5b60200260200101516040516108eb91906148cc565b9081526020016040518091039020915080600101905061086d565b50606060018351116109185783610931565b8260018451038151811061092857fe5b60200260200101515b90506000826001018260405161094791906148e3565b908152602001604051809103902054141561096a57600095505050505050610b3e565b610972613888565b826000016001846001018460405161098a91906148e3565b90815260200160405180910390205403815481106109a457fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610a565780601f10610a2b57610100808354040283529160200191610a56565b820191906000526020600020905b815481529060010190602001808311610a3957829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115610aa257fe5b6002811115610aad57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015610b2557602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411610aef5790505b5050505050815250509050806060015196505050505050505b919050565b600160009054906101000a900460ff16610b85576120006002819055506210000060038190555060018060006101000a81548160ff0219169083151502179055505b6000815111610bc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc090614ade565b60405180910390fd5b60003390506060610bd983612902565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015610cea57600082600101846001840381518110610c4357fe5b6020026020010151604051610c5891906148cc565b90815260200160405180910390205411610ca7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9e90614ade565b60405180910390fd5b81600201836001830381518110610cba57fe5b6020026020010151604051610ccf91906148cc565b90815260200160405180910390209150806001019050610c25565b50600254816000018054905010610d36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2d90614bfe565b60405180910390fd5b60606001835111610d475784610d60565b82600184510381518110610d5757fe5b60200260200101515b905060008260010182604051610d7691906148e3565b90815260200160405180910390205414610dc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbc90614c3e565b60405180910390fd5b610dce81612ee8565b610e0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0490614afe565b60405180910390fd5b6000610e198587612fc9565b905080610e5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e529061499e565b60405180910390fd5b610e63613888565b82816000018190525060008160200190151590811515815250508360000181908060018154018082558091505090600182039060005260206000209060050201600090919290919091506000820151816000019080519060200190610ec99291906138c4565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff02191690836002811115610f1857fe5b02179055506080820151816004019080519060200190610f39929190613944565b5050505083600001805490508460010184604051610f5791906148e3565b90815260200160405180910390208190555050505050505050565b610f7a61302d565b73ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161480610fdf57503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614155b61101e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101590614a5e565b60405180910390fd5b80600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411156110a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109790614b3e565b60405180910390fd5b600054600754820111156110e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e0906149be565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460076000828254039250508190555080600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550806007600082825401925050819055505050565b60008054905090565b600033905060006111aa82866130c6565b9050600160028111156111b957fe5b8160030160009054906101000a900460ff1660028111156111d657fe5b14611216576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120d90614c1e565b60405180910390fd5b6000600354858161122357fe5b061480156112345750806002015484105b611273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126a9061497e565b60405180910390fd5b600354848260020154031080156112905750838160020154038351145b8061129d57506003548351145b6112dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d390614a1e565b60405180910390fd5b600015158160040160035486816112ef57fe5b04815481106112fa57fe5b90600052602060002090602091828204019190069054906101000a900460ff1615151461135c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611353906149fe565b60405180910390fd5b600061136a838787876132c5565b9050806113ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a390614b1e565b60405180910390fd5b60018260040160035487816113bd57fe5b04815481106113c857fe5b90600052602060002090602091828204019190066101000a81548160ff021916908315150217905550505050505050565b611401613a40565b6000606061140e86612b66565b9150915061141a613888565b61142483836130c6565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156114c85780601f1061149d576101008083540402835291602001916114c8565b820191906000526020600020905b8154815290600101906020018083116114ab57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561151457fe5b600281111561151f57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561159757602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116115615790505b50505050508152505090506002808111156115ae57fe5b816060015160028111156115be57fe5b146115fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f590614c9e565b60405180910390fd5b60035485111580156116105750600085115b61164f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164690614a1e565b60405180910390fd5b80604001518587011115611698576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168f9061497e565b60405180910390fd5b60006116a684848989613376565b8096508192505050806116ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e590614b9e565b60405180910390fd5b505050509392505050565b6000339050600061170a82846130c6565b90506001600281111561171957fe5b8160030160009054906101000a900460ff16600281111561173657fe5b14611776576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176d90614c1e565b60405180910390fd5b60006001905060008260040180549050905060008090505b818110156117e157600015158460040182815481106117a957fe5b90600052602060002090602091828204019190069054906101000a900460ff16151514156117d657600092505b80600101905061178e565b5081611822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181990614b7e565b60405180910390fd5b60028360030160006101000a81548160ff0219169083600281111561184357fe5b021790555060006118548587613409565b905080611896576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188d906149de565b60405180910390fd5b505050505050565b6060600060606118ad84612b66565b9150915060606118bc82612902565b90506000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008090505b82518110156119c65760008260010184838151811061192257fe5b602002602001015160405161193791906148cc565b90815260200160405180910390205411611986576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197d90614ade565b60405180910390fd5b8160020183828151811061199657fe5b60200260200101516040516119ab91906148cc565b90815260200160405180910390209150806001019050611907565b5080600001805480602002602001604051908101604052809291908181526020016000905b82821015611b8e57838290600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611aa75780601f10611a7c57610100808354040283529160200191611aa7565b820191906000526020600020905b815481529060010190602001808311611a8a57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115611af357fe5b6002811115611afe57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015611b7657602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411611b405790505b505050505081525050815260200190600101906119eb565b50505050945050505050919050565b600160009054906101000a900460ff16611bdf576120006002819055506210000060038190555060018060006101000a81548160ff0219169083151502179055505b60003390506305f5e100821115611c2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2290614bde565b60405180910390fd5b6060611c3684612902565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015611d4757600082600101846001840381518110611ca057fe5b6020026020010151604051611cb591906148cc565b90815260200160405180910390205411611d04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cfb90614ade565b60405180910390fd5b81600201836001830381518110611d1757fe5b6020026020010151604051611d2c91906148cc565b90815260200160405180910390209150806001019050611c82565b5060606001835111611d595785611d72565b82600184510381518110611d6957fe5b60200260200101515b905060008260010182604051611d8891906148e3565b90815260200160405180910390205414611dd7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dce90614c3e565b60405180910390fd5b611de081612ee8565b611e1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1690614bbe565b60405180910390fd5b6000611e2c85888861346d565b905080611e6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6590614c7e565b60405180910390fd5b6060600354600160035489010381611e8257fe5b04604051908082528060200260200182016040528015611eb15781602001602082028038833980820191505090505b509050836000016040518060a0016040528085815260200160011515815260200189815260200160016002811115611ee557fe5b815260200183815250908060018154018082558091505090600182039060005260206000209060050201600090919290919091506000820151816000019080519060200190611f359291906138c4565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff02191690836002811115611f8457fe5b02179055506080820151816004019080519060200190611fa5929190613944565b5050505083600001805490508460010184604051611fc391906148e3565b90815260200160405180910390208190555086600560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505050505050505050565b6000339050612039613888565b61204382846130c6565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156120e75780601f106120bc576101008083540402835291602001916120e7565b820191906000526020600020905b8154815290600101906020018083116120ca57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561213357fe5b600281111561213e57fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156121b657602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116121805790505b5050505050815250509050600060028111156121ce57fe5b816060015160028111156121de57fe5b141561221f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221690614a3e565b60405180910390fd5b600061222b83856134da565b90508061226d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226490614a9e565b60405180910390fd5b606061227885612902565b90506000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b825181101561231057816002018360018303815181106122e057fe5b60200260200101516040516122f591906148cc565b908152602001604051809103902091508060010190506122c4565b506000600182600101866000015160405161232b91906148cc565b908152602001604051809103902054039050612345613888565b8260000160018460000180549050038154811061235e57fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156124105780601f106123e557610100808354040283529160200191612410565b820191906000526020600020905b8154815290600101906020018083116123f357829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561245c57fe5b600281111561246757fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156124df57602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116124a95790505b5050505050815250509050808360000183815481106124fa57fe5b906000526020600020906005020160008201518160000190805190602001906125249291906138c4565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561257357fe5b02179055506080820151816004019080519060200190612594929190613944565b50905050826000018054809190600190036125af91906139ea565b508260010186600001516040516125c691906148cc565b9081526020016040518091039020548360010182600001516040516125eb91906148cc565b908152602001604051809103902081905550600083600101876000015160405161261591906148cc565b9081526020016040518091039020819055508560400151600560008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505050505050505050565b600080606061269084612b66565b9150915061269c613888565b6126a683836130c6565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561274a5780601f1061271f5761010080835404028352916020019161274a565b820191906000526020600020905b81548152906001019060200180831161272d57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561279657fe5b60028111156127a157fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561281957602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116127e35790505b50505050508152505090506001600281111561283157fe5b8160600151600281111561284157fe5b1480612866575060028081111561285457fe5b8160600151600281111561286457fe5b145b6128a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161289c90614c1e565b60405180910390fd5b60006128b1848461353e565b8096508192505050806128f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128f090614c5e565b60405180910390fd5b50505050919050565b606061290c613a65565b612915836135a7565b905061291f613a65565b61295d6040518060400160405280600181526020017f2f000000000000000000000000000000000000000000000000000000000000008152506135a7565b90506060600161297683856135d590919063ffffffff16565b016040519080825280602002602001820160405280156129aa57816020015b60608152602001906001900390816129955790505b50905060008090505b81518110156129fb576129d76129d2848661364a90919063ffffffff16565b613664565b8282815181106129e357fe5b602002602001018190525080806001019150506129b3565b50600081600183510381518110612a0e57fe5b6020026020010151511415612a795780600182510381518110612a2d57fe5b6020026020010160608152506001815103604051908082528060200260200182016040528015612a7157816020015b6060815260200190600190039081612a5c5790505b509350612ab2565b8051604051908082528060200260200182016040528015612aae57816020015b6060815260200190600190039081612a995790505b5093505b60008090505b8451811015612af957818181518110612acd57fe5b6020026020010151858281518110612ae157fe5b60200260200101819052508080600101915050612ab8565b50505050919050565b60008060016020601f85510181612b1557fe5b040190506040518481526020810160005b83811015612b47578060200286015181602002830152806001019050612b26565b50602082602085026040018460006010600019f1935050505092915050565b6000606060006028905080845111612bb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612baa90614abe565b60405180910390fd5b6060816040519080825280601f01601f191660200182016040528015612be85781602001600182028038833980820191505090505b50905060008090505b82811015612c5857858181518110612c0557fe5b602001015160f81c60f81b828281518110612c1c57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050612bf1565b50600080905060008090505b83811015612d87576000838281518110612c7a57fe5b602001015160f81c60f81b60f81c60ff16905060308110158015612c9f575060398111155b80612cb8575060418110158015612cb75750605a8111155b5b80612cd1575060618110158015612cd0575060668111155b5b612d10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d0790614abe565b60405180910390fd5b60308110158015612d22575060398111155b15612d335760308103601084020192505b60418110158015612d455750605a8111155b15612d565760378103601084020192505b60618110158015612d68575060668111155b15612d795760578103601084020192505b508080600101915050612c64565b508094507f2f00000000000000000000000000000000000000000000000000000000000000868481518110612db857fe5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612e25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e1c90614abe565b60405180910390fd5b6000600184885103039050806040519080825280601f01601f191660200182016040528015612e635781602001600182028038833980820191505090505b50945060008090505b81811015612ede5760008860018784010181518110612e8757fe5b602001015160f81c60f81b905080878381518110612ea157fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350508080600101915050612e6c565b5050505050915091565b6000604051602001612ef99061490f565b6040516020818303038152906040528051906020012082604051602001612f2091906148e3565b604051602081830303815290604052805190602001201480612f8b5750604051602001612f4c906148fa565b6040516020818303038152906040528051906020012082604051602001612f7391906148e3565b60405160208183030381529060405280519060200120145b80612f97575060008251145b15612fa55760009050612fc4565b60008251905060ff811115612fbe576000915050612fc4565b60019150505b919050565b60008060016020601f85510181612fdc57fe5b040190506040518481526020810160005b8381101561300e578060200286015181602002830152806001019050612fed565b5060208260208502604001846000600f600019f1935050505092915050565b600073d2001000000000000000000000000000000000d273ffffffffffffffffffffffffffffffffffffffff166383e781fe6040518163ffffffff1660e01b815260040160206040518083038186803b15801561308957600080fd5b505afa15801561309d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506130c19190810190613c9a565b905090565b600060606130d383612902565b90506000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b82518110156131e45760008260010184600184038151811061313d57fe5b602002602001015160405161315291906148cc565b908152602001604051809103902054116131a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161319890614ade565b60405180910390fd5b816002018360018303815181106131b457fe5b60200260200101516040516131c991906148cc565b9081526020016040518091039020915080600101905061311f565b50606060018351116131f6578461320f565b8260018451038151811061320657fe5b60200260200101515b90506000826001018260405161322591906148e3565b90815260200160405180910390205411613274576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161326b90614ade565b60405180910390fd5b6000826000016001846001018460405161328e91906148e3565b90815260200160405180910390205403815481106132a857fe5b906000526020600020906005020190508094505050505092915050565b60008060016020601f855101816132d857fe5b04019050600060016020601f885101816132ee57fe5b040190506040518781526020810160005b838110156133205780602002890151816020028301528060010190506132ff565b50868360200282015260005b84811015613352578060200287015181856001010160200283015280600101905061332c565b50602082848601602002606001846000600c600019f1945050505050949350505050565b6000613380613a40565b600060016020601f8851018161339257fe5b0401905060006020601f8601816133a557fe5b0490506040518881526020810160005b848110156133d657806020028a0151816020028301528060010190506133b5565b5083602002810188815287816020015283602002868660030160200285600a600019fa9650505050505094509492505050565b60008060016020601f8551018161341c57fe5b040190506040518481526020810160005b8381101561344e57806020028601518160200283015280600101905061342d565b50602082602085026040018460006011600019f1935050505092915050565b60008060016020601f8651018161348057fe5b040190506040518581526020810160005b838110156134b2578060200287015181602002830152806001019050613491565b50846020840282015260208260208502604001846000600b600019f193505050509392505050565b60008060016020601f855101816134ed57fe5b040190506040518481526020810160005b8381101561351f5780602002860151816020028301528060010190506134fe565b5060208260208502604001846000600e600019f1935050505092915050565b600080600060016020601f8651018161355357fe5b040190506040518581526020810160005b83811015613585578060200287015181602002830152806001019050613564565b506020826020850260200184600d600019fa9450815193505050509250929050565b6135af613a65565b600060208301905060405180604001604052808451815260200182815250915050919050565b60008082600001516135f985600001518660200151866000015187602001516136c6565b0190505b83600001518460200151018111613643578180600101925050826000015161363b8560200151830386600001510383866000015187602001516136c6565b0190506135fd565b5092915050565b613652613a65565b61365d8383836137a1565b5092915050565b60608082600001516040519080825280601f01601f19166020018201604052801561369e5781602001600182028038833980820191505090505b50905060006020820190506136bc818560200151866000015161383f565b8192505050919050565b6000808490506000868511613791576020851161374b57600060018660200360080260020a031960001b905060008186511690506000878a8a0103905060008386511690505b82811461373d5781861061372a578a8a019650505050505050613799565b858060010196505083865116905061370c565b859650505050505050613799565b60008585209050600091505b858803821161378f57600086842090508082141561377b5783945050505050613799565b600184019350508180600101925050613757565b505b868601925050505b949350505050565b6137a9613a65565b60006137c785600001518660200151866000015187602001516136c6565b90508460200151836020018181525050846020015181038360000181815250508460000151856020015101811415613809576000856000018181525050613834565b8360000151836000015101856000018181510391508181525050836000015181018560200181815250505b829150509392505050565b5b602081106138635781518352602083019250602082019150602081039050613840565b60006001826020036101000a0390508019835116818551168181178652505050505050565b6040518060a001604052806060815260200160001515815260200160008152602001600060028111156138b757fe5b8152602001606081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061390557805160ff1916838001178555613933565b82800160010185558215613933579182015b82811115613932578251825591602001919060010190613917565b5b5090506139409190613a7f565b5090565b82805482825590600052602060002090601f016020900481019282156139d95791602002820160005b838211156139aa57835183826101000a81548160ff021916908315150217905550926020019260010160208160000104928301926001030261396d565b80156139d75782816101000a81549060ff02191690556001016020816000010492830192600103026139aa565b505b5090506139e69190613aa4565b5090565b815481835581811115613a1757600502816005028360005260206000209182019101613a169190613ad4565b5b505050565b5080546000825560050290600052602060002090810190613a3d9190613ad4565b50565b6040518062100000016040528061800090602082028038833980820191505090505090565b604051806040016040528060008152602001600081525090565b613aa191905b80821115613a9d576000816000905550600101613a85565b5090565b90565b613ad191905b80821115613acd57600081816101000a81549060ff021916905550600101613aaa565b5090565b90565b613b4091905b80821115613b3c5760008082016000613af39190613b43565b6001820160006101000a81549060ff021916905560028201600090556003820160006101000a81549060ff0219169055600482016000613b339190613b8b565b50600501613ada565b5090565b90565b50805460018160011615610100020316600290046000825580601f10613b695750613b88565b601f016020900490600052602060002090810190613b879190613a7f565b5b50565b50805460008255601f016020900490600052602060002090810190613bb09190613a7f565b50565b600081359050613bc281614f18565b92915050565b600081519050613bd781614f18565b92915050565b600082601f830112613bee57600080fd5b8135613c01613bfc82614d06565b614cd9565b91508082526020830160208301858383011115613c1d57600080fd5b613c28838284614eb8565b50505092915050565b600082601f830112613c4257600080fd5b8135613c55613c5082614d32565b614cd9565b91508082526020830160208301858383011115613c7157600080fd5b613c7c838284614eb8565b50505092915050565b600081359050613c9481614f2f565b92915050565b600060208284031215613cac57600080fd5b6000613cba84828501613bc8565b91505092915050565b60008060408385031215613cd657600080fd5b6000613ce485828601613bb3565b9250506020613cf585828601613c85565b9150509250929050565b600060208284031215613d1157600080fd5b600082013567ffffffffffffffff811115613d2b57600080fd5b613d3784828501613c31565b91505092915050565b60008060408385031215613d5357600080fd5b600083013567ffffffffffffffff811115613d6d57600080fd5b613d7985828601613c31565b9250506020613d8a85828601613c85565b9150509250929050565b600080600060608486031215613da957600080fd5b600084013567ffffffffffffffff811115613dc357600080fd5b613dcf86828701613c31565b9350506020613de086828701613c85565b925050604084013567ffffffffffffffff811115613dfd57600080fd5b613e0986828701613bdd565b9150509250925092565b600080600060608486031215613e2857600080fd5b600084013567ffffffffffffffff811115613e4257600080fd5b613e4e86828701613c31565b9350506020613e5f86828701613c85565b9250506040613e7086828701613c85565b9150509250925092565b6000613e868383613fe8565b60208301905092915050565b6000613e9e8383613ff7565b60208301905092915050565b6000613eb68383614831565b905092915050565b6000613ec982614d88565b613ed38185614de7565b9350613ede83614d5e565b8060005b83811015613f0f578151613ef68882613e7a565b9750613f0183614dc0565b925050600181019050613ee2565b5085935050505092915050565b613f2581614d93565b613f2f8184614df8565b9250613f3a82614d6e565b8060005b83811015613f6b578151613f528782613e92565b9650613f5d83614dcd565b925050600181019050613f3e565b505050505050565b6000613f7e82614d9f565b613f888185614e03565b935083602082028501613f9a85614d78565b8060005b85811015613fd65784840389528151613fb78582613eaa565b9450613fc283614dda565b925060208a01995050600181019050613f9e565b50829750879550505050505092915050565b613ff181614e53565b82525050565b61400081614e5f565b82525050565b61400f81614ea6565b82525050565b61401e81614ea6565b82525050565b600061402f82614db5565b6140398185614e36565b9350614049818560208601614ec7565b80840191505092915050565b600061406082614daa565b61406a8185614e14565b935061407a818560208601614ec7565b61408381614efa565b840191505092915050565b600061409982614daa565b6140a38185614e36565b93506140b3818560208601614ec7565b80840191505092915050565b60006140cc601883614e25565b91507f496e636f7272656374206368756e6b20706f736974696f6e00000000000000006000830152602082019050919050565b600061410c601583614e25565b91507f4469726563746f7279206e6f74206372656174656400000000000000000000006000830152602082019050919050565b600061414c602483614e25565b91507f4e6f7420656e6f756768206d656d6f727920696e207468652046696c6573746f60008301527f72616765000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006141b2601b83614e25565b91507f48617368206861736e2774206265656e2063616c63756c6174656400000000006000830152602082019050919050565b60006141f2601983614e25565b91507f4368756e6b20697320616c72656164792075706c6f61646564000000000000006000830152602082019050919050565b6000614232601683614e25565b91507f496e636f7272656374206368756e6b206c656e677468000000000000000000006000830152602082019050919050565b6000614272600f83614e25565b91507f46696c65206e6f742065786973747300000000000000000000000000000000006000830152602082019050919050565b60006142b2600e83614e25565b91507f496e76616c69642073656e6465720000000000000000000000000000000000006000830152602082019050919050565b60006142f2601883614e25565b91507f4469726563746f7279206973206e6f742064656c6574656400000000000000006000830152602082019050919050565b6000614332601083614e25565b91507f46696c65206e6f742064656c65746564000000000000000000000000000000006000830152602082019050919050565b6000614372601383614e25565b91507f496e76616c69642073746f7261676550617468000000000000000000000000006000830152602082019050919050565b60006143b2600c83614e25565b91507f496e76616c6964207061746800000000000000000000000000000000000000006000830152602082019050919050565b60006143f2600183614e36565b91507f2e000000000000000000000000000000000000000000000000000000000000006000830152600182019050919050565b6000614432601683614e25565b91507f496e76616c6964206469726563746f7279206e616d65000000000000000000006000830152602082019050919050565b6000614472601583614e25565b91507f4368756e6b207761736e27742075706c6f6164656400000000000000000000006000830152602082019050919050565b60006144b2602683614e25565b91507f436f756c64206e6f742072657365727665206c657373207468616e207573656460008301527f20737061636500000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614518601683614e25565b91507f4469726563746f7279206973206e6f7420656d707479000000000000000000006000830152602082019050919050565b6000614558602383614e25565b91507f46696c65206861736e2774206265656e2075706c6f6164656420636f7272656360008301527f746c7900000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006145be601183614e25565b91507f4368756e6b207761736e277420726561640000000000000000000000000000006000830152602082019050919050565b60006145fe601883614e25565b91507f46696c656e616d652073686f756c64206265203c2032353600000000000000006000830152602082019050919050565b600061463e601f83614e25565b91507f46696c652073686f756c64206265206c657373207468616e20313030204d42006000830152602082019050919050565b600061467e600283614e36565b91507f2e2e0000000000000000000000000000000000000000000000000000000000006000830152600282019050919050565b60006146be601183614e25565b91507f4469726563746f72792069732066756c6c0000000000000000000000000000006000830152602082019050919050565b60006146fe600e83614e25565b91507f46696c65206e6f7420666f756e640000000000000000000000000000000000006000830152602082019050919050565b600061473e601883614e25565b91507f46696c65206f72206469726563746f72792065786973747300000000000000006000830152602082019050919050565b600061477e601883614e25565b91507f45564d206572726f7220696e2067657446696c6553697a6500000000000000006000830152602082019050919050565b60006147be601083614e25565b91507f46696c65206e6f742063726561746564000000000000000000000000000000006000830152602082019050919050565b60006147fe601983614e25565b91507f46696c65206861736e2774206265656e2075706c6f61646564000000000000006000830152602082019050919050565b600060a083016000830151848203600086015261484e8282614055565b91505060208301516148636020860182613fe8565b50604083015161487660408601826148ae565b5060608301516148896060860182614006565b50608083015184820360808601526148a18282613ebe565b9150508091505092915050565b6148b781614e9c565b82525050565b6148c681614e9c565b82525050565b60006148d8828461408e565b915081905092915050565b60006148ef8284614024565b915081905092915050565b6000614905826143e5565b9150819050919050565b600061491a82614671565b9150819050919050565b6000621000008201905061493b6000830184613f1c565b92915050565b6000602082019050818103600083015261495b8184613f73565b905092915050565b60006020820190506149786000830184614015565b92915050565b60006020820190508181036000830152614997816140bf565b9050919050565b600060208201905081810360008301526149b7816140ff565b9050919050565b600060208201905081810360008301526149d78161413f565b9050919050565b600060208201905081810360008301526149f7816141a5565b9050919050565b60006020820190508181036000830152614a17816141e5565b9050919050565b60006020820190508181036000830152614a3781614225565b9050919050565b60006020820190508181036000830152614a5781614265565b9050919050565b60006020820190508181036000830152614a77816142a5565b9050919050565b60006020820190508181036000830152614a97816142e5565b9050919050565b60006020820190508181036000830152614ab781614325565b9050919050565b60006020820190508181036000830152614ad781614365565b9050919050565b60006020820190508181036000830152614af7816143a5565b9050919050565b60006020820190508181036000830152614b1781614425565b9050919050565b60006020820190508181036000830152614b3781614465565b9050919050565b60006020820190508181036000830152614b57816144a5565b9050919050565b60006020820190508181036000830152614b778161450b565b9050919050565b60006020820190508181036000830152614b978161454b565b9050919050565b60006020820190508181036000830152614bb7816145b1565b9050919050565b60006020820190508181036000830152614bd7816145f1565b9050919050565b60006020820190508181036000830152614bf781614631565b9050919050565b60006020820190508181036000830152614c17816146b1565b9050919050565b60006020820190508181036000830152614c37816146f1565b9050919050565b60006020820190508181036000830152614c5781614731565b9050919050565b60006020820190508181036000830152614c7781614771565b9050919050565b60006020820190508181036000830152614c97816147b1565b9050919050565b60006020820190508181036000830152614cb7816147f1565b9050919050565b6000602082019050614cd360008301846148bd565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614cfc57600080fd5b8060405250919050565b600067ffffffffffffffff821115614d1d57600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614d4957600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050919050565b6000819050602082019050919050565b600081519050919050565b60006180009050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614e4c82614e7c565b9050919050565b60008115159050919050565b6000819050919050565b6000819050614e7782614f0b565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000614eb182614e69565b9050919050565b82818337600083830152505050565b60005b83811015614ee5578082015181840152602081019050614eca565b83811115614ef4576000848401525b50505050565b6000601f19601f8301169050919050565b60038110614f1557fe5b50565b614f2181614e41565b8114614f2c57600080fd5b50565b614f3881614e9c565b8114614f4357600080fd5b5056fea365627a7a723158202ae226b25ad72f9cff2d74c6dc7bcfb78530ab1d2438f48a8dab67499b37a8e56c6578706572696d656e74616cf564736f6c634300050d0040", + "nonce": "0", + "storage": { + "0x0": "2868903936" + } + }, + "0x69362535ec535F0643cBf62D16aDeDCAf32Ee6F8": { + "balance": "0", + "code": "0x608060405234801561001057600080fd5b50600436106100b45760003560e01c806379210e8e1161007157806379210e8e1461017757806381a8235a146101a757806385aeeb17146101c35780639a9a5593146101f3578063a99100541461020f578063b57321221461022b576100b4565b806307c6e7d3146100b9578063122f4fba146100d55780631c6ec7a9146101055780631cfe4e3b14610121578063373dedb41461013d57806361e46db51461015b575b600080fd5b6100d360048036036100ce9190810190613e0d565b61025b565b005b6100ef60048036036100ea9190810190613e0d565b610804565b6040516100fc9190614ab1565b60405180910390f35b61011f600480360361011a9190810190613e0d565b610b43565b005b61013b60048036036101369190810190613dd1565b610f72565b005b610145611190565b6040516101529190614e2c565b60405180910390f35b61017560048036036101709190810190613ea2565b611199565b005b610191600480360361018c9190810190613f21565b6113f9565b60405161019e9190614a72565b60405180910390f35b6101c160048036036101bc9190810190613e0d565b6116f9565b005b6101dd60048036036101d89190810190613e0d565b61189e565b6040516101ea9190614a8f565b60405180910390f35b61020d60048036036102089190810190613e4e565b611b9d565b005b61022960048036036102249190810190613e0d565b61213a565b005b61024560048036036102409190810190613e0d565b612790565b6040516102529190614e2c565b60405180910390f35b6000339050606061026b83612a10565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b825181101561037c576000826001018460018403815181106102d557fe5b60200260200101516040516102ea9190614a1a565b90815260200160405180910390205411610339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161033090614c2c565b60405180910390fd5b8160020183600183038151811061034c57fe5b60200260200101516040516103619190614a1a565b908152602001604051809103902091508060010190506102b7565b506060600183511161038e57846103a7565b8260018451038151811061039e57fe5b60200260200101515b9050600082600101826040516103bd9190614a31565b9081526020016040518091039020541161040c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161040390614c2c565b60405180910390fd5b600082600201826040516104209190614a31565b90815260200160405180910390206000018054905014610475576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161046c90614cac565b60405180910390fd5b60006104818587612c10565b9050806104c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ba90614bcc565b60405180910390fd5b6104cb613996565b836000016001856000018054905003815481106104e457fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156105965780601f1061056b57610100808354040283529160200191610596565b820191906000526020600020905b81548152906001019060200180831161057957829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff1660028111156105e257fe5b60028111156105ed57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561066557602002820191906000526020600020906000905b82829054906101000a900460ff1615158152602001906001019060208260000104928301926001038202915080841161062f5790505b50505050508152505090508084600001600186600101866040516106899190614a31565b90815260200160405180910390205403815481106106a357fe5b906000526020600020906005020160008201518160000190805190602001906106cd9291906139d2565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561071c57fe5b0217905550608082015181600401908051906020019061073d929190613a52565b5090505083600101836040516107539190614a31565b9081526020016040518091039020548460010182600001516040516107789190614a1a565b9081526020016040518091039020819055506000846001018460405161079e9190614a31565b908152602001604051809103902081905550836000018054809190600190036107c79190613af8565b5083600201836040516107da9190614a31565b9081526020016040518091039020600080820160006107f99190613b2a565b505050505050505050565b600080606061081284612c74565b91509150606061082182612a10565b90506000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b82518110156109065760008260010184600184038151811061088b57fe5b60200260200101516040516108a09190614a1a565b90815260200160405180910390205414156108c357600095505050505050610b3e565b816002018360018303815181106108d657fe5b60200260200101516040516108eb9190614a1a565b9081526020016040518091039020915080600101905061086d565b50606060018351116109185783610931565b8260018451038151811061092857fe5b60200260200101515b9050600082600101826040516109479190614a31565b908152602001604051809103902054141561096a57600095505050505050610b3e565b610972613996565b826000016001846001018460405161098a9190614a31565b90815260200160405180910390205403815481106109a457fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610a565780601f10610a2b57610100808354040283529160200191610a56565b820191906000526020600020905b815481529060010190602001808311610a3957829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115610aa257fe5b6002811115610aad57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015610b2557602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411610aef5790505b5050505050815250509050806060015196505050505050505b919050565b600160009054906101000a900460ff16610b85576120006002819055506210000060038190555060018060006101000a81548160ff0219169083151502179055505b6000815111610bc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc090614c2c565b60405180910390fd5b60003390506060610bd983612a10565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015610cea57600082600101846001840381518110610c4357fe5b6020026020010151604051610c589190614a1a565b90815260200160405180910390205411610ca7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9e90614c2c565b60405180910390fd5b81600201836001830381518110610cba57fe5b6020026020010151604051610ccf9190614a1a565b90815260200160405180910390209150806001019050610c25565b50600254816000018054905010610d36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2d90614d4c565b60405180910390fd5b60606001835111610d475784610d60565b82600184510381518110610d5757fe5b60200260200101515b905060008260010182604051610d769190614a31565b90815260200160405180910390205414610dc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbc90614d8c565b60405180910390fd5b610dce81612ff6565b610e0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0490614c4c565b60405180910390fd5b6000610e1985876130d7565b905080610e5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5290614aec565b60405180910390fd5b610e63613996565b82816000018190525060008160200190151590811515815250508360000181908060018154018082558091505090600182039060005260206000209060050201600090919290919091506000820151816000019080519060200190610ec99291906139d2565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff02191690836002811115610f1857fe5b02179055506080820151816004019080519060200190610f39929190613a52565b5050505083600001805490508460010184604051610f579190614a31565b90815260200160405180910390208190555050505050505050565b610f7a61313b565b73ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161480610fdf57503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614155b61101e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101590614bac565b60405180910390fd5b80600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411156110a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109790614c8c565b60405180910390fd5b600054600754820111156110e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e090614b0c565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460076000828254039250508190555080600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550806007600082825401925050819055505050565b60008054905090565b600033905060006111aa82866131d4565b9050600160028111156111b957fe5b8160030160009054906101000a900460ff1660028111156111d657fe5b14611216576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120d90614d6c565b60405180910390fd5b6000600354858161122357fe5b061480156112345750806002015484105b611273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126a90614acc565b60405180910390fd5b600354848260020154031080156112905750838160020154038351145b8061129d57506003548351145b6112dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d390614b6c565b60405180910390fd5b600015158160040160035486816112ef57fe5b04815481106112fa57fe5b90600052602060002090602091828204019190069054906101000a900460ff1615151461135c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135390614b4c565b60405180910390fd5b600061136a838787876133d3565b9050806113ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a390614c6c565b60405180910390fd5b60018260040160035487816113bd57fe5b04815481106113c857fe5b90600052602060002090602091828204019190066101000a81548160ff021916908315150217905550505050505050565b611401613b4e565b6000606061140e86612c74565b9150915061141a613996565b61142483836131d4565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156114c85780601f1061149d576101008083540402835291602001916114c8565b820191906000526020600020905b8154815290600101906020018083116114ab57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561151457fe5b600281111561151f57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561159757602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116115615790505b50505050508152505090506002808111156115ae57fe5b816060015160028111156115be57fe5b146115fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f590614e0c565b60405180910390fd5b60035485111580156116105750600085115b61164f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164690614b6c565b60405180910390fd5b80604001518587011115611698576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168f90614acc565b60405180910390fd5b60006116a684848989613484565b8096508192505050806116ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e590614cec565b60405180910390fd5b505050509392505050565b6000339050600061170a82846131d4565b90506001600281111561171957fe5b8160030160009054906101000a900460ff16600281111561173657fe5b14611776576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176d90614d6c565b60405180910390fd5b60006001905060008260040180549050905060008090505b818110156117e157600015158460040182815481106117a957fe5b90600052602060002090602091828204019190069054906101000a900460ff16151514156117d657600092505b80600101905061178e565b5081611822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181990614ccc565b60405180910390fd5b60028360030160006101000a81548160ff0219169083600281111561184357fe5b021790555060006118548587613517565b905080611896576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188d90614b2c565b60405180910390fd5b505050505050565b6060600060606118ad84612c74565b9150915060606118bc82612a10565b90506000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008090505b82518110156119c65760008260010184838151811061192257fe5b60200260200101516040516119379190614a1a565b90815260200160405180910390205411611986576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197d90614c2c565b60405180910390fd5b8160020183828151811061199657fe5b60200260200101516040516119ab9190614a1a565b90815260200160405180910390209150806001019050611907565b5080600001805480602002602001604051908101604052809291908181526020016000905b82821015611b8e57838290600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611aa75780601f10611a7c57610100808354040283529160200191611aa7565b820191906000526020600020905b815481529060010190602001808311611a8a57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115611af357fe5b6002811115611afe57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015611b7657602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411611b405790505b505050505081525050815260200190600101906119eb565b50505050945050505050919050565b600160009054906101000a900460ff16611bdf576120006002819055506210000060038190555060018060006101000a81548160ff0219169083151502179055505b60003390506305f5e100821115611c2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2290614d2c565b60405180910390fd5b600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205483011115611cee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce590614dac565b60405180910390fd5b6060611cf984612a10565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015611e0a57600082600101846001840381518110611d6357fe5b6020026020010151604051611d789190614a1a565b90815260200160405180910390205411611dc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dbe90614c2c565b60405180910390fd5b81600201836001830381518110611dda57fe5b6020026020010151604051611def9190614a1a565b90815260200160405180910390209150806001019050611d45565b50600254816000018054905010611e56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4d90614d4c565b60405180910390fd5b60606001835111611e675785611e80565b82600184510381518110611e7757fe5b60200260200101515b905060008260010182604051611e969190614a31565b90815260200160405180910390205414611ee5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611edc90614d8c565b60405180910390fd5b611eee81612ff6565b611f2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2490614d0c565b60405180910390fd5b6000611f3a85888861357b565b905080611f7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7390614dec565b60405180910390fd5b6060600354600160035489010381611f9057fe5b04604051908082528060200260200182016040528015611fbf5781602001602082028038833980820191505090505b509050836000016040518060a0016040528085815260200160011515815260200189815260200160016002811115611ff357fe5b8152602001838152509080600181540180825580915050906001820390600052602060002090600502016000909192909190915060008201518160000190805190602001906120439291906139d2565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561209257fe5b021790555060808201518160040190805190602001906120b3929190613a52565b50505050836000018054905084600101846040516120d19190614a31565b90815260200160405180910390208190555086600560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505050505050505050565b6000339050612147613996565b61215182846131d4565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156121f55780601f106121ca576101008083540402835291602001916121f5565b820191906000526020600020905b8154815290600101906020018083116121d857829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561224157fe5b600281111561224c57fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156122c457602002820191906000526020600020906000905b82829054906101000a900460ff1615158152602001906001019060208260000104928301926001038202915080841161228e5790505b5050505050815250509050600060028111156122dc57fe5b816060015160028111156122ec57fe5b141561232d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232490614b8c565b60405180910390fd5b600061233983856135e8565b90508061237b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161237290614bec565b60405180910390fd5b606061238685612a10565b90506000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b825181101561241e57816002018360018303815181106123ee57fe5b60200260200101516040516124039190614a1a565b908152602001604051809103902091508060010190506123d2565b50600060018260010186600001516040516124399190614a1a565b908152602001604051809103902054039050612453613996565b8260000160018460000180549050038154811061246c57fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561251e5780601f106124f35761010080835404028352916020019161251e565b820191906000526020600020905b81548152906001019060200180831161250157829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561256a57fe5b600281111561257557fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156125ed57602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116125b75790505b50505050508152505090508083600001838154811061260857fe5b906000526020600020906005020160008201518160000190805190602001906126329291906139d2565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561268157fe5b021790555060808201518160040190805190602001906126a2929190613a52565b50905050826000018054809190600190036126bd9190613af8565b508260010186600001516040516126d49190614a1a565b9081526020016040518091039020548360010182600001516040516126f99190614a1a565b90815260200160405180910390208190555060008360010187600001516040516127239190614a1a565b9081526020016040518091039020819055508560400151600560008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505050505050505050565b600080606061279e84612c74565b915091506127aa613996565b6127b483836131d4565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156128585780601f1061282d57610100808354040283529160200191612858565b820191906000526020600020905b81548152906001019060200180831161283b57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff1660028111156128a457fe5b60028111156128af57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561292757602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116128f15790505b50505050508152505090506001600281111561293f57fe5b8160600151600281111561294f57fe5b1480612974575060028081111561296257fe5b8160600151600281111561297257fe5b145b6129b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129aa90614d6c565b60405180910390fd5b60006129bf848461364c565b809650819250505080612a07576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129fe90614dcc565b60405180910390fd5b50505050919050565b6060612a1a613b73565b612a23836136b5565b9050612a2d613b73565b612a6b6040518060400160405280600181526020017f2f000000000000000000000000000000000000000000000000000000000000008152506136b5565b905060606001612a8483856136e390919063ffffffff16565b01604051908082528060200260200182016040528015612ab857816020015b6060815260200190600190039081612aa35790505b50905060008090505b8151811015612b0957612ae5612ae0848661375890919063ffffffff16565b613772565b828281518110612af157fe5b60200260200101819052508080600101915050612ac1565b50600081600183510381518110612b1c57fe5b6020026020010151511415612b875780600182510381518110612b3b57fe5b6020026020010160608152506001815103604051908082528060200260200182016040528015612b7f57816020015b6060815260200190600190039081612b6a5790505b509350612bc0565b8051604051908082528060200260200182016040528015612bbc57816020015b6060815260200190600190039081612ba75790505b5093505b60008090505b8451811015612c0757818181518110612bdb57fe5b6020026020010151858281518110612bef57fe5b60200260200101819052508080600101915050612bc6565b50505050919050565b60008060016020601f85510181612c2357fe5b040190506040518481526020810160005b83811015612c55578060200286015181602002830152806001019050612c34565b50602082602085026040018460006010600019f1935050505092915050565b6000606060006028905080845111612cc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cb890614c0c565b60405180910390fd5b6060816040519080825280601f01601f191660200182016040528015612cf65781602001600182028038833980820191505090505b50905060008090505b82811015612d6657858181518110612d1357fe5b602001015160f81c60f81b828281518110612d2a57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050612cff565b50600080905060008090505b83811015612e95576000838281518110612d8857fe5b602001015160f81c60f81b60f81c60ff16905060308110158015612dad575060398111155b80612dc6575060418110158015612dc55750605a8111155b5b80612ddf575060618110158015612dde575060668111155b5b612e1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e1590614c0c565b60405180910390fd5b60308110158015612e30575060398111155b15612e415760308103601084020192505b60418110158015612e535750605a8111155b15612e645760378103601084020192505b60618110158015612e76575060668111155b15612e875760578103601084020192505b508080600101915050612d72565b508094507f2f00000000000000000000000000000000000000000000000000000000000000868481518110612ec657fe5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612f33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f2a90614c0c565b60405180910390fd5b6000600184885103039050806040519080825280601f01601f191660200182016040528015612f715781602001600182028038833980820191505090505b50945060008090505b81811015612fec5760008860018784010181518110612f9557fe5b602001015160f81c60f81b905080878381518110612faf57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350508080600101915050612f7a565b5050505050915091565b600060405160200161300790614a5d565b604051602081830303815290604052805190602001208260405160200161302e9190614a31565b604051602081830303815290604052805190602001201480613099575060405160200161305a90614a48565b60405160208183030381529060405280519060200120826040516020016130819190614a31565b60405160208183030381529060405280519060200120145b806130a5575060008251145b156130b357600090506130d2565b60008251905060ff8111156130cc5760009150506130d2565b60019150505b919050565b60008060016020601f855101816130ea57fe5b040190506040518481526020810160005b8381101561311c5780602002860151816020028301528060010190506130fb565b5060208260208502604001846000600f600019f1935050505092915050565b600073d2001000000000000000000000000000000000d273ffffffffffffffffffffffffffffffffffffffff166383e781fe6040518163ffffffff1660e01b815260040160206040518083038186803b15801561319757600080fd5b505afa1580156131ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506131cf9190810190613da8565b905090565b600060606131e183612a10565b90506000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b82518110156132f25760008260010184600184038151811061324b57fe5b60200260200101516040516132609190614a1a565b908152602001604051809103902054116132af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132a690614c2c565b60405180910390fd5b816002018360018303815181106132c257fe5b60200260200101516040516132d79190614a1a565b9081526020016040518091039020915080600101905061322d565b5060606001835111613304578461331d565b8260018451038151811061331457fe5b60200260200101515b9050600082600101826040516133339190614a31565b90815260200160405180910390205411613382576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161337990614c2c565b60405180910390fd5b6000826000016001846001018460405161339c9190614a31565b90815260200160405180910390205403815481106133b657fe5b906000526020600020906005020190508094505050505092915050565b60008060016020601f855101816133e657fe5b04019050600060016020601f885101816133fc57fe5b040190506040518781526020810160005b8381101561342e57806020028901518160200283015280600101905061340d565b50868360200282015260005b84811015613460578060200287015181856001010160200283015280600101905061343a565b50602082848601602002606001846000600c600019f1945050505050949350505050565b600061348e613b4e565b600060016020601f885101816134a057fe5b0401905060006020601f8601816134b357fe5b0490506040518881526020810160005b848110156134e457806020028a0151816020028301528060010190506134c3565b5083602002810188815287816020015283602002868660030160200285600a600019fa9650505050505094509492505050565b60008060016020601f8551018161352a57fe5b040190506040518481526020810160005b8381101561355c57806020028601518160200283015280600101905061353b565b50602082602085026040018460006011600019f1935050505092915050565b60008060016020601f8651018161358e57fe5b040190506040518581526020810160005b838110156135c057806020028701518160200283015280600101905061359f565b50846020840282015260208260208502604001846000600b600019f193505050509392505050565b60008060016020601f855101816135fb57fe5b040190506040518481526020810160005b8381101561362d57806020028601518160200283015280600101905061360c565b5060208260208502604001846000600e600019f1935050505092915050565b600080600060016020601f8651018161366157fe5b040190506040518581526020810160005b83811015613693578060200287015181602002830152806001019050613672565b506020826020850260200184600d600019fa9450815193505050509250929050565b6136bd613b73565b600060208301905060405180604001604052808451815260200182815250915050919050565b600080826000015161370785600001518660200151866000015187602001516137d4565b0190505b8360000151846020015101811161375157818060010192505082600001516137498560200151830386600001510383866000015187602001516137d4565b01905061370b565b5092915050565b613760613b73565b61376b8383836138af565b5092915050565b60608082600001516040519080825280601f01601f1916602001820160405280156137ac5781602001600182028038833980820191505090505b50905060006020820190506137ca818560200151866000015161394d565b8192505050919050565b600080849050600086851161389f576020851161385957600060018660200360080260020a031960001b905060008186511690506000878a8a0103905060008386511690505b82811461384b57818610613838578a8a0196505050505050506138a7565b858060010196505083865116905061381a565b8596505050505050506138a7565b60008585209050600091505b858803821161389d57600086842090508082141561388957839450505050506138a7565b600184019350508180600101925050613865565b505b868601925050505b949350505050565b6138b7613b73565b60006138d585600001518660200151866000015187602001516137d4565b90508460200151836020018181525050846020015181038360000181815250508460000151856020015101811415613917576000856000018181525050613942565b8360000151836000015101856000018181510391508181525050836000015181018560200181815250505b829150509392505050565b5b60208110613971578151835260208301925060208201915060208103905061394e565b60006001826020036101000a0390508019835116818551168181178652505050505050565b6040518060a001604052806060815260200160001515815260200160008152602001600060028111156139c557fe5b8152602001606081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613a1357805160ff1916838001178555613a41565b82800160010185558215613a41579182015b82811115613a40578251825591602001919060010190613a25565b5b509050613a4e9190613b8d565b5090565b82805482825590600052602060002090601f01602090048101928215613ae75791602002820160005b83821115613ab857835183826101000a81548160ff0219169083151502179055509260200192600101602081600001049283019260010302613a7b565b8015613ae55782816101000a81549060ff0219169055600101602081600001049283019260010302613ab8565b505b509050613af49190613bb2565b5090565b815481835581811115613b2557600502816005028360005260206000209182019101613b249190613be2565b5b505050565b5080546000825560050290600052602060002090810190613b4b9190613be2565b50565b6040518062100000016040528061800090602082028038833980820191505090505090565b604051806040016040528060008152602001600081525090565b613baf91905b80821115613bab576000816000905550600101613b93565b5090565b90565b613bdf91905b80821115613bdb57600081816101000a81549060ff021916905550600101613bb8565b5090565b90565b613c4e91905b80821115613c4a5760008082016000613c019190613c51565b6001820160006101000a81549060ff021916905560028201600090556003820160006101000a81549060ff0219169055600482016000613c419190613c99565b50600501613be8565b5090565b90565b50805460018160011615610100020316600290046000825580601f10613c775750613c96565b601f016020900490600052602060002090810190613c959190613b8d565b5b50565b50805460008255601f016020900490600052602060002090810190613cbe9190613b8d565b50565b600081359050613cd081615086565b92915050565b600081519050613ce581615086565b92915050565b600082601f830112613cfc57600080fd5b8135613d0f613d0a82614e74565b614e47565b91508082526020830160208301858383011115613d2b57600080fd5b613d36838284615026565b50505092915050565b600082601f830112613d5057600080fd5b8135613d63613d5e82614ea0565b614e47565b91508082526020830160208301858383011115613d7f57600080fd5b613d8a838284615026565b50505092915050565b600081359050613da28161509d565b92915050565b600060208284031215613dba57600080fd5b6000613dc884828501613cd6565b91505092915050565b60008060408385031215613de457600080fd5b6000613df285828601613cc1565b9250506020613e0385828601613d93565b9150509250929050565b600060208284031215613e1f57600080fd5b600082013567ffffffffffffffff811115613e3957600080fd5b613e4584828501613d3f565b91505092915050565b60008060408385031215613e6157600080fd5b600083013567ffffffffffffffff811115613e7b57600080fd5b613e8785828601613d3f565b9250506020613e9885828601613d93565b9150509250929050565b600080600060608486031215613eb757600080fd5b600084013567ffffffffffffffff811115613ed157600080fd5b613edd86828701613d3f565b9350506020613eee86828701613d93565b925050604084013567ffffffffffffffff811115613f0b57600080fd5b613f1786828701613ceb565b9150509250925092565b600080600060608486031215613f3657600080fd5b600084013567ffffffffffffffff811115613f5057600080fd5b613f5c86828701613d3f565b9350506020613f6d86828701613d93565b9250506040613f7e86828701613d93565b9150509250925092565b6000613f9483836140f6565b60208301905092915050565b6000613fac8383614105565b60208301905092915050565b6000613fc4838361497f565b905092915050565b6000613fd782614ef6565b613fe18185614f55565b9350613fec83614ecc565b8060005b8381101561401d5781516140048882613f88565b975061400f83614f2e565b925050600181019050613ff0565b5085935050505092915050565b61403381614f01565b61403d8184614f66565b925061404882614edc565b8060005b838110156140795781516140608782613fa0565b965061406b83614f3b565b92505060018101905061404c565b505050505050565b600061408c82614f0d565b6140968185614f71565b9350836020820285016140a885614ee6565b8060005b858110156140e457848403895281516140c58582613fb8565b94506140d083614f48565b925060208a019950506001810190506140ac565b50829750879550505050505092915050565b6140ff81614fc1565b82525050565b61410e81614fcd565b82525050565b61411d81615014565b82525050565b61412c81615014565b82525050565b600061413d82614f23565b6141478185614fa4565b9350614157818560208601615035565b80840191505092915050565b600061416e82614f18565b6141788185614f82565b9350614188818560208601615035565b61419181615068565b840191505092915050565b60006141a782614f18565b6141b18185614fa4565b93506141c1818560208601615035565b80840191505092915050565b60006141da601883614f93565b91507f496e636f7272656374206368756e6b20706f736974696f6e00000000000000006000830152602082019050919050565b600061421a601583614f93565b91507f4469726563746f7279206e6f74206372656174656400000000000000000000006000830152602082019050919050565b600061425a602483614f93565b91507f4e6f7420656e6f756768206d656d6f727920696e207468652046696c6573746f60008301527f72616765000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006142c0601b83614f93565b91507f48617368206861736e2774206265656e2063616c63756c6174656400000000006000830152602082019050919050565b6000614300601983614f93565b91507f4368756e6b20697320616c72656164792075706c6f61646564000000000000006000830152602082019050919050565b6000614340601683614f93565b91507f496e636f7272656374206368756e6b206c656e677468000000000000000000006000830152602082019050919050565b6000614380600f83614f93565b91507f46696c65206e6f742065786973747300000000000000000000000000000000006000830152602082019050919050565b60006143c0600e83614f93565b91507f496e76616c69642073656e6465720000000000000000000000000000000000006000830152602082019050919050565b6000614400601883614f93565b91507f4469726563746f7279206973206e6f742064656c6574656400000000000000006000830152602082019050919050565b6000614440601083614f93565b91507f46696c65206e6f742064656c65746564000000000000000000000000000000006000830152602082019050919050565b6000614480601383614f93565b91507f496e76616c69642073746f7261676550617468000000000000000000000000006000830152602082019050919050565b60006144c0600c83614f93565b91507f496e76616c6964207061746800000000000000000000000000000000000000006000830152602082019050919050565b6000614500600183614fa4565b91507f2e000000000000000000000000000000000000000000000000000000000000006000830152600182019050919050565b6000614540601683614f93565b91507f496e76616c6964206469726563746f7279206e616d65000000000000000000006000830152602082019050919050565b6000614580601583614f93565b91507f4368756e6b207761736e27742075706c6f6164656400000000000000000000006000830152602082019050919050565b60006145c0602683614f93565b91507f436f756c64206e6f742072657365727665206c657373207468616e207573656460008301527f20737061636500000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614626601683614f93565b91507f4469726563746f7279206973206e6f7420656d707479000000000000000000006000830152602082019050919050565b6000614666602383614f93565b91507f46696c65206861736e2774206265656e2075706c6f6164656420636f7272656360008301527f746c7900000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006146cc601183614f93565b91507f4368756e6b207761736e277420726561640000000000000000000000000000006000830152602082019050919050565b600061470c601883614f93565b91507f46696c656e616d652073686f756c64206265203c2032353600000000000000006000830152602082019050919050565b600061474c601f83614f93565b91507f46696c652073686f756c64206265206c657373207468616e20313030204d42006000830152602082019050919050565b600061478c600283614fa4565b91507f2e2e0000000000000000000000000000000000000000000000000000000000006000830152600282019050919050565b60006147cc601183614f93565b91507f4469726563746f72792069732066756c6c0000000000000000000000000000006000830152602082019050919050565b600061480c600e83614f93565b91507f46696c65206e6f7420666f756e640000000000000000000000000000000000006000830152602082019050919050565b600061484c601883614f93565b91507f46696c65206f72206469726563746f72792065786973747300000000000000006000830152602082019050919050565b600061488c601983614f93565b91507f4e6f7420656e6f756768207265736572766564207370616365000000000000006000830152602082019050919050565b60006148cc601883614f93565b91507f45564d206572726f7220696e2067657446696c6553697a6500000000000000006000830152602082019050919050565b600061490c601083614f93565b91507f46696c65206e6f742063726561746564000000000000000000000000000000006000830152602082019050919050565b600061494c601983614f93565b91507f46696c65206861736e2774206265656e2075706c6f61646564000000000000006000830152602082019050919050565b600060a083016000830151848203600086015261499c8282614163565b91505060208301516149b160208601826140f6565b5060408301516149c460408601826149fc565b5060608301516149d76060860182614114565b50608083015184820360808601526149ef8282613fcc565b9150508091505092915050565b614a058161500a565b82525050565b614a148161500a565b82525050565b6000614a26828461419c565b915081905092915050565b6000614a3d8284614132565b915081905092915050565b6000614a53826144f3565b9150819050919050565b6000614a688261477f565b9150819050919050565b60006210000082019050614a89600083018461402a565b92915050565b60006020820190508181036000830152614aa98184614081565b905092915050565b6000602082019050614ac66000830184614123565b92915050565b60006020820190508181036000830152614ae5816141cd565b9050919050565b60006020820190508181036000830152614b058161420d565b9050919050565b60006020820190508181036000830152614b258161424d565b9050919050565b60006020820190508181036000830152614b45816142b3565b9050919050565b60006020820190508181036000830152614b65816142f3565b9050919050565b60006020820190508181036000830152614b8581614333565b9050919050565b60006020820190508181036000830152614ba581614373565b9050919050565b60006020820190508181036000830152614bc5816143b3565b9050919050565b60006020820190508181036000830152614be5816143f3565b9050919050565b60006020820190508181036000830152614c0581614433565b9050919050565b60006020820190508181036000830152614c2581614473565b9050919050565b60006020820190508181036000830152614c45816144b3565b9050919050565b60006020820190508181036000830152614c6581614533565b9050919050565b60006020820190508181036000830152614c8581614573565b9050919050565b60006020820190508181036000830152614ca5816145b3565b9050919050565b60006020820190508181036000830152614cc581614619565b9050919050565b60006020820190508181036000830152614ce581614659565b9050919050565b60006020820190508181036000830152614d05816146bf565b9050919050565b60006020820190508181036000830152614d25816146ff565b9050919050565b60006020820190508181036000830152614d458161473f565b9050919050565b60006020820190508181036000830152614d65816147bf565b9050919050565b60006020820190508181036000830152614d85816147ff565b9050919050565b60006020820190508181036000830152614da58161483f565b9050919050565b60006020820190508181036000830152614dc58161487f565b9050919050565b60006020820190508181036000830152614de5816148bf565b9050919050565b60006020820190508181036000830152614e05816148ff565b9050919050565b60006020820190508181036000830152614e258161493f565b9050919050565b6000602082019050614e416000830184614a0b565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614e6a57600080fd5b8060405250919050565b600067ffffffffffffffff821115614e8b57600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614eb757600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050919050565b6000819050602082019050919050565b600081519050919050565b60006180009050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614fba82614fea565b9050919050565b60008115159050919050565b6000819050919050565b6000819050614fe582615079565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061501f82614fd7565b9050919050565b82818337600083830152505050565b60005b83811015615053578082015181840152602081019050615038565b83811115615062576000848401525b50505050565b6000601f19601f8301169050919050565b6003811061508357fe5b50565b61508f81614faf565b811461509a57600080fd5b50565b6150a68161500a565b81146150b157600080fd5b5056fea365627a7a72315820314a90e541327f2678eaf7815f54348c3702e4fa45cdf1d5595b378d08af86896c6578706572696d656e74616cf564736f6c634300050d0040", + "nonce": "0", + "storage": { + "0x0": "2868903936" + } + }, + "0x69bfcdcb98c9562e0a2faee3ecdfd65e8a0adb19": { + "balance": "1000000000000000000000000000000" + }, + "0x6a37ad7dceec4595eea9f03b82d2710e738343ac": { + "balance": "1000000000000000000000000000000" + }, + "0x6b806862a977a0e22ed1752f858e5332647121c8": { + "balance": "1000000000000000000000000000000" + }, + "0x6c0ef9084a57df13c175afea32ea47a510c5506e": { + "balance": "1000000000000000000000000000000" + }, + "0x6cd5e637266e18d3e888ee99451eb828c6b491f4": { + "balance": "1000000000000000000000000000000" + }, + "0x6d0d7f0ff51917bd84a5f7270d31a894282aaf4b": { + "balance": "1000000000000000000000000000000" + }, + "0x6d8092cb926daf29236f866cd31c327ff73323d1": { + "balance": "1000000000000000000000000000000" + }, + "0x6d80aAC61F6d92c7F4A3c412850474ba963B698E": { + "balance": "1000000000000000000000" + }, + "0x6fec280c0ab320715b17d70e8b02c2d4141c1372": { + "balance": "1000000000000000000000000000000" + }, + "0x733ad609ef2e742334d96266fbc13733f1cf5e4a": { + "balance": "1000000000000000000000000000000" + }, + "0x7525198d8cd1121d57358a0b0ed037e924581a76": { + "balance": "1000000000000000000000000000000" + }, + "0x765708943c3b791563d1e3f0533b6d7e7d769e4d": { + "balance": "1000000000000000000000000000000" + }, + "0x7685d04f0b7657017b77efa004a14ff9f022acab": { + "balance": "1000000000000000000000000000000" + }, + "0x76b545cb6a2fc671f741950eeb27627e69a1e69b": { + "balance": "1000000000000000000000000000000" + }, + "0x77a0bc73442d3d9cb993e8d9752f95babf0ccaa6": { + "balance": "1000000000000000000000000000000" + }, + "0x7a89A6c323FaCfF0ADeF7EEF3e491aD4044d0592": { + "balance": "100000000000000000000000" + }, + "0x7e7E68F04D1799Fa25C8cff57314c8a5d3942e69": { + "balance": "1000000000000000000000000" + }, + "0x811d701d14539d190a8593fe901eafe8eff511f5": { + "balance": "1000000000000000000000000000000" + }, + "0x81dcbd71da28fafb9ca99ff5a22bfcebba84fecc": { + "balance": "100000000000000000000000" + }, + "0x83c1479d2a32d9ed9fa699289b6c2db56b7cd045": { + "balance": "1000000000000000000000000000000" + }, + "0x85b33f0853ab8eaa4e602bdfd724d44bc2731e90": { + "balance": "1000000000000000000000000000000" + }, + "0x863f816036e3cbba90855196c9d1e339fcff1650": { + "balance": "1000000000000000000000000000000" + }, + "0x87ea381878572d63b3453033d7540abddd191186": { + "balance": "1000000000000000000000000000000" + }, + "0x88fd5e01078629cc194c933d9631b9448fe10b1d": { + "balance": "1000000000000000000000000000000" + }, + "0x8945e48bd056f45c8b57f9025d2674bb03a24035": { + "balance": "1000000000000000000000000000000" + }, + "0x8a920edc1021ce76c22774e0e83723a6e51c2439": { + "balance": "1000000000000000000000000000000" + }, + "0x8e6081e272c8f4d49f5b29157b52f68cbd6307ad": { + "balance": "1000000000000000000000000000000" + }, + "0x8fe24dbbf9884bd458d8cfac528b4ad70e82497d": { + "balance": "1000000000000000000000000000000" + }, + "0x90431f3f75b26657f74abbb5c759b12e78f916cc": { + "balance": "1000000000000000000000000000000" + }, + "0x907cd0881E50d359bb9Fd120B1A5A143b1C97De6": { + "balance": "1000000000000000000000000000000000000000000000000000000000" + }, + "0x94c6e5746971d6aebeaa42cbbe2feca0f6b5b24f": { + "balance": "1000000000000000000000000000000" + }, + "0x96672f9e982936e1904b15c948cc81bf18027db6": { + "balance": "1000000000000000000000000000000" + }, + "0x97b921ba45e0aa8830701aa62050a83ee00a1bb8": { + "balance": "1000000000000000000000000000000" + }, + "0x98e50c97baf98dc6a81bdb95067339a269a36fc1": { + "balance": "1000000000000000000000000000000" + }, + "0x9b77f28285a49601169a33332f08aa309d97edd0": { + "balance": "1000000000000000000000000000000" + }, + "0x9f62f4215cd277ca40dede101b4ccb29290de6bb": { + "balance": "1000000000000000000000000000000" + }, + "0xD1001000000000000000000000000000000000D1": { + "balance": "0", + "code": "0x608060405260043610603f576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680636d4ce63c146044575b600080fd5b348015604f57600080fd5b506056606c565b6040518082815260200191505060405180910390f35b60006001600060048152602001908152602001600020600060098152602001908152602001600020600101549050905600a165627a7a723058208fe64219becc0bcab1c8f854f05804ebb6bb555da5dbc49e8f7021c31d77636a0029", + "nonce": "0", + "storage": { + "0x3b4da637a1b0e6dbfc6795f2b7f0cb29eebb91b3af4dcc335e1633f6b4af810b": "1111" + } + }, + "0xD3001000000000000000000000000000000000D3": { + "balance": "0", + "code": "0x60806040526004361061007b5760003560e01c80639623609d1161004e5780639623609d1461013657806399a88ec4146101f5578063f2fde38b14610230578063f3b7dead146102635761007b565b8063204e1c7a14610080578063715018a6146100cf5780637eff275e146100e65780638da5cb5b14610121575b600080fd5b34801561008c57600080fd5b506100b3600480360360208110156100a357600080fd5b50356001600160a01b0316610296565b604080516001600160a01b039092168252519081900360200190f35b3480156100db57600080fd5b506100e4610328565b005b3480156100f257600080fd5b506100e46004803603604081101561010957600080fd5b506001600160a01b03813581169160200135166103ca565b34801561012d57600080fd5b506100b3610496565b6100e46004803603606081101561014c57600080fd5b6001600160a01b03823581169260208101359091169181019060608101604082013564010000000081111561018057600080fd5b82018360208201111561019257600080fd5b803590602001918460018302840111640100000000831117156101b457600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506104a5945050505050565b34801561020157600080fd5b506100e46004803603604081101561021857600080fd5b506001600160a01b03813581169160200135166105dd565b34801561023c57600080fd5b506100e46004803603602081101561025357600080fd5b50356001600160a01b031661068d565b34801561026f57600080fd5b506100b36004803603602081101561028657600080fd5b50356001600160a01b0316610785565b6000806060836001600160a01b03166040518080635c60da1b60e01b8152506004019050600060405180830381855afa9150503d80600081146102f5576040519150601f19603f3d011682016040523d82523d6000602084013e6102fa565b606091505b50915091508161030957600080fd5b80806020019051602081101561031e57600080fd5b5051949350505050565b6103306107e4565b6000546001600160a01b03908116911614610380576040805162461bcd60e51b8152602060048201819052602482015260008051602061080f833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6103d26107e4565b6000546001600160a01b03908116911614610422576040805162461bcd60e51b8152602060048201819052602482015260008051602061080f833981519152604482015290519081900360640190fd5b816001600160a01b0316638f283970826040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050600060405180830381600087803b15801561047a57600080fd5b505af115801561048e573d6000803e3d6000fd5b505050505050565b6000546001600160a01b031690565b6104ad6107e4565b6000546001600160a01b039081169116146104fd576040805162461bcd60e51b8152602060048201819052602482015260008051602061080f833981519152604482015290519081900360640190fd5b826001600160a01b0316634f1ef2863484846040518463ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561057357818101518382015260200161055b565b50505050905090810190601f1680156105a05780820380516001836020036101000a031916815260200191505b5093505050506000604051808303818588803b1580156105bf57600080fd5b505af11580156105d3573d6000803e3d6000fd5b5050505050505050565b6105e56107e4565b6000546001600160a01b03908116911614610635576040805162461bcd60e51b8152602060048201819052602482015260008051602061080f833981519152604482015290519081900360640190fd5b816001600160a01b0316633659cfe6826040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050600060405180830381600087803b15801561047a57600080fd5b6106956107e4565b6000546001600160a01b039081169116146106e5576040805162461bcd60e51b8152602060048201819052602482015260008051602061080f833981519152604482015290519081900360640190fd5b6001600160a01b03811661072a5760405162461bcd60e51b81526004018080602001828103825260268152602001806107e96026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000806060836001600160a01b031660405180806303e1469160e61b8152506004019050600060405180830381855afa9150503d80600081146102f5576040519150601f19603f3d011682016040523d82523d6000602084013e6102fa565b339056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a26469706673582212201d968ac32bef5562c6b4f1bd5d2f2a74c14d07ce008ca6fdc5a3bd0f5fc265f564736f6c63430006080033", + "nonce": "0", + "storage": { + "0x0": "0x907cd0881E50d359bb9Fd120B1A5A143b1C97De6" + } + }, + "0xD3002000000000000000000000000000000000D3": { + "balance": "0", + "code": "0x60806040526004361061004e5760003560e01c80633659cfe6146100655780634f1ef286146100985780635c60da1b146101185780638f28397014610149578063f851a4401461017c5761005d565b3661005d5761005b610191565b005b61005b610191565b34801561007157600080fd5b5061005b6004803603602081101561008857600080fd5b50356001600160a01b03166101ab565b61005b600480360360408110156100ae57600080fd5b6001600160a01b0382351691908101906040810160208201356401000000008111156100d957600080fd5b8201836020820111156100eb57600080fd5b8035906020019184600183028401116401000000008311171561010d57600080fd5b5090925090506101e5565b34801561012457600080fd5b5061012d610292565b604080516001600160a01b039092168252519081900360200190f35b34801561015557600080fd5b5061005b6004803603602081101561016c57600080fd5b50356001600160a01b03166102cf565b34801561018857600080fd5b5061012d610389565b6101996103ba565b6101a96101a461041a565b61043f565b565b6101b3610463565b6001600160a01b0316336001600160a01b031614156101da576101d581610488565b6101e2565b6101e2610191565b50565b6101ed610463565b6001600160a01b0316336001600160a01b031614156102855761020f83610488565b6000836001600160a01b031683836040518083838082843760405192019450600093509091505080830381855af49150503d806000811461026c576040519150601f19603f3d011682016040523d82523d6000602084013e610271565b606091505b505090508061027f57600080fd5b5061028d565b61028d610191565b505050565b600061029c610463565b6001600160a01b0316336001600160a01b031614156102c4576102bd61041a565b90506102cc565b6102cc610191565b90565b6102d7610463565b6001600160a01b0316336001600160a01b031614156101da576001600160a01b0381166103355760405162461bcd60e51b81526004018080602001828103825260368152602001806105876036913960400191505060405180910390fd5b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f61035e610463565b604080516001600160a01b03928316815291841660208301528051918290030190a16101d5816104c8565b6000610393610463565b6001600160a01b0316336001600160a01b031614156102c4576102bd610463565b3b151590565b6103c2610463565b6001600160a01b0316336001600160a01b031614156104125760405162461bcd60e51b81526004018080602001828103825260328152602001806105556032913960400191505060405180910390fd5b6101a96101a9565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b3660008037600080366000845af43d6000803e80801561045e573d6000f35b3d6000fd5b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b610491816104ec565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610355565b6104f5816103b4565b6105305760405162461bcd60e51b815260040180806020018281038252603b8152602001806105bd603b913960400191505060405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5556fe43616e6e6f742063616c6c2066616c6c6261636b2066756e6374696f6e2066726f6d207468652070726f78792061646d696e43616e6e6f74206368616e6765207468652061646d696e206f6620612070726f787920746f20746865207a65726f206164647265737343616e6e6f742073657420612070726f787920696d706c656d656e746174696f6e20746f2061206e6f6e2d636f6e74726163742061646472657373a26469706673582212206e221e2a3547bd97244b05ed46430b1b078ba097cb2a4e25ec3d79cf9ac9f02c64736f6c63430006080033", + "nonce": "0", + "storage": { + "0x0": "1000000", + "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0xD3003000000000000000000000000000000000D3", + "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "0xD3001000000000000000000000000000000000D3" + } + }, + "0xD3003000000000000000000000000000000000D3": { + "balance": "0", + "code": "0x608060405234801561001057600080fd5b50600436106100b45760003560e01c806379210e8e1161007157806379210e8e1461017757806381a8235a146101a757806385aeeb17146101c35780639a9a5593146101f3578063a99100541461020f578063b57321221461022b576100b4565b806307c6e7d3146100b9578063122f4fba146100d55780631c6ec7a9146101055780631cfe4e3b14610121578063373dedb41461013d57806361e46db51461015b575b600080fd5b6100d360048036036100ce9190810190613e94565b61025b565b005b6100ef60048036036100ea9190810190613e94565b610862565b6040516100fc9190614b38565b60405180910390f35b61011f600480360361011a9190810190613e94565b610ba1565b005b61013b60048036036101369190810190613e58565b610fce565b005b6101456111ec565b6040516101529190614eb3565b60405180910390f35b61017560048036036101709190810190613f29565b6111f6565b005b610191600480360361018c9190810190613fa8565b611456565b60405161019e9190614af9565b60405180910390f35b6101c160048036036101bc9190810190613e94565b611756565b005b6101dd60048036036101d89190810190613e94565b6118fb565b6040516101ea9190614b16565b60405180910390f35b61020d60048036036102089190810190613ed5565b611bfa565b005b61022960048036036102249190810190613e94565b612195565b005b61024560048036036102409190810190613e94565b612849565b6040516102529190614eb3565b60405180910390f35b6000339050606061026b83612ac9565b90506000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b825181101561037c576000826001018460018403815181106102d557fe5b60200260200101516040516102ea9190614aa1565b90815260200160405180910390205411610339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161033090614cb3565b60405180910390fd5b8160020183600183038151811061034c57fe5b60200260200101516040516103619190614aa1565b908152602001604051809103902091508060010190506102b7565b506060600183511161038e57846103a7565b8260018451038151811061039e57fe5b60200260200101515b9050600082600101826040516103bd9190614ab8565b9081526020016040518091039020541161040c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161040390614cb3565b60405180910390fd5b600082600201826040516104209190614ab8565b90815260200160405180910390206000018054905014610475576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161046c90614d33565b60405180910390fd5b60006104818587612cc9565b9050806104c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ba90614c53565b60405180910390fd5b6104cb613a4f565b836000016001856000018054905003815481106104e457fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156105965780601f1061056b57610100808354040283529160200191610596565b820191906000526020600020905b81548152906001019060200180831161057957829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff1660028111156105e257fe5b60028111156105ed57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561066557602002820191906000526020600020906000905b82829054906101000a900460ff1615158152602001906001019060208260000104928301926001038202915080841161062f5790505b50505050508152505090508084600001600186600101866040516106899190614ab8565b90815260200160405180910390205403815481106106a357fe5b906000526020600020906005020160008201518160000190805190602001906106cd929190613a8b565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561071c57fe5b0217905550608082015181600401908051906020019061073d929190613b0b565b5090505083600101836040516107539190614ab8565b9081526020016040518091039020548460010182600001516040516107789190614aa1565b9081526020016040518091039020819055506000846001018460405161079e9190614ab8565b908152602001604051809103902081905550836000018054806107bd57fe5b6001900381819060005260206000209060050201600080820160006107e29190613bb1565b6001820160006101000a81549060ff021916905560028201600090556003820160006101000a81549060ff02191690556004820160006108229190613bf9565b5050905583600201836040516108389190614ab8565b9081526020016040518091039020600080820160006108579190613c21565b505050505050505050565b600080606061087084612d2d565b91509150606061087f82612ac9565b90506000600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015610964576000826001018460018403815181106108e957fe5b60200260200101516040516108fe9190614aa1565b908152602001604051809103902054141561092157600095505050505050610b9c565b8160020183600183038151811061093457fe5b60200260200101516040516109499190614aa1565b908152602001604051809103902091508060010190506108cb565b5060606001835111610976578361098f565b8260018451038151811061098657fe5b60200260200101515b9050600082600101826040516109a59190614ab8565b90815260200160405180910390205414156109c857600095505050505050610b9c565b6109d0613a4f565b82600001600184600101846040516109e89190614ab8565b9081526020016040518091039020540381548110610a0257fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610ab45780601f10610a8957610100808354040283529160200191610ab4565b820191906000526020600020905b815481529060010190602001808311610a9757829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115610b0057fe5b6002811115610b0b57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015610b8357602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411610b4d5790505b5050505050815250509050806060015196505050505050505b919050565b600360009054906101000a900460ff16610be457612000600481905550621000006005819055506001600360006101000a81548160ff0219169083151502179055505b6000815111610c28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1f90614cb3565b60405180910390fd5b60003390506060610c3883612ac9565b90506000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015610d4957600082600101846001840381518110610ca257fe5b6020026020010151604051610cb79190614aa1565b90815260200160405180910390205411610d06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cfd90614cb3565b60405180910390fd5b81600201836001830381518110610d1957fe5b6020026020010151604051610d2e9190614aa1565b90815260200160405180910390209150806001019050610c84565b50600454816000018054905010610d95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8c90614dd3565b60405180910390fd5b60606001835111610da65784610dbf565b82600184510381518110610db657fe5b60200260200101515b905060008260010182604051610dd59190614ab8565b90815260200160405180910390205414610e24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1b90614e13565b60405180910390fd5b610e2d816130af565b610e6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6390614cd3565b60405180910390fd5b6000610e788587613190565b905080610eba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb190614b73565b60405180910390fd5b610ec2613a4f565b8281600001819052506000816020019015159081151581525050836000018190806001815401808255809150506001900390600052602060002090600502016000909190919091506000820151816000019080519060200190610f26929190613a8b565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff02191690836002811115610f7557fe5b02179055506080820151816004019080519060200190610f96929190613b0b565b50505083600001805490508460010184604051610fb39190614ab8565b90815260200160405180910390208190555050505050505050565b610fd66131f4565b73ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16148061103b57503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614155b61107a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107190614c33565b60405180910390fd5b80600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411156110fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f390614d13565b60405180910390fd5b60025460095482011115611145576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113c90614b93565b60405180910390fd5b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460096000828254039250508190555080600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550806009600082825401925050819055505050565b6000600254905090565b60003390506000611207828661328d565b90506001600281111561121657fe5b8160030160009054906101000a900460ff16600281111561123357fe5b14611273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126a90614df3565b60405180910390fd5b6000600554858161128057fe5b061480156112915750806002015484105b6112d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c790614b53565b60405180910390fd5b600554848260020154031080156112ed5750838160020154038351145b806112fa57506005548351145b611339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133090614bf3565b60405180910390fd5b6000151581600401600554868161134c57fe5b048154811061135757fe5b90600052602060002090602091828204019190069054906101000a900460ff161515146113b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b090614bd3565b60405180910390fd5b60006113c78387878761348c565b905080611409576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140090614cf3565b60405180910390fd5b600182600401600554878161141a57fe5b048154811061142557fe5b90600052602060002090602091828204019190066101000a81548160ff021916908315150217905550505050505050565b61145e613c45565b6000606061146b86612d2d565b91509150611477613a4f565b611481838361328d565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156115255780601f106114fa57610100808354040283529160200191611525565b820191906000526020600020905b81548152906001019060200180831161150857829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561157157fe5b600281111561157c57fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156115f457602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116115be5790505b505050505081525050905060028081111561160b57fe5b8160600151600281111561161b57fe5b1461165b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165290614e93565b60405180910390fd5b600554851115801561166d5750600085115b6116ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a390614bf3565b60405180910390fd5b806040015185870111156116f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ec90614b53565b60405180910390fd5b60006117038484898961353d565b80965081925050508061174b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174290614d73565b60405180910390fd5b505050509392505050565b60003390506000611767828461328d565b90506001600281111561177657fe5b8160030160009054906101000a900460ff16600281111561179357fe5b146117d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ca90614df3565b60405180910390fd5b60006001905060008260040180549050905060008090505b8181101561183e576000151584600401828154811061180657fe5b90600052602060002090602091828204019190069054906101000a900460ff161515141561183357600092505b8060010190506117eb565b508161187f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187690614d53565b60405180910390fd5b60028360030160006101000a81548160ff021916908360028111156118a057fe5b021790555060006118b185876135d0565b9050806118f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ea90614bb3565b60405180910390fd5b505050505050565b60606000606061190a84612d2d565b91509150606061191982612ac9565b90506000600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008090505b8251811015611a235760008260010184838151811061197f57fe5b60200260200101516040516119949190614aa1565b908152602001604051809103902054116119e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119da90614cb3565b60405180910390fd5b816002018382815181106119f357fe5b6020026020010151604051611a089190614aa1565b90815260200160405180910390209150806001019050611964565b5080600001805480602002602001604051908101604052809291908181526020016000905b82821015611beb57838290600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611b045780601f10611ad957610100808354040283529160200191611b04565b820191906000526020600020905b815481529060010190602001808311611ae757829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115611b5057fe5b6002811115611b5b57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015611bd357602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411611b9d5790505b50505050508152505081526020019060010190611a48565b50505050945050505050919050565b600360009054906101000a900460ff16611c3d57612000600481905550621000006005819055506001600360006101000a81548160ff0219169083151502179055505b60003390506305f5e100821115611c89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8090614db3565b60405180910390fd5b600660008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205483011115611d4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4390614e33565b60405180910390fd5b6060611d5784612ac9565b90506000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015611e6857600082600101846001840381518110611dc157fe5b6020026020010151604051611dd69190614aa1565b90815260200160405180910390205411611e25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1c90614cb3565b60405180910390fd5b81600201836001830381518110611e3857fe5b6020026020010151604051611e4d9190614aa1565b90815260200160405180910390209150806001019050611da3565b50600454816000018054905010611eb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eab90614dd3565b60405180910390fd5b60606001835111611ec55785611ede565b82600184510381518110611ed557fe5b60200260200101515b905060008260010182604051611ef49190614ab8565b90815260200160405180910390205414611f43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3a90614e13565b60405180910390fd5b611f4c816130af565b611f8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8290614d93565b60405180910390fd5b6000611f98858888613634565b905080611fda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd190614e73565b60405180910390fd5b6060600554600160055489010381611fee57fe5b0460405190808252806020026020018201604052801561201d5781602001602082028038833980820191505090505b509050836000016040518060a001604052808581526020016001151581526020018981526020016001600281111561205157fe5b8152602001838152509080600181540180825580915050600190039060005260206000209060050201600090919091909150600082015181600001908051906020019061209f929190613a8b565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff021916908360028111156120ee57fe5b0217905550608082015181600401908051906020019061210f929190613b0b565b5050508360000180549050846001018460405161212c9190614ab8565b90815260200160405180910390208190555086600760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505050505050505050565b60003390506121a2613a4f565b6121ac828461328d565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156122505780601f1061222557610100808354040283529160200191612250565b820191906000526020600020905b81548152906001019060200180831161223357829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561229c57fe5b60028111156122a757fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561231f57602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116122e95790505b50505050508152505090506000600281111561233757fe5b8160600151600281111561234757fe5b1415612388576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161237f90614c13565b60405180910390fd5b600061239483856136a1565b9050806123d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123cd90614c73565b60405180910390fd5b60606123e185612ac9565b90506000600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015612479578160020183600183038151811061244957fe5b602002602001015160405161245e9190614aa1565b9081526020016040518091039020915080600101905061242d565b50600060018260010186600001516040516124949190614aa1565b9081526020016040518091039020540390506124ae613a4f565b826000016001846000018054905003815481106124c757fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156125795780601f1061254e57610100808354040283529160200191612579565b820191906000526020600020905b81548152906001019060200180831161255c57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff1660028111156125c557fe5b60028111156125d057fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561264857602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116126125790505b50505050508152505090508083600001838154811061266357fe5b9060005260206000209060050201600082015181600001908051906020019061268d929190613a8b565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff021916908360028111156126dc57fe5b021790555060808201518160040190805190602001906126fd929190613b0b565b509050508260000180548061270e57fe5b6001900381819060005260206000209060050201600080820160006127339190613bb1565b6001820160006101000a81549060ff021916905560028201600090556003820160006101000a81549060ff02191690556004820160006127739190613bf9565b5050905582600101866000015160405161278d9190614aa1565b9081526020016040518091039020548360010182600001516040516127b29190614aa1565b90815260200160405180910390208190555060008360010187600001516040516127dc9190614aa1565b9081526020016040518091039020819055508560400151600760008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505050505050505050565b600080606061285784612d2d565b91509150612863613a4f565b61286d838361328d565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156129115780601f106128e657610100808354040283529160200191612911565b820191906000526020600020905b8154815290600101906020018083116128f457829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561295d57fe5b600281111561296857fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156129e057602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116129aa5790505b5050505050815250509050600160028111156129f857fe5b81606001516002811115612a0857fe5b1480612a2d5750600280811115612a1b57fe5b81606001516002811115612a2b57fe5b145b612a6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a6390614df3565b60405180910390fd5b6000612a788484613705565b809650819250505080612ac0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ab790614e53565b60405180910390fd5b50505050919050565b6060612ad3613c6a565b612adc8361376e565b9050612ae6613c6a565b612b246040518060400160405280600181526020017f2f0000000000000000000000000000000000000000000000000000000000000081525061376e565b905060606001612b3d838561379c90919063ffffffff16565b01604051908082528060200260200182016040528015612b7157816020015b6060815260200190600190039081612b5c5790505b50905060008090505b8151811015612bc257612b9e612b99848661381190919063ffffffff16565b61382b565b828281518110612baa57fe5b60200260200101819052508080600101915050612b7a565b50600081600183510381518110612bd557fe5b6020026020010151511415612c405780600182510381518110612bf457fe5b6020026020010160608152506001815103604051908082528060200260200182016040528015612c3857816020015b6060815260200190600190039081612c235790505b509350612c79565b8051604051908082528060200260200182016040528015612c7557816020015b6060815260200190600190039081612c605790505b5093505b60008090505b8451811015612cc057818181518110612c9457fe5b6020026020010151858281518110612ca857fe5b60200260200101819052508080600101915050612c7f565b50505050919050565b60008060016020601f85510181612cdc57fe5b040190506040518481526020810160005b83811015612d0e578060200286015181602002830152806001019050612ced565b50602082602085026040018460006010600019f1935050505092915050565b6000606060006028905080845111612d7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d7190614c93565b60405180910390fd5b6060816040519080825280601f01601f191660200182016040528015612daf5781602001600182028038833980820191505090505b50905060008090505b82811015612e1f57858181518110612dcc57fe5b602001015160f81c60f81b828281518110612de357fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050612db8565b50600080905060008090505b83811015612f4e576000838281518110612e4157fe5b602001015160f81c60f81b60f81c60ff16905060308110158015612e66575060398111155b80612e7f575060418110158015612e7e5750605a8111155b5b80612e98575060618110158015612e97575060668111155b5b612ed7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ece90614c93565b60405180910390fd5b60308110158015612ee9575060398111155b15612efa5760308103601084020192505b60418110158015612f0c5750605a8111155b15612f1d5760378103601084020192505b60618110158015612f2f575060668111155b15612f405760578103601084020192505b508080600101915050612e2b565b508094507f2f00000000000000000000000000000000000000000000000000000000000000868481518110612f7f57fe5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612fec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fe390614c93565b60405180910390fd5b6000600184885103039050806040519080825280601f01601f19166020018201604052801561302a5781602001600182028038833980820191505090505b50945060008090505b818110156130a5576000886001878401018151811061304e57fe5b602001015160f81c60f81b90508087838151811061306857fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350508080600101915050613033565b5050505050915091565b60006040516020016130c090614ae4565b60405160208183030381529060405280519060200120826040516020016130e79190614ab8565b604051602081830303815290604052805190602001201480613152575060405160200161311390614acf565b604051602081830303815290604052805190602001208260405160200161313a9190614ab8565b60405160208183030381529060405280519060200120145b8061315e575060008251145b1561316c576000905061318b565b60008251905060ff81111561318557600091505061318b565b60019150505b919050565b60008060016020601f855101816131a357fe5b040190506040518481526020810160005b838110156131d55780602002860151816020028301528060010190506131b4565b5060208260208502604001846000600f600019f1935050505092915050565b600073d2001000000000000000000000000000000000d273ffffffffffffffffffffffffffffffffffffffff166383e781fe6040518163ffffffff1660e01b815260040160206040518083038186803b15801561325057600080fd5b505afa158015613264573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506132889190810190613e2f565b905090565b6000606061329a83612ac9565b90506000600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b82518110156133ab5760008260010184600184038151811061330457fe5b60200260200101516040516133199190614aa1565b90815260200160405180910390205411613368576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161335f90614cb3565b60405180910390fd5b8160020183600183038151811061337b57fe5b60200260200101516040516133909190614aa1565b908152602001604051809103902091508060010190506132e6565b50606060018351116133bd57846133d6565b826001845103815181106133cd57fe5b60200260200101515b9050600082600101826040516133ec9190614ab8565b9081526020016040518091039020541161343b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161343290614cb3565b60405180910390fd5b600082600001600184600101846040516134559190614ab8565b908152602001604051809103902054038154811061346f57fe5b906000526020600020906005020190508094505050505092915050565b60008060016020601f8551018161349f57fe5b04019050600060016020601f885101816134b557fe5b040190506040518781526020810160005b838110156134e75780602002890151816020028301528060010190506134c6565b50868360200282015260005b8481101561351957806020028701518185600101016020028301528060010190506134f3565b50602082848601602002606001846000600c600019f1945050505050949350505050565b6000613547613c45565b600060016020601f8851018161355957fe5b0401905060006020601f86018161356c57fe5b0490506040518881526020810160005b8481101561359d57806020028a01518160200283015280600101905061357c565b5083602002810188815287816020015283602002868660030160200285600a600019fa9650505050505094509492505050565b60008060016020601f855101816135e357fe5b040190506040518481526020810160005b838110156136155780602002860151816020028301528060010190506135f4565b50602082602085026040018460006011600019f1935050505092915050565b60008060016020601f8651018161364757fe5b040190506040518581526020810160005b83811015613679578060200287015181602002830152806001019050613658565b50846020840282015260208260208502604001846000600b600019f193505050509392505050565b60008060016020601f855101816136b457fe5b040190506040518481526020810160005b838110156136e65780602002860151816020028301528060010190506136c5565b5060208260208502604001846000600e600019f1935050505092915050565b600080600060016020601f8651018161371a57fe5b040190506040518581526020810160005b8381101561374c57806020028701518160200283015280600101905061372b565b506020826020850260200184600d600019fa9450815193505050509250929050565b613776613c6a565b600060208301905060405180604001604052808451815260200182815250915050919050565b60008082600001516137c0856000015186602001518660000151876020015161388d565b0190505b8360000151846020015101811161380a578180600101925050826000015161380285602001518303866000015103838660000151876020015161388d565b0190506137c4565b5092915050565b613819613c6a565b613824838383613968565b5092915050565b60608082600001516040519080825280601f01601f1916602001820160405280156138655781602001600182028038833980820191505090505b50905060006020820190506138838185602001518660000151613a06565b8192505050919050565b6000808490506000868511613958576020851161391257600060018660200360080260020a031960001b905060008186511690506000878a8a0103905060008386511690505b828114613904578186106138f1578a8a019650505050505050613960565b85806001019650508386511690506138d3565b859650505050505050613960565b60008585209050600091505b85880382116139565760008684209050808214156139425783945050505050613960565b60018401935050818060010192505061391e565b505b868601925050505b949350505050565b613970613c6a565b600061398e856000015186602001518660000151876020015161388d565b905084602001518360200181815250508460200151810383600001818152505084600001518560200151018114156139d05760008560000181815250506139fb565b8360000151836000015101856000018181510391508181525050836000015181018560200181815250505b829150509392505050565b5b60208110613a2a5781518352602083019250602082019150602081039050613a07565b60006001826020036101000a0390508019835116818551168181178652505050505050565b6040518060a00160405280606081526020016000151581526020016000815260200160006002811115613a7e57fe5b8152602001606081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613acc57805160ff1916838001178555613afa565b82800160010185558215613afa579182015b82811115613af9578251825591602001919060010190613ade565b5b509050613b079190613c84565b5090565b82805482825590600052602060002090601f01602090048101928215613ba05791602002820160005b83821115613b7157835183826101000a81548160ff0219169083151502179055509260200192600101602081600001049283019260010302613b34565b8015613b9e5782816101000a81549060ff0219169055600101602081600001049283019260010302613b71565b505b509050613bad9190613ca9565b5090565b50805460018160011615610100020316600290046000825580601f10613bd75750613bf6565b601f016020900490600052602060002090810190613bf59190613c84565b5b50565b50805460008255601f016020900490600052602060002090810190613c1e9190613c84565b50565b5080546000825560050290600052602060002090810190613c429190613cd9565b50565b6040518062100000016040528061800090602082028038833980820191505090505090565b604051806040016040528060008152602001600081525090565b613ca691905b80821115613ca2576000816000905550600101613c8a565b5090565b90565b613cd691905b80821115613cd257600081816101000a81549060ff021916905550600101613caf565b5090565b90565b613d4591905b80821115613d415760008082016000613cf89190613bb1565b6001820160006101000a81549060ff021916905560028201600090556003820160006101000a81549060ff0219169055600482016000613d389190613bf9565b50600501613cdf565b5090565b90565b600081359050613d578161510d565b92915050565b600081519050613d6c8161510d565b92915050565b600082601f830112613d8357600080fd5b8135613d96613d9182614efb565b614ece565b91508082526020830160208301858383011115613db257600080fd5b613dbd8382846150ad565b50505092915050565b600082601f830112613dd757600080fd5b8135613dea613de582614f27565b614ece565b91508082526020830160208301858383011115613e0657600080fd5b613e118382846150ad565b50505092915050565b600081359050613e2981615124565b92915050565b600060208284031215613e4157600080fd5b6000613e4f84828501613d5d565b91505092915050565b60008060408385031215613e6b57600080fd5b6000613e7985828601613d48565b9250506020613e8a85828601613e1a565b9150509250929050565b600060208284031215613ea657600080fd5b600082013567ffffffffffffffff811115613ec057600080fd5b613ecc84828501613dc6565b91505092915050565b60008060408385031215613ee857600080fd5b600083013567ffffffffffffffff811115613f0257600080fd5b613f0e85828601613dc6565b9250506020613f1f85828601613e1a565b9150509250929050565b600080600060608486031215613f3e57600080fd5b600084013567ffffffffffffffff811115613f5857600080fd5b613f6486828701613dc6565b9350506020613f7586828701613e1a565b925050604084013567ffffffffffffffff811115613f9257600080fd5b613f9e86828701613d72565b9150509250925092565b600080600060608486031215613fbd57600080fd5b600084013567ffffffffffffffff811115613fd757600080fd5b613fe386828701613dc6565b9350506020613ff486828701613e1a565b925050604061400586828701613e1a565b9150509250925092565b600061401b838361417d565b60208301905092915050565b6000614033838361418c565b60208301905092915050565b600061404b8383614a06565b905092915050565b600061405e82614f7d565b6140688185614fdc565b935061407383614f53565b8060005b838110156140a457815161408b888261400f565b975061409683614fb5565b925050600181019050614077565b5085935050505092915050565b6140ba81614f88565b6140c48184614fed565b92506140cf82614f63565b8060005b838110156141005781516140e78782614027565b96506140f283614fc2565b9250506001810190506140d3565b505050505050565b600061411382614f94565b61411d8185614ff8565b93508360208202850161412f85614f6d565b8060005b8581101561416b578484038952815161414c858261403f565b945061415783614fcf565b925060208a01995050600181019050614133565b50829750879550505050505092915050565b61418681615048565b82525050565b61419581615054565b82525050565b6141a48161509b565b82525050565b6141b38161509b565b82525050565b60006141c482614faa565b6141ce818561502b565b93506141de8185602086016150bc565b80840191505092915050565b60006141f582614f9f565b6141ff8185615009565b935061420f8185602086016150bc565b614218816150ef565b840191505092915050565b600061422e82614f9f565b614238818561502b565b93506142488185602086016150bc565b80840191505092915050565b600061426160188361501a565b91507f496e636f7272656374206368756e6b20706f736974696f6e00000000000000006000830152602082019050919050565b60006142a160158361501a565b91507f4469726563746f7279206e6f74206372656174656400000000000000000000006000830152602082019050919050565b60006142e160248361501a565b91507f4e6f7420656e6f756768206d656d6f727920696e207468652046696c6573746f60008301527f72616765000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614347601b8361501a565b91507f48617368206861736e2774206265656e2063616c63756c6174656400000000006000830152602082019050919050565b600061438760198361501a565b91507f4368756e6b20697320616c72656164792075706c6f61646564000000000000006000830152602082019050919050565b60006143c760168361501a565b91507f496e636f7272656374206368756e6b206c656e677468000000000000000000006000830152602082019050919050565b6000614407600f8361501a565b91507f46696c65206e6f742065786973747300000000000000000000000000000000006000830152602082019050919050565b6000614447600e8361501a565b91507f496e76616c69642073656e6465720000000000000000000000000000000000006000830152602082019050919050565b600061448760188361501a565b91507f4469726563746f7279206973206e6f742064656c6574656400000000000000006000830152602082019050919050565b60006144c760108361501a565b91507f46696c65206e6f742064656c65746564000000000000000000000000000000006000830152602082019050919050565b600061450760138361501a565b91507f496e76616c69642073746f7261676550617468000000000000000000000000006000830152602082019050919050565b6000614547600c8361501a565b91507f496e76616c6964207061746800000000000000000000000000000000000000006000830152602082019050919050565b600061458760018361502b565b91507f2e000000000000000000000000000000000000000000000000000000000000006000830152600182019050919050565b60006145c760168361501a565b91507f496e76616c6964206469726563746f7279206e616d65000000000000000000006000830152602082019050919050565b600061460760158361501a565b91507f4368756e6b207761736e27742075706c6f6164656400000000000000000000006000830152602082019050919050565b600061464760268361501a565b91507f436f756c64206e6f742072657365727665206c657373207468616e207573656460008301527f20737061636500000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006146ad60168361501a565b91507f4469726563746f7279206973206e6f7420656d707479000000000000000000006000830152602082019050919050565b60006146ed60238361501a565b91507f46696c65206861736e2774206265656e2075706c6f6164656420636f7272656360008301527f746c7900000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061475360118361501a565b91507f4368756e6b207761736e277420726561640000000000000000000000000000006000830152602082019050919050565b600061479360188361501a565b91507f46696c656e616d652073686f756c64206265203c2032353600000000000000006000830152602082019050919050565b60006147d3601f8361501a565b91507f46696c652073686f756c64206265206c657373207468616e20313030204d42006000830152602082019050919050565b600061481360028361502b565b91507f2e2e0000000000000000000000000000000000000000000000000000000000006000830152600282019050919050565b600061485360118361501a565b91507f4469726563746f72792069732066756c6c0000000000000000000000000000006000830152602082019050919050565b6000614893600e8361501a565b91507f46696c65206e6f7420666f756e640000000000000000000000000000000000006000830152602082019050919050565b60006148d360188361501a565b91507f46696c65206f72206469726563746f72792065786973747300000000000000006000830152602082019050919050565b600061491360198361501a565b91507f4e6f7420656e6f756768207265736572766564207370616365000000000000006000830152602082019050919050565b600061495360188361501a565b91507f45564d206572726f7220696e2067657446696c6553697a6500000000000000006000830152602082019050919050565b600061499360108361501a565b91507f46696c65206e6f742063726561746564000000000000000000000000000000006000830152602082019050919050565b60006149d360198361501a565b91507f46696c65206861736e2774206265656e2075706c6f61646564000000000000006000830152602082019050919050565b600060a0830160008301518482036000860152614a2382826141ea565b9150506020830151614a38602086018261417d565b506040830151614a4b6040860182614a83565b506060830151614a5e606086018261419b565b5060808301518482036080860152614a768282614053565b9150508091505092915050565b614a8c81615091565b82525050565b614a9b81615091565b82525050565b6000614aad8284614223565b915081905092915050565b6000614ac482846141b9565b915081905092915050565b6000614ada8261457a565b9150819050919050565b6000614aef82614806565b9150819050919050565b60006210000082019050614b1060008301846140b1565b92915050565b60006020820190508181036000830152614b308184614108565b905092915050565b6000602082019050614b4d60008301846141aa565b92915050565b60006020820190508181036000830152614b6c81614254565b9050919050565b60006020820190508181036000830152614b8c81614294565b9050919050565b60006020820190508181036000830152614bac816142d4565b9050919050565b60006020820190508181036000830152614bcc8161433a565b9050919050565b60006020820190508181036000830152614bec8161437a565b9050919050565b60006020820190508181036000830152614c0c816143ba565b9050919050565b60006020820190508181036000830152614c2c816143fa565b9050919050565b60006020820190508181036000830152614c4c8161443a565b9050919050565b60006020820190508181036000830152614c6c8161447a565b9050919050565b60006020820190508181036000830152614c8c816144ba565b9050919050565b60006020820190508181036000830152614cac816144fa565b9050919050565b60006020820190508181036000830152614ccc8161453a565b9050919050565b60006020820190508181036000830152614cec816145ba565b9050919050565b60006020820190508181036000830152614d0c816145fa565b9050919050565b60006020820190508181036000830152614d2c8161463a565b9050919050565b60006020820190508181036000830152614d4c816146a0565b9050919050565b60006020820190508181036000830152614d6c816146e0565b9050919050565b60006020820190508181036000830152614d8c81614746565b9050919050565b60006020820190508181036000830152614dac81614786565b9050919050565b60006020820190508181036000830152614dcc816147c6565b9050919050565b60006020820190508181036000830152614dec81614846565b9050919050565b60006020820190508181036000830152614e0c81614886565b9050919050565b60006020820190508181036000830152614e2c816148c6565b9050919050565b60006020820190508181036000830152614e4c81614906565b9050919050565b60006020820190508181036000830152614e6c81614946565b9050919050565b60006020820190508181036000830152614e8c81614986565b9050919050565b60006020820190508181036000830152614eac816149c6565b9050919050565b6000602082019050614ec86000830184614a92565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614ef157600080fd5b8060405250919050565b600067ffffffffffffffff821115614f1257600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614f3e57600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050919050565b6000819050602082019050919050565b600081519050919050565b60006180009050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061504182615071565b9050919050565b60008115159050919050565b6000819050919050565b600081905061506c82615100565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006150a68261505e565b9050919050565b82818337600083830152505050565b60005b838110156150da5780820151818401526020810190506150bf565b838111156150e9576000848401525b50505050565b6000601f19601f8301169050919050565b6003811061510a57fe5b50565b61511681615036565b811461512157600080fd5b50565b61512d81615091565b811461513857600080fd5b5056fea2646970667358221220a549ad9e778ae8bb3048c0a1805e77745871cc1560637ae1c3ebccb76638d9c464736f6c63430006020033", + "nonce": "0", + "storage": {} + }, + "0xa096b05a489831db893fc53aacc7ed20efb36382": { + "balance": "1000000000000000000000000000000" + }, + "0xa1cd651d99283be60e2a9d2e3bc8a90aedb8244f": { + "balance": "1000000000000000000000000000000" + }, + "0xa2969e82619021ea407338f8bdf7c6f2bd679673": { + "balance": "1000000000000000000000000000000" + }, + "0xa3597b1162b6559cb5e966904b63e762ece756a4": { + "balance": "1000000000000000000000000000000" + }, + "0xa68f946090c600eda6f139783077ee802afeb990": { + "balance": "1000000000000000000000000000000" + }, + "0xa6d50055592cecb795bc1ed3b9ea57ed426b0b7c": { + "balance": "1000000000000000000000000000000" + }, + "0xa7c0789bdeee38c6b59111a789dfb6b815489847": { + "balance": "1000000000000000000000000000000" + }, + "0xa8c813ee806b4c8537ff5f16084d44db18ea9ab1": { + "balance": "1000000000000000000000000000000" + }, + "0xaa6a87bbb74bc1f3cb40c1efb7fc171ee6407560": { + "balance": "1000000000000000000000000000000" + }, + "0xabf920b89f5a2487fdb70be17fd01a99a0602e62": { + "balance": "1000000000000000000000000000000" + }, + "0xac5df92da5171ba24a9618018b4f79494040334b": { + "balance": "1000000000000000000000000000000" + }, + "0xaf97a8318a1a51d5daeeb9650024b63ee44f45bd": { + "balance": "1000000000000000000000000000000" + }, + "0xb28c45b98ae43a5e9ee5509c97ea037b5de5d6d9": { + "balance": "1000000000000000000000000000000" + }, + "0xb64989ab32b089da3da103b93e6781d6d5dd10b4": { + "balance": "1000000000000000000000000000000" + }, + "0xb67e6f4a21f93c250fa6ff0cb142bd14dd4ca8eb": { + "balance": "1000000000000000000000000000000" + }, + "0xb70603c505f85130b5b2e73cd82d196dfd7d8b5e": { + "balance": "1000000000000000000000000000000" + }, + "0xb942414cae2a1ab1056657b905845c0ab6b6280a": { + "balance": "1000000000000000000000000000000" + }, + "0xbee0e5c1961d51be9bd670876caa9c90ba7d9016": { + "balance": "1000000000000000000000000000000" + }, + "0xbf2d8cebdeeb8ad8fed7b2a75f35922106f8d75c": { + "balance": "1000000000000000000000000000000" + }, + "0xbf5aa678b969c0871e2fbcf09c3dbb5d5865ac1e": { + "balance": "1000000000000000000000000000000" + }, + "0xc12bcedd9bcad9120150122cd50f39576ecccc08": { + "balance": "1000000000000000000000000000000" + }, + "0xc2d3852f3292acb81bd164dbae5f1e2a87535150": { + "balance": "1000000000000000000000000000000" + }, + "0xc3820490201e94d76b44655d2df713fec29d9795": { + "balance": "1000000000000000000000000000000" + }, + "0xc58744e2eceefd45cc5469f0e0a708ad24ddbbdb": { + "balance": "1000000000000000000000000000000" + }, + "0xc7865200e8e51ba1c8d695f327deed432930f2cc": { + "balance": "1000000000000000000000000000000" + }, + "0xc8e4d709eb3eb335dc69c9fbf2d24d447cb86105": { + "balance": "1000000000000000000000000000000" + }, + "0xc98af661e44c5bf31d2f8bdff4bbf2808ed4e991": { + "balance": "1000000000000000000000000000000" + }, + "0xca4409573a5129a72edf85d6c51e26760fc9c903": { + "balance": "100000000000000000000000" + }, + "0xcc33e23b04b74f7ba8fbe315083182224af973fa": { + "balance": "1000000000000000000000000000000" + }, + "0xce1c62d0a77600fb2f959b4da76fcb9b3b9430a3": { + "balance": "1000000000000000000000000000000" + }, + "0xd1b6c947fb14060b38945584714491592e84875d": { + "balance": "1000000000000000000000000000000" + }, + "0xd23cd6a9ddcc3470300003621bbac1e06a7919d5": { + "balance": "1000000000000000000000000000000" + }, + "0xd2c5b39B4e735C17612Bb5a08FD024ccc5dBCb23": { + "balance": "100000000000000000000000" + }, + "0xd2cd302eb060e375a65d65946692a3ac2d838d35": { + "balance": "1000000000000000000000000000000" + }, + "0xd2e75c41ced8699e3176f6e335355701a2568b7b": { + "balance": "1000000000000000000000000000000" + }, + "0xd3d38f4cb0aeb4c7c2527ddaeec2ab3b910c8528": { + "balance": "1000000000000000000000000000000" + }, + "0xd5b561a27cca5049650a14ab93dbf1a20c0cefc1": { + "balance": "1000000000000000000000000000000" + }, + "0xd90045420b8abc37b3f9304ed2b385fc1b7fa8c5": { + "balance": "1000000000000000000000000000000" + }, + "0xd951bf4cff429062702a7d8699a5f0bf14845d9b": { + "balance": "1000000000000000000000000000000" + }, + "0xdc6a269c58e58a93a22b5df8cdf1af630c47481f": { + "balance": "1000000000000000000000000000000" + }, + "0xdc6d02ef4003a4f2d0ccff65ae1a2d8157fbb23e": { + "balance": "1000000000000000000000000000000" + }, + "0xde14aca36acc62c305a7ee571da37840a408e600": { + "balance": "1000000000000000000000000000000" + }, + "0xdee32ae508cf783f53ab8bc39d878fe323cdfae3": { + "balance": "1000000000000000000000000000000" + }, + "0xe083a100d51fc4f38aae4a3a68404c36ad96c612": { + "balance": "1000000000000000000000000000000" + }, + "0xe1607990ce800407e3c206e58de4917977181d4d": { + "balance": "1000000000000000000000000000000" + }, + "0xe25e5b63dfd4cf59b81eddf64f1195858634b8a6": { + "balance": "1000000000000000000000000000000" + }, + "0xe372377decb3bdc0c7f5272d38ce0ba2a54934fe": { + "balance": "1000000000000000000000000000000" + }, + "0xe3cc6ec63b5652d1594bc63bb293f4e80f76dbdd": { + "balance": "1000000000000000000000000000000" + }, + "0xe3da7c014286258944ab20a31e4d861b4c9262f1": { + "balance": "1000000000000000000000000000000" + }, + "0xe8b57f330d56081c856e618210fbedb414925ff0": { + "balance": "1000000000000000000000000000000" + }, + "0xe91ac72a568e752eb7c9f5235100586ce97c8cc1": { + "balance": "1000000000000000000000000000000" + }, + "0xf184c8c243a178c1748a0af45caedeca476105b4": { + "balance": "1000000000000000000000000000000" + }, + "0xf1a5912ff318aebf312cdb54c75642a9e632703c": { + "balance": "1000000000000000000000000000000" + }, + "0xf2197b153b4c9086fc5410431fbf7960d284c65e": { + "balance": "1000000000000000000000000000000" + }, + "0xf36620e71327f4a55d550d46e030ccf0c728f154": { + "balance": "1000000000000000000000000000000" + }, + "0xf9817fB82fc767aA9A4A97a1901676244b88ce0E": { + "balance": "100000000000000000000000" + }, + "0xfa723938fa8da1a8a2114ad409a11581761ee40d": { + "balance": "1000000000000000000000000000000" + }, + "0xfa7a8c69810eaf16a395d2a93b3ab51efeed2a1c": { + "balance": "1000000000000000000000000000000" + }, + "0xfaa1038074941571524934ba52d312e88b3577f5": { + "balance": "1000000000000000000000000000000" + }, + "0xfe14077c26a507496b7208384d459e21c49c4212": { + "balance": "1000000000000000000000000000000" + }, + "0xfe275c9b5ac792327da509b27eb9614196dfb07d": { + "balance": "1000000000000000000000000000000" + }, + "0xfe2c5aa110fff89361806ea7ee080bfffba0d3dd": { + "balance": "1000000000000000000000000000000" + }, + "0xfe3d4f1fc038f4f756ba44995129cd45c9e0e861": { + "balance": "1000000000000000000000000000000" + }, + "0xfee314cdc84ecfaa675e41b3559c0101e1eba6b8": { + "balance": "1000000000000000000000000000000" + } + }, + "genesis": { + "author": "0x0000000000000000000000000000000000000001", + "difficulty": "0x0", + "extraData": "0x11bbe8db4e347b4e8c937c1c8370e4b5ed33adb3db69cbdb7a38e1e50b1b82fa", + "gasLimit": "0xFFFFFFFFF", + "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000abc", + "nonce": "0x0000000000000042", + "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "timestamp": "0x00" + }, + "params": { + "EIP150ForkBlock": "0x00", + "EIP158ForkBlock": "0x00", + "accountStartNonce": "0x00", + "blockReward": "0x4563918244F40000", + "byzantiumForkBlock": "0x0", + "chainID": "0x12345", + "constantinopleForkBlock": "0x0", + "daoHardforkBlock": "0x0", + "difficultyBoundDivisor": "0x0800", + "durationLimit": "0x0d", + "externalGasDifficulty": "0x01", + "gasLimitBoundDivisor": "0x0400", + "homesteadForkBlock": "0x0", + "maxGasLimit": "0xFFFFFFFFF", + "maximumExtraDataSize": "0x20", + "minGasLimit": "0xFFFFFFFFF", + "minimumDifficulty": "0x0", + "networkID": "12313219", + "tieBreakingGas": false + }, + "sealEngine": "Ethash", + "skaleConfig": { + "nodeInfo": { + "basePort": 2131, + "bindIP": "0.0.0.0", + "collectionDuration": 10, + "collectionQueueSize": 2, + "db-path": "/tmp/test_eth_10_of_16", + "ecdsaKeyName": "", + "httpRpcPort": 2134, + "httpsRpcPort": 1239, + "logLevel": "info", + "logLevelProposal": "info", + "maxCacheSize": 2000, + "maxOpenLeveldbFiles": 25, + "minCacheSize": 1000, + "nodeID": 1610, + "nodeName": "Node1", + "rotateAfterBlock": 0, + "testSignatures": true, + "transactionQueueSize": 10000, + "wsRpcPort": 2133, + "wssRpcPort": 2138 + }, + "sChain": { + "EIP1559TransactionsPatchTimestamp": 1, + "contractStorageLimit": 10000000000, + "contractStoragePatchTimestamp": 1, + "contractStorageZeroValuePatchTimestamp": 1, + "correctForkInPowPatchTimestamp": 1, + "emptyBlockIntervalMs": 10000, + "fastConsensusPatchTimestamp": 1, + "flexibleDeploymentPatchTimestamp": 1, + "levelDBReopenIntervalMs": 1, + "multiTransactionMode": false, + "nodes": [ + { + "basePort": 1231, + "ip": "127.0.0.1", + "nodeID": 1601, + "publicKey": "", + "schainIndex": 1 + }, + { + "basePort": 1331, + "ip": "127.0.0.1", + "nodeID": 1602, + "publicKey": "", + "schainIndex": 2 + }, + { + "basePort": 1431, + "ip": "127.0.0.1", + "nodeID": 1603, + "publicKey": "", + "schainIndex": 3 + }, + { + "basePort": 1531, + "ip": "127.0.0.1", + "nodeID": 1604, + "publicKey": "", + "schainIndex": 4 + }, + { + "basePort": 1631, + "ip": "127.0.0.1", + "nodeID": 1605, + "publicKey": "", + "schainIndex": 5 + }, + { + "basePort": 1731, + "ip": "127.0.0.1", + "nodeID": 1606, + "publicKey": "", + "schainIndex": 6 + }, + { + "basePort": 1831, + "ip": "127.0.0.1", + "nodeID": 1607, + "publicKey": "", + "schainIndex": 7 + }, + { + "basePort": 1931, + "ip": "127.0.0.1", + "nodeID": 1608, + "publicKey": "", + "schainIndex": 8 + }, + { + "basePort": 2031, + "ip": "127.0.0.1", + "nodeID": 1609, + "publicKey": "", + "schainIndex": 9 + }, + { + "basePort": 2131, + "ip": "127.0.0.1", + "nodeID": 1610, + "publicKey": "", + "schainIndex": 10 + }, + { + "basePort": 2231, + "ip": "127.0.0.1", + "nodeID": 1611, + "publicKey": "", + "schainIndex": 11 + }, + { + "basePort": 2331, + "ip": "127.0.0.1", + "nodeID": 1612, + "publicKey": "", + "schainIndex": 12 + }, + { + "basePort": 2431, + "ip": "127.0.0.1", + "nodeID": 1613, + "publicKey": "", + "schainIndex": 13 + }, + { + "basePort": 2531, + "ip": "127.0.0.1", + "nodeID": 1614, + "publicKey": "", + "schainIndex": 14 + }, + { + "basePort": 2631, + "ip": "127.0.0.1", + "nodeID": 1615, + "publicKey": "", + "schainIndex": 15 + }, + { + "basePort": 2731, + "ip": "127.0.0.1", + "nodeID": 1616, + "publicKey": "", + "schainIndex": 16 + } + ], + "powCheckPatchTimestamp": 1, + "precompiledConfigPatchTimestamp": 1, + "pushZeroPatchTimestamp": 1, + "revertableFSPatchTimestamp": 1, + "schainID": 5, + "schainName": "TestChain", + "schainOwner": "0x907cd0881E50d359bb9Fd120B1A5A143b1C97De6", + "skipInvalidTransactionsPatchTimestamp": 1, + "storageDestructionPatchTimestamp": 1, + "verifyBlsSyncPatchTimestamp": 1, + "verifyDaSigsPatchTimestamp": 1 + } + }, + "unddos": { + "origins": [ + { + "ban_lengthy": 0, + "ban_peak": 0, + "max_calls_per_minute": 1000000000, + "max_calls_per_second": 1000000000, + "max_ws_conn": 65535, + "origin": [ + "*" + ] + } + ] + } +} \ No newline at end of file diff --git a/test/historicstate/configs/test_11_of_16.json b/test/historicstate/configs/test_11_of_16.json new file mode 100644 index 000000000..02d5f2feb --- /dev/null +++ b/test/historicstate/configs/test_11_of_16.json @@ -0,0 +1,910 @@ +{ + "accounts": { + "0000000000000000000000000000000000000001": { + "precompiled": { + "linear": { + "base": 3000, + "word": 0 + }, + "name": "ecrecover" + } + }, + "0000000000000000000000000000000000000002": { + "precompiled": { + "linear": { + "base": 60, + "word": 12 + }, + "name": "sha256" + } + }, + "0000000000000000000000000000000000000003": { + "precompiled": { + "linear": { + "base": 600, + "word": 120 + }, + "name": "ripemd160" + } + }, + "0000000000000000000000000000000000000004": { + "precompiled": { + "linear": { + "base": 15, + "word": 3 + }, + "name": "identity" + } + }, + "0000000000000000000000000000000000000005": { + "precompiled": { + "name": "modexp", + "startingBlock": "0x2dc6c0" + } + }, + "0000000000000000000000000000000000000006": { + "precompiled": { + "linear": { + "base": 500, + "word": 0 + }, + "name": "alt_bn128_G1_add", + "startingBlock": "0x2dc6c0" + } + }, + "0000000000000000000000000000000000000007": { + "precompiled": { + "linear": { + "base": 40000, + "word": 0 + }, + "name": "alt_bn128_G1_mul", + "startingBlock": "0x2dc6c0" + } + }, + "0000000000000000000000000000000000000008": { + "precompiled": { + "name": "alt_bn128_pairing_product", + "startingBlock": "0x2dc6c0" + } + }, + "000000000000000000000000000000000000000A": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "readChunk", + "startingBlock": "0x0" + } + }, + "000000000000000000000000000000000000000B": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "createFile", + "restrictAccess": [ + "69362535ec535F0643cBf62D16aDeDCAf32Ee6F7" + ], + "startingBlock": "0x0" + } + }, + "000000000000000000000000000000000000000C": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "uploadChunk", + "startingBlock": "0x0" + } + }, + "000000000000000000000000000000000000000D": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "getFileSize", + "startingBlock": "0x0" + } + }, + "000000000000000000000000000000000000000E": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "deleteFile", + "startingBlock": "0x0" + } + }, + "000000000000000000000000000000000000000F": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "createDirectory", + "startingBlock": "0x0" + } + }, + "0000000000000000000000000000000000000010": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "deleteDirectory", + "startingBlock": "0x0" + } + }, + "0x006d8e49ce0b9eb5646e34a4d91934801b9044fd": { + "balance": "1000000000000000000000000000000" + }, + "0x0150b461b06922a5030784ba888962c28bb1f188": { + "balance": "1000000000000000000000000000000" + }, + "0x03309956988ae70152ae4469daf99b0cac2306c5": { + "balance": "1000000000000000000000000000000" + }, + "0x06104a85a380895b6dd4030113806df2b044905e": { + "balance": "1000000000000000000000000000000" + }, + "0x079cf317ef40b16141784b6fabff812d64f7c0fd": { + "balance": "1000000000000000000000000000000" + }, + "0x0966454f51166c68b73b2865473c8fb2fcdefdd5": { + "balance": "1000000000000000000000000000000" + }, + "0x099452fedc71897880f584b1bc1706efc4e76e36": { + "balance": "1000000000000000000000000000000" + }, + "0x0aa6a44690ef52354e976990292cf9c5cd36ad59": { + "balance": "1000000000000000000000000000000" + }, + "0x0fbbe17a0e5a61ee3e8661f442d7f6b177c49820": { + "balance": "1000000000000000000000000000000" + }, + "0x1239fe658b410dbbac5bbd572035f5041542f9e5": { + "balance": "1000000000000000000000000000000" + }, + "0x12d5d7340a93be7be28ea7a3ae198242f8e1282c": { + "balance": "1000000000000000000000000000000" + }, + "0x137048b9fa4f1234d6519271b2c5ec64f480db0f": { + "balance": "1000000000000000000000000000000" + }, + "0x13867af77a63048e17380e39248ada90521e97e4": { + "balance": "1000000000000000000000000000000" + }, + "0x138ea4bdf0382c2deffd5b0bff0afe59f471467f": { + "balance": "1000000000000000000000000000000" + }, + "0x13d19c55ee0a212249d26b9d741ff6d7f416db01": { + "balance": "1000000000000000000000000000000" + }, + "0x157d38b52196b248e9fe6a2172e32ce2b8c078e6": { + "balance": "1000000000000000000000000000000" + }, + "0x16e8c390f8e576161cfe966f2c3e5dd303eb9039": { + "balance": "1000000000000000000000000000000" + }, + "0x194cb9991d3d94c43e400becf21dfea45e7b3b4c": { + "balance": "1000000000000000000000000000000" + }, + "0x1C9abe4ff0CcECa40fc404c74AB7d4923fEF8901": { + "balance": "100000000000000000000000" + }, + "0x1a66fc89809112c20aa76a993db712fa9e003e4e": { + "balance": "1000000000000000000000000000000" + }, + "0x1f1d6041e12a18cf1202019f146f2fc150915e8d": { + "balance": "1000000000000000000000000000000" + }, + "0x1feaf1671c1f0faf0d44c152f72dc755db932569": { + "balance": "1000000000000000000000000000000" + }, + "0x236bf02dfafaf03851a4e6f5d69052f4884cec32": { + "balance": "1000000000000000000000000000000" + }, + "0x26d88f6a8b659be4165ee53774a057e41b5201c9": { + "balance": "1000000000000000000000000000000" + }, + "0x28353685b0b986a724b92113debb3d8cd9a6b263": { + "balance": "1000000000000000000000000000000" + }, + "0x29d83322219fdfb821459d5fdf796360faf3166a": { + "balance": "1000000000000000000000000000000" + }, + "0x2bee474be207bdbeac83d6672da5ed2fd417eac9": { + "balance": "1000000000000000000000000000000" + }, + "0x2d93455b07bccf38e8d019f7f43a2c2d70b46b4e": { + "balance": "1000000000000000000000000000000" + }, + "0x2f971bd38806c3ca45ae0a125d1267118bf5619c": { + "balance": "1000000000000000000000000000000" + }, + "0x30aaab366dfac8331f3e827495c789cde9b437c0": { + "balance": "1000000000000000000000000000000" + }, + "0x32ea0400dc2d20664cc4744b2fab04ecb709445c": { + "balance": "1000000000000000000000000000000" + }, + "0x3760dc9594ccac0f33ade5cc5371402131696341": { + "balance": "1000000000000000000000000000000" + }, + "0x38855e430611bc179cd777a8704679ffc43921de": { + "balance": "1000000000000000000000000000000" + }, + "0x3a921471a2397644c37c88ef9572c421ab37145d": { + "balance": "1000000000000000000000000000000" + }, + "0x3bcca8a8471d55a1a668bc163c0336e4a57e5c99": { + "balance": "1000000000000000000000000000000" + }, + "0x3d46ee560227c1d73cd6042b47fc8fddd8a06ecb": { + "balance": "1000000000000000000000000000000" + }, + "0x3f5bdf5d4c274c82b8d17aa2810b00d2cf050f24": { + "balance": "1000000000000000000000000000000" + }, + "0x3ffe1c9183e0f97f52a816405a7d2350624ec88b": { + "balance": "1000000000000000000000000000000" + }, + "0x426ec5f07847674aada3856609d8baaa16805d88": { + "balance": "1000000000000000000000000000000" + }, + "0x482d7f53cba6ae73a354533673c48e2dfd560949": { + "balance": "1000000000000000000000000000000" + }, + "0x48acbd6a2724eadcc2a11144ab84b6a617d1a241": { + "balance": "1000000000000000000000000000000" + }, + "0x49ef89840e400026eb5c8d79bd1b0adc152fe86d": { + "balance": "1000000000000000000000000000000" + }, + "0x4bf989fa6572af36b190032505506f1db888357f": { + "balance": "1000000000000000000000000000000" + }, + "0x4cf9b195f7cb5f86694d9b399fe21a5f34616fd3": { + "balance": "1000000000000000000000000000000" + }, + "0x4e9b85904bca60aeb5b916ca86ac622096908427": { + "balance": "1000000000000000000000000000000" + }, + "0x50120c17d7b59200e9b76e89e4e3de2f0cd00090": { + "balance": "1000000000000000000000000000000" + }, + "0x54db355342c35085a1a53184162b2fddd0a43b0f": { + "balance": "1000000000000000000000000000000" + }, + "0x54e228d8fea148cfe2b109b3b152ff21321d09a2": { + "balance": "1000000000000000000000000000000" + }, + "0x5667601b7dcde6f24d06bccc4f291cb06976f4ee": { + "balance": "1000000000000000000000000000000" + }, + "0x57829f2ecca390cd9d1c41f92328bad4d1073bbb": { + "balance": "1000000000000000000000000000000" + }, + "0x5EF25557E2ed6AFfF321B266C93e95A0B4B05AbC": { + "balance": "1000000000000000000000000" + }, + "0x5a3adad4382b3eb1e0c65f2de2845901081039b5": { + "balance": "1000000000000000000000000000000" + }, + "0x5cdb7392efdce502ccc6fba5c3c1dd1653967b4d": { + "balance": "1000000000000000000000000000000" + }, + "0x5d012c13b2854bda8b7b6580e97e52751884f827": { + "balance": "1000000000000000000000000000000" + }, + "0x5d9326c6504833d84f8a0d65ded59b1a6e768ca2": { + "balance": "1000000000000000000000000000000" + }, + "0x60268f799d8f1808e4a32c2eb898e73a8881f6f0": { + "balance": "1000000000000000000000000000000" + }, + "0x605ba4a05d779f9869bd9a10234c22f516766cfe": { + "balance": "1000000000000000000000000000000" + }, + "0x6093f0f2a7b5148b71603ac439adbc4c0e5aa5da": { + "balance": "1000000000000000000000000000000" + }, + "0x6196d135CdDb9d73A0756C1E44b5b02B11acf594": { + "balance": "2000000000000000000000", + "code": "", + "nonce": "5076", + "storage": {} + }, + "0x62712ceccb50f62ca4c5402fff6da9c819c866cf": { + "balance": "1000000000000000000000000000000" + }, + "0x62971de462ea1ec0d3b43a6a85b6fb975e6c6f64": { + "balance": "1000000000000000000000000000000" + }, + "0x62cf32dfb9eb6358dc5deb006aef1d75fb153e5f": { + "balance": "1000000000000000000000000000000" + }, + "0x62d8b22c1d71577829b2fee20a5c3fff43aed0ec": { + "balance": "100000000000000000000000" + }, + "0x6314956b78bb2eaed1c49b3ae71d4d0ec501cfab": { + "balance": "1000000000000000000000000000000" + }, + "0x661bda4daeba3ce9ac2aa30b80d463580f90d31a": { + "balance": "1000000000000000000000000000000" + }, + "0x66c5a87f4a49DD75e970055A265E8dd5C3F8f852": { + "balance": "1000000000000000000000" + }, + "0x66cd465ddcd85504c0d2cfb1728acee994d55a3f": { + "balance": "1000000000000000000000000000000" + }, + "0x68bca79ae7aae796027ff843d2303444da5cf5d8": { + "balance": "1000000000000000000000000000000" + }, + "0x6923877b65e24966efa9efd1207822fa2eaf601a": { + "balance": "1000000000000000000000000000000" + }, + "0x69362535ec535F0643cBf62D16aDeDCAf32Ee6F7": { + "balance": "0", + "code": "0x608060405234801561001057600080fd5b50600436106100b45760003560e01c806379210e8e1161007157806379210e8e1461017757806381a8235a146101a757806385aeeb17146101c35780639a9a5593146101f3578063a99100541461020f578063b57321221461022b576100b4565b806307c6e7d3146100b9578063122f4fba146100d55780631c6ec7a9146101055780631cfe4e3b14610121578063373dedb41461013d57806361e46db51461015b575b600080fd5b6100d360048036036100ce9190810190613cff565b61025b565b005b6100ef60048036036100ea9190810190613cff565b610804565b6040516100fc9190614963565b60405180910390f35b61011f600480360361011a9190810190613cff565b610b43565b005b61013b60048036036101369190810190613cc3565b610f72565b005b610145611190565b6040516101529190614cbe565b60405180910390f35b61017560048036036101709190810190613d94565b611199565b005b610191600480360361018c9190810190613e13565b6113f9565b60405161019e9190614924565b60405180910390f35b6101c160048036036101bc9190810190613cff565b6116f9565b005b6101dd60048036036101d89190810190613cff565b61189e565b6040516101ea9190614941565b60405180910390f35b61020d60048036036102089190810190613d40565b611b9d565b005b61022960048036036102249190810190613cff565b61202c565b005b61024560048036036102409190810190613cff565b612682565b6040516102529190614cbe565b60405180910390f35b6000339050606061026b83612902565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b825181101561037c576000826001018460018403815181106102d557fe5b60200260200101516040516102ea91906148cc565b90815260200160405180910390205411610339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161033090614ade565b60405180910390fd5b8160020183600183038151811061034c57fe5b602002602001015160405161036191906148cc565b908152602001604051809103902091508060010190506102b7565b506060600183511161038e57846103a7565b8260018451038151811061039e57fe5b60200260200101515b9050600082600101826040516103bd91906148e3565b9081526020016040518091039020541161040c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161040390614ade565b60405180910390fd5b6000826002018260405161042091906148e3565b90815260200160405180910390206000018054905014610475576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161046c90614b5e565b60405180910390fd5b60006104818587612b02565b9050806104c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ba90614a7e565b60405180910390fd5b6104cb613888565b836000016001856000018054905003815481106104e457fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156105965780601f1061056b57610100808354040283529160200191610596565b820191906000526020600020905b81548152906001019060200180831161057957829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff1660028111156105e257fe5b60028111156105ed57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561066557602002820191906000526020600020906000905b82829054906101000a900460ff1615158152602001906001019060208260000104928301926001038202915080841161062f5790505b505050505081525050905080846000016001866001018660405161068991906148e3565b90815260200160405180910390205403815481106106a357fe5b906000526020600020906005020160008201518160000190805190602001906106cd9291906138c4565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561071c57fe5b0217905550608082015181600401908051906020019061073d929190613944565b50905050836001018360405161075391906148e3565b90815260200160405180910390205484600101826000015160405161077891906148cc565b9081526020016040518091039020819055506000846001018460405161079e91906148e3565b908152602001604051809103902081905550836000018054809190600190036107c791906139ea565b5083600201836040516107da91906148e3565b9081526020016040518091039020600080820160006107f99190613a1c565b505050505050505050565b600080606061081284612b66565b91509150606061082182612902565b90506000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b82518110156109065760008260010184600184038151811061088b57fe5b60200260200101516040516108a091906148cc565b90815260200160405180910390205414156108c357600095505050505050610b3e565b816002018360018303815181106108d657fe5b60200260200101516040516108eb91906148cc565b9081526020016040518091039020915080600101905061086d565b50606060018351116109185783610931565b8260018451038151811061092857fe5b60200260200101515b90506000826001018260405161094791906148e3565b908152602001604051809103902054141561096a57600095505050505050610b3e565b610972613888565b826000016001846001018460405161098a91906148e3565b90815260200160405180910390205403815481106109a457fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610a565780601f10610a2b57610100808354040283529160200191610a56565b820191906000526020600020905b815481529060010190602001808311610a3957829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115610aa257fe5b6002811115610aad57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015610b2557602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411610aef5790505b5050505050815250509050806060015196505050505050505b919050565b600160009054906101000a900460ff16610b85576120006002819055506210000060038190555060018060006101000a81548160ff0219169083151502179055505b6000815111610bc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc090614ade565b60405180910390fd5b60003390506060610bd983612902565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015610cea57600082600101846001840381518110610c4357fe5b6020026020010151604051610c5891906148cc565b90815260200160405180910390205411610ca7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9e90614ade565b60405180910390fd5b81600201836001830381518110610cba57fe5b6020026020010151604051610ccf91906148cc565b90815260200160405180910390209150806001019050610c25565b50600254816000018054905010610d36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2d90614bfe565b60405180910390fd5b60606001835111610d475784610d60565b82600184510381518110610d5757fe5b60200260200101515b905060008260010182604051610d7691906148e3565b90815260200160405180910390205414610dc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbc90614c3e565b60405180910390fd5b610dce81612ee8565b610e0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0490614afe565b60405180910390fd5b6000610e198587612fc9565b905080610e5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e529061499e565b60405180910390fd5b610e63613888565b82816000018190525060008160200190151590811515815250508360000181908060018154018082558091505090600182039060005260206000209060050201600090919290919091506000820151816000019080519060200190610ec99291906138c4565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff02191690836002811115610f1857fe5b02179055506080820151816004019080519060200190610f39929190613944565b5050505083600001805490508460010184604051610f5791906148e3565b90815260200160405180910390208190555050505050505050565b610f7a61302d565b73ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161480610fdf57503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614155b61101e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101590614a5e565b60405180910390fd5b80600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411156110a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109790614b3e565b60405180910390fd5b600054600754820111156110e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e0906149be565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460076000828254039250508190555080600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550806007600082825401925050819055505050565b60008054905090565b600033905060006111aa82866130c6565b9050600160028111156111b957fe5b8160030160009054906101000a900460ff1660028111156111d657fe5b14611216576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120d90614c1e565b60405180910390fd5b6000600354858161122357fe5b061480156112345750806002015484105b611273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126a9061497e565b60405180910390fd5b600354848260020154031080156112905750838160020154038351145b8061129d57506003548351145b6112dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d390614a1e565b60405180910390fd5b600015158160040160035486816112ef57fe5b04815481106112fa57fe5b90600052602060002090602091828204019190069054906101000a900460ff1615151461135c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611353906149fe565b60405180910390fd5b600061136a838787876132c5565b9050806113ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a390614b1e565b60405180910390fd5b60018260040160035487816113bd57fe5b04815481106113c857fe5b90600052602060002090602091828204019190066101000a81548160ff021916908315150217905550505050505050565b611401613a40565b6000606061140e86612b66565b9150915061141a613888565b61142483836130c6565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156114c85780601f1061149d576101008083540402835291602001916114c8565b820191906000526020600020905b8154815290600101906020018083116114ab57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561151457fe5b600281111561151f57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561159757602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116115615790505b50505050508152505090506002808111156115ae57fe5b816060015160028111156115be57fe5b146115fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f590614c9e565b60405180910390fd5b60035485111580156116105750600085115b61164f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164690614a1e565b60405180910390fd5b80604001518587011115611698576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168f9061497e565b60405180910390fd5b60006116a684848989613376565b8096508192505050806116ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e590614b9e565b60405180910390fd5b505050509392505050565b6000339050600061170a82846130c6565b90506001600281111561171957fe5b8160030160009054906101000a900460ff16600281111561173657fe5b14611776576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176d90614c1e565b60405180910390fd5b60006001905060008260040180549050905060008090505b818110156117e157600015158460040182815481106117a957fe5b90600052602060002090602091828204019190069054906101000a900460ff16151514156117d657600092505b80600101905061178e565b5081611822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181990614b7e565b60405180910390fd5b60028360030160006101000a81548160ff0219169083600281111561184357fe5b021790555060006118548587613409565b905080611896576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188d906149de565b60405180910390fd5b505050505050565b6060600060606118ad84612b66565b9150915060606118bc82612902565b90506000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008090505b82518110156119c65760008260010184838151811061192257fe5b602002602001015160405161193791906148cc565b90815260200160405180910390205411611986576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197d90614ade565b60405180910390fd5b8160020183828151811061199657fe5b60200260200101516040516119ab91906148cc565b90815260200160405180910390209150806001019050611907565b5080600001805480602002602001604051908101604052809291908181526020016000905b82821015611b8e57838290600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611aa75780601f10611a7c57610100808354040283529160200191611aa7565b820191906000526020600020905b815481529060010190602001808311611a8a57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115611af357fe5b6002811115611afe57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015611b7657602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411611b405790505b505050505081525050815260200190600101906119eb565b50505050945050505050919050565b600160009054906101000a900460ff16611bdf576120006002819055506210000060038190555060018060006101000a81548160ff0219169083151502179055505b60003390506305f5e100821115611c2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2290614bde565b60405180910390fd5b6060611c3684612902565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015611d4757600082600101846001840381518110611ca057fe5b6020026020010151604051611cb591906148cc565b90815260200160405180910390205411611d04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cfb90614ade565b60405180910390fd5b81600201836001830381518110611d1757fe5b6020026020010151604051611d2c91906148cc565b90815260200160405180910390209150806001019050611c82565b5060606001835111611d595785611d72565b82600184510381518110611d6957fe5b60200260200101515b905060008260010182604051611d8891906148e3565b90815260200160405180910390205414611dd7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dce90614c3e565b60405180910390fd5b611de081612ee8565b611e1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1690614bbe565b60405180910390fd5b6000611e2c85888861346d565b905080611e6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6590614c7e565b60405180910390fd5b6060600354600160035489010381611e8257fe5b04604051908082528060200260200182016040528015611eb15781602001602082028038833980820191505090505b509050836000016040518060a0016040528085815260200160011515815260200189815260200160016002811115611ee557fe5b815260200183815250908060018154018082558091505090600182039060005260206000209060050201600090919290919091506000820151816000019080519060200190611f359291906138c4565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff02191690836002811115611f8457fe5b02179055506080820151816004019080519060200190611fa5929190613944565b5050505083600001805490508460010184604051611fc391906148e3565b90815260200160405180910390208190555086600560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505050505050505050565b6000339050612039613888565b61204382846130c6565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156120e75780601f106120bc576101008083540402835291602001916120e7565b820191906000526020600020905b8154815290600101906020018083116120ca57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561213357fe5b600281111561213e57fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156121b657602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116121805790505b5050505050815250509050600060028111156121ce57fe5b816060015160028111156121de57fe5b141561221f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221690614a3e565b60405180910390fd5b600061222b83856134da565b90508061226d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226490614a9e565b60405180910390fd5b606061227885612902565b90506000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b825181101561231057816002018360018303815181106122e057fe5b60200260200101516040516122f591906148cc565b908152602001604051809103902091508060010190506122c4565b506000600182600101866000015160405161232b91906148cc565b908152602001604051809103902054039050612345613888565b8260000160018460000180549050038154811061235e57fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156124105780601f106123e557610100808354040283529160200191612410565b820191906000526020600020905b8154815290600101906020018083116123f357829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561245c57fe5b600281111561246757fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156124df57602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116124a95790505b5050505050815250509050808360000183815481106124fa57fe5b906000526020600020906005020160008201518160000190805190602001906125249291906138c4565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561257357fe5b02179055506080820151816004019080519060200190612594929190613944565b50905050826000018054809190600190036125af91906139ea565b508260010186600001516040516125c691906148cc565b9081526020016040518091039020548360010182600001516040516125eb91906148cc565b908152602001604051809103902081905550600083600101876000015160405161261591906148cc565b9081526020016040518091039020819055508560400151600560008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505050505050505050565b600080606061269084612b66565b9150915061269c613888565b6126a683836130c6565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561274a5780601f1061271f5761010080835404028352916020019161274a565b820191906000526020600020905b81548152906001019060200180831161272d57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561279657fe5b60028111156127a157fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561281957602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116127e35790505b50505050508152505090506001600281111561283157fe5b8160600151600281111561284157fe5b1480612866575060028081111561285457fe5b8160600151600281111561286457fe5b145b6128a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161289c90614c1e565b60405180910390fd5b60006128b1848461353e565b8096508192505050806128f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128f090614c5e565b60405180910390fd5b50505050919050565b606061290c613a65565b612915836135a7565b905061291f613a65565b61295d6040518060400160405280600181526020017f2f000000000000000000000000000000000000000000000000000000000000008152506135a7565b90506060600161297683856135d590919063ffffffff16565b016040519080825280602002602001820160405280156129aa57816020015b60608152602001906001900390816129955790505b50905060008090505b81518110156129fb576129d76129d2848661364a90919063ffffffff16565b613664565b8282815181106129e357fe5b602002602001018190525080806001019150506129b3565b50600081600183510381518110612a0e57fe5b6020026020010151511415612a795780600182510381518110612a2d57fe5b6020026020010160608152506001815103604051908082528060200260200182016040528015612a7157816020015b6060815260200190600190039081612a5c5790505b509350612ab2565b8051604051908082528060200260200182016040528015612aae57816020015b6060815260200190600190039081612a995790505b5093505b60008090505b8451811015612af957818181518110612acd57fe5b6020026020010151858281518110612ae157fe5b60200260200101819052508080600101915050612ab8565b50505050919050565b60008060016020601f85510181612b1557fe5b040190506040518481526020810160005b83811015612b47578060200286015181602002830152806001019050612b26565b50602082602085026040018460006010600019f1935050505092915050565b6000606060006028905080845111612bb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612baa90614abe565b60405180910390fd5b6060816040519080825280601f01601f191660200182016040528015612be85781602001600182028038833980820191505090505b50905060008090505b82811015612c5857858181518110612c0557fe5b602001015160f81c60f81b828281518110612c1c57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050612bf1565b50600080905060008090505b83811015612d87576000838281518110612c7a57fe5b602001015160f81c60f81b60f81c60ff16905060308110158015612c9f575060398111155b80612cb8575060418110158015612cb75750605a8111155b5b80612cd1575060618110158015612cd0575060668111155b5b612d10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d0790614abe565b60405180910390fd5b60308110158015612d22575060398111155b15612d335760308103601084020192505b60418110158015612d455750605a8111155b15612d565760378103601084020192505b60618110158015612d68575060668111155b15612d795760578103601084020192505b508080600101915050612c64565b508094507f2f00000000000000000000000000000000000000000000000000000000000000868481518110612db857fe5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612e25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e1c90614abe565b60405180910390fd5b6000600184885103039050806040519080825280601f01601f191660200182016040528015612e635781602001600182028038833980820191505090505b50945060008090505b81811015612ede5760008860018784010181518110612e8757fe5b602001015160f81c60f81b905080878381518110612ea157fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350508080600101915050612e6c565b5050505050915091565b6000604051602001612ef99061490f565b6040516020818303038152906040528051906020012082604051602001612f2091906148e3565b604051602081830303815290604052805190602001201480612f8b5750604051602001612f4c906148fa565b6040516020818303038152906040528051906020012082604051602001612f7391906148e3565b60405160208183030381529060405280519060200120145b80612f97575060008251145b15612fa55760009050612fc4565b60008251905060ff811115612fbe576000915050612fc4565b60019150505b919050565b60008060016020601f85510181612fdc57fe5b040190506040518481526020810160005b8381101561300e578060200286015181602002830152806001019050612fed565b5060208260208502604001846000600f600019f1935050505092915050565b600073d2001000000000000000000000000000000000d273ffffffffffffffffffffffffffffffffffffffff166383e781fe6040518163ffffffff1660e01b815260040160206040518083038186803b15801561308957600080fd5b505afa15801561309d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506130c19190810190613c9a565b905090565b600060606130d383612902565b90506000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b82518110156131e45760008260010184600184038151811061313d57fe5b602002602001015160405161315291906148cc565b908152602001604051809103902054116131a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161319890614ade565b60405180910390fd5b816002018360018303815181106131b457fe5b60200260200101516040516131c991906148cc565b9081526020016040518091039020915080600101905061311f565b50606060018351116131f6578461320f565b8260018451038151811061320657fe5b60200260200101515b90506000826001018260405161322591906148e3565b90815260200160405180910390205411613274576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161326b90614ade565b60405180910390fd5b6000826000016001846001018460405161328e91906148e3565b90815260200160405180910390205403815481106132a857fe5b906000526020600020906005020190508094505050505092915050565b60008060016020601f855101816132d857fe5b04019050600060016020601f885101816132ee57fe5b040190506040518781526020810160005b838110156133205780602002890151816020028301528060010190506132ff565b50868360200282015260005b84811015613352578060200287015181856001010160200283015280600101905061332c565b50602082848601602002606001846000600c600019f1945050505050949350505050565b6000613380613a40565b600060016020601f8851018161339257fe5b0401905060006020601f8601816133a557fe5b0490506040518881526020810160005b848110156133d657806020028a0151816020028301528060010190506133b5565b5083602002810188815287816020015283602002868660030160200285600a600019fa9650505050505094509492505050565b60008060016020601f8551018161341c57fe5b040190506040518481526020810160005b8381101561344e57806020028601518160200283015280600101905061342d565b50602082602085026040018460006011600019f1935050505092915050565b60008060016020601f8651018161348057fe5b040190506040518581526020810160005b838110156134b2578060200287015181602002830152806001019050613491565b50846020840282015260208260208502604001846000600b600019f193505050509392505050565b60008060016020601f855101816134ed57fe5b040190506040518481526020810160005b8381101561351f5780602002860151816020028301528060010190506134fe565b5060208260208502604001846000600e600019f1935050505092915050565b600080600060016020601f8651018161355357fe5b040190506040518581526020810160005b83811015613585578060200287015181602002830152806001019050613564565b506020826020850260200184600d600019fa9450815193505050509250929050565b6135af613a65565b600060208301905060405180604001604052808451815260200182815250915050919050565b60008082600001516135f985600001518660200151866000015187602001516136c6565b0190505b83600001518460200151018111613643578180600101925050826000015161363b8560200151830386600001510383866000015187602001516136c6565b0190506135fd565b5092915050565b613652613a65565b61365d8383836137a1565b5092915050565b60608082600001516040519080825280601f01601f19166020018201604052801561369e5781602001600182028038833980820191505090505b50905060006020820190506136bc818560200151866000015161383f565b8192505050919050565b6000808490506000868511613791576020851161374b57600060018660200360080260020a031960001b905060008186511690506000878a8a0103905060008386511690505b82811461373d5781861061372a578a8a019650505050505050613799565b858060010196505083865116905061370c565b859650505050505050613799565b60008585209050600091505b858803821161378f57600086842090508082141561377b5783945050505050613799565b600184019350508180600101925050613757565b505b868601925050505b949350505050565b6137a9613a65565b60006137c785600001518660200151866000015187602001516136c6565b90508460200151836020018181525050846020015181038360000181815250508460000151856020015101811415613809576000856000018181525050613834565b8360000151836000015101856000018181510391508181525050836000015181018560200181815250505b829150509392505050565b5b602081106138635781518352602083019250602082019150602081039050613840565b60006001826020036101000a0390508019835116818551168181178652505050505050565b6040518060a001604052806060815260200160001515815260200160008152602001600060028111156138b757fe5b8152602001606081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061390557805160ff1916838001178555613933565b82800160010185558215613933579182015b82811115613932578251825591602001919060010190613917565b5b5090506139409190613a7f565b5090565b82805482825590600052602060002090601f016020900481019282156139d95791602002820160005b838211156139aa57835183826101000a81548160ff021916908315150217905550926020019260010160208160000104928301926001030261396d565b80156139d75782816101000a81549060ff02191690556001016020816000010492830192600103026139aa565b505b5090506139e69190613aa4565b5090565b815481835581811115613a1757600502816005028360005260206000209182019101613a169190613ad4565b5b505050565b5080546000825560050290600052602060002090810190613a3d9190613ad4565b50565b6040518062100000016040528061800090602082028038833980820191505090505090565b604051806040016040528060008152602001600081525090565b613aa191905b80821115613a9d576000816000905550600101613a85565b5090565b90565b613ad191905b80821115613acd57600081816101000a81549060ff021916905550600101613aaa565b5090565b90565b613b4091905b80821115613b3c5760008082016000613af39190613b43565b6001820160006101000a81549060ff021916905560028201600090556003820160006101000a81549060ff0219169055600482016000613b339190613b8b565b50600501613ada565b5090565b90565b50805460018160011615610100020316600290046000825580601f10613b695750613b88565b601f016020900490600052602060002090810190613b879190613a7f565b5b50565b50805460008255601f016020900490600052602060002090810190613bb09190613a7f565b50565b600081359050613bc281614f18565b92915050565b600081519050613bd781614f18565b92915050565b600082601f830112613bee57600080fd5b8135613c01613bfc82614d06565b614cd9565b91508082526020830160208301858383011115613c1d57600080fd5b613c28838284614eb8565b50505092915050565b600082601f830112613c4257600080fd5b8135613c55613c5082614d32565b614cd9565b91508082526020830160208301858383011115613c7157600080fd5b613c7c838284614eb8565b50505092915050565b600081359050613c9481614f2f565b92915050565b600060208284031215613cac57600080fd5b6000613cba84828501613bc8565b91505092915050565b60008060408385031215613cd657600080fd5b6000613ce485828601613bb3565b9250506020613cf585828601613c85565b9150509250929050565b600060208284031215613d1157600080fd5b600082013567ffffffffffffffff811115613d2b57600080fd5b613d3784828501613c31565b91505092915050565b60008060408385031215613d5357600080fd5b600083013567ffffffffffffffff811115613d6d57600080fd5b613d7985828601613c31565b9250506020613d8a85828601613c85565b9150509250929050565b600080600060608486031215613da957600080fd5b600084013567ffffffffffffffff811115613dc357600080fd5b613dcf86828701613c31565b9350506020613de086828701613c85565b925050604084013567ffffffffffffffff811115613dfd57600080fd5b613e0986828701613bdd565b9150509250925092565b600080600060608486031215613e2857600080fd5b600084013567ffffffffffffffff811115613e4257600080fd5b613e4e86828701613c31565b9350506020613e5f86828701613c85565b9250506040613e7086828701613c85565b9150509250925092565b6000613e868383613fe8565b60208301905092915050565b6000613e9e8383613ff7565b60208301905092915050565b6000613eb68383614831565b905092915050565b6000613ec982614d88565b613ed38185614de7565b9350613ede83614d5e565b8060005b83811015613f0f578151613ef68882613e7a565b9750613f0183614dc0565b925050600181019050613ee2565b5085935050505092915050565b613f2581614d93565b613f2f8184614df8565b9250613f3a82614d6e565b8060005b83811015613f6b578151613f528782613e92565b9650613f5d83614dcd565b925050600181019050613f3e565b505050505050565b6000613f7e82614d9f565b613f888185614e03565b935083602082028501613f9a85614d78565b8060005b85811015613fd65784840389528151613fb78582613eaa565b9450613fc283614dda565b925060208a01995050600181019050613f9e565b50829750879550505050505092915050565b613ff181614e53565b82525050565b61400081614e5f565b82525050565b61400f81614ea6565b82525050565b61401e81614ea6565b82525050565b600061402f82614db5565b6140398185614e36565b9350614049818560208601614ec7565b80840191505092915050565b600061406082614daa565b61406a8185614e14565b935061407a818560208601614ec7565b61408381614efa565b840191505092915050565b600061409982614daa565b6140a38185614e36565b93506140b3818560208601614ec7565b80840191505092915050565b60006140cc601883614e25565b91507f496e636f7272656374206368756e6b20706f736974696f6e00000000000000006000830152602082019050919050565b600061410c601583614e25565b91507f4469726563746f7279206e6f74206372656174656400000000000000000000006000830152602082019050919050565b600061414c602483614e25565b91507f4e6f7420656e6f756768206d656d6f727920696e207468652046696c6573746f60008301527f72616765000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006141b2601b83614e25565b91507f48617368206861736e2774206265656e2063616c63756c6174656400000000006000830152602082019050919050565b60006141f2601983614e25565b91507f4368756e6b20697320616c72656164792075706c6f61646564000000000000006000830152602082019050919050565b6000614232601683614e25565b91507f496e636f7272656374206368756e6b206c656e677468000000000000000000006000830152602082019050919050565b6000614272600f83614e25565b91507f46696c65206e6f742065786973747300000000000000000000000000000000006000830152602082019050919050565b60006142b2600e83614e25565b91507f496e76616c69642073656e6465720000000000000000000000000000000000006000830152602082019050919050565b60006142f2601883614e25565b91507f4469726563746f7279206973206e6f742064656c6574656400000000000000006000830152602082019050919050565b6000614332601083614e25565b91507f46696c65206e6f742064656c65746564000000000000000000000000000000006000830152602082019050919050565b6000614372601383614e25565b91507f496e76616c69642073746f7261676550617468000000000000000000000000006000830152602082019050919050565b60006143b2600c83614e25565b91507f496e76616c6964207061746800000000000000000000000000000000000000006000830152602082019050919050565b60006143f2600183614e36565b91507f2e000000000000000000000000000000000000000000000000000000000000006000830152600182019050919050565b6000614432601683614e25565b91507f496e76616c6964206469726563746f7279206e616d65000000000000000000006000830152602082019050919050565b6000614472601583614e25565b91507f4368756e6b207761736e27742075706c6f6164656400000000000000000000006000830152602082019050919050565b60006144b2602683614e25565b91507f436f756c64206e6f742072657365727665206c657373207468616e207573656460008301527f20737061636500000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614518601683614e25565b91507f4469726563746f7279206973206e6f7420656d707479000000000000000000006000830152602082019050919050565b6000614558602383614e25565b91507f46696c65206861736e2774206265656e2075706c6f6164656420636f7272656360008301527f746c7900000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006145be601183614e25565b91507f4368756e6b207761736e277420726561640000000000000000000000000000006000830152602082019050919050565b60006145fe601883614e25565b91507f46696c656e616d652073686f756c64206265203c2032353600000000000000006000830152602082019050919050565b600061463e601f83614e25565b91507f46696c652073686f756c64206265206c657373207468616e20313030204d42006000830152602082019050919050565b600061467e600283614e36565b91507f2e2e0000000000000000000000000000000000000000000000000000000000006000830152600282019050919050565b60006146be601183614e25565b91507f4469726563746f72792069732066756c6c0000000000000000000000000000006000830152602082019050919050565b60006146fe600e83614e25565b91507f46696c65206e6f7420666f756e640000000000000000000000000000000000006000830152602082019050919050565b600061473e601883614e25565b91507f46696c65206f72206469726563746f72792065786973747300000000000000006000830152602082019050919050565b600061477e601883614e25565b91507f45564d206572726f7220696e2067657446696c6553697a6500000000000000006000830152602082019050919050565b60006147be601083614e25565b91507f46696c65206e6f742063726561746564000000000000000000000000000000006000830152602082019050919050565b60006147fe601983614e25565b91507f46696c65206861736e2774206265656e2075706c6f61646564000000000000006000830152602082019050919050565b600060a083016000830151848203600086015261484e8282614055565b91505060208301516148636020860182613fe8565b50604083015161487660408601826148ae565b5060608301516148896060860182614006565b50608083015184820360808601526148a18282613ebe565b9150508091505092915050565b6148b781614e9c565b82525050565b6148c681614e9c565b82525050565b60006148d8828461408e565b915081905092915050565b60006148ef8284614024565b915081905092915050565b6000614905826143e5565b9150819050919050565b600061491a82614671565b9150819050919050565b6000621000008201905061493b6000830184613f1c565b92915050565b6000602082019050818103600083015261495b8184613f73565b905092915050565b60006020820190506149786000830184614015565b92915050565b60006020820190508181036000830152614997816140bf565b9050919050565b600060208201905081810360008301526149b7816140ff565b9050919050565b600060208201905081810360008301526149d78161413f565b9050919050565b600060208201905081810360008301526149f7816141a5565b9050919050565b60006020820190508181036000830152614a17816141e5565b9050919050565b60006020820190508181036000830152614a3781614225565b9050919050565b60006020820190508181036000830152614a5781614265565b9050919050565b60006020820190508181036000830152614a77816142a5565b9050919050565b60006020820190508181036000830152614a97816142e5565b9050919050565b60006020820190508181036000830152614ab781614325565b9050919050565b60006020820190508181036000830152614ad781614365565b9050919050565b60006020820190508181036000830152614af7816143a5565b9050919050565b60006020820190508181036000830152614b1781614425565b9050919050565b60006020820190508181036000830152614b3781614465565b9050919050565b60006020820190508181036000830152614b57816144a5565b9050919050565b60006020820190508181036000830152614b778161450b565b9050919050565b60006020820190508181036000830152614b978161454b565b9050919050565b60006020820190508181036000830152614bb7816145b1565b9050919050565b60006020820190508181036000830152614bd7816145f1565b9050919050565b60006020820190508181036000830152614bf781614631565b9050919050565b60006020820190508181036000830152614c17816146b1565b9050919050565b60006020820190508181036000830152614c37816146f1565b9050919050565b60006020820190508181036000830152614c5781614731565b9050919050565b60006020820190508181036000830152614c7781614771565b9050919050565b60006020820190508181036000830152614c97816147b1565b9050919050565b60006020820190508181036000830152614cb7816147f1565b9050919050565b6000602082019050614cd360008301846148bd565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614cfc57600080fd5b8060405250919050565b600067ffffffffffffffff821115614d1d57600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614d4957600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050919050565b6000819050602082019050919050565b600081519050919050565b60006180009050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614e4c82614e7c565b9050919050565b60008115159050919050565b6000819050919050565b6000819050614e7782614f0b565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000614eb182614e69565b9050919050565b82818337600083830152505050565b60005b83811015614ee5578082015181840152602081019050614eca565b83811115614ef4576000848401525b50505050565b6000601f19601f8301169050919050565b60038110614f1557fe5b50565b614f2181614e41565b8114614f2c57600080fd5b50565b614f3881614e9c565b8114614f4357600080fd5b5056fea365627a7a723158202ae226b25ad72f9cff2d74c6dc7bcfb78530ab1d2438f48a8dab67499b37a8e56c6578706572696d656e74616cf564736f6c634300050d0040", + "nonce": "0", + "storage": { + "0x0": "2868903936" + } + }, + "0x69362535ec535F0643cBf62D16aDeDCAf32Ee6F8": { + "balance": "0", + "code": "0x608060405234801561001057600080fd5b50600436106100b45760003560e01c806379210e8e1161007157806379210e8e1461017757806381a8235a146101a757806385aeeb17146101c35780639a9a5593146101f3578063a99100541461020f578063b57321221461022b576100b4565b806307c6e7d3146100b9578063122f4fba146100d55780631c6ec7a9146101055780631cfe4e3b14610121578063373dedb41461013d57806361e46db51461015b575b600080fd5b6100d360048036036100ce9190810190613e0d565b61025b565b005b6100ef60048036036100ea9190810190613e0d565b610804565b6040516100fc9190614ab1565b60405180910390f35b61011f600480360361011a9190810190613e0d565b610b43565b005b61013b60048036036101369190810190613dd1565b610f72565b005b610145611190565b6040516101529190614e2c565b60405180910390f35b61017560048036036101709190810190613ea2565b611199565b005b610191600480360361018c9190810190613f21565b6113f9565b60405161019e9190614a72565b60405180910390f35b6101c160048036036101bc9190810190613e0d565b6116f9565b005b6101dd60048036036101d89190810190613e0d565b61189e565b6040516101ea9190614a8f565b60405180910390f35b61020d60048036036102089190810190613e4e565b611b9d565b005b61022960048036036102249190810190613e0d565b61213a565b005b61024560048036036102409190810190613e0d565b612790565b6040516102529190614e2c565b60405180910390f35b6000339050606061026b83612a10565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b825181101561037c576000826001018460018403815181106102d557fe5b60200260200101516040516102ea9190614a1a565b90815260200160405180910390205411610339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161033090614c2c565b60405180910390fd5b8160020183600183038151811061034c57fe5b60200260200101516040516103619190614a1a565b908152602001604051809103902091508060010190506102b7565b506060600183511161038e57846103a7565b8260018451038151811061039e57fe5b60200260200101515b9050600082600101826040516103bd9190614a31565b9081526020016040518091039020541161040c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161040390614c2c565b60405180910390fd5b600082600201826040516104209190614a31565b90815260200160405180910390206000018054905014610475576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161046c90614cac565b60405180910390fd5b60006104818587612c10565b9050806104c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ba90614bcc565b60405180910390fd5b6104cb613996565b836000016001856000018054905003815481106104e457fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156105965780601f1061056b57610100808354040283529160200191610596565b820191906000526020600020905b81548152906001019060200180831161057957829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff1660028111156105e257fe5b60028111156105ed57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561066557602002820191906000526020600020906000905b82829054906101000a900460ff1615158152602001906001019060208260000104928301926001038202915080841161062f5790505b50505050508152505090508084600001600186600101866040516106899190614a31565b90815260200160405180910390205403815481106106a357fe5b906000526020600020906005020160008201518160000190805190602001906106cd9291906139d2565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561071c57fe5b0217905550608082015181600401908051906020019061073d929190613a52565b5090505083600101836040516107539190614a31565b9081526020016040518091039020548460010182600001516040516107789190614a1a565b9081526020016040518091039020819055506000846001018460405161079e9190614a31565b908152602001604051809103902081905550836000018054809190600190036107c79190613af8565b5083600201836040516107da9190614a31565b9081526020016040518091039020600080820160006107f99190613b2a565b505050505050505050565b600080606061081284612c74565b91509150606061082182612a10565b90506000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b82518110156109065760008260010184600184038151811061088b57fe5b60200260200101516040516108a09190614a1a565b90815260200160405180910390205414156108c357600095505050505050610b3e565b816002018360018303815181106108d657fe5b60200260200101516040516108eb9190614a1a565b9081526020016040518091039020915080600101905061086d565b50606060018351116109185783610931565b8260018451038151811061092857fe5b60200260200101515b9050600082600101826040516109479190614a31565b908152602001604051809103902054141561096a57600095505050505050610b3e565b610972613996565b826000016001846001018460405161098a9190614a31565b90815260200160405180910390205403815481106109a457fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610a565780601f10610a2b57610100808354040283529160200191610a56565b820191906000526020600020905b815481529060010190602001808311610a3957829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115610aa257fe5b6002811115610aad57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015610b2557602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411610aef5790505b5050505050815250509050806060015196505050505050505b919050565b600160009054906101000a900460ff16610b85576120006002819055506210000060038190555060018060006101000a81548160ff0219169083151502179055505b6000815111610bc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc090614c2c565b60405180910390fd5b60003390506060610bd983612a10565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015610cea57600082600101846001840381518110610c4357fe5b6020026020010151604051610c589190614a1a565b90815260200160405180910390205411610ca7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9e90614c2c565b60405180910390fd5b81600201836001830381518110610cba57fe5b6020026020010151604051610ccf9190614a1a565b90815260200160405180910390209150806001019050610c25565b50600254816000018054905010610d36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2d90614d4c565b60405180910390fd5b60606001835111610d475784610d60565b82600184510381518110610d5757fe5b60200260200101515b905060008260010182604051610d769190614a31565b90815260200160405180910390205414610dc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbc90614d8c565b60405180910390fd5b610dce81612ff6565b610e0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0490614c4c565b60405180910390fd5b6000610e1985876130d7565b905080610e5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5290614aec565b60405180910390fd5b610e63613996565b82816000018190525060008160200190151590811515815250508360000181908060018154018082558091505090600182039060005260206000209060050201600090919290919091506000820151816000019080519060200190610ec99291906139d2565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff02191690836002811115610f1857fe5b02179055506080820151816004019080519060200190610f39929190613a52565b5050505083600001805490508460010184604051610f579190614a31565b90815260200160405180910390208190555050505050505050565b610f7a61313b565b73ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161480610fdf57503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614155b61101e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101590614bac565b60405180910390fd5b80600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411156110a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109790614c8c565b60405180910390fd5b600054600754820111156110e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e090614b0c565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460076000828254039250508190555080600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550806007600082825401925050819055505050565b60008054905090565b600033905060006111aa82866131d4565b9050600160028111156111b957fe5b8160030160009054906101000a900460ff1660028111156111d657fe5b14611216576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120d90614d6c565b60405180910390fd5b6000600354858161122357fe5b061480156112345750806002015484105b611273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126a90614acc565b60405180910390fd5b600354848260020154031080156112905750838160020154038351145b8061129d57506003548351145b6112dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d390614b6c565b60405180910390fd5b600015158160040160035486816112ef57fe5b04815481106112fa57fe5b90600052602060002090602091828204019190069054906101000a900460ff1615151461135c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135390614b4c565b60405180910390fd5b600061136a838787876133d3565b9050806113ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a390614c6c565b60405180910390fd5b60018260040160035487816113bd57fe5b04815481106113c857fe5b90600052602060002090602091828204019190066101000a81548160ff021916908315150217905550505050505050565b611401613b4e565b6000606061140e86612c74565b9150915061141a613996565b61142483836131d4565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156114c85780601f1061149d576101008083540402835291602001916114c8565b820191906000526020600020905b8154815290600101906020018083116114ab57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561151457fe5b600281111561151f57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561159757602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116115615790505b50505050508152505090506002808111156115ae57fe5b816060015160028111156115be57fe5b146115fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f590614e0c565b60405180910390fd5b60035485111580156116105750600085115b61164f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164690614b6c565b60405180910390fd5b80604001518587011115611698576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168f90614acc565b60405180910390fd5b60006116a684848989613484565b8096508192505050806116ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e590614cec565b60405180910390fd5b505050509392505050565b6000339050600061170a82846131d4565b90506001600281111561171957fe5b8160030160009054906101000a900460ff16600281111561173657fe5b14611776576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176d90614d6c565b60405180910390fd5b60006001905060008260040180549050905060008090505b818110156117e157600015158460040182815481106117a957fe5b90600052602060002090602091828204019190069054906101000a900460ff16151514156117d657600092505b80600101905061178e565b5081611822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181990614ccc565b60405180910390fd5b60028360030160006101000a81548160ff0219169083600281111561184357fe5b021790555060006118548587613517565b905080611896576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188d90614b2c565b60405180910390fd5b505050505050565b6060600060606118ad84612c74565b9150915060606118bc82612a10565b90506000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008090505b82518110156119c65760008260010184838151811061192257fe5b60200260200101516040516119379190614a1a565b90815260200160405180910390205411611986576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197d90614c2c565b60405180910390fd5b8160020183828151811061199657fe5b60200260200101516040516119ab9190614a1a565b90815260200160405180910390209150806001019050611907565b5080600001805480602002602001604051908101604052809291908181526020016000905b82821015611b8e57838290600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611aa75780601f10611a7c57610100808354040283529160200191611aa7565b820191906000526020600020905b815481529060010190602001808311611a8a57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115611af357fe5b6002811115611afe57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015611b7657602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411611b405790505b505050505081525050815260200190600101906119eb565b50505050945050505050919050565b600160009054906101000a900460ff16611bdf576120006002819055506210000060038190555060018060006101000a81548160ff0219169083151502179055505b60003390506305f5e100821115611c2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2290614d2c565b60405180910390fd5b600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205483011115611cee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce590614dac565b60405180910390fd5b6060611cf984612a10565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015611e0a57600082600101846001840381518110611d6357fe5b6020026020010151604051611d789190614a1a565b90815260200160405180910390205411611dc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dbe90614c2c565b60405180910390fd5b81600201836001830381518110611dda57fe5b6020026020010151604051611def9190614a1a565b90815260200160405180910390209150806001019050611d45565b50600254816000018054905010611e56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4d90614d4c565b60405180910390fd5b60606001835111611e675785611e80565b82600184510381518110611e7757fe5b60200260200101515b905060008260010182604051611e969190614a31565b90815260200160405180910390205414611ee5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611edc90614d8c565b60405180910390fd5b611eee81612ff6565b611f2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2490614d0c565b60405180910390fd5b6000611f3a85888861357b565b905080611f7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7390614dec565b60405180910390fd5b6060600354600160035489010381611f9057fe5b04604051908082528060200260200182016040528015611fbf5781602001602082028038833980820191505090505b509050836000016040518060a0016040528085815260200160011515815260200189815260200160016002811115611ff357fe5b8152602001838152509080600181540180825580915050906001820390600052602060002090600502016000909192909190915060008201518160000190805190602001906120439291906139d2565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561209257fe5b021790555060808201518160040190805190602001906120b3929190613a52565b50505050836000018054905084600101846040516120d19190614a31565b90815260200160405180910390208190555086600560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505050505050505050565b6000339050612147613996565b61215182846131d4565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156121f55780601f106121ca576101008083540402835291602001916121f5565b820191906000526020600020905b8154815290600101906020018083116121d857829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561224157fe5b600281111561224c57fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156122c457602002820191906000526020600020906000905b82829054906101000a900460ff1615158152602001906001019060208260000104928301926001038202915080841161228e5790505b5050505050815250509050600060028111156122dc57fe5b816060015160028111156122ec57fe5b141561232d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232490614b8c565b60405180910390fd5b600061233983856135e8565b90508061237b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161237290614bec565b60405180910390fd5b606061238685612a10565b90506000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b825181101561241e57816002018360018303815181106123ee57fe5b60200260200101516040516124039190614a1a565b908152602001604051809103902091508060010190506123d2565b50600060018260010186600001516040516124399190614a1a565b908152602001604051809103902054039050612453613996565b8260000160018460000180549050038154811061246c57fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561251e5780601f106124f35761010080835404028352916020019161251e565b820191906000526020600020905b81548152906001019060200180831161250157829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561256a57fe5b600281111561257557fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156125ed57602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116125b75790505b50505050508152505090508083600001838154811061260857fe5b906000526020600020906005020160008201518160000190805190602001906126329291906139d2565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561268157fe5b021790555060808201518160040190805190602001906126a2929190613a52565b50905050826000018054809190600190036126bd9190613af8565b508260010186600001516040516126d49190614a1a565b9081526020016040518091039020548360010182600001516040516126f99190614a1a565b90815260200160405180910390208190555060008360010187600001516040516127239190614a1a565b9081526020016040518091039020819055508560400151600560008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505050505050505050565b600080606061279e84612c74565b915091506127aa613996565b6127b483836131d4565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156128585780601f1061282d57610100808354040283529160200191612858565b820191906000526020600020905b81548152906001019060200180831161283b57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff1660028111156128a457fe5b60028111156128af57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561292757602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116128f15790505b50505050508152505090506001600281111561293f57fe5b8160600151600281111561294f57fe5b1480612974575060028081111561296257fe5b8160600151600281111561297257fe5b145b6129b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129aa90614d6c565b60405180910390fd5b60006129bf848461364c565b809650819250505080612a07576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129fe90614dcc565b60405180910390fd5b50505050919050565b6060612a1a613b73565b612a23836136b5565b9050612a2d613b73565b612a6b6040518060400160405280600181526020017f2f000000000000000000000000000000000000000000000000000000000000008152506136b5565b905060606001612a8483856136e390919063ffffffff16565b01604051908082528060200260200182016040528015612ab857816020015b6060815260200190600190039081612aa35790505b50905060008090505b8151811015612b0957612ae5612ae0848661375890919063ffffffff16565b613772565b828281518110612af157fe5b60200260200101819052508080600101915050612ac1565b50600081600183510381518110612b1c57fe5b6020026020010151511415612b875780600182510381518110612b3b57fe5b6020026020010160608152506001815103604051908082528060200260200182016040528015612b7f57816020015b6060815260200190600190039081612b6a5790505b509350612bc0565b8051604051908082528060200260200182016040528015612bbc57816020015b6060815260200190600190039081612ba75790505b5093505b60008090505b8451811015612c0757818181518110612bdb57fe5b6020026020010151858281518110612bef57fe5b60200260200101819052508080600101915050612bc6565b50505050919050565b60008060016020601f85510181612c2357fe5b040190506040518481526020810160005b83811015612c55578060200286015181602002830152806001019050612c34565b50602082602085026040018460006010600019f1935050505092915050565b6000606060006028905080845111612cc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cb890614c0c565b60405180910390fd5b6060816040519080825280601f01601f191660200182016040528015612cf65781602001600182028038833980820191505090505b50905060008090505b82811015612d6657858181518110612d1357fe5b602001015160f81c60f81b828281518110612d2a57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050612cff565b50600080905060008090505b83811015612e95576000838281518110612d8857fe5b602001015160f81c60f81b60f81c60ff16905060308110158015612dad575060398111155b80612dc6575060418110158015612dc55750605a8111155b5b80612ddf575060618110158015612dde575060668111155b5b612e1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e1590614c0c565b60405180910390fd5b60308110158015612e30575060398111155b15612e415760308103601084020192505b60418110158015612e535750605a8111155b15612e645760378103601084020192505b60618110158015612e76575060668111155b15612e875760578103601084020192505b508080600101915050612d72565b508094507f2f00000000000000000000000000000000000000000000000000000000000000868481518110612ec657fe5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612f33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f2a90614c0c565b60405180910390fd5b6000600184885103039050806040519080825280601f01601f191660200182016040528015612f715781602001600182028038833980820191505090505b50945060008090505b81811015612fec5760008860018784010181518110612f9557fe5b602001015160f81c60f81b905080878381518110612faf57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350508080600101915050612f7a565b5050505050915091565b600060405160200161300790614a5d565b604051602081830303815290604052805190602001208260405160200161302e9190614a31565b604051602081830303815290604052805190602001201480613099575060405160200161305a90614a48565b60405160208183030381529060405280519060200120826040516020016130819190614a31565b60405160208183030381529060405280519060200120145b806130a5575060008251145b156130b357600090506130d2565b60008251905060ff8111156130cc5760009150506130d2565b60019150505b919050565b60008060016020601f855101816130ea57fe5b040190506040518481526020810160005b8381101561311c5780602002860151816020028301528060010190506130fb565b5060208260208502604001846000600f600019f1935050505092915050565b600073d2001000000000000000000000000000000000d273ffffffffffffffffffffffffffffffffffffffff166383e781fe6040518163ffffffff1660e01b815260040160206040518083038186803b15801561319757600080fd5b505afa1580156131ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506131cf9190810190613da8565b905090565b600060606131e183612a10565b90506000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b82518110156132f25760008260010184600184038151811061324b57fe5b60200260200101516040516132609190614a1a565b908152602001604051809103902054116132af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132a690614c2c565b60405180910390fd5b816002018360018303815181106132c257fe5b60200260200101516040516132d79190614a1a565b9081526020016040518091039020915080600101905061322d565b5060606001835111613304578461331d565b8260018451038151811061331457fe5b60200260200101515b9050600082600101826040516133339190614a31565b90815260200160405180910390205411613382576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161337990614c2c565b60405180910390fd5b6000826000016001846001018460405161339c9190614a31565b90815260200160405180910390205403815481106133b657fe5b906000526020600020906005020190508094505050505092915050565b60008060016020601f855101816133e657fe5b04019050600060016020601f885101816133fc57fe5b040190506040518781526020810160005b8381101561342e57806020028901518160200283015280600101905061340d565b50868360200282015260005b84811015613460578060200287015181856001010160200283015280600101905061343a565b50602082848601602002606001846000600c600019f1945050505050949350505050565b600061348e613b4e565b600060016020601f885101816134a057fe5b0401905060006020601f8601816134b357fe5b0490506040518881526020810160005b848110156134e457806020028a0151816020028301528060010190506134c3565b5083602002810188815287816020015283602002868660030160200285600a600019fa9650505050505094509492505050565b60008060016020601f8551018161352a57fe5b040190506040518481526020810160005b8381101561355c57806020028601518160200283015280600101905061353b565b50602082602085026040018460006011600019f1935050505092915050565b60008060016020601f8651018161358e57fe5b040190506040518581526020810160005b838110156135c057806020028701518160200283015280600101905061359f565b50846020840282015260208260208502604001846000600b600019f193505050509392505050565b60008060016020601f855101816135fb57fe5b040190506040518481526020810160005b8381101561362d57806020028601518160200283015280600101905061360c565b5060208260208502604001846000600e600019f1935050505092915050565b600080600060016020601f8651018161366157fe5b040190506040518581526020810160005b83811015613693578060200287015181602002830152806001019050613672565b506020826020850260200184600d600019fa9450815193505050509250929050565b6136bd613b73565b600060208301905060405180604001604052808451815260200182815250915050919050565b600080826000015161370785600001518660200151866000015187602001516137d4565b0190505b8360000151846020015101811161375157818060010192505082600001516137498560200151830386600001510383866000015187602001516137d4565b01905061370b565b5092915050565b613760613b73565b61376b8383836138af565b5092915050565b60608082600001516040519080825280601f01601f1916602001820160405280156137ac5781602001600182028038833980820191505090505b50905060006020820190506137ca818560200151866000015161394d565b8192505050919050565b600080849050600086851161389f576020851161385957600060018660200360080260020a031960001b905060008186511690506000878a8a0103905060008386511690505b82811461384b57818610613838578a8a0196505050505050506138a7565b858060010196505083865116905061381a565b8596505050505050506138a7565b60008585209050600091505b858803821161389d57600086842090508082141561388957839450505050506138a7565b600184019350508180600101925050613865565b505b868601925050505b949350505050565b6138b7613b73565b60006138d585600001518660200151866000015187602001516137d4565b90508460200151836020018181525050846020015181038360000181815250508460000151856020015101811415613917576000856000018181525050613942565b8360000151836000015101856000018181510391508181525050836000015181018560200181815250505b829150509392505050565b5b60208110613971578151835260208301925060208201915060208103905061394e565b60006001826020036101000a0390508019835116818551168181178652505050505050565b6040518060a001604052806060815260200160001515815260200160008152602001600060028111156139c557fe5b8152602001606081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613a1357805160ff1916838001178555613a41565b82800160010185558215613a41579182015b82811115613a40578251825591602001919060010190613a25565b5b509050613a4e9190613b8d565b5090565b82805482825590600052602060002090601f01602090048101928215613ae75791602002820160005b83821115613ab857835183826101000a81548160ff0219169083151502179055509260200192600101602081600001049283019260010302613a7b565b8015613ae55782816101000a81549060ff0219169055600101602081600001049283019260010302613ab8565b505b509050613af49190613bb2565b5090565b815481835581811115613b2557600502816005028360005260206000209182019101613b249190613be2565b5b505050565b5080546000825560050290600052602060002090810190613b4b9190613be2565b50565b6040518062100000016040528061800090602082028038833980820191505090505090565b604051806040016040528060008152602001600081525090565b613baf91905b80821115613bab576000816000905550600101613b93565b5090565b90565b613bdf91905b80821115613bdb57600081816101000a81549060ff021916905550600101613bb8565b5090565b90565b613c4e91905b80821115613c4a5760008082016000613c019190613c51565b6001820160006101000a81549060ff021916905560028201600090556003820160006101000a81549060ff0219169055600482016000613c419190613c99565b50600501613be8565b5090565b90565b50805460018160011615610100020316600290046000825580601f10613c775750613c96565b601f016020900490600052602060002090810190613c959190613b8d565b5b50565b50805460008255601f016020900490600052602060002090810190613cbe9190613b8d565b50565b600081359050613cd081615086565b92915050565b600081519050613ce581615086565b92915050565b600082601f830112613cfc57600080fd5b8135613d0f613d0a82614e74565b614e47565b91508082526020830160208301858383011115613d2b57600080fd5b613d36838284615026565b50505092915050565b600082601f830112613d5057600080fd5b8135613d63613d5e82614ea0565b614e47565b91508082526020830160208301858383011115613d7f57600080fd5b613d8a838284615026565b50505092915050565b600081359050613da28161509d565b92915050565b600060208284031215613dba57600080fd5b6000613dc884828501613cd6565b91505092915050565b60008060408385031215613de457600080fd5b6000613df285828601613cc1565b9250506020613e0385828601613d93565b9150509250929050565b600060208284031215613e1f57600080fd5b600082013567ffffffffffffffff811115613e3957600080fd5b613e4584828501613d3f565b91505092915050565b60008060408385031215613e6157600080fd5b600083013567ffffffffffffffff811115613e7b57600080fd5b613e8785828601613d3f565b9250506020613e9885828601613d93565b9150509250929050565b600080600060608486031215613eb757600080fd5b600084013567ffffffffffffffff811115613ed157600080fd5b613edd86828701613d3f565b9350506020613eee86828701613d93565b925050604084013567ffffffffffffffff811115613f0b57600080fd5b613f1786828701613ceb565b9150509250925092565b600080600060608486031215613f3657600080fd5b600084013567ffffffffffffffff811115613f5057600080fd5b613f5c86828701613d3f565b9350506020613f6d86828701613d93565b9250506040613f7e86828701613d93565b9150509250925092565b6000613f9483836140f6565b60208301905092915050565b6000613fac8383614105565b60208301905092915050565b6000613fc4838361497f565b905092915050565b6000613fd782614ef6565b613fe18185614f55565b9350613fec83614ecc565b8060005b8381101561401d5781516140048882613f88565b975061400f83614f2e565b925050600181019050613ff0565b5085935050505092915050565b61403381614f01565b61403d8184614f66565b925061404882614edc565b8060005b838110156140795781516140608782613fa0565b965061406b83614f3b565b92505060018101905061404c565b505050505050565b600061408c82614f0d565b6140968185614f71565b9350836020820285016140a885614ee6565b8060005b858110156140e457848403895281516140c58582613fb8565b94506140d083614f48565b925060208a019950506001810190506140ac565b50829750879550505050505092915050565b6140ff81614fc1565b82525050565b61410e81614fcd565b82525050565b61411d81615014565b82525050565b61412c81615014565b82525050565b600061413d82614f23565b6141478185614fa4565b9350614157818560208601615035565b80840191505092915050565b600061416e82614f18565b6141788185614f82565b9350614188818560208601615035565b61419181615068565b840191505092915050565b60006141a782614f18565b6141b18185614fa4565b93506141c1818560208601615035565b80840191505092915050565b60006141da601883614f93565b91507f496e636f7272656374206368756e6b20706f736974696f6e00000000000000006000830152602082019050919050565b600061421a601583614f93565b91507f4469726563746f7279206e6f74206372656174656400000000000000000000006000830152602082019050919050565b600061425a602483614f93565b91507f4e6f7420656e6f756768206d656d6f727920696e207468652046696c6573746f60008301527f72616765000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006142c0601b83614f93565b91507f48617368206861736e2774206265656e2063616c63756c6174656400000000006000830152602082019050919050565b6000614300601983614f93565b91507f4368756e6b20697320616c72656164792075706c6f61646564000000000000006000830152602082019050919050565b6000614340601683614f93565b91507f496e636f7272656374206368756e6b206c656e677468000000000000000000006000830152602082019050919050565b6000614380600f83614f93565b91507f46696c65206e6f742065786973747300000000000000000000000000000000006000830152602082019050919050565b60006143c0600e83614f93565b91507f496e76616c69642073656e6465720000000000000000000000000000000000006000830152602082019050919050565b6000614400601883614f93565b91507f4469726563746f7279206973206e6f742064656c6574656400000000000000006000830152602082019050919050565b6000614440601083614f93565b91507f46696c65206e6f742064656c65746564000000000000000000000000000000006000830152602082019050919050565b6000614480601383614f93565b91507f496e76616c69642073746f7261676550617468000000000000000000000000006000830152602082019050919050565b60006144c0600c83614f93565b91507f496e76616c6964207061746800000000000000000000000000000000000000006000830152602082019050919050565b6000614500600183614fa4565b91507f2e000000000000000000000000000000000000000000000000000000000000006000830152600182019050919050565b6000614540601683614f93565b91507f496e76616c6964206469726563746f7279206e616d65000000000000000000006000830152602082019050919050565b6000614580601583614f93565b91507f4368756e6b207761736e27742075706c6f6164656400000000000000000000006000830152602082019050919050565b60006145c0602683614f93565b91507f436f756c64206e6f742072657365727665206c657373207468616e207573656460008301527f20737061636500000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614626601683614f93565b91507f4469726563746f7279206973206e6f7420656d707479000000000000000000006000830152602082019050919050565b6000614666602383614f93565b91507f46696c65206861736e2774206265656e2075706c6f6164656420636f7272656360008301527f746c7900000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006146cc601183614f93565b91507f4368756e6b207761736e277420726561640000000000000000000000000000006000830152602082019050919050565b600061470c601883614f93565b91507f46696c656e616d652073686f756c64206265203c2032353600000000000000006000830152602082019050919050565b600061474c601f83614f93565b91507f46696c652073686f756c64206265206c657373207468616e20313030204d42006000830152602082019050919050565b600061478c600283614fa4565b91507f2e2e0000000000000000000000000000000000000000000000000000000000006000830152600282019050919050565b60006147cc601183614f93565b91507f4469726563746f72792069732066756c6c0000000000000000000000000000006000830152602082019050919050565b600061480c600e83614f93565b91507f46696c65206e6f7420666f756e640000000000000000000000000000000000006000830152602082019050919050565b600061484c601883614f93565b91507f46696c65206f72206469726563746f72792065786973747300000000000000006000830152602082019050919050565b600061488c601983614f93565b91507f4e6f7420656e6f756768207265736572766564207370616365000000000000006000830152602082019050919050565b60006148cc601883614f93565b91507f45564d206572726f7220696e2067657446696c6553697a6500000000000000006000830152602082019050919050565b600061490c601083614f93565b91507f46696c65206e6f742063726561746564000000000000000000000000000000006000830152602082019050919050565b600061494c601983614f93565b91507f46696c65206861736e2774206265656e2075706c6f61646564000000000000006000830152602082019050919050565b600060a083016000830151848203600086015261499c8282614163565b91505060208301516149b160208601826140f6565b5060408301516149c460408601826149fc565b5060608301516149d76060860182614114565b50608083015184820360808601526149ef8282613fcc565b9150508091505092915050565b614a058161500a565b82525050565b614a148161500a565b82525050565b6000614a26828461419c565b915081905092915050565b6000614a3d8284614132565b915081905092915050565b6000614a53826144f3565b9150819050919050565b6000614a688261477f565b9150819050919050565b60006210000082019050614a89600083018461402a565b92915050565b60006020820190508181036000830152614aa98184614081565b905092915050565b6000602082019050614ac66000830184614123565b92915050565b60006020820190508181036000830152614ae5816141cd565b9050919050565b60006020820190508181036000830152614b058161420d565b9050919050565b60006020820190508181036000830152614b258161424d565b9050919050565b60006020820190508181036000830152614b45816142b3565b9050919050565b60006020820190508181036000830152614b65816142f3565b9050919050565b60006020820190508181036000830152614b8581614333565b9050919050565b60006020820190508181036000830152614ba581614373565b9050919050565b60006020820190508181036000830152614bc5816143b3565b9050919050565b60006020820190508181036000830152614be5816143f3565b9050919050565b60006020820190508181036000830152614c0581614433565b9050919050565b60006020820190508181036000830152614c2581614473565b9050919050565b60006020820190508181036000830152614c45816144b3565b9050919050565b60006020820190508181036000830152614c6581614533565b9050919050565b60006020820190508181036000830152614c8581614573565b9050919050565b60006020820190508181036000830152614ca5816145b3565b9050919050565b60006020820190508181036000830152614cc581614619565b9050919050565b60006020820190508181036000830152614ce581614659565b9050919050565b60006020820190508181036000830152614d05816146bf565b9050919050565b60006020820190508181036000830152614d25816146ff565b9050919050565b60006020820190508181036000830152614d458161473f565b9050919050565b60006020820190508181036000830152614d65816147bf565b9050919050565b60006020820190508181036000830152614d85816147ff565b9050919050565b60006020820190508181036000830152614da58161483f565b9050919050565b60006020820190508181036000830152614dc58161487f565b9050919050565b60006020820190508181036000830152614de5816148bf565b9050919050565b60006020820190508181036000830152614e05816148ff565b9050919050565b60006020820190508181036000830152614e258161493f565b9050919050565b6000602082019050614e416000830184614a0b565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614e6a57600080fd5b8060405250919050565b600067ffffffffffffffff821115614e8b57600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614eb757600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050919050565b6000819050602082019050919050565b600081519050919050565b60006180009050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614fba82614fea565b9050919050565b60008115159050919050565b6000819050919050565b6000819050614fe582615079565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061501f82614fd7565b9050919050565b82818337600083830152505050565b60005b83811015615053578082015181840152602081019050615038565b83811115615062576000848401525b50505050565b6000601f19601f8301169050919050565b6003811061508357fe5b50565b61508f81614faf565b811461509a57600080fd5b50565b6150a68161500a565b81146150b157600080fd5b5056fea365627a7a72315820314a90e541327f2678eaf7815f54348c3702e4fa45cdf1d5595b378d08af86896c6578706572696d656e74616cf564736f6c634300050d0040", + "nonce": "0", + "storage": { + "0x0": "2868903936" + } + }, + "0x69bfcdcb98c9562e0a2faee3ecdfd65e8a0adb19": { + "balance": "1000000000000000000000000000000" + }, + "0x6a37ad7dceec4595eea9f03b82d2710e738343ac": { + "balance": "1000000000000000000000000000000" + }, + "0x6b806862a977a0e22ed1752f858e5332647121c8": { + "balance": "1000000000000000000000000000000" + }, + "0x6c0ef9084a57df13c175afea32ea47a510c5506e": { + "balance": "1000000000000000000000000000000" + }, + "0x6cd5e637266e18d3e888ee99451eb828c6b491f4": { + "balance": "1000000000000000000000000000000" + }, + "0x6d0d7f0ff51917bd84a5f7270d31a894282aaf4b": { + "balance": "1000000000000000000000000000000" + }, + "0x6d8092cb926daf29236f866cd31c327ff73323d1": { + "balance": "1000000000000000000000000000000" + }, + "0x6d80aAC61F6d92c7F4A3c412850474ba963B698E": { + "balance": "1000000000000000000000" + }, + "0x6fec280c0ab320715b17d70e8b02c2d4141c1372": { + "balance": "1000000000000000000000000000000" + }, + "0x733ad609ef2e742334d96266fbc13733f1cf5e4a": { + "balance": "1000000000000000000000000000000" + }, + "0x7525198d8cd1121d57358a0b0ed037e924581a76": { + "balance": "1000000000000000000000000000000" + }, + "0x765708943c3b791563d1e3f0533b6d7e7d769e4d": { + "balance": "1000000000000000000000000000000" + }, + "0x7685d04f0b7657017b77efa004a14ff9f022acab": { + "balance": "1000000000000000000000000000000" + }, + "0x76b545cb6a2fc671f741950eeb27627e69a1e69b": { + "balance": "1000000000000000000000000000000" + }, + "0x77a0bc73442d3d9cb993e8d9752f95babf0ccaa6": { + "balance": "1000000000000000000000000000000" + }, + "0x7a89A6c323FaCfF0ADeF7EEF3e491aD4044d0592": { + "balance": "100000000000000000000000" + }, + "0x7e7E68F04D1799Fa25C8cff57314c8a5d3942e69": { + "balance": "1000000000000000000000000" + }, + "0x811d701d14539d190a8593fe901eafe8eff511f5": { + "balance": "1000000000000000000000000000000" + }, + "0x81dcbd71da28fafb9ca99ff5a22bfcebba84fecc": { + "balance": "100000000000000000000000" + }, + "0x83c1479d2a32d9ed9fa699289b6c2db56b7cd045": { + "balance": "1000000000000000000000000000000" + }, + "0x85b33f0853ab8eaa4e602bdfd724d44bc2731e90": { + "balance": "1000000000000000000000000000000" + }, + "0x863f816036e3cbba90855196c9d1e339fcff1650": { + "balance": "1000000000000000000000000000000" + }, + "0x87ea381878572d63b3453033d7540abddd191186": { + "balance": "1000000000000000000000000000000" + }, + "0x88fd5e01078629cc194c933d9631b9448fe10b1d": { + "balance": "1000000000000000000000000000000" + }, + "0x8945e48bd056f45c8b57f9025d2674bb03a24035": { + "balance": "1000000000000000000000000000000" + }, + "0x8a920edc1021ce76c22774e0e83723a6e51c2439": { + "balance": "1000000000000000000000000000000" + }, + "0x8e6081e272c8f4d49f5b29157b52f68cbd6307ad": { + "balance": "1000000000000000000000000000000" + }, + "0x8fe24dbbf9884bd458d8cfac528b4ad70e82497d": { + "balance": "1000000000000000000000000000000" + }, + "0x90431f3f75b26657f74abbb5c759b12e78f916cc": { + "balance": "1000000000000000000000000000000" + }, + "0x907cd0881E50d359bb9Fd120B1A5A143b1C97De6": { + "balance": "1000000000000000000000000000000000000000000000000000000000" + }, + "0x94c6e5746971d6aebeaa42cbbe2feca0f6b5b24f": { + "balance": "1000000000000000000000000000000" + }, + "0x96672f9e982936e1904b15c948cc81bf18027db6": { + "balance": "1000000000000000000000000000000" + }, + "0x97b921ba45e0aa8830701aa62050a83ee00a1bb8": { + "balance": "1000000000000000000000000000000" + }, + "0x98e50c97baf98dc6a81bdb95067339a269a36fc1": { + "balance": "1000000000000000000000000000000" + }, + "0x9b77f28285a49601169a33332f08aa309d97edd0": { + "balance": "1000000000000000000000000000000" + }, + "0x9f62f4215cd277ca40dede101b4ccb29290de6bb": { + "balance": "1000000000000000000000000000000" + }, + "0xD1001000000000000000000000000000000000D1": { + "balance": "0", + "code": "0x608060405260043610603f576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680636d4ce63c146044575b600080fd5b348015604f57600080fd5b506056606c565b6040518082815260200191505060405180910390f35b60006001600060048152602001908152602001600020600060098152602001908152602001600020600101549050905600a165627a7a723058208fe64219becc0bcab1c8f854f05804ebb6bb555da5dbc49e8f7021c31d77636a0029", + "nonce": "0", + "storage": { + "0x3b4da637a1b0e6dbfc6795f2b7f0cb29eebb91b3af4dcc335e1633f6b4af810b": "1111" + } + }, + "0xD3001000000000000000000000000000000000D3": { + "balance": "0", + "code": "0x60806040526004361061007b5760003560e01c80639623609d1161004e5780639623609d1461013657806399a88ec4146101f5578063f2fde38b14610230578063f3b7dead146102635761007b565b8063204e1c7a14610080578063715018a6146100cf5780637eff275e146100e65780638da5cb5b14610121575b600080fd5b34801561008c57600080fd5b506100b3600480360360208110156100a357600080fd5b50356001600160a01b0316610296565b604080516001600160a01b039092168252519081900360200190f35b3480156100db57600080fd5b506100e4610328565b005b3480156100f257600080fd5b506100e46004803603604081101561010957600080fd5b506001600160a01b03813581169160200135166103ca565b34801561012d57600080fd5b506100b3610496565b6100e46004803603606081101561014c57600080fd5b6001600160a01b03823581169260208101359091169181019060608101604082013564010000000081111561018057600080fd5b82018360208201111561019257600080fd5b803590602001918460018302840111640100000000831117156101b457600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506104a5945050505050565b34801561020157600080fd5b506100e46004803603604081101561021857600080fd5b506001600160a01b03813581169160200135166105dd565b34801561023c57600080fd5b506100e46004803603602081101561025357600080fd5b50356001600160a01b031661068d565b34801561026f57600080fd5b506100b36004803603602081101561028657600080fd5b50356001600160a01b0316610785565b6000806060836001600160a01b03166040518080635c60da1b60e01b8152506004019050600060405180830381855afa9150503d80600081146102f5576040519150601f19603f3d011682016040523d82523d6000602084013e6102fa565b606091505b50915091508161030957600080fd5b80806020019051602081101561031e57600080fd5b5051949350505050565b6103306107e4565b6000546001600160a01b03908116911614610380576040805162461bcd60e51b8152602060048201819052602482015260008051602061080f833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6103d26107e4565b6000546001600160a01b03908116911614610422576040805162461bcd60e51b8152602060048201819052602482015260008051602061080f833981519152604482015290519081900360640190fd5b816001600160a01b0316638f283970826040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050600060405180830381600087803b15801561047a57600080fd5b505af115801561048e573d6000803e3d6000fd5b505050505050565b6000546001600160a01b031690565b6104ad6107e4565b6000546001600160a01b039081169116146104fd576040805162461bcd60e51b8152602060048201819052602482015260008051602061080f833981519152604482015290519081900360640190fd5b826001600160a01b0316634f1ef2863484846040518463ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561057357818101518382015260200161055b565b50505050905090810190601f1680156105a05780820380516001836020036101000a031916815260200191505b5093505050506000604051808303818588803b1580156105bf57600080fd5b505af11580156105d3573d6000803e3d6000fd5b5050505050505050565b6105e56107e4565b6000546001600160a01b03908116911614610635576040805162461bcd60e51b8152602060048201819052602482015260008051602061080f833981519152604482015290519081900360640190fd5b816001600160a01b0316633659cfe6826040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050600060405180830381600087803b15801561047a57600080fd5b6106956107e4565b6000546001600160a01b039081169116146106e5576040805162461bcd60e51b8152602060048201819052602482015260008051602061080f833981519152604482015290519081900360640190fd5b6001600160a01b03811661072a5760405162461bcd60e51b81526004018080602001828103825260268152602001806107e96026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000806060836001600160a01b031660405180806303e1469160e61b8152506004019050600060405180830381855afa9150503d80600081146102f5576040519150601f19603f3d011682016040523d82523d6000602084013e6102fa565b339056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a26469706673582212201d968ac32bef5562c6b4f1bd5d2f2a74c14d07ce008ca6fdc5a3bd0f5fc265f564736f6c63430006080033", + "nonce": "0", + "storage": { + "0x0": "0x907cd0881E50d359bb9Fd120B1A5A143b1C97De6" + } + }, + "0xD3002000000000000000000000000000000000D3": { + "balance": "0", + "code": "0x60806040526004361061004e5760003560e01c80633659cfe6146100655780634f1ef286146100985780635c60da1b146101185780638f28397014610149578063f851a4401461017c5761005d565b3661005d5761005b610191565b005b61005b610191565b34801561007157600080fd5b5061005b6004803603602081101561008857600080fd5b50356001600160a01b03166101ab565b61005b600480360360408110156100ae57600080fd5b6001600160a01b0382351691908101906040810160208201356401000000008111156100d957600080fd5b8201836020820111156100eb57600080fd5b8035906020019184600183028401116401000000008311171561010d57600080fd5b5090925090506101e5565b34801561012457600080fd5b5061012d610292565b604080516001600160a01b039092168252519081900360200190f35b34801561015557600080fd5b5061005b6004803603602081101561016c57600080fd5b50356001600160a01b03166102cf565b34801561018857600080fd5b5061012d610389565b6101996103ba565b6101a96101a461041a565b61043f565b565b6101b3610463565b6001600160a01b0316336001600160a01b031614156101da576101d581610488565b6101e2565b6101e2610191565b50565b6101ed610463565b6001600160a01b0316336001600160a01b031614156102855761020f83610488565b6000836001600160a01b031683836040518083838082843760405192019450600093509091505080830381855af49150503d806000811461026c576040519150601f19603f3d011682016040523d82523d6000602084013e610271565b606091505b505090508061027f57600080fd5b5061028d565b61028d610191565b505050565b600061029c610463565b6001600160a01b0316336001600160a01b031614156102c4576102bd61041a565b90506102cc565b6102cc610191565b90565b6102d7610463565b6001600160a01b0316336001600160a01b031614156101da576001600160a01b0381166103355760405162461bcd60e51b81526004018080602001828103825260368152602001806105876036913960400191505060405180910390fd5b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f61035e610463565b604080516001600160a01b03928316815291841660208301528051918290030190a16101d5816104c8565b6000610393610463565b6001600160a01b0316336001600160a01b031614156102c4576102bd610463565b3b151590565b6103c2610463565b6001600160a01b0316336001600160a01b031614156104125760405162461bcd60e51b81526004018080602001828103825260328152602001806105556032913960400191505060405180910390fd5b6101a96101a9565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b3660008037600080366000845af43d6000803e80801561045e573d6000f35b3d6000fd5b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b610491816104ec565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610355565b6104f5816103b4565b6105305760405162461bcd60e51b815260040180806020018281038252603b8152602001806105bd603b913960400191505060405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5556fe43616e6e6f742063616c6c2066616c6c6261636b2066756e6374696f6e2066726f6d207468652070726f78792061646d696e43616e6e6f74206368616e6765207468652061646d696e206f6620612070726f787920746f20746865207a65726f206164647265737343616e6e6f742073657420612070726f787920696d706c656d656e746174696f6e20746f2061206e6f6e2d636f6e74726163742061646472657373a26469706673582212206e221e2a3547bd97244b05ed46430b1b078ba097cb2a4e25ec3d79cf9ac9f02c64736f6c63430006080033", + "nonce": "0", + "storage": { + "0x0": "1000000", + "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0xD3003000000000000000000000000000000000D3", + "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "0xD3001000000000000000000000000000000000D3" + } + }, + "0xD3003000000000000000000000000000000000D3": { + "balance": "0", + "code": "0x608060405234801561001057600080fd5b50600436106100b45760003560e01c806379210e8e1161007157806379210e8e1461017757806381a8235a146101a757806385aeeb17146101c35780639a9a5593146101f3578063a99100541461020f578063b57321221461022b576100b4565b806307c6e7d3146100b9578063122f4fba146100d55780631c6ec7a9146101055780631cfe4e3b14610121578063373dedb41461013d57806361e46db51461015b575b600080fd5b6100d360048036036100ce9190810190613e94565b61025b565b005b6100ef60048036036100ea9190810190613e94565b610862565b6040516100fc9190614b38565b60405180910390f35b61011f600480360361011a9190810190613e94565b610ba1565b005b61013b60048036036101369190810190613e58565b610fce565b005b6101456111ec565b6040516101529190614eb3565b60405180910390f35b61017560048036036101709190810190613f29565b6111f6565b005b610191600480360361018c9190810190613fa8565b611456565b60405161019e9190614af9565b60405180910390f35b6101c160048036036101bc9190810190613e94565b611756565b005b6101dd60048036036101d89190810190613e94565b6118fb565b6040516101ea9190614b16565b60405180910390f35b61020d60048036036102089190810190613ed5565b611bfa565b005b61022960048036036102249190810190613e94565b612195565b005b61024560048036036102409190810190613e94565b612849565b6040516102529190614eb3565b60405180910390f35b6000339050606061026b83612ac9565b90506000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b825181101561037c576000826001018460018403815181106102d557fe5b60200260200101516040516102ea9190614aa1565b90815260200160405180910390205411610339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161033090614cb3565b60405180910390fd5b8160020183600183038151811061034c57fe5b60200260200101516040516103619190614aa1565b908152602001604051809103902091508060010190506102b7565b506060600183511161038e57846103a7565b8260018451038151811061039e57fe5b60200260200101515b9050600082600101826040516103bd9190614ab8565b9081526020016040518091039020541161040c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161040390614cb3565b60405180910390fd5b600082600201826040516104209190614ab8565b90815260200160405180910390206000018054905014610475576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161046c90614d33565b60405180910390fd5b60006104818587612cc9565b9050806104c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ba90614c53565b60405180910390fd5b6104cb613a4f565b836000016001856000018054905003815481106104e457fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156105965780601f1061056b57610100808354040283529160200191610596565b820191906000526020600020905b81548152906001019060200180831161057957829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff1660028111156105e257fe5b60028111156105ed57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561066557602002820191906000526020600020906000905b82829054906101000a900460ff1615158152602001906001019060208260000104928301926001038202915080841161062f5790505b50505050508152505090508084600001600186600101866040516106899190614ab8565b90815260200160405180910390205403815481106106a357fe5b906000526020600020906005020160008201518160000190805190602001906106cd929190613a8b565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561071c57fe5b0217905550608082015181600401908051906020019061073d929190613b0b565b5090505083600101836040516107539190614ab8565b9081526020016040518091039020548460010182600001516040516107789190614aa1565b9081526020016040518091039020819055506000846001018460405161079e9190614ab8565b908152602001604051809103902081905550836000018054806107bd57fe5b6001900381819060005260206000209060050201600080820160006107e29190613bb1565b6001820160006101000a81549060ff021916905560028201600090556003820160006101000a81549060ff02191690556004820160006108229190613bf9565b5050905583600201836040516108389190614ab8565b9081526020016040518091039020600080820160006108579190613c21565b505050505050505050565b600080606061087084612d2d565b91509150606061087f82612ac9565b90506000600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015610964576000826001018460018403815181106108e957fe5b60200260200101516040516108fe9190614aa1565b908152602001604051809103902054141561092157600095505050505050610b9c565b8160020183600183038151811061093457fe5b60200260200101516040516109499190614aa1565b908152602001604051809103902091508060010190506108cb565b5060606001835111610976578361098f565b8260018451038151811061098657fe5b60200260200101515b9050600082600101826040516109a59190614ab8565b90815260200160405180910390205414156109c857600095505050505050610b9c565b6109d0613a4f565b82600001600184600101846040516109e89190614ab8565b9081526020016040518091039020540381548110610a0257fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610ab45780601f10610a8957610100808354040283529160200191610ab4565b820191906000526020600020905b815481529060010190602001808311610a9757829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115610b0057fe5b6002811115610b0b57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015610b8357602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411610b4d5790505b5050505050815250509050806060015196505050505050505b919050565b600360009054906101000a900460ff16610be457612000600481905550621000006005819055506001600360006101000a81548160ff0219169083151502179055505b6000815111610c28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1f90614cb3565b60405180910390fd5b60003390506060610c3883612ac9565b90506000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015610d4957600082600101846001840381518110610ca257fe5b6020026020010151604051610cb79190614aa1565b90815260200160405180910390205411610d06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cfd90614cb3565b60405180910390fd5b81600201836001830381518110610d1957fe5b6020026020010151604051610d2e9190614aa1565b90815260200160405180910390209150806001019050610c84565b50600454816000018054905010610d95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8c90614dd3565b60405180910390fd5b60606001835111610da65784610dbf565b82600184510381518110610db657fe5b60200260200101515b905060008260010182604051610dd59190614ab8565b90815260200160405180910390205414610e24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1b90614e13565b60405180910390fd5b610e2d816130af565b610e6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6390614cd3565b60405180910390fd5b6000610e788587613190565b905080610eba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb190614b73565b60405180910390fd5b610ec2613a4f565b8281600001819052506000816020019015159081151581525050836000018190806001815401808255809150506001900390600052602060002090600502016000909190919091506000820151816000019080519060200190610f26929190613a8b565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff02191690836002811115610f7557fe5b02179055506080820151816004019080519060200190610f96929190613b0b565b50505083600001805490508460010184604051610fb39190614ab8565b90815260200160405180910390208190555050505050505050565b610fd66131f4565b73ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16148061103b57503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614155b61107a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107190614c33565b60405180910390fd5b80600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411156110fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f390614d13565b60405180910390fd5b60025460095482011115611145576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113c90614b93565b60405180910390fd5b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460096000828254039250508190555080600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550806009600082825401925050819055505050565b6000600254905090565b60003390506000611207828661328d565b90506001600281111561121657fe5b8160030160009054906101000a900460ff16600281111561123357fe5b14611273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126a90614df3565b60405180910390fd5b6000600554858161128057fe5b061480156112915750806002015484105b6112d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c790614b53565b60405180910390fd5b600554848260020154031080156112ed5750838160020154038351145b806112fa57506005548351145b611339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133090614bf3565b60405180910390fd5b6000151581600401600554868161134c57fe5b048154811061135757fe5b90600052602060002090602091828204019190069054906101000a900460ff161515146113b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b090614bd3565b60405180910390fd5b60006113c78387878761348c565b905080611409576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140090614cf3565b60405180910390fd5b600182600401600554878161141a57fe5b048154811061142557fe5b90600052602060002090602091828204019190066101000a81548160ff021916908315150217905550505050505050565b61145e613c45565b6000606061146b86612d2d565b91509150611477613a4f565b611481838361328d565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156115255780601f106114fa57610100808354040283529160200191611525565b820191906000526020600020905b81548152906001019060200180831161150857829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561157157fe5b600281111561157c57fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156115f457602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116115be5790505b505050505081525050905060028081111561160b57fe5b8160600151600281111561161b57fe5b1461165b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165290614e93565b60405180910390fd5b600554851115801561166d5750600085115b6116ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a390614bf3565b60405180910390fd5b806040015185870111156116f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ec90614b53565b60405180910390fd5b60006117038484898961353d565b80965081925050508061174b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174290614d73565b60405180910390fd5b505050509392505050565b60003390506000611767828461328d565b90506001600281111561177657fe5b8160030160009054906101000a900460ff16600281111561179357fe5b146117d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ca90614df3565b60405180910390fd5b60006001905060008260040180549050905060008090505b8181101561183e576000151584600401828154811061180657fe5b90600052602060002090602091828204019190069054906101000a900460ff161515141561183357600092505b8060010190506117eb565b508161187f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187690614d53565b60405180910390fd5b60028360030160006101000a81548160ff021916908360028111156118a057fe5b021790555060006118b185876135d0565b9050806118f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ea90614bb3565b60405180910390fd5b505050505050565b60606000606061190a84612d2d565b91509150606061191982612ac9565b90506000600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008090505b8251811015611a235760008260010184838151811061197f57fe5b60200260200101516040516119949190614aa1565b908152602001604051809103902054116119e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119da90614cb3565b60405180910390fd5b816002018382815181106119f357fe5b6020026020010151604051611a089190614aa1565b90815260200160405180910390209150806001019050611964565b5080600001805480602002602001604051908101604052809291908181526020016000905b82821015611beb57838290600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611b045780601f10611ad957610100808354040283529160200191611b04565b820191906000526020600020905b815481529060010190602001808311611ae757829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115611b5057fe5b6002811115611b5b57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015611bd357602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411611b9d5790505b50505050508152505081526020019060010190611a48565b50505050945050505050919050565b600360009054906101000a900460ff16611c3d57612000600481905550621000006005819055506001600360006101000a81548160ff0219169083151502179055505b60003390506305f5e100821115611c89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8090614db3565b60405180910390fd5b600660008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205483011115611d4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4390614e33565b60405180910390fd5b6060611d5784612ac9565b90506000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015611e6857600082600101846001840381518110611dc157fe5b6020026020010151604051611dd69190614aa1565b90815260200160405180910390205411611e25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1c90614cb3565b60405180910390fd5b81600201836001830381518110611e3857fe5b6020026020010151604051611e4d9190614aa1565b90815260200160405180910390209150806001019050611da3565b50600454816000018054905010611eb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eab90614dd3565b60405180910390fd5b60606001835111611ec55785611ede565b82600184510381518110611ed557fe5b60200260200101515b905060008260010182604051611ef49190614ab8565b90815260200160405180910390205414611f43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3a90614e13565b60405180910390fd5b611f4c816130af565b611f8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8290614d93565b60405180910390fd5b6000611f98858888613634565b905080611fda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd190614e73565b60405180910390fd5b6060600554600160055489010381611fee57fe5b0460405190808252806020026020018201604052801561201d5781602001602082028038833980820191505090505b509050836000016040518060a001604052808581526020016001151581526020018981526020016001600281111561205157fe5b8152602001838152509080600181540180825580915050600190039060005260206000209060050201600090919091909150600082015181600001908051906020019061209f929190613a8b565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff021916908360028111156120ee57fe5b0217905550608082015181600401908051906020019061210f929190613b0b565b5050508360000180549050846001018460405161212c9190614ab8565b90815260200160405180910390208190555086600760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505050505050505050565b60003390506121a2613a4f565b6121ac828461328d565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156122505780601f1061222557610100808354040283529160200191612250565b820191906000526020600020905b81548152906001019060200180831161223357829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561229c57fe5b60028111156122a757fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561231f57602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116122e95790505b50505050508152505090506000600281111561233757fe5b8160600151600281111561234757fe5b1415612388576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161237f90614c13565b60405180910390fd5b600061239483856136a1565b9050806123d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123cd90614c73565b60405180910390fd5b60606123e185612ac9565b90506000600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015612479578160020183600183038151811061244957fe5b602002602001015160405161245e9190614aa1565b9081526020016040518091039020915080600101905061242d565b50600060018260010186600001516040516124949190614aa1565b9081526020016040518091039020540390506124ae613a4f565b826000016001846000018054905003815481106124c757fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156125795780601f1061254e57610100808354040283529160200191612579565b820191906000526020600020905b81548152906001019060200180831161255c57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff1660028111156125c557fe5b60028111156125d057fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561264857602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116126125790505b50505050508152505090508083600001838154811061266357fe5b9060005260206000209060050201600082015181600001908051906020019061268d929190613a8b565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff021916908360028111156126dc57fe5b021790555060808201518160040190805190602001906126fd929190613b0b565b509050508260000180548061270e57fe5b6001900381819060005260206000209060050201600080820160006127339190613bb1565b6001820160006101000a81549060ff021916905560028201600090556003820160006101000a81549060ff02191690556004820160006127739190613bf9565b5050905582600101866000015160405161278d9190614aa1565b9081526020016040518091039020548360010182600001516040516127b29190614aa1565b90815260200160405180910390208190555060008360010187600001516040516127dc9190614aa1565b9081526020016040518091039020819055508560400151600760008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505050505050505050565b600080606061285784612d2d565b91509150612863613a4f565b61286d838361328d565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156129115780601f106128e657610100808354040283529160200191612911565b820191906000526020600020905b8154815290600101906020018083116128f457829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561295d57fe5b600281111561296857fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156129e057602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116129aa5790505b5050505050815250509050600160028111156129f857fe5b81606001516002811115612a0857fe5b1480612a2d5750600280811115612a1b57fe5b81606001516002811115612a2b57fe5b145b612a6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a6390614df3565b60405180910390fd5b6000612a788484613705565b809650819250505080612ac0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ab790614e53565b60405180910390fd5b50505050919050565b6060612ad3613c6a565b612adc8361376e565b9050612ae6613c6a565b612b246040518060400160405280600181526020017f2f0000000000000000000000000000000000000000000000000000000000000081525061376e565b905060606001612b3d838561379c90919063ffffffff16565b01604051908082528060200260200182016040528015612b7157816020015b6060815260200190600190039081612b5c5790505b50905060008090505b8151811015612bc257612b9e612b99848661381190919063ffffffff16565b61382b565b828281518110612baa57fe5b60200260200101819052508080600101915050612b7a565b50600081600183510381518110612bd557fe5b6020026020010151511415612c405780600182510381518110612bf457fe5b6020026020010160608152506001815103604051908082528060200260200182016040528015612c3857816020015b6060815260200190600190039081612c235790505b509350612c79565b8051604051908082528060200260200182016040528015612c7557816020015b6060815260200190600190039081612c605790505b5093505b60008090505b8451811015612cc057818181518110612c9457fe5b6020026020010151858281518110612ca857fe5b60200260200101819052508080600101915050612c7f565b50505050919050565b60008060016020601f85510181612cdc57fe5b040190506040518481526020810160005b83811015612d0e578060200286015181602002830152806001019050612ced565b50602082602085026040018460006010600019f1935050505092915050565b6000606060006028905080845111612d7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d7190614c93565b60405180910390fd5b6060816040519080825280601f01601f191660200182016040528015612daf5781602001600182028038833980820191505090505b50905060008090505b82811015612e1f57858181518110612dcc57fe5b602001015160f81c60f81b828281518110612de357fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050612db8565b50600080905060008090505b83811015612f4e576000838281518110612e4157fe5b602001015160f81c60f81b60f81c60ff16905060308110158015612e66575060398111155b80612e7f575060418110158015612e7e5750605a8111155b5b80612e98575060618110158015612e97575060668111155b5b612ed7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ece90614c93565b60405180910390fd5b60308110158015612ee9575060398111155b15612efa5760308103601084020192505b60418110158015612f0c5750605a8111155b15612f1d5760378103601084020192505b60618110158015612f2f575060668111155b15612f405760578103601084020192505b508080600101915050612e2b565b508094507f2f00000000000000000000000000000000000000000000000000000000000000868481518110612f7f57fe5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612fec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fe390614c93565b60405180910390fd5b6000600184885103039050806040519080825280601f01601f19166020018201604052801561302a5781602001600182028038833980820191505090505b50945060008090505b818110156130a5576000886001878401018151811061304e57fe5b602001015160f81c60f81b90508087838151811061306857fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350508080600101915050613033565b5050505050915091565b60006040516020016130c090614ae4565b60405160208183030381529060405280519060200120826040516020016130e79190614ab8565b604051602081830303815290604052805190602001201480613152575060405160200161311390614acf565b604051602081830303815290604052805190602001208260405160200161313a9190614ab8565b60405160208183030381529060405280519060200120145b8061315e575060008251145b1561316c576000905061318b565b60008251905060ff81111561318557600091505061318b565b60019150505b919050565b60008060016020601f855101816131a357fe5b040190506040518481526020810160005b838110156131d55780602002860151816020028301528060010190506131b4565b5060208260208502604001846000600f600019f1935050505092915050565b600073d2001000000000000000000000000000000000d273ffffffffffffffffffffffffffffffffffffffff166383e781fe6040518163ffffffff1660e01b815260040160206040518083038186803b15801561325057600080fd5b505afa158015613264573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506132889190810190613e2f565b905090565b6000606061329a83612ac9565b90506000600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b82518110156133ab5760008260010184600184038151811061330457fe5b60200260200101516040516133199190614aa1565b90815260200160405180910390205411613368576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161335f90614cb3565b60405180910390fd5b8160020183600183038151811061337b57fe5b60200260200101516040516133909190614aa1565b908152602001604051809103902091508060010190506132e6565b50606060018351116133bd57846133d6565b826001845103815181106133cd57fe5b60200260200101515b9050600082600101826040516133ec9190614ab8565b9081526020016040518091039020541161343b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161343290614cb3565b60405180910390fd5b600082600001600184600101846040516134559190614ab8565b908152602001604051809103902054038154811061346f57fe5b906000526020600020906005020190508094505050505092915050565b60008060016020601f8551018161349f57fe5b04019050600060016020601f885101816134b557fe5b040190506040518781526020810160005b838110156134e75780602002890151816020028301528060010190506134c6565b50868360200282015260005b8481101561351957806020028701518185600101016020028301528060010190506134f3565b50602082848601602002606001846000600c600019f1945050505050949350505050565b6000613547613c45565b600060016020601f8851018161355957fe5b0401905060006020601f86018161356c57fe5b0490506040518881526020810160005b8481101561359d57806020028a01518160200283015280600101905061357c565b5083602002810188815287816020015283602002868660030160200285600a600019fa9650505050505094509492505050565b60008060016020601f855101816135e357fe5b040190506040518481526020810160005b838110156136155780602002860151816020028301528060010190506135f4565b50602082602085026040018460006011600019f1935050505092915050565b60008060016020601f8651018161364757fe5b040190506040518581526020810160005b83811015613679578060200287015181602002830152806001019050613658565b50846020840282015260208260208502604001846000600b600019f193505050509392505050565b60008060016020601f855101816136b457fe5b040190506040518481526020810160005b838110156136e65780602002860151816020028301528060010190506136c5565b5060208260208502604001846000600e600019f1935050505092915050565b600080600060016020601f8651018161371a57fe5b040190506040518581526020810160005b8381101561374c57806020028701518160200283015280600101905061372b565b506020826020850260200184600d600019fa9450815193505050509250929050565b613776613c6a565b600060208301905060405180604001604052808451815260200182815250915050919050565b60008082600001516137c0856000015186602001518660000151876020015161388d565b0190505b8360000151846020015101811161380a578180600101925050826000015161380285602001518303866000015103838660000151876020015161388d565b0190506137c4565b5092915050565b613819613c6a565b613824838383613968565b5092915050565b60608082600001516040519080825280601f01601f1916602001820160405280156138655781602001600182028038833980820191505090505b50905060006020820190506138838185602001518660000151613a06565b8192505050919050565b6000808490506000868511613958576020851161391257600060018660200360080260020a031960001b905060008186511690506000878a8a0103905060008386511690505b828114613904578186106138f1578a8a019650505050505050613960565b85806001019650508386511690506138d3565b859650505050505050613960565b60008585209050600091505b85880382116139565760008684209050808214156139425783945050505050613960565b60018401935050818060010192505061391e565b505b868601925050505b949350505050565b613970613c6a565b600061398e856000015186602001518660000151876020015161388d565b905084602001518360200181815250508460200151810383600001818152505084600001518560200151018114156139d05760008560000181815250506139fb565b8360000151836000015101856000018181510391508181525050836000015181018560200181815250505b829150509392505050565b5b60208110613a2a5781518352602083019250602082019150602081039050613a07565b60006001826020036101000a0390508019835116818551168181178652505050505050565b6040518060a00160405280606081526020016000151581526020016000815260200160006002811115613a7e57fe5b8152602001606081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613acc57805160ff1916838001178555613afa565b82800160010185558215613afa579182015b82811115613af9578251825591602001919060010190613ade565b5b509050613b079190613c84565b5090565b82805482825590600052602060002090601f01602090048101928215613ba05791602002820160005b83821115613b7157835183826101000a81548160ff0219169083151502179055509260200192600101602081600001049283019260010302613b34565b8015613b9e5782816101000a81549060ff0219169055600101602081600001049283019260010302613b71565b505b509050613bad9190613ca9565b5090565b50805460018160011615610100020316600290046000825580601f10613bd75750613bf6565b601f016020900490600052602060002090810190613bf59190613c84565b5b50565b50805460008255601f016020900490600052602060002090810190613c1e9190613c84565b50565b5080546000825560050290600052602060002090810190613c429190613cd9565b50565b6040518062100000016040528061800090602082028038833980820191505090505090565b604051806040016040528060008152602001600081525090565b613ca691905b80821115613ca2576000816000905550600101613c8a565b5090565b90565b613cd691905b80821115613cd257600081816101000a81549060ff021916905550600101613caf565b5090565b90565b613d4591905b80821115613d415760008082016000613cf89190613bb1565b6001820160006101000a81549060ff021916905560028201600090556003820160006101000a81549060ff0219169055600482016000613d389190613bf9565b50600501613cdf565b5090565b90565b600081359050613d578161510d565b92915050565b600081519050613d6c8161510d565b92915050565b600082601f830112613d8357600080fd5b8135613d96613d9182614efb565b614ece565b91508082526020830160208301858383011115613db257600080fd5b613dbd8382846150ad565b50505092915050565b600082601f830112613dd757600080fd5b8135613dea613de582614f27565b614ece565b91508082526020830160208301858383011115613e0657600080fd5b613e118382846150ad565b50505092915050565b600081359050613e2981615124565b92915050565b600060208284031215613e4157600080fd5b6000613e4f84828501613d5d565b91505092915050565b60008060408385031215613e6b57600080fd5b6000613e7985828601613d48565b9250506020613e8a85828601613e1a565b9150509250929050565b600060208284031215613ea657600080fd5b600082013567ffffffffffffffff811115613ec057600080fd5b613ecc84828501613dc6565b91505092915050565b60008060408385031215613ee857600080fd5b600083013567ffffffffffffffff811115613f0257600080fd5b613f0e85828601613dc6565b9250506020613f1f85828601613e1a565b9150509250929050565b600080600060608486031215613f3e57600080fd5b600084013567ffffffffffffffff811115613f5857600080fd5b613f6486828701613dc6565b9350506020613f7586828701613e1a565b925050604084013567ffffffffffffffff811115613f9257600080fd5b613f9e86828701613d72565b9150509250925092565b600080600060608486031215613fbd57600080fd5b600084013567ffffffffffffffff811115613fd757600080fd5b613fe386828701613dc6565b9350506020613ff486828701613e1a565b925050604061400586828701613e1a565b9150509250925092565b600061401b838361417d565b60208301905092915050565b6000614033838361418c565b60208301905092915050565b600061404b8383614a06565b905092915050565b600061405e82614f7d565b6140688185614fdc565b935061407383614f53565b8060005b838110156140a457815161408b888261400f565b975061409683614fb5565b925050600181019050614077565b5085935050505092915050565b6140ba81614f88565b6140c48184614fed565b92506140cf82614f63565b8060005b838110156141005781516140e78782614027565b96506140f283614fc2565b9250506001810190506140d3565b505050505050565b600061411382614f94565b61411d8185614ff8565b93508360208202850161412f85614f6d565b8060005b8581101561416b578484038952815161414c858261403f565b945061415783614fcf565b925060208a01995050600181019050614133565b50829750879550505050505092915050565b61418681615048565b82525050565b61419581615054565b82525050565b6141a48161509b565b82525050565b6141b38161509b565b82525050565b60006141c482614faa565b6141ce818561502b565b93506141de8185602086016150bc565b80840191505092915050565b60006141f582614f9f565b6141ff8185615009565b935061420f8185602086016150bc565b614218816150ef565b840191505092915050565b600061422e82614f9f565b614238818561502b565b93506142488185602086016150bc565b80840191505092915050565b600061426160188361501a565b91507f496e636f7272656374206368756e6b20706f736974696f6e00000000000000006000830152602082019050919050565b60006142a160158361501a565b91507f4469726563746f7279206e6f74206372656174656400000000000000000000006000830152602082019050919050565b60006142e160248361501a565b91507f4e6f7420656e6f756768206d656d6f727920696e207468652046696c6573746f60008301527f72616765000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614347601b8361501a565b91507f48617368206861736e2774206265656e2063616c63756c6174656400000000006000830152602082019050919050565b600061438760198361501a565b91507f4368756e6b20697320616c72656164792075706c6f61646564000000000000006000830152602082019050919050565b60006143c760168361501a565b91507f496e636f7272656374206368756e6b206c656e677468000000000000000000006000830152602082019050919050565b6000614407600f8361501a565b91507f46696c65206e6f742065786973747300000000000000000000000000000000006000830152602082019050919050565b6000614447600e8361501a565b91507f496e76616c69642073656e6465720000000000000000000000000000000000006000830152602082019050919050565b600061448760188361501a565b91507f4469726563746f7279206973206e6f742064656c6574656400000000000000006000830152602082019050919050565b60006144c760108361501a565b91507f46696c65206e6f742064656c65746564000000000000000000000000000000006000830152602082019050919050565b600061450760138361501a565b91507f496e76616c69642073746f7261676550617468000000000000000000000000006000830152602082019050919050565b6000614547600c8361501a565b91507f496e76616c6964207061746800000000000000000000000000000000000000006000830152602082019050919050565b600061458760018361502b565b91507f2e000000000000000000000000000000000000000000000000000000000000006000830152600182019050919050565b60006145c760168361501a565b91507f496e76616c6964206469726563746f7279206e616d65000000000000000000006000830152602082019050919050565b600061460760158361501a565b91507f4368756e6b207761736e27742075706c6f6164656400000000000000000000006000830152602082019050919050565b600061464760268361501a565b91507f436f756c64206e6f742072657365727665206c657373207468616e207573656460008301527f20737061636500000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006146ad60168361501a565b91507f4469726563746f7279206973206e6f7420656d707479000000000000000000006000830152602082019050919050565b60006146ed60238361501a565b91507f46696c65206861736e2774206265656e2075706c6f6164656420636f7272656360008301527f746c7900000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061475360118361501a565b91507f4368756e6b207761736e277420726561640000000000000000000000000000006000830152602082019050919050565b600061479360188361501a565b91507f46696c656e616d652073686f756c64206265203c2032353600000000000000006000830152602082019050919050565b60006147d3601f8361501a565b91507f46696c652073686f756c64206265206c657373207468616e20313030204d42006000830152602082019050919050565b600061481360028361502b565b91507f2e2e0000000000000000000000000000000000000000000000000000000000006000830152600282019050919050565b600061485360118361501a565b91507f4469726563746f72792069732066756c6c0000000000000000000000000000006000830152602082019050919050565b6000614893600e8361501a565b91507f46696c65206e6f7420666f756e640000000000000000000000000000000000006000830152602082019050919050565b60006148d360188361501a565b91507f46696c65206f72206469726563746f72792065786973747300000000000000006000830152602082019050919050565b600061491360198361501a565b91507f4e6f7420656e6f756768207265736572766564207370616365000000000000006000830152602082019050919050565b600061495360188361501a565b91507f45564d206572726f7220696e2067657446696c6553697a6500000000000000006000830152602082019050919050565b600061499360108361501a565b91507f46696c65206e6f742063726561746564000000000000000000000000000000006000830152602082019050919050565b60006149d360198361501a565b91507f46696c65206861736e2774206265656e2075706c6f61646564000000000000006000830152602082019050919050565b600060a0830160008301518482036000860152614a2382826141ea565b9150506020830151614a38602086018261417d565b506040830151614a4b6040860182614a83565b506060830151614a5e606086018261419b565b5060808301518482036080860152614a768282614053565b9150508091505092915050565b614a8c81615091565b82525050565b614a9b81615091565b82525050565b6000614aad8284614223565b915081905092915050565b6000614ac482846141b9565b915081905092915050565b6000614ada8261457a565b9150819050919050565b6000614aef82614806565b9150819050919050565b60006210000082019050614b1060008301846140b1565b92915050565b60006020820190508181036000830152614b308184614108565b905092915050565b6000602082019050614b4d60008301846141aa565b92915050565b60006020820190508181036000830152614b6c81614254565b9050919050565b60006020820190508181036000830152614b8c81614294565b9050919050565b60006020820190508181036000830152614bac816142d4565b9050919050565b60006020820190508181036000830152614bcc8161433a565b9050919050565b60006020820190508181036000830152614bec8161437a565b9050919050565b60006020820190508181036000830152614c0c816143ba565b9050919050565b60006020820190508181036000830152614c2c816143fa565b9050919050565b60006020820190508181036000830152614c4c8161443a565b9050919050565b60006020820190508181036000830152614c6c8161447a565b9050919050565b60006020820190508181036000830152614c8c816144ba565b9050919050565b60006020820190508181036000830152614cac816144fa565b9050919050565b60006020820190508181036000830152614ccc8161453a565b9050919050565b60006020820190508181036000830152614cec816145ba565b9050919050565b60006020820190508181036000830152614d0c816145fa565b9050919050565b60006020820190508181036000830152614d2c8161463a565b9050919050565b60006020820190508181036000830152614d4c816146a0565b9050919050565b60006020820190508181036000830152614d6c816146e0565b9050919050565b60006020820190508181036000830152614d8c81614746565b9050919050565b60006020820190508181036000830152614dac81614786565b9050919050565b60006020820190508181036000830152614dcc816147c6565b9050919050565b60006020820190508181036000830152614dec81614846565b9050919050565b60006020820190508181036000830152614e0c81614886565b9050919050565b60006020820190508181036000830152614e2c816148c6565b9050919050565b60006020820190508181036000830152614e4c81614906565b9050919050565b60006020820190508181036000830152614e6c81614946565b9050919050565b60006020820190508181036000830152614e8c81614986565b9050919050565b60006020820190508181036000830152614eac816149c6565b9050919050565b6000602082019050614ec86000830184614a92565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614ef157600080fd5b8060405250919050565b600067ffffffffffffffff821115614f1257600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614f3e57600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050919050565b6000819050602082019050919050565b600081519050919050565b60006180009050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061504182615071565b9050919050565b60008115159050919050565b6000819050919050565b600081905061506c82615100565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006150a68261505e565b9050919050565b82818337600083830152505050565b60005b838110156150da5780820151818401526020810190506150bf565b838111156150e9576000848401525b50505050565b6000601f19601f8301169050919050565b6003811061510a57fe5b50565b61511681615036565b811461512157600080fd5b50565b61512d81615091565b811461513857600080fd5b5056fea2646970667358221220a549ad9e778ae8bb3048c0a1805e77745871cc1560637ae1c3ebccb76638d9c464736f6c63430006020033", + "nonce": "0", + "storage": {} + }, + "0xa096b05a489831db893fc53aacc7ed20efb36382": { + "balance": "1000000000000000000000000000000" + }, + "0xa1cd651d99283be60e2a9d2e3bc8a90aedb8244f": { + "balance": "1000000000000000000000000000000" + }, + "0xa2969e82619021ea407338f8bdf7c6f2bd679673": { + "balance": "1000000000000000000000000000000" + }, + "0xa3597b1162b6559cb5e966904b63e762ece756a4": { + "balance": "1000000000000000000000000000000" + }, + "0xa68f946090c600eda6f139783077ee802afeb990": { + "balance": "1000000000000000000000000000000" + }, + "0xa6d50055592cecb795bc1ed3b9ea57ed426b0b7c": { + "balance": "1000000000000000000000000000000" + }, + "0xa7c0789bdeee38c6b59111a789dfb6b815489847": { + "balance": "1000000000000000000000000000000" + }, + "0xa8c813ee806b4c8537ff5f16084d44db18ea9ab1": { + "balance": "1000000000000000000000000000000" + }, + "0xaa6a87bbb74bc1f3cb40c1efb7fc171ee6407560": { + "balance": "1000000000000000000000000000000" + }, + "0xabf920b89f5a2487fdb70be17fd01a99a0602e62": { + "balance": "1000000000000000000000000000000" + }, + "0xac5df92da5171ba24a9618018b4f79494040334b": { + "balance": "1000000000000000000000000000000" + }, + "0xaf97a8318a1a51d5daeeb9650024b63ee44f45bd": { + "balance": "1000000000000000000000000000000" + }, + "0xb28c45b98ae43a5e9ee5509c97ea037b5de5d6d9": { + "balance": "1000000000000000000000000000000" + }, + "0xb64989ab32b089da3da103b93e6781d6d5dd10b4": { + "balance": "1000000000000000000000000000000" + }, + "0xb67e6f4a21f93c250fa6ff0cb142bd14dd4ca8eb": { + "balance": "1000000000000000000000000000000" + }, + "0xb70603c505f85130b5b2e73cd82d196dfd7d8b5e": { + "balance": "1000000000000000000000000000000" + }, + "0xb942414cae2a1ab1056657b905845c0ab6b6280a": { + "balance": "1000000000000000000000000000000" + }, + "0xbee0e5c1961d51be9bd670876caa9c90ba7d9016": { + "balance": "1000000000000000000000000000000" + }, + "0xbf2d8cebdeeb8ad8fed7b2a75f35922106f8d75c": { + "balance": "1000000000000000000000000000000" + }, + "0xbf5aa678b969c0871e2fbcf09c3dbb5d5865ac1e": { + "balance": "1000000000000000000000000000000" + }, + "0xc12bcedd9bcad9120150122cd50f39576ecccc08": { + "balance": "1000000000000000000000000000000" + }, + "0xc2d3852f3292acb81bd164dbae5f1e2a87535150": { + "balance": "1000000000000000000000000000000" + }, + "0xc3820490201e94d76b44655d2df713fec29d9795": { + "balance": "1000000000000000000000000000000" + }, + "0xc58744e2eceefd45cc5469f0e0a708ad24ddbbdb": { + "balance": "1000000000000000000000000000000" + }, + "0xc7865200e8e51ba1c8d695f327deed432930f2cc": { + "balance": "1000000000000000000000000000000" + }, + "0xc8e4d709eb3eb335dc69c9fbf2d24d447cb86105": { + "balance": "1000000000000000000000000000000" + }, + "0xc98af661e44c5bf31d2f8bdff4bbf2808ed4e991": { + "balance": "1000000000000000000000000000000" + }, + "0xca4409573a5129a72edf85d6c51e26760fc9c903": { + "balance": "100000000000000000000000" + }, + "0xcc33e23b04b74f7ba8fbe315083182224af973fa": { + "balance": "1000000000000000000000000000000" + }, + "0xce1c62d0a77600fb2f959b4da76fcb9b3b9430a3": { + "balance": "1000000000000000000000000000000" + }, + "0xd1b6c947fb14060b38945584714491592e84875d": { + "balance": "1000000000000000000000000000000" + }, + "0xd23cd6a9ddcc3470300003621bbac1e06a7919d5": { + "balance": "1000000000000000000000000000000" + }, + "0xd2c5b39B4e735C17612Bb5a08FD024ccc5dBCb23": { + "balance": "100000000000000000000000" + }, + "0xd2cd302eb060e375a65d65946692a3ac2d838d35": { + "balance": "1000000000000000000000000000000" + }, + "0xd2e75c41ced8699e3176f6e335355701a2568b7b": { + "balance": "1000000000000000000000000000000" + }, + "0xd3d38f4cb0aeb4c7c2527ddaeec2ab3b910c8528": { + "balance": "1000000000000000000000000000000" + }, + "0xd5b561a27cca5049650a14ab93dbf1a20c0cefc1": { + "balance": "1000000000000000000000000000000" + }, + "0xd90045420b8abc37b3f9304ed2b385fc1b7fa8c5": { + "balance": "1000000000000000000000000000000" + }, + "0xd951bf4cff429062702a7d8699a5f0bf14845d9b": { + "balance": "1000000000000000000000000000000" + }, + "0xdc6a269c58e58a93a22b5df8cdf1af630c47481f": { + "balance": "1000000000000000000000000000000" + }, + "0xdc6d02ef4003a4f2d0ccff65ae1a2d8157fbb23e": { + "balance": "1000000000000000000000000000000" + }, + "0xde14aca36acc62c305a7ee571da37840a408e600": { + "balance": "1000000000000000000000000000000" + }, + "0xdee32ae508cf783f53ab8bc39d878fe323cdfae3": { + "balance": "1000000000000000000000000000000" + }, + "0xe083a100d51fc4f38aae4a3a68404c36ad96c612": { + "balance": "1000000000000000000000000000000" + }, + "0xe1607990ce800407e3c206e58de4917977181d4d": { + "balance": "1000000000000000000000000000000" + }, + "0xe25e5b63dfd4cf59b81eddf64f1195858634b8a6": { + "balance": "1000000000000000000000000000000" + }, + "0xe372377decb3bdc0c7f5272d38ce0ba2a54934fe": { + "balance": "1000000000000000000000000000000" + }, + "0xe3cc6ec63b5652d1594bc63bb293f4e80f76dbdd": { + "balance": "1000000000000000000000000000000" + }, + "0xe3da7c014286258944ab20a31e4d861b4c9262f1": { + "balance": "1000000000000000000000000000000" + }, + "0xe8b57f330d56081c856e618210fbedb414925ff0": { + "balance": "1000000000000000000000000000000" + }, + "0xe91ac72a568e752eb7c9f5235100586ce97c8cc1": { + "balance": "1000000000000000000000000000000" + }, + "0xf184c8c243a178c1748a0af45caedeca476105b4": { + "balance": "1000000000000000000000000000000" + }, + "0xf1a5912ff318aebf312cdb54c75642a9e632703c": { + "balance": "1000000000000000000000000000000" + }, + "0xf2197b153b4c9086fc5410431fbf7960d284c65e": { + "balance": "1000000000000000000000000000000" + }, + "0xf36620e71327f4a55d550d46e030ccf0c728f154": { + "balance": "1000000000000000000000000000000" + }, + "0xf9817fB82fc767aA9A4A97a1901676244b88ce0E": { + "balance": "100000000000000000000000" + }, + "0xfa723938fa8da1a8a2114ad409a11581761ee40d": { + "balance": "1000000000000000000000000000000" + }, + "0xfa7a8c69810eaf16a395d2a93b3ab51efeed2a1c": { + "balance": "1000000000000000000000000000000" + }, + "0xfaa1038074941571524934ba52d312e88b3577f5": { + "balance": "1000000000000000000000000000000" + }, + "0xfe14077c26a507496b7208384d459e21c49c4212": { + "balance": "1000000000000000000000000000000" + }, + "0xfe275c9b5ac792327da509b27eb9614196dfb07d": { + "balance": "1000000000000000000000000000000" + }, + "0xfe2c5aa110fff89361806ea7ee080bfffba0d3dd": { + "balance": "1000000000000000000000000000000" + }, + "0xfe3d4f1fc038f4f756ba44995129cd45c9e0e861": { + "balance": "1000000000000000000000000000000" + }, + "0xfee314cdc84ecfaa675e41b3559c0101e1eba6b8": { + "balance": "1000000000000000000000000000000" + } + }, + "genesis": { + "author": "0x0000000000000000000000000000000000000001", + "difficulty": "0x0", + "extraData": "0x11bbe8db4e347b4e8c937c1c8370e4b5ed33adb3db69cbdb7a38e1e50b1b82fa", + "gasLimit": "0xFFFFFFFFF", + "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000abc", + "nonce": "0x0000000000000042", + "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "timestamp": "0x00" + }, + "params": { + "EIP150ForkBlock": "0x00", + "EIP158ForkBlock": "0x00", + "accountStartNonce": "0x00", + "blockReward": "0x4563918244F40000", + "byzantiumForkBlock": "0x0", + "chainID": "0x12345", + "constantinopleForkBlock": "0x0", + "daoHardforkBlock": "0x0", + "difficultyBoundDivisor": "0x0800", + "durationLimit": "0x0d", + "externalGasDifficulty": "0x01", + "gasLimitBoundDivisor": "0x0400", + "homesteadForkBlock": "0x0", + "maxGasLimit": "0xFFFFFFFFF", + "maximumExtraDataSize": "0x20", + "minGasLimit": "0xFFFFFFFFF", + "minimumDifficulty": "0x0", + "networkID": "12313219", + "tieBreakingGas": false + }, + "sealEngine": "Ethash", + "skaleConfig": { + "nodeInfo": { + "basePort": 2231, + "bindIP": "0.0.0.0", + "collectionDuration": 10, + "collectionQueueSize": 2, + "db-path": "/tmp/test_eth_11_of_16", + "ecdsaKeyName": "", + "httpRpcPort": 2234, + "httpsRpcPort": 1239, + "logLevel": "info", + "logLevelProposal": "info", + "maxCacheSize": 2000, + "maxOpenLeveldbFiles": 25, + "minCacheSize": 1000, + "nodeID": 1611, + "nodeName": "Node1", + "rotateAfterBlock": 0, + "testSignatures": true, + "transactionQueueSize": 10000, + "wsRpcPort": 2233, + "wssRpcPort": 2238 + }, + "sChain": { + "EIP1559TransactionsPatchTimestamp": 1, + "contractStorageLimit": 10000000000, + "contractStoragePatchTimestamp": 1, + "contractStorageZeroValuePatchTimestamp": 1, + "correctForkInPowPatchTimestamp": 1, + "emptyBlockIntervalMs": 10000, + "fastConsensusPatchTimestamp": 1, + "flexibleDeploymentPatchTimestamp": 1, + "levelDBReopenIntervalMs": 1, + "multiTransactionMode": false, + "nodes": [ + { + "basePort": 1231, + "ip": "127.0.0.1", + "nodeID": 1601, + "publicKey": "", + "schainIndex": 1 + }, + { + "basePort": 1331, + "ip": "127.0.0.1", + "nodeID": 1602, + "publicKey": "", + "schainIndex": 2 + }, + { + "basePort": 1431, + "ip": "127.0.0.1", + "nodeID": 1603, + "publicKey": "", + "schainIndex": 3 + }, + { + "basePort": 1531, + "ip": "127.0.0.1", + "nodeID": 1604, + "publicKey": "", + "schainIndex": 4 + }, + { + "basePort": 1631, + "ip": "127.0.0.1", + "nodeID": 1605, + "publicKey": "", + "schainIndex": 5 + }, + { + "basePort": 1731, + "ip": "127.0.0.1", + "nodeID": 1606, + "publicKey": "", + "schainIndex": 6 + }, + { + "basePort": 1831, + "ip": "127.0.0.1", + "nodeID": 1607, + "publicKey": "", + "schainIndex": 7 + }, + { + "basePort": 1931, + "ip": "127.0.0.1", + "nodeID": 1608, + "publicKey": "", + "schainIndex": 8 + }, + { + "basePort": 2031, + "ip": "127.0.0.1", + "nodeID": 1609, + "publicKey": "", + "schainIndex": 9 + }, + { + "basePort": 2131, + "ip": "127.0.0.1", + "nodeID": 1610, + "publicKey": "", + "schainIndex": 10 + }, + { + "basePort": 2231, + "ip": "127.0.0.1", + "nodeID": 1611, + "publicKey": "", + "schainIndex": 11 + }, + { + "basePort": 2331, + "ip": "127.0.0.1", + "nodeID": 1612, + "publicKey": "", + "schainIndex": 12 + }, + { + "basePort": 2431, + "ip": "127.0.0.1", + "nodeID": 1613, + "publicKey": "", + "schainIndex": 13 + }, + { + "basePort": 2531, + "ip": "127.0.0.1", + "nodeID": 1614, + "publicKey": "", + "schainIndex": 14 + }, + { + "basePort": 2631, + "ip": "127.0.0.1", + "nodeID": 1615, + "publicKey": "", + "schainIndex": 15 + }, + { + "basePort": 2731, + "ip": "127.0.0.1", + "nodeID": 1616, + "publicKey": "", + "schainIndex": 16 + } + ], + "powCheckPatchTimestamp": 1, + "precompiledConfigPatchTimestamp": 1, + "pushZeroPatchTimestamp": 1, + "revertableFSPatchTimestamp": 1, + "schainID": 5, + "schainName": "TestChain", + "schainOwner": "0x907cd0881E50d359bb9Fd120B1A5A143b1C97De6", + "skipInvalidTransactionsPatchTimestamp": 1, + "storageDestructionPatchTimestamp": 1, + "verifyBlsSyncPatchTimestamp": 1, + "verifyDaSigsPatchTimestamp": 1 + } + }, + "unddos": { + "origins": [ + { + "ban_lengthy": 0, + "ban_peak": 0, + "max_calls_per_minute": 1000000000, + "max_calls_per_second": 1000000000, + "max_ws_conn": 65535, + "origin": [ + "*" + ] + } + ] + } +} \ No newline at end of file diff --git a/test/historicstate/configs/test_12_of_16.json b/test/historicstate/configs/test_12_of_16.json new file mode 100644 index 000000000..50fbb6bb8 --- /dev/null +++ b/test/historicstate/configs/test_12_of_16.json @@ -0,0 +1,910 @@ +{ + "accounts": { + "0000000000000000000000000000000000000001": { + "precompiled": { + "linear": { + "base": 3000, + "word": 0 + }, + "name": "ecrecover" + } + }, + "0000000000000000000000000000000000000002": { + "precompiled": { + "linear": { + "base": 60, + "word": 12 + }, + "name": "sha256" + } + }, + "0000000000000000000000000000000000000003": { + "precompiled": { + "linear": { + "base": 600, + "word": 120 + }, + "name": "ripemd160" + } + }, + "0000000000000000000000000000000000000004": { + "precompiled": { + "linear": { + "base": 15, + "word": 3 + }, + "name": "identity" + } + }, + "0000000000000000000000000000000000000005": { + "precompiled": { + "name": "modexp", + "startingBlock": "0x2dc6c0" + } + }, + "0000000000000000000000000000000000000006": { + "precompiled": { + "linear": { + "base": 500, + "word": 0 + }, + "name": "alt_bn128_G1_add", + "startingBlock": "0x2dc6c0" + } + }, + "0000000000000000000000000000000000000007": { + "precompiled": { + "linear": { + "base": 40000, + "word": 0 + }, + "name": "alt_bn128_G1_mul", + "startingBlock": "0x2dc6c0" + } + }, + "0000000000000000000000000000000000000008": { + "precompiled": { + "name": "alt_bn128_pairing_product", + "startingBlock": "0x2dc6c0" + } + }, + "000000000000000000000000000000000000000A": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "readChunk", + "startingBlock": "0x0" + } + }, + "000000000000000000000000000000000000000B": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "createFile", + "restrictAccess": [ + "69362535ec535F0643cBf62D16aDeDCAf32Ee6F7" + ], + "startingBlock": "0x0" + } + }, + "000000000000000000000000000000000000000C": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "uploadChunk", + "startingBlock": "0x0" + } + }, + "000000000000000000000000000000000000000D": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "getFileSize", + "startingBlock": "0x0" + } + }, + "000000000000000000000000000000000000000E": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "deleteFile", + "startingBlock": "0x0" + } + }, + "000000000000000000000000000000000000000F": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "createDirectory", + "startingBlock": "0x0" + } + }, + "0000000000000000000000000000000000000010": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "deleteDirectory", + "startingBlock": "0x0" + } + }, + "0x006d8e49ce0b9eb5646e34a4d91934801b9044fd": { + "balance": "1000000000000000000000000000000" + }, + "0x0150b461b06922a5030784ba888962c28bb1f188": { + "balance": "1000000000000000000000000000000" + }, + "0x03309956988ae70152ae4469daf99b0cac2306c5": { + "balance": "1000000000000000000000000000000" + }, + "0x06104a85a380895b6dd4030113806df2b044905e": { + "balance": "1000000000000000000000000000000" + }, + "0x079cf317ef40b16141784b6fabff812d64f7c0fd": { + "balance": "1000000000000000000000000000000" + }, + "0x0966454f51166c68b73b2865473c8fb2fcdefdd5": { + "balance": "1000000000000000000000000000000" + }, + "0x099452fedc71897880f584b1bc1706efc4e76e36": { + "balance": "1000000000000000000000000000000" + }, + "0x0aa6a44690ef52354e976990292cf9c5cd36ad59": { + "balance": "1000000000000000000000000000000" + }, + "0x0fbbe17a0e5a61ee3e8661f442d7f6b177c49820": { + "balance": "1000000000000000000000000000000" + }, + "0x1239fe658b410dbbac5bbd572035f5041542f9e5": { + "balance": "1000000000000000000000000000000" + }, + "0x12d5d7340a93be7be28ea7a3ae198242f8e1282c": { + "balance": "1000000000000000000000000000000" + }, + "0x137048b9fa4f1234d6519271b2c5ec64f480db0f": { + "balance": "1000000000000000000000000000000" + }, + "0x13867af77a63048e17380e39248ada90521e97e4": { + "balance": "1000000000000000000000000000000" + }, + "0x138ea4bdf0382c2deffd5b0bff0afe59f471467f": { + "balance": "1000000000000000000000000000000" + }, + "0x13d19c55ee0a212249d26b9d741ff6d7f416db01": { + "balance": "1000000000000000000000000000000" + }, + "0x157d38b52196b248e9fe6a2172e32ce2b8c078e6": { + "balance": "1000000000000000000000000000000" + }, + "0x16e8c390f8e576161cfe966f2c3e5dd303eb9039": { + "balance": "1000000000000000000000000000000" + }, + "0x194cb9991d3d94c43e400becf21dfea45e7b3b4c": { + "balance": "1000000000000000000000000000000" + }, + "0x1C9abe4ff0CcECa40fc404c74AB7d4923fEF8901": { + "balance": "100000000000000000000000" + }, + "0x1a66fc89809112c20aa76a993db712fa9e003e4e": { + "balance": "1000000000000000000000000000000" + }, + "0x1f1d6041e12a18cf1202019f146f2fc150915e8d": { + "balance": "1000000000000000000000000000000" + }, + "0x1feaf1671c1f0faf0d44c152f72dc755db932569": { + "balance": "1000000000000000000000000000000" + }, + "0x236bf02dfafaf03851a4e6f5d69052f4884cec32": { + "balance": "1000000000000000000000000000000" + }, + "0x26d88f6a8b659be4165ee53774a057e41b5201c9": { + "balance": "1000000000000000000000000000000" + }, + "0x28353685b0b986a724b92113debb3d8cd9a6b263": { + "balance": "1000000000000000000000000000000" + }, + "0x29d83322219fdfb821459d5fdf796360faf3166a": { + "balance": "1000000000000000000000000000000" + }, + "0x2bee474be207bdbeac83d6672da5ed2fd417eac9": { + "balance": "1000000000000000000000000000000" + }, + "0x2d93455b07bccf38e8d019f7f43a2c2d70b46b4e": { + "balance": "1000000000000000000000000000000" + }, + "0x2f971bd38806c3ca45ae0a125d1267118bf5619c": { + "balance": "1000000000000000000000000000000" + }, + "0x30aaab366dfac8331f3e827495c789cde9b437c0": { + "balance": "1000000000000000000000000000000" + }, + "0x32ea0400dc2d20664cc4744b2fab04ecb709445c": { + "balance": "1000000000000000000000000000000" + }, + "0x3760dc9594ccac0f33ade5cc5371402131696341": { + "balance": "1000000000000000000000000000000" + }, + "0x38855e430611bc179cd777a8704679ffc43921de": { + "balance": "1000000000000000000000000000000" + }, + "0x3a921471a2397644c37c88ef9572c421ab37145d": { + "balance": "1000000000000000000000000000000" + }, + "0x3bcca8a8471d55a1a668bc163c0336e4a57e5c99": { + "balance": "1000000000000000000000000000000" + }, + "0x3d46ee560227c1d73cd6042b47fc8fddd8a06ecb": { + "balance": "1000000000000000000000000000000" + }, + "0x3f5bdf5d4c274c82b8d17aa2810b00d2cf050f24": { + "balance": "1000000000000000000000000000000" + }, + "0x3ffe1c9183e0f97f52a816405a7d2350624ec88b": { + "balance": "1000000000000000000000000000000" + }, + "0x426ec5f07847674aada3856609d8baaa16805d88": { + "balance": "1000000000000000000000000000000" + }, + "0x482d7f53cba6ae73a354533673c48e2dfd560949": { + "balance": "1000000000000000000000000000000" + }, + "0x48acbd6a2724eadcc2a11144ab84b6a617d1a241": { + "balance": "1000000000000000000000000000000" + }, + "0x49ef89840e400026eb5c8d79bd1b0adc152fe86d": { + "balance": "1000000000000000000000000000000" + }, + "0x4bf989fa6572af36b190032505506f1db888357f": { + "balance": "1000000000000000000000000000000" + }, + "0x4cf9b195f7cb5f86694d9b399fe21a5f34616fd3": { + "balance": "1000000000000000000000000000000" + }, + "0x4e9b85904bca60aeb5b916ca86ac622096908427": { + "balance": "1000000000000000000000000000000" + }, + "0x50120c17d7b59200e9b76e89e4e3de2f0cd00090": { + "balance": "1000000000000000000000000000000" + }, + "0x54db355342c35085a1a53184162b2fddd0a43b0f": { + "balance": "1000000000000000000000000000000" + }, + "0x54e228d8fea148cfe2b109b3b152ff21321d09a2": { + "balance": "1000000000000000000000000000000" + }, + "0x5667601b7dcde6f24d06bccc4f291cb06976f4ee": { + "balance": "1000000000000000000000000000000" + }, + "0x57829f2ecca390cd9d1c41f92328bad4d1073bbb": { + "balance": "1000000000000000000000000000000" + }, + "0x5EF25557E2ed6AFfF321B266C93e95A0B4B05AbC": { + "balance": "1000000000000000000000000" + }, + "0x5a3adad4382b3eb1e0c65f2de2845901081039b5": { + "balance": "1000000000000000000000000000000" + }, + "0x5cdb7392efdce502ccc6fba5c3c1dd1653967b4d": { + "balance": "1000000000000000000000000000000" + }, + "0x5d012c13b2854bda8b7b6580e97e52751884f827": { + "balance": "1000000000000000000000000000000" + }, + "0x5d9326c6504833d84f8a0d65ded59b1a6e768ca2": { + "balance": "1000000000000000000000000000000" + }, + "0x60268f799d8f1808e4a32c2eb898e73a8881f6f0": { + "balance": "1000000000000000000000000000000" + }, + "0x605ba4a05d779f9869bd9a10234c22f516766cfe": { + "balance": "1000000000000000000000000000000" + }, + "0x6093f0f2a7b5148b71603ac439adbc4c0e5aa5da": { + "balance": "1000000000000000000000000000000" + }, + "0x6196d135CdDb9d73A0756C1E44b5b02B11acf594": { + "balance": "2000000000000000000000", + "code": "", + "nonce": "5076", + "storage": {} + }, + "0x62712ceccb50f62ca4c5402fff6da9c819c866cf": { + "balance": "1000000000000000000000000000000" + }, + "0x62971de462ea1ec0d3b43a6a85b6fb975e6c6f64": { + "balance": "1000000000000000000000000000000" + }, + "0x62cf32dfb9eb6358dc5deb006aef1d75fb153e5f": { + "balance": "1000000000000000000000000000000" + }, + "0x62d8b22c1d71577829b2fee20a5c3fff43aed0ec": { + "balance": "100000000000000000000000" + }, + "0x6314956b78bb2eaed1c49b3ae71d4d0ec501cfab": { + "balance": "1000000000000000000000000000000" + }, + "0x661bda4daeba3ce9ac2aa30b80d463580f90d31a": { + "balance": "1000000000000000000000000000000" + }, + "0x66c5a87f4a49DD75e970055A265E8dd5C3F8f852": { + "balance": "1000000000000000000000" + }, + "0x66cd465ddcd85504c0d2cfb1728acee994d55a3f": { + "balance": "1000000000000000000000000000000" + }, + "0x68bca79ae7aae796027ff843d2303444da5cf5d8": { + "balance": "1000000000000000000000000000000" + }, + "0x6923877b65e24966efa9efd1207822fa2eaf601a": { + "balance": "1000000000000000000000000000000" + }, + "0x69362535ec535F0643cBf62D16aDeDCAf32Ee6F7": { + "balance": "0", + "code": "0x608060405234801561001057600080fd5b50600436106100b45760003560e01c806379210e8e1161007157806379210e8e1461017757806381a8235a146101a757806385aeeb17146101c35780639a9a5593146101f3578063a99100541461020f578063b57321221461022b576100b4565b806307c6e7d3146100b9578063122f4fba146100d55780631c6ec7a9146101055780631cfe4e3b14610121578063373dedb41461013d57806361e46db51461015b575b600080fd5b6100d360048036036100ce9190810190613cff565b61025b565b005b6100ef60048036036100ea9190810190613cff565b610804565b6040516100fc9190614963565b60405180910390f35b61011f600480360361011a9190810190613cff565b610b43565b005b61013b60048036036101369190810190613cc3565b610f72565b005b610145611190565b6040516101529190614cbe565b60405180910390f35b61017560048036036101709190810190613d94565b611199565b005b610191600480360361018c9190810190613e13565b6113f9565b60405161019e9190614924565b60405180910390f35b6101c160048036036101bc9190810190613cff565b6116f9565b005b6101dd60048036036101d89190810190613cff565b61189e565b6040516101ea9190614941565b60405180910390f35b61020d60048036036102089190810190613d40565b611b9d565b005b61022960048036036102249190810190613cff565b61202c565b005b61024560048036036102409190810190613cff565b612682565b6040516102529190614cbe565b60405180910390f35b6000339050606061026b83612902565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b825181101561037c576000826001018460018403815181106102d557fe5b60200260200101516040516102ea91906148cc565b90815260200160405180910390205411610339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161033090614ade565b60405180910390fd5b8160020183600183038151811061034c57fe5b602002602001015160405161036191906148cc565b908152602001604051809103902091508060010190506102b7565b506060600183511161038e57846103a7565b8260018451038151811061039e57fe5b60200260200101515b9050600082600101826040516103bd91906148e3565b9081526020016040518091039020541161040c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161040390614ade565b60405180910390fd5b6000826002018260405161042091906148e3565b90815260200160405180910390206000018054905014610475576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161046c90614b5e565b60405180910390fd5b60006104818587612b02565b9050806104c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ba90614a7e565b60405180910390fd5b6104cb613888565b836000016001856000018054905003815481106104e457fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156105965780601f1061056b57610100808354040283529160200191610596565b820191906000526020600020905b81548152906001019060200180831161057957829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff1660028111156105e257fe5b60028111156105ed57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561066557602002820191906000526020600020906000905b82829054906101000a900460ff1615158152602001906001019060208260000104928301926001038202915080841161062f5790505b505050505081525050905080846000016001866001018660405161068991906148e3565b90815260200160405180910390205403815481106106a357fe5b906000526020600020906005020160008201518160000190805190602001906106cd9291906138c4565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561071c57fe5b0217905550608082015181600401908051906020019061073d929190613944565b50905050836001018360405161075391906148e3565b90815260200160405180910390205484600101826000015160405161077891906148cc565b9081526020016040518091039020819055506000846001018460405161079e91906148e3565b908152602001604051809103902081905550836000018054809190600190036107c791906139ea565b5083600201836040516107da91906148e3565b9081526020016040518091039020600080820160006107f99190613a1c565b505050505050505050565b600080606061081284612b66565b91509150606061082182612902565b90506000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b82518110156109065760008260010184600184038151811061088b57fe5b60200260200101516040516108a091906148cc565b90815260200160405180910390205414156108c357600095505050505050610b3e565b816002018360018303815181106108d657fe5b60200260200101516040516108eb91906148cc565b9081526020016040518091039020915080600101905061086d565b50606060018351116109185783610931565b8260018451038151811061092857fe5b60200260200101515b90506000826001018260405161094791906148e3565b908152602001604051809103902054141561096a57600095505050505050610b3e565b610972613888565b826000016001846001018460405161098a91906148e3565b90815260200160405180910390205403815481106109a457fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610a565780601f10610a2b57610100808354040283529160200191610a56565b820191906000526020600020905b815481529060010190602001808311610a3957829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115610aa257fe5b6002811115610aad57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015610b2557602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411610aef5790505b5050505050815250509050806060015196505050505050505b919050565b600160009054906101000a900460ff16610b85576120006002819055506210000060038190555060018060006101000a81548160ff0219169083151502179055505b6000815111610bc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc090614ade565b60405180910390fd5b60003390506060610bd983612902565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015610cea57600082600101846001840381518110610c4357fe5b6020026020010151604051610c5891906148cc565b90815260200160405180910390205411610ca7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9e90614ade565b60405180910390fd5b81600201836001830381518110610cba57fe5b6020026020010151604051610ccf91906148cc565b90815260200160405180910390209150806001019050610c25565b50600254816000018054905010610d36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2d90614bfe565b60405180910390fd5b60606001835111610d475784610d60565b82600184510381518110610d5757fe5b60200260200101515b905060008260010182604051610d7691906148e3565b90815260200160405180910390205414610dc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbc90614c3e565b60405180910390fd5b610dce81612ee8565b610e0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0490614afe565b60405180910390fd5b6000610e198587612fc9565b905080610e5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e529061499e565b60405180910390fd5b610e63613888565b82816000018190525060008160200190151590811515815250508360000181908060018154018082558091505090600182039060005260206000209060050201600090919290919091506000820151816000019080519060200190610ec99291906138c4565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff02191690836002811115610f1857fe5b02179055506080820151816004019080519060200190610f39929190613944565b5050505083600001805490508460010184604051610f5791906148e3565b90815260200160405180910390208190555050505050505050565b610f7a61302d565b73ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161480610fdf57503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614155b61101e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101590614a5e565b60405180910390fd5b80600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411156110a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109790614b3e565b60405180910390fd5b600054600754820111156110e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e0906149be565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460076000828254039250508190555080600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550806007600082825401925050819055505050565b60008054905090565b600033905060006111aa82866130c6565b9050600160028111156111b957fe5b8160030160009054906101000a900460ff1660028111156111d657fe5b14611216576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120d90614c1e565b60405180910390fd5b6000600354858161122357fe5b061480156112345750806002015484105b611273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126a9061497e565b60405180910390fd5b600354848260020154031080156112905750838160020154038351145b8061129d57506003548351145b6112dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d390614a1e565b60405180910390fd5b600015158160040160035486816112ef57fe5b04815481106112fa57fe5b90600052602060002090602091828204019190069054906101000a900460ff1615151461135c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611353906149fe565b60405180910390fd5b600061136a838787876132c5565b9050806113ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a390614b1e565b60405180910390fd5b60018260040160035487816113bd57fe5b04815481106113c857fe5b90600052602060002090602091828204019190066101000a81548160ff021916908315150217905550505050505050565b611401613a40565b6000606061140e86612b66565b9150915061141a613888565b61142483836130c6565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156114c85780601f1061149d576101008083540402835291602001916114c8565b820191906000526020600020905b8154815290600101906020018083116114ab57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561151457fe5b600281111561151f57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561159757602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116115615790505b50505050508152505090506002808111156115ae57fe5b816060015160028111156115be57fe5b146115fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f590614c9e565b60405180910390fd5b60035485111580156116105750600085115b61164f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164690614a1e565b60405180910390fd5b80604001518587011115611698576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168f9061497e565b60405180910390fd5b60006116a684848989613376565b8096508192505050806116ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e590614b9e565b60405180910390fd5b505050509392505050565b6000339050600061170a82846130c6565b90506001600281111561171957fe5b8160030160009054906101000a900460ff16600281111561173657fe5b14611776576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176d90614c1e565b60405180910390fd5b60006001905060008260040180549050905060008090505b818110156117e157600015158460040182815481106117a957fe5b90600052602060002090602091828204019190069054906101000a900460ff16151514156117d657600092505b80600101905061178e565b5081611822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181990614b7e565b60405180910390fd5b60028360030160006101000a81548160ff0219169083600281111561184357fe5b021790555060006118548587613409565b905080611896576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188d906149de565b60405180910390fd5b505050505050565b6060600060606118ad84612b66565b9150915060606118bc82612902565b90506000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008090505b82518110156119c65760008260010184838151811061192257fe5b602002602001015160405161193791906148cc565b90815260200160405180910390205411611986576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197d90614ade565b60405180910390fd5b8160020183828151811061199657fe5b60200260200101516040516119ab91906148cc565b90815260200160405180910390209150806001019050611907565b5080600001805480602002602001604051908101604052809291908181526020016000905b82821015611b8e57838290600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611aa75780601f10611a7c57610100808354040283529160200191611aa7565b820191906000526020600020905b815481529060010190602001808311611a8a57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115611af357fe5b6002811115611afe57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015611b7657602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411611b405790505b505050505081525050815260200190600101906119eb565b50505050945050505050919050565b600160009054906101000a900460ff16611bdf576120006002819055506210000060038190555060018060006101000a81548160ff0219169083151502179055505b60003390506305f5e100821115611c2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2290614bde565b60405180910390fd5b6060611c3684612902565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015611d4757600082600101846001840381518110611ca057fe5b6020026020010151604051611cb591906148cc565b90815260200160405180910390205411611d04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cfb90614ade565b60405180910390fd5b81600201836001830381518110611d1757fe5b6020026020010151604051611d2c91906148cc565b90815260200160405180910390209150806001019050611c82565b5060606001835111611d595785611d72565b82600184510381518110611d6957fe5b60200260200101515b905060008260010182604051611d8891906148e3565b90815260200160405180910390205414611dd7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dce90614c3e565b60405180910390fd5b611de081612ee8565b611e1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1690614bbe565b60405180910390fd5b6000611e2c85888861346d565b905080611e6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6590614c7e565b60405180910390fd5b6060600354600160035489010381611e8257fe5b04604051908082528060200260200182016040528015611eb15781602001602082028038833980820191505090505b509050836000016040518060a0016040528085815260200160011515815260200189815260200160016002811115611ee557fe5b815260200183815250908060018154018082558091505090600182039060005260206000209060050201600090919290919091506000820151816000019080519060200190611f359291906138c4565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff02191690836002811115611f8457fe5b02179055506080820151816004019080519060200190611fa5929190613944565b5050505083600001805490508460010184604051611fc391906148e3565b90815260200160405180910390208190555086600560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505050505050505050565b6000339050612039613888565b61204382846130c6565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156120e75780601f106120bc576101008083540402835291602001916120e7565b820191906000526020600020905b8154815290600101906020018083116120ca57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561213357fe5b600281111561213e57fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156121b657602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116121805790505b5050505050815250509050600060028111156121ce57fe5b816060015160028111156121de57fe5b141561221f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221690614a3e565b60405180910390fd5b600061222b83856134da565b90508061226d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226490614a9e565b60405180910390fd5b606061227885612902565b90506000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b825181101561231057816002018360018303815181106122e057fe5b60200260200101516040516122f591906148cc565b908152602001604051809103902091508060010190506122c4565b506000600182600101866000015160405161232b91906148cc565b908152602001604051809103902054039050612345613888565b8260000160018460000180549050038154811061235e57fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156124105780601f106123e557610100808354040283529160200191612410565b820191906000526020600020905b8154815290600101906020018083116123f357829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561245c57fe5b600281111561246757fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156124df57602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116124a95790505b5050505050815250509050808360000183815481106124fa57fe5b906000526020600020906005020160008201518160000190805190602001906125249291906138c4565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561257357fe5b02179055506080820151816004019080519060200190612594929190613944565b50905050826000018054809190600190036125af91906139ea565b508260010186600001516040516125c691906148cc565b9081526020016040518091039020548360010182600001516040516125eb91906148cc565b908152602001604051809103902081905550600083600101876000015160405161261591906148cc565b9081526020016040518091039020819055508560400151600560008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505050505050505050565b600080606061269084612b66565b9150915061269c613888565b6126a683836130c6565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561274a5780601f1061271f5761010080835404028352916020019161274a565b820191906000526020600020905b81548152906001019060200180831161272d57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561279657fe5b60028111156127a157fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561281957602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116127e35790505b50505050508152505090506001600281111561283157fe5b8160600151600281111561284157fe5b1480612866575060028081111561285457fe5b8160600151600281111561286457fe5b145b6128a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161289c90614c1e565b60405180910390fd5b60006128b1848461353e565b8096508192505050806128f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128f090614c5e565b60405180910390fd5b50505050919050565b606061290c613a65565b612915836135a7565b905061291f613a65565b61295d6040518060400160405280600181526020017f2f000000000000000000000000000000000000000000000000000000000000008152506135a7565b90506060600161297683856135d590919063ffffffff16565b016040519080825280602002602001820160405280156129aa57816020015b60608152602001906001900390816129955790505b50905060008090505b81518110156129fb576129d76129d2848661364a90919063ffffffff16565b613664565b8282815181106129e357fe5b602002602001018190525080806001019150506129b3565b50600081600183510381518110612a0e57fe5b6020026020010151511415612a795780600182510381518110612a2d57fe5b6020026020010160608152506001815103604051908082528060200260200182016040528015612a7157816020015b6060815260200190600190039081612a5c5790505b509350612ab2565b8051604051908082528060200260200182016040528015612aae57816020015b6060815260200190600190039081612a995790505b5093505b60008090505b8451811015612af957818181518110612acd57fe5b6020026020010151858281518110612ae157fe5b60200260200101819052508080600101915050612ab8565b50505050919050565b60008060016020601f85510181612b1557fe5b040190506040518481526020810160005b83811015612b47578060200286015181602002830152806001019050612b26565b50602082602085026040018460006010600019f1935050505092915050565b6000606060006028905080845111612bb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612baa90614abe565b60405180910390fd5b6060816040519080825280601f01601f191660200182016040528015612be85781602001600182028038833980820191505090505b50905060008090505b82811015612c5857858181518110612c0557fe5b602001015160f81c60f81b828281518110612c1c57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050612bf1565b50600080905060008090505b83811015612d87576000838281518110612c7a57fe5b602001015160f81c60f81b60f81c60ff16905060308110158015612c9f575060398111155b80612cb8575060418110158015612cb75750605a8111155b5b80612cd1575060618110158015612cd0575060668111155b5b612d10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d0790614abe565b60405180910390fd5b60308110158015612d22575060398111155b15612d335760308103601084020192505b60418110158015612d455750605a8111155b15612d565760378103601084020192505b60618110158015612d68575060668111155b15612d795760578103601084020192505b508080600101915050612c64565b508094507f2f00000000000000000000000000000000000000000000000000000000000000868481518110612db857fe5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612e25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e1c90614abe565b60405180910390fd5b6000600184885103039050806040519080825280601f01601f191660200182016040528015612e635781602001600182028038833980820191505090505b50945060008090505b81811015612ede5760008860018784010181518110612e8757fe5b602001015160f81c60f81b905080878381518110612ea157fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350508080600101915050612e6c565b5050505050915091565b6000604051602001612ef99061490f565b6040516020818303038152906040528051906020012082604051602001612f2091906148e3565b604051602081830303815290604052805190602001201480612f8b5750604051602001612f4c906148fa565b6040516020818303038152906040528051906020012082604051602001612f7391906148e3565b60405160208183030381529060405280519060200120145b80612f97575060008251145b15612fa55760009050612fc4565b60008251905060ff811115612fbe576000915050612fc4565b60019150505b919050565b60008060016020601f85510181612fdc57fe5b040190506040518481526020810160005b8381101561300e578060200286015181602002830152806001019050612fed565b5060208260208502604001846000600f600019f1935050505092915050565b600073d2001000000000000000000000000000000000d273ffffffffffffffffffffffffffffffffffffffff166383e781fe6040518163ffffffff1660e01b815260040160206040518083038186803b15801561308957600080fd5b505afa15801561309d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506130c19190810190613c9a565b905090565b600060606130d383612902565b90506000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b82518110156131e45760008260010184600184038151811061313d57fe5b602002602001015160405161315291906148cc565b908152602001604051809103902054116131a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161319890614ade565b60405180910390fd5b816002018360018303815181106131b457fe5b60200260200101516040516131c991906148cc565b9081526020016040518091039020915080600101905061311f565b50606060018351116131f6578461320f565b8260018451038151811061320657fe5b60200260200101515b90506000826001018260405161322591906148e3565b90815260200160405180910390205411613274576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161326b90614ade565b60405180910390fd5b6000826000016001846001018460405161328e91906148e3565b90815260200160405180910390205403815481106132a857fe5b906000526020600020906005020190508094505050505092915050565b60008060016020601f855101816132d857fe5b04019050600060016020601f885101816132ee57fe5b040190506040518781526020810160005b838110156133205780602002890151816020028301528060010190506132ff565b50868360200282015260005b84811015613352578060200287015181856001010160200283015280600101905061332c565b50602082848601602002606001846000600c600019f1945050505050949350505050565b6000613380613a40565b600060016020601f8851018161339257fe5b0401905060006020601f8601816133a557fe5b0490506040518881526020810160005b848110156133d657806020028a0151816020028301528060010190506133b5565b5083602002810188815287816020015283602002868660030160200285600a600019fa9650505050505094509492505050565b60008060016020601f8551018161341c57fe5b040190506040518481526020810160005b8381101561344e57806020028601518160200283015280600101905061342d565b50602082602085026040018460006011600019f1935050505092915050565b60008060016020601f8651018161348057fe5b040190506040518581526020810160005b838110156134b2578060200287015181602002830152806001019050613491565b50846020840282015260208260208502604001846000600b600019f193505050509392505050565b60008060016020601f855101816134ed57fe5b040190506040518481526020810160005b8381101561351f5780602002860151816020028301528060010190506134fe565b5060208260208502604001846000600e600019f1935050505092915050565b600080600060016020601f8651018161355357fe5b040190506040518581526020810160005b83811015613585578060200287015181602002830152806001019050613564565b506020826020850260200184600d600019fa9450815193505050509250929050565b6135af613a65565b600060208301905060405180604001604052808451815260200182815250915050919050565b60008082600001516135f985600001518660200151866000015187602001516136c6565b0190505b83600001518460200151018111613643578180600101925050826000015161363b8560200151830386600001510383866000015187602001516136c6565b0190506135fd565b5092915050565b613652613a65565b61365d8383836137a1565b5092915050565b60608082600001516040519080825280601f01601f19166020018201604052801561369e5781602001600182028038833980820191505090505b50905060006020820190506136bc818560200151866000015161383f565b8192505050919050565b6000808490506000868511613791576020851161374b57600060018660200360080260020a031960001b905060008186511690506000878a8a0103905060008386511690505b82811461373d5781861061372a578a8a019650505050505050613799565b858060010196505083865116905061370c565b859650505050505050613799565b60008585209050600091505b858803821161378f57600086842090508082141561377b5783945050505050613799565b600184019350508180600101925050613757565b505b868601925050505b949350505050565b6137a9613a65565b60006137c785600001518660200151866000015187602001516136c6565b90508460200151836020018181525050846020015181038360000181815250508460000151856020015101811415613809576000856000018181525050613834565b8360000151836000015101856000018181510391508181525050836000015181018560200181815250505b829150509392505050565b5b602081106138635781518352602083019250602082019150602081039050613840565b60006001826020036101000a0390508019835116818551168181178652505050505050565b6040518060a001604052806060815260200160001515815260200160008152602001600060028111156138b757fe5b8152602001606081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061390557805160ff1916838001178555613933565b82800160010185558215613933579182015b82811115613932578251825591602001919060010190613917565b5b5090506139409190613a7f565b5090565b82805482825590600052602060002090601f016020900481019282156139d95791602002820160005b838211156139aa57835183826101000a81548160ff021916908315150217905550926020019260010160208160000104928301926001030261396d565b80156139d75782816101000a81549060ff02191690556001016020816000010492830192600103026139aa565b505b5090506139e69190613aa4565b5090565b815481835581811115613a1757600502816005028360005260206000209182019101613a169190613ad4565b5b505050565b5080546000825560050290600052602060002090810190613a3d9190613ad4565b50565b6040518062100000016040528061800090602082028038833980820191505090505090565b604051806040016040528060008152602001600081525090565b613aa191905b80821115613a9d576000816000905550600101613a85565b5090565b90565b613ad191905b80821115613acd57600081816101000a81549060ff021916905550600101613aaa565b5090565b90565b613b4091905b80821115613b3c5760008082016000613af39190613b43565b6001820160006101000a81549060ff021916905560028201600090556003820160006101000a81549060ff0219169055600482016000613b339190613b8b565b50600501613ada565b5090565b90565b50805460018160011615610100020316600290046000825580601f10613b695750613b88565b601f016020900490600052602060002090810190613b879190613a7f565b5b50565b50805460008255601f016020900490600052602060002090810190613bb09190613a7f565b50565b600081359050613bc281614f18565b92915050565b600081519050613bd781614f18565b92915050565b600082601f830112613bee57600080fd5b8135613c01613bfc82614d06565b614cd9565b91508082526020830160208301858383011115613c1d57600080fd5b613c28838284614eb8565b50505092915050565b600082601f830112613c4257600080fd5b8135613c55613c5082614d32565b614cd9565b91508082526020830160208301858383011115613c7157600080fd5b613c7c838284614eb8565b50505092915050565b600081359050613c9481614f2f565b92915050565b600060208284031215613cac57600080fd5b6000613cba84828501613bc8565b91505092915050565b60008060408385031215613cd657600080fd5b6000613ce485828601613bb3565b9250506020613cf585828601613c85565b9150509250929050565b600060208284031215613d1157600080fd5b600082013567ffffffffffffffff811115613d2b57600080fd5b613d3784828501613c31565b91505092915050565b60008060408385031215613d5357600080fd5b600083013567ffffffffffffffff811115613d6d57600080fd5b613d7985828601613c31565b9250506020613d8a85828601613c85565b9150509250929050565b600080600060608486031215613da957600080fd5b600084013567ffffffffffffffff811115613dc357600080fd5b613dcf86828701613c31565b9350506020613de086828701613c85565b925050604084013567ffffffffffffffff811115613dfd57600080fd5b613e0986828701613bdd565b9150509250925092565b600080600060608486031215613e2857600080fd5b600084013567ffffffffffffffff811115613e4257600080fd5b613e4e86828701613c31565b9350506020613e5f86828701613c85565b9250506040613e7086828701613c85565b9150509250925092565b6000613e868383613fe8565b60208301905092915050565b6000613e9e8383613ff7565b60208301905092915050565b6000613eb68383614831565b905092915050565b6000613ec982614d88565b613ed38185614de7565b9350613ede83614d5e565b8060005b83811015613f0f578151613ef68882613e7a565b9750613f0183614dc0565b925050600181019050613ee2565b5085935050505092915050565b613f2581614d93565b613f2f8184614df8565b9250613f3a82614d6e565b8060005b83811015613f6b578151613f528782613e92565b9650613f5d83614dcd565b925050600181019050613f3e565b505050505050565b6000613f7e82614d9f565b613f888185614e03565b935083602082028501613f9a85614d78565b8060005b85811015613fd65784840389528151613fb78582613eaa565b9450613fc283614dda565b925060208a01995050600181019050613f9e565b50829750879550505050505092915050565b613ff181614e53565b82525050565b61400081614e5f565b82525050565b61400f81614ea6565b82525050565b61401e81614ea6565b82525050565b600061402f82614db5565b6140398185614e36565b9350614049818560208601614ec7565b80840191505092915050565b600061406082614daa565b61406a8185614e14565b935061407a818560208601614ec7565b61408381614efa565b840191505092915050565b600061409982614daa565b6140a38185614e36565b93506140b3818560208601614ec7565b80840191505092915050565b60006140cc601883614e25565b91507f496e636f7272656374206368756e6b20706f736974696f6e00000000000000006000830152602082019050919050565b600061410c601583614e25565b91507f4469726563746f7279206e6f74206372656174656400000000000000000000006000830152602082019050919050565b600061414c602483614e25565b91507f4e6f7420656e6f756768206d656d6f727920696e207468652046696c6573746f60008301527f72616765000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006141b2601b83614e25565b91507f48617368206861736e2774206265656e2063616c63756c6174656400000000006000830152602082019050919050565b60006141f2601983614e25565b91507f4368756e6b20697320616c72656164792075706c6f61646564000000000000006000830152602082019050919050565b6000614232601683614e25565b91507f496e636f7272656374206368756e6b206c656e677468000000000000000000006000830152602082019050919050565b6000614272600f83614e25565b91507f46696c65206e6f742065786973747300000000000000000000000000000000006000830152602082019050919050565b60006142b2600e83614e25565b91507f496e76616c69642073656e6465720000000000000000000000000000000000006000830152602082019050919050565b60006142f2601883614e25565b91507f4469726563746f7279206973206e6f742064656c6574656400000000000000006000830152602082019050919050565b6000614332601083614e25565b91507f46696c65206e6f742064656c65746564000000000000000000000000000000006000830152602082019050919050565b6000614372601383614e25565b91507f496e76616c69642073746f7261676550617468000000000000000000000000006000830152602082019050919050565b60006143b2600c83614e25565b91507f496e76616c6964207061746800000000000000000000000000000000000000006000830152602082019050919050565b60006143f2600183614e36565b91507f2e000000000000000000000000000000000000000000000000000000000000006000830152600182019050919050565b6000614432601683614e25565b91507f496e76616c6964206469726563746f7279206e616d65000000000000000000006000830152602082019050919050565b6000614472601583614e25565b91507f4368756e6b207761736e27742075706c6f6164656400000000000000000000006000830152602082019050919050565b60006144b2602683614e25565b91507f436f756c64206e6f742072657365727665206c657373207468616e207573656460008301527f20737061636500000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614518601683614e25565b91507f4469726563746f7279206973206e6f7420656d707479000000000000000000006000830152602082019050919050565b6000614558602383614e25565b91507f46696c65206861736e2774206265656e2075706c6f6164656420636f7272656360008301527f746c7900000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006145be601183614e25565b91507f4368756e6b207761736e277420726561640000000000000000000000000000006000830152602082019050919050565b60006145fe601883614e25565b91507f46696c656e616d652073686f756c64206265203c2032353600000000000000006000830152602082019050919050565b600061463e601f83614e25565b91507f46696c652073686f756c64206265206c657373207468616e20313030204d42006000830152602082019050919050565b600061467e600283614e36565b91507f2e2e0000000000000000000000000000000000000000000000000000000000006000830152600282019050919050565b60006146be601183614e25565b91507f4469726563746f72792069732066756c6c0000000000000000000000000000006000830152602082019050919050565b60006146fe600e83614e25565b91507f46696c65206e6f7420666f756e640000000000000000000000000000000000006000830152602082019050919050565b600061473e601883614e25565b91507f46696c65206f72206469726563746f72792065786973747300000000000000006000830152602082019050919050565b600061477e601883614e25565b91507f45564d206572726f7220696e2067657446696c6553697a6500000000000000006000830152602082019050919050565b60006147be601083614e25565b91507f46696c65206e6f742063726561746564000000000000000000000000000000006000830152602082019050919050565b60006147fe601983614e25565b91507f46696c65206861736e2774206265656e2075706c6f61646564000000000000006000830152602082019050919050565b600060a083016000830151848203600086015261484e8282614055565b91505060208301516148636020860182613fe8565b50604083015161487660408601826148ae565b5060608301516148896060860182614006565b50608083015184820360808601526148a18282613ebe565b9150508091505092915050565b6148b781614e9c565b82525050565b6148c681614e9c565b82525050565b60006148d8828461408e565b915081905092915050565b60006148ef8284614024565b915081905092915050565b6000614905826143e5565b9150819050919050565b600061491a82614671565b9150819050919050565b6000621000008201905061493b6000830184613f1c565b92915050565b6000602082019050818103600083015261495b8184613f73565b905092915050565b60006020820190506149786000830184614015565b92915050565b60006020820190508181036000830152614997816140bf565b9050919050565b600060208201905081810360008301526149b7816140ff565b9050919050565b600060208201905081810360008301526149d78161413f565b9050919050565b600060208201905081810360008301526149f7816141a5565b9050919050565b60006020820190508181036000830152614a17816141e5565b9050919050565b60006020820190508181036000830152614a3781614225565b9050919050565b60006020820190508181036000830152614a5781614265565b9050919050565b60006020820190508181036000830152614a77816142a5565b9050919050565b60006020820190508181036000830152614a97816142e5565b9050919050565b60006020820190508181036000830152614ab781614325565b9050919050565b60006020820190508181036000830152614ad781614365565b9050919050565b60006020820190508181036000830152614af7816143a5565b9050919050565b60006020820190508181036000830152614b1781614425565b9050919050565b60006020820190508181036000830152614b3781614465565b9050919050565b60006020820190508181036000830152614b57816144a5565b9050919050565b60006020820190508181036000830152614b778161450b565b9050919050565b60006020820190508181036000830152614b978161454b565b9050919050565b60006020820190508181036000830152614bb7816145b1565b9050919050565b60006020820190508181036000830152614bd7816145f1565b9050919050565b60006020820190508181036000830152614bf781614631565b9050919050565b60006020820190508181036000830152614c17816146b1565b9050919050565b60006020820190508181036000830152614c37816146f1565b9050919050565b60006020820190508181036000830152614c5781614731565b9050919050565b60006020820190508181036000830152614c7781614771565b9050919050565b60006020820190508181036000830152614c97816147b1565b9050919050565b60006020820190508181036000830152614cb7816147f1565b9050919050565b6000602082019050614cd360008301846148bd565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614cfc57600080fd5b8060405250919050565b600067ffffffffffffffff821115614d1d57600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614d4957600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050919050565b6000819050602082019050919050565b600081519050919050565b60006180009050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614e4c82614e7c565b9050919050565b60008115159050919050565b6000819050919050565b6000819050614e7782614f0b565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000614eb182614e69565b9050919050565b82818337600083830152505050565b60005b83811015614ee5578082015181840152602081019050614eca565b83811115614ef4576000848401525b50505050565b6000601f19601f8301169050919050565b60038110614f1557fe5b50565b614f2181614e41565b8114614f2c57600080fd5b50565b614f3881614e9c565b8114614f4357600080fd5b5056fea365627a7a723158202ae226b25ad72f9cff2d74c6dc7bcfb78530ab1d2438f48a8dab67499b37a8e56c6578706572696d656e74616cf564736f6c634300050d0040", + "nonce": "0", + "storage": { + "0x0": "2868903936" + } + }, + "0x69362535ec535F0643cBf62D16aDeDCAf32Ee6F8": { + "balance": "0", + "code": "0x608060405234801561001057600080fd5b50600436106100b45760003560e01c806379210e8e1161007157806379210e8e1461017757806381a8235a146101a757806385aeeb17146101c35780639a9a5593146101f3578063a99100541461020f578063b57321221461022b576100b4565b806307c6e7d3146100b9578063122f4fba146100d55780631c6ec7a9146101055780631cfe4e3b14610121578063373dedb41461013d57806361e46db51461015b575b600080fd5b6100d360048036036100ce9190810190613e0d565b61025b565b005b6100ef60048036036100ea9190810190613e0d565b610804565b6040516100fc9190614ab1565b60405180910390f35b61011f600480360361011a9190810190613e0d565b610b43565b005b61013b60048036036101369190810190613dd1565b610f72565b005b610145611190565b6040516101529190614e2c565b60405180910390f35b61017560048036036101709190810190613ea2565b611199565b005b610191600480360361018c9190810190613f21565b6113f9565b60405161019e9190614a72565b60405180910390f35b6101c160048036036101bc9190810190613e0d565b6116f9565b005b6101dd60048036036101d89190810190613e0d565b61189e565b6040516101ea9190614a8f565b60405180910390f35b61020d60048036036102089190810190613e4e565b611b9d565b005b61022960048036036102249190810190613e0d565b61213a565b005b61024560048036036102409190810190613e0d565b612790565b6040516102529190614e2c565b60405180910390f35b6000339050606061026b83612a10565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b825181101561037c576000826001018460018403815181106102d557fe5b60200260200101516040516102ea9190614a1a565b90815260200160405180910390205411610339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161033090614c2c565b60405180910390fd5b8160020183600183038151811061034c57fe5b60200260200101516040516103619190614a1a565b908152602001604051809103902091508060010190506102b7565b506060600183511161038e57846103a7565b8260018451038151811061039e57fe5b60200260200101515b9050600082600101826040516103bd9190614a31565b9081526020016040518091039020541161040c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161040390614c2c565b60405180910390fd5b600082600201826040516104209190614a31565b90815260200160405180910390206000018054905014610475576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161046c90614cac565b60405180910390fd5b60006104818587612c10565b9050806104c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ba90614bcc565b60405180910390fd5b6104cb613996565b836000016001856000018054905003815481106104e457fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156105965780601f1061056b57610100808354040283529160200191610596565b820191906000526020600020905b81548152906001019060200180831161057957829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff1660028111156105e257fe5b60028111156105ed57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561066557602002820191906000526020600020906000905b82829054906101000a900460ff1615158152602001906001019060208260000104928301926001038202915080841161062f5790505b50505050508152505090508084600001600186600101866040516106899190614a31565b90815260200160405180910390205403815481106106a357fe5b906000526020600020906005020160008201518160000190805190602001906106cd9291906139d2565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561071c57fe5b0217905550608082015181600401908051906020019061073d929190613a52565b5090505083600101836040516107539190614a31565b9081526020016040518091039020548460010182600001516040516107789190614a1a565b9081526020016040518091039020819055506000846001018460405161079e9190614a31565b908152602001604051809103902081905550836000018054809190600190036107c79190613af8565b5083600201836040516107da9190614a31565b9081526020016040518091039020600080820160006107f99190613b2a565b505050505050505050565b600080606061081284612c74565b91509150606061082182612a10565b90506000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b82518110156109065760008260010184600184038151811061088b57fe5b60200260200101516040516108a09190614a1a565b90815260200160405180910390205414156108c357600095505050505050610b3e565b816002018360018303815181106108d657fe5b60200260200101516040516108eb9190614a1a565b9081526020016040518091039020915080600101905061086d565b50606060018351116109185783610931565b8260018451038151811061092857fe5b60200260200101515b9050600082600101826040516109479190614a31565b908152602001604051809103902054141561096a57600095505050505050610b3e565b610972613996565b826000016001846001018460405161098a9190614a31565b90815260200160405180910390205403815481106109a457fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610a565780601f10610a2b57610100808354040283529160200191610a56565b820191906000526020600020905b815481529060010190602001808311610a3957829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115610aa257fe5b6002811115610aad57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015610b2557602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411610aef5790505b5050505050815250509050806060015196505050505050505b919050565b600160009054906101000a900460ff16610b85576120006002819055506210000060038190555060018060006101000a81548160ff0219169083151502179055505b6000815111610bc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc090614c2c565b60405180910390fd5b60003390506060610bd983612a10565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015610cea57600082600101846001840381518110610c4357fe5b6020026020010151604051610c589190614a1a565b90815260200160405180910390205411610ca7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9e90614c2c565b60405180910390fd5b81600201836001830381518110610cba57fe5b6020026020010151604051610ccf9190614a1a565b90815260200160405180910390209150806001019050610c25565b50600254816000018054905010610d36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2d90614d4c565b60405180910390fd5b60606001835111610d475784610d60565b82600184510381518110610d5757fe5b60200260200101515b905060008260010182604051610d769190614a31565b90815260200160405180910390205414610dc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbc90614d8c565b60405180910390fd5b610dce81612ff6565b610e0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0490614c4c565b60405180910390fd5b6000610e1985876130d7565b905080610e5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5290614aec565b60405180910390fd5b610e63613996565b82816000018190525060008160200190151590811515815250508360000181908060018154018082558091505090600182039060005260206000209060050201600090919290919091506000820151816000019080519060200190610ec99291906139d2565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff02191690836002811115610f1857fe5b02179055506080820151816004019080519060200190610f39929190613a52565b5050505083600001805490508460010184604051610f579190614a31565b90815260200160405180910390208190555050505050505050565b610f7a61313b565b73ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161480610fdf57503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614155b61101e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101590614bac565b60405180910390fd5b80600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411156110a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109790614c8c565b60405180910390fd5b600054600754820111156110e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e090614b0c565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460076000828254039250508190555080600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550806007600082825401925050819055505050565b60008054905090565b600033905060006111aa82866131d4565b9050600160028111156111b957fe5b8160030160009054906101000a900460ff1660028111156111d657fe5b14611216576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120d90614d6c565b60405180910390fd5b6000600354858161122357fe5b061480156112345750806002015484105b611273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126a90614acc565b60405180910390fd5b600354848260020154031080156112905750838160020154038351145b8061129d57506003548351145b6112dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d390614b6c565b60405180910390fd5b600015158160040160035486816112ef57fe5b04815481106112fa57fe5b90600052602060002090602091828204019190069054906101000a900460ff1615151461135c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135390614b4c565b60405180910390fd5b600061136a838787876133d3565b9050806113ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a390614c6c565b60405180910390fd5b60018260040160035487816113bd57fe5b04815481106113c857fe5b90600052602060002090602091828204019190066101000a81548160ff021916908315150217905550505050505050565b611401613b4e565b6000606061140e86612c74565b9150915061141a613996565b61142483836131d4565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156114c85780601f1061149d576101008083540402835291602001916114c8565b820191906000526020600020905b8154815290600101906020018083116114ab57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561151457fe5b600281111561151f57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561159757602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116115615790505b50505050508152505090506002808111156115ae57fe5b816060015160028111156115be57fe5b146115fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f590614e0c565b60405180910390fd5b60035485111580156116105750600085115b61164f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164690614b6c565b60405180910390fd5b80604001518587011115611698576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168f90614acc565b60405180910390fd5b60006116a684848989613484565b8096508192505050806116ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e590614cec565b60405180910390fd5b505050509392505050565b6000339050600061170a82846131d4565b90506001600281111561171957fe5b8160030160009054906101000a900460ff16600281111561173657fe5b14611776576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176d90614d6c565b60405180910390fd5b60006001905060008260040180549050905060008090505b818110156117e157600015158460040182815481106117a957fe5b90600052602060002090602091828204019190069054906101000a900460ff16151514156117d657600092505b80600101905061178e565b5081611822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181990614ccc565b60405180910390fd5b60028360030160006101000a81548160ff0219169083600281111561184357fe5b021790555060006118548587613517565b905080611896576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188d90614b2c565b60405180910390fd5b505050505050565b6060600060606118ad84612c74565b9150915060606118bc82612a10565b90506000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008090505b82518110156119c65760008260010184838151811061192257fe5b60200260200101516040516119379190614a1a565b90815260200160405180910390205411611986576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197d90614c2c565b60405180910390fd5b8160020183828151811061199657fe5b60200260200101516040516119ab9190614a1a565b90815260200160405180910390209150806001019050611907565b5080600001805480602002602001604051908101604052809291908181526020016000905b82821015611b8e57838290600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611aa75780601f10611a7c57610100808354040283529160200191611aa7565b820191906000526020600020905b815481529060010190602001808311611a8a57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115611af357fe5b6002811115611afe57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015611b7657602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411611b405790505b505050505081525050815260200190600101906119eb565b50505050945050505050919050565b600160009054906101000a900460ff16611bdf576120006002819055506210000060038190555060018060006101000a81548160ff0219169083151502179055505b60003390506305f5e100821115611c2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2290614d2c565b60405180910390fd5b600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205483011115611cee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce590614dac565b60405180910390fd5b6060611cf984612a10565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015611e0a57600082600101846001840381518110611d6357fe5b6020026020010151604051611d789190614a1a565b90815260200160405180910390205411611dc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dbe90614c2c565b60405180910390fd5b81600201836001830381518110611dda57fe5b6020026020010151604051611def9190614a1a565b90815260200160405180910390209150806001019050611d45565b50600254816000018054905010611e56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4d90614d4c565b60405180910390fd5b60606001835111611e675785611e80565b82600184510381518110611e7757fe5b60200260200101515b905060008260010182604051611e969190614a31565b90815260200160405180910390205414611ee5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611edc90614d8c565b60405180910390fd5b611eee81612ff6565b611f2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2490614d0c565b60405180910390fd5b6000611f3a85888861357b565b905080611f7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7390614dec565b60405180910390fd5b6060600354600160035489010381611f9057fe5b04604051908082528060200260200182016040528015611fbf5781602001602082028038833980820191505090505b509050836000016040518060a0016040528085815260200160011515815260200189815260200160016002811115611ff357fe5b8152602001838152509080600181540180825580915050906001820390600052602060002090600502016000909192909190915060008201518160000190805190602001906120439291906139d2565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561209257fe5b021790555060808201518160040190805190602001906120b3929190613a52565b50505050836000018054905084600101846040516120d19190614a31565b90815260200160405180910390208190555086600560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505050505050505050565b6000339050612147613996565b61215182846131d4565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156121f55780601f106121ca576101008083540402835291602001916121f5565b820191906000526020600020905b8154815290600101906020018083116121d857829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561224157fe5b600281111561224c57fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156122c457602002820191906000526020600020906000905b82829054906101000a900460ff1615158152602001906001019060208260000104928301926001038202915080841161228e5790505b5050505050815250509050600060028111156122dc57fe5b816060015160028111156122ec57fe5b141561232d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232490614b8c565b60405180910390fd5b600061233983856135e8565b90508061237b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161237290614bec565b60405180910390fd5b606061238685612a10565b90506000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b825181101561241e57816002018360018303815181106123ee57fe5b60200260200101516040516124039190614a1a565b908152602001604051809103902091508060010190506123d2565b50600060018260010186600001516040516124399190614a1a565b908152602001604051809103902054039050612453613996565b8260000160018460000180549050038154811061246c57fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561251e5780601f106124f35761010080835404028352916020019161251e565b820191906000526020600020905b81548152906001019060200180831161250157829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561256a57fe5b600281111561257557fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156125ed57602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116125b75790505b50505050508152505090508083600001838154811061260857fe5b906000526020600020906005020160008201518160000190805190602001906126329291906139d2565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561268157fe5b021790555060808201518160040190805190602001906126a2929190613a52565b50905050826000018054809190600190036126bd9190613af8565b508260010186600001516040516126d49190614a1a565b9081526020016040518091039020548360010182600001516040516126f99190614a1a565b90815260200160405180910390208190555060008360010187600001516040516127239190614a1a565b9081526020016040518091039020819055508560400151600560008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505050505050505050565b600080606061279e84612c74565b915091506127aa613996565b6127b483836131d4565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156128585780601f1061282d57610100808354040283529160200191612858565b820191906000526020600020905b81548152906001019060200180831161283b57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff1660028111156128a457fe5b60028111156128af57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561292757602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116128f15790505b50505050508152505090506001600281111561293f57fe5b8160600151600281111561294f57fe5b1480612974575060028081111561296257fe5b8160600151600281111561297257fe5b145b6129b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129aa90614d6c565b60405180910390fd5b60006129bf848461364c565b809650819250505080612a07576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129fe90614dcc565b60405180910390fd5b50505050919050565b6060612a1a613b73565b612a23836136b5565b9050612a2d613b73565b612a6b6040518060400160405280600181526020017f2f000000000000000000000000000000000000000000000000000000000000008152506136b5565b905060606001612a8483856136e390919063ffffffff16565b01604051908082528060200260200182016040528015612ab857816020015b6060815260200190600190039081612aa35790505b50905060008090505b8151811015612b0957612ae5612ae0848661375890919063ffffffff16565b613772565b828281518110612af157fe5b60200260200101819052508080600101915050612ac1565b50600081600183510381518110612b1c57fe5b6020026020010151511415612b875780600182510381518110612b3b57fe5b6020026020010160608152506001815103604051908082528060200260200182016040528015612b7f57816020015b6060815260200190600190039081612b6a5790505b509350612bc0565b8051604051908082528060200260200182016040528015612bbc57816020015b6060815260200190600190039081612ba75790505b5093505b60008090505b8451811015612c0757818181518110612bdb57fe5b6020026020010151858281518110612bef57fe5b60200260200101819052508080600101915050612bc6565b50505050919050565b60008060016020601f85510181612c2357fe5b040190506040518481526020810160005b83811015612c55578060200286015181602002830152806001019050612c34565b50602082602085026040018460006010600019f1935050505092915050565b6000606060006028905080845111612cc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cb890614c0c565b60405180910390fd5b6060816040519080825280601f01601f191660200182016040528015612cf65781602001600182028038833980820191505090505b50905060008090505b82811015612d6657858181518110612d1357fe5b602001015160f81c60f81b828281518110612d2a57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050612cff565b50600080905060008090505b83811015612e95576000838281518110612d8857fe5b602001015160f81c60f81b60f81c60ff16905060308110158015612dad575060398111155b80612dc6575060418110158015612dc55750605a8111155b5b80612ddf575060618110158015612dde575060668111155b5b612e1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e1590614c0c565b60405180910390fd5b60308110158015612e30575060398111155b15612e415760308103601084020192505b60418110158015612e535750605a8111155b15612e645760378103601084020192505b60618110158015612e76575060668111155b15612e875760578103601084020192505b508080600101915050612d72565b508094507f2f00000000000000000000000000000000000000000000000000000000000000868481518110612ec657fe5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612f33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f2a90614c0c565b60405180910390fd5b6000600184885103039050806040519080825280601f01601f191660200182016040528015612f715781602001600182028038833980820191505090505b50945060008090505b81811015612fec5760008860018784010181518110612f9557fe5b602001015160f81c60f81b905080878381518110612faf57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350508080600101915050612f7a565b5050505050915091565b600060405160200161300790614a5d565b604051602081830303815290604052805190602001208260405160200161302e9190614a31565b604051602081830303815290604052805190602001201480613099575060405160200161305a90614a48565b60405160208183030381529060405280519060200120826040516020016130819190614a31565b60405160208183030381529060405280519060200120145b806130a5575060008251145b156130b357600090506130d2565b60008251905060ff8111156130cc5760009150506130d2565b60019150505b919050565b60008060016020601f855101816130ea57fe5b040190506040518481526020810160005b8381101561311c5780602002860151816020028301528060010190506130fb565b5060208260208502604001846000600f600019f1935050505092915050565b600073d2001000000000000000000000000000000000d273ffffffffffffffffffffffffffffffffffffffff166383e781fe6040518163ffffffff1660e01b815260040160206040518083038186803b15801561319757600080fd5b505afa1580156131ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506131cf9190810190613da8565b905090565b600060606131e183612a10565b90506000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b82518110156132f25760008260010184600184038151811061324b57fe5b60200260200101516040516132609190614a1a565b908152602001604051809103902054116132af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132a690614c2c565b60405180910390fd5b816002018360018303815181106132c257fe5b60200260200101516040516132d79190614a1a565b9081526020016040518091039020915080600101905061322d565b5060606001835111613304578461331d565b8260018451038151811061331457fe5b60200260200101515b9050600082600101826040516133339190614a31565b90815260200160405180910390205411613382576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161337990614c2c565b60405180910390fd5b6000826000016001846001018460405161339c9190614a31565b90815260200160405180910390205403815481106133b657fe5b906000526020600020906005020190508094505050505092915050565b60008060016020601f855101816133e657fe5b04019050600060016020601f885101816133fc57fe5b040190506040518781526020810160005b8381101561342e57806020028901518160200283015280600101905061340d565b50868360200282015260005b84811015613460578060200287015181856001010160200283015280600101905061343a565b50602082848601602002606001846000600c600019f1945050505050949350505050565b600061348e613b4e565b600060016020601f885101816134a057fe5b0401905060006020601f8601816134b357fe5b0490506040518881526020810160005b848110156134e457806020028a0151816020028301528060010190506134c3565b5083602002810188815287816020015283602002868660030160200285600a600019fa9650505050505094509492505050565b60008060016020601f8551018161352a57fe5b040190506040518481526020810160005b8381101561355c57806020028601518160200283015280600101905061353b565b50602082602085026040018460006011600019f1935050505092915050565b60008060016020601f8651018161358e57fe5b040190506040518581526020810160005b838110156135c057806020028701518160200283015280600101905061359f565b50846020840282015260208260208502604001846000600b600019f193505050509392505050565b60008060016020601f855101816135fb57fe5b040190506040518481526020810160005b8381101561362d57806020028601518160200283015280600101905061360c565b5060208260208502604001846000600e600019f1935050505092915050565b600080600060016020601f8651018161366157fe5b040190506040518581526020810160005b83811015613693578060200287015181602002830152806001019050613672565b506020826020850260200184600d600019fa9450815193505050509250929050565b6136bd613b73565b600060208301905060405180604001604052808451815260200182815250915050919050565b600080826000015161370785600001518660200151866000015187602001516137d4565b0190505b8360000151846020015101811161375157818060010192505082600001516137498560200151830386600001510383866000015187602001516137d4565b01905061370b565b5092915050565b613760613b73565b61376b8383836138af565b5092915050565b60608082600001516040519080825280601f01601f1916602001820160405280156137ac5781602001600182028038833980820191505090505b50905060006020820190506137ca818560200151866000015161394d565b8192505050919050565b600080849050600086851161389f576020851161385957600060018660200360080260020a031960001b905060008186511690506000878a8a0103905060008386511690505b82811461384b57818610613838578a8a0196505050505050506138a7565b858060010196505083865116905061381a565b8596505050505050506138a7565b60008585209050600091505b858803821161389d57600086842090508082141561388957839450505050506138a7565b600184019350508180600101925050613865565b505b868601925050505b949350505050565b6138b7613b73565b60006138d585600001518660200151866000015187602001516137d4565b90508460200151836020018181525050846020015181038360000181815250508460000151856020015101811415613917576000856000018181525050613942565b8360000151836000015101856000018181510391508181525050836000015181018560200181815250505b829150509392505050565b5b60208110613971578151835260208301925060208201915060208103905061394e565b60006001826020036101000a0390508019835116818551168181178652505050505050565b6040518060a001604052806060815260200160001515815260200160008152602001600060028111156139c557fe5b8152602001606081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613a1357805160ff1916838001178555613a41565b82800160010185558215613a41579182015b82811115613a40578251825591602001919060010190613a25565b5b509050613a4e9190613b8d565b5090565b82805482825590600052602060002090601f01602090048101928215613ae75791602002820160005b83821115613ab857835183826101000a81548160ff0219169083151502179055509260200192600101602081600001049283019260010302613a7b565b8015613ae55782816101000a81549060ff0219169055600101602081600001049283019260010302613ab8565b505b509050613af49190613bb2565b5090565b815481835581811115613b2557600502816005028360005260206000209182019101613b249190613be2565b5b505050565b5080546000825560050290600052602060002090810190613b4b9190613be2565b50565b6040518062100000016040528061800090602082028038833980820191505090505090565b604051806040016040528060008152602001600081525090565b613baf91905b80821115613bab576000816000905550600101613b93565b5090565b90565b613bdf91905b80821115613bdb57600081816101000a81549060ff021916905550600101613bb8565b5090565b90565b613c4e91905b80821115613c4a5760008082016000613c019190613c51565b6001820160006101000a81549060ff021916905560028201600090556003820160006101000a81549060ff0219169055600482016000613c419190613c99565b50600501613be8565b5090565b90565b50805460018160011615610100020316600290046000825580601f10613c775750613c96565b601f016020900490600052602060002090810190613c959190613b8d565b5b50565b50805460008255601f016020900490600052602060002090810190613cbe9190613b8d565b50565b600081359050613cd081615086565b92915050565b600081519050613ce581615086565b92915050565b600082601f830112613cfc57600080fd5b8135613d0f613d0a82614e74565b614e47565b91508082526020830160208301858383011115613d2b57600080fd5b613d36838284615026565b50505092915050565b600082601f830112613d5057600080fd5b8135613d63613d5e82614ea0565b614e47565b91508082526020830160208301858383011115613d7f57600080fd5b613d8a838284615026565b50505092915050565b600081359050613da28161509d565b92915050565b600060208284031215613dba57600080fd5b6000613dc884828501613cd6565b91505092915050565b60008060408385031215613de457600080fd5b6000613df285828601613cc1565b9250506020613e0385828601613d93565b9150509250929050565b600060208284031215613e1f57600080fd5b600082013567ffffffffffffffff811115613e3957600080fd5b613e4584828501613d3f565b91505092915050565b60008060408385031215613e6157600080fd5b600083013567ffffffffffffffff811115613e7b57600080fd5b613e8785828601613d3f565b9250506020613e9885828601613d93565b9150509250929050565b600080600060608486031215613eb757600080fd5b600084013567ffffffffffffffff811115613ed157600080fd5b613edd86828701613d3f565b9350506020613eee86828701613d93565b925050604084013567ffffffffffffffff811115613f0b57600080fd5b613f1786828701613ceb565b9150509250925092565b600080600060608486031215613f3657600080fd5b600084013567ffffffffffffffff811115613f5057600080fd5b613f5c86828701613d3f565b9350506020613f6d86828701613d93565b9250506040613f7e86828701613d93565b9150509250925092565b6000613f9483836140f6565b60208301905092915050565b6000613fac8383614105565b60208301905092915050565b6000613fc4838361497f565b905092915050565b6000613fd782614ef6565b613fe18185614f55565b9350613fec83614ecc565b8060005b8381101561401d5781516140048882613f88565b975061400f83614f2e565b925050600181019050613ff0565b5085935050505092915050565b61403381614f01565b61403d8184614f66565b925061404882614edc565b8060005b838110156140795781516140608782613fa0565b965061406b83614f3b565b92505060018101905061404c565b505050505050565b600061408c82614f0d565b6140968185614f71565b9350836020820285016140a885614ee6565b8060005b858110156140e457848403895281516140c58582613fb8565b94506140d083614f48565b925060208a019950506001810190506140ac565b50829750879550505050505092915050565b6140ff81614fc1565b82525050565b61410e81614fcd565b82525050565b61411d81615014565b82525050565b61412c81615014565b82525050565b600061413d82614f23565b6141478185614fa4565b9350614157818560208601615035565b80840191505092915050565b600061416e82614f18565b6141788185614f82565b9350614188818560208601615035565b61419181615068565b840191505092915050565b60006141a782614f18565b6141b18185614fa4565b93506141c1818560208601615035565b80840191505092915050565b60006141da601883614f93565b91507f496e636f7272656374206368756e6b20706f736974696f6e00000000000000006000830152602082019050919050565b600061421a601583614f93565b91507f4469726563746f7279206e6f74206372656174656400000000000000000000006000830152602082019050919050565b600061425a602483614f93565b91507f4e6f7420656e6f756768206d656d6f727920696e207468652046696c6573746f60008301527f72616765000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006142c0601b83614f93565b91507f48617368206861736e2774206265656e2063616c63756c6174656400000000006000830152602082019050919050565b6000614300601983614f93565b91507f4368756e6b20697320616c72656164792075706c6f61646564000000000000006000830152602082019050919050565b6000614340601683614f93565b91507f496e636f7272656374206368756e6b206c656e677468000000000000000000006000830152602082019050919050565b6000614380600f83614f93565b91507f46696c65206e6f742065786973747300000000000000000000000000000000006000830152602082019050919050565b60006143c0600e83614f93565b91507f496e76616c69642073656e6465720000000000000000000000000000000000006000830152602082019050919050565b6000614400601883614f93565b91507f4469726563746f7279206973206e6f742064656c6574656400000000000000006000830152602082019050919050565b6000614440601083614f93565b91507f46696c65206e6f742064656c65746564000000000000000000000000000000006000830152602082019050919050565b6000614480601383614f93565b91507f496e76616c69642073746f7261676550617468000000000000000000000000006000830152602082019050919050565b60006144c0600c83614f93565b91507f496e76616c6964207061746800000000000000000000000000000000000000006000830152602082019050919050565b6000614500600183614fa4565b91507f2e000000000000000000000000000000000000000000000000000000000000006000830152600182019050919050565b6000614540601683614f93565b91507f496e76616c6964206469726563746f7279206e616d65000000000000000000006000830152602082019050919050565b6000614580601583614f93565b91507f4368756e6b207761736e27742075706c6f6164656400000000000000000000006000830152602082019050919050565b60006145c0602683614f93565b91507f436f756c64206e6f742072657365727665206c657373207468616e207573656460008301527f20737061636500000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614626601683614f93565b91507f4469726563746f7279206973206e6f7420656d707479000000000000000000006000830152602082019050919050565b6000614666602383614f93565b91507f46696c65206861736e2774206265656e2075706c6f6164656420636f7272656360008301527f746c7900000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006146cc601183614f93565b91507f4368756e6b207761736e277420726561640000000000000000000000000000006000830152602082019050919050565b600061470c601883614f93565b91507f46696c656e616d652073686f756c64206265203c2032353600000000000000006000830152602082019050919050565b600061474c601f83614f93565b91507f46696c652073686f756c64206265206c657373207468616e20313030204d42006000830152602082019050919050565b600061478c600283614fa4565b91507f2e2e0000000000000000000000000000000000000000000000000000000000006000830152600282019050919050565b60006147cc601183614f93565b91507f4469726563746f72792069732066756c6c0000000000000000000000000000006000830152602082019050919050565b600061480c600e83614f93565b91507f46696c65206e6f7420666f756e640000000000000000000000000000000000006000830152602082019050919050565b600061484c601883614f93565b91507f46696c65206f72206469726563746f72792065786973747300000000000000006000830152602082019050919050565b600061488c601983614f93565b91507f4e6f7420656e6f756768207265736572766564207370616365000000000000006000830152602082019050919050565b60006148cc601883614f93565b91507f45564d206572726f7220696e2067657446696c6553697a6500000000000000006000830152602082019050919050565b600061490c601083614f93565b91507f46696c65206e6f742063726561746564000000000000000000000000000000006000830152602082019050919050565b600061494c601983614f93565b91507f46696c65206861736e2774206265656e2075706c6f61646564000000000000006000830152602082019050919050565b600060a083016000830151848203600086015261499c8282614163565b91505060208301516149b160208601826140f6565b5060408301516149c460408601826149fc565b5060608301516149d76060860182614114565b50608083015184820360808601526149ef8282613fcc565b9150508091505092915050565b614a058161500a565b82525050565b614a148161500a565b82525050565b6000614a26828461419c565b915081905092915050565b6000614a3d8284614132565b915081905092915050565b6000614a53826144f3565b9150819050919050565b6000614a688261477f565b9150819050919050565b60006210000082019050614a89600083018461402a565b92915050565b60006020820190508181036000830152614aa98184614081565b905092915050565b6000602082019050614ac66000830184614123565b92915050565b60006020820190508181036000830152614ae5816141cd565b9050919050565b60006020820190508181036000830152614b058161420d565b9050919050565b60006020820190508181036000830152614b258161424d565b9050919050565b60006020820190508181036000830152614b45816142b3565b9050919050565b60006020820190508181036000830152614b65816142f3565b9050919050565b60006020820190508181036000830152614b8581614333565b9050919050565b60006020820190508181036000830152614ba581614373565b9050919050565b60006020820190508181036000830152614bc5816143b3565b9050919050565b60006020820190508181036000830152614be5816143f3565b9050919050565b60006020820190508181036000830152614c0581614433565b9050919050565b60006020820190508181036000830152614c2581614473565b9050919050565b60006020820190508181036000830152614c45816144b3565b9050919050565b60006020820190508181036000830152614c6581614533565b9050919050565b60006020820190508181036000830152614c8581614573565b9050919050565b60006020820190508181036000830152614ca5816145b3565b9050919050565b60006020820190508181036000830152614cc581614619565b9050919050565b60006020820190508181036000830152614ce581614659565b9050919050565b60006020820190508181036000830152614d05816146bf565b9050919050565b60006020820190508181036000830152614d25816146ff565b9050919050565b60006020820190508181036000830152614d458161473f565b9050919050565b60006020820190508181036000830152614d65816147bf565b9050919050565b60006020820190508181036000830152614d85816147ff565b9050919050565b60006020820190508181036000830152614da58161483f565b9050919050565b60006020820190508181036000830152614dc58161487f565b9050919050565b60006020820190508181036000830152614de5816148bf565b9050919050565b60006020820190508181036000830152614e05816148ff565b9050919050565b60006020820190508181036000830152614e258161493f565b9050919050565b6000602082019050614e416000830184614a0b565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614e6a57600080fd5b8060405250919050565b600067ffffffffffffffff821115614e8b57600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614eb757600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050919050565b6000819050602082019050919050565b600081519050919050565b60006180009050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614fba82614fea565b9050919050565b60008115159050919050565b6000819050919050565b6000819050614fe582615079565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061501f82614fd7565b9050919050565b82818337600083830152505050565b60005b83811015615053578082015181840152602081019050615038565b83811115615062576000848401525b50505050565b6000601f19601f8301169050919050565b6003811061508357fe5b50565b61508f81614faf565b811461509a57600080fd5b50565b6150a68161500a565b81146150b157600080fd5b5056fea365627a7a72315820314a90e541327f2678eaf7815f54348c3702e4fa45cdf1d5595b378d08af86896c6578706572696d656e74616cf564736f6c634300050d0040", + "nonce": "0", + "storage": { + "0x0": "2868903936" + } + }, + "0x69bfcdcb98c9562e0a2faee3ecdfd65e8a0adb19": { + "balance": "1000000000000000000000000000000" + }, + "0x6a37ad7dceec4595eea9f03b82d2710e738343ac": { + "balance": "1000000000000000000000000000000" + }, + "0x6b806862a977a0e22ed1752f858e5332647121c8": { + "balance": "1000000000000000000000000000000" + }, + "0x6c0ef9084a57df13c175afea32ea47a510c5506e": { + "balance": "1000000000000000000000000000000" + }, + "0x6cd5e637266e18d3e888ee99451eb828c6b491f4": { + "balance": "1000000000000000000000000000000" + }, + "0x6d0d7f0ff51917bd84a5f7270d31a894282aaf4b": { + "balance": "1000000000000000000000000000000" + }, + "0x6d8092cb926daf29236f866cd31c327ff73323d1": { + "balance": "1000000000000000000000000000000" + }, + "0x6d80aAC61F6d92c7F4A3c412850474ba963B698E": { + "balance": "1000000000000000000000" + }, + "0x6fec280c0ab320715b17d70e8b02c2d4141c1372": { + "balance": "1000000000000000000000000000000" + }, + "0x733ad609ef2e742334d96266fbc13733f1cf5e4a": { + "balance": "1000000000000000000000000000000" + }, + "0x7525198d8cd1121d57358a0b0ed037e924581a76": { + "balance": "1000000000000000000000000000000" + }, + "0x765708943c3b791563d1e3f0533b6d7e7d769e4d": { + "balance": "1000000000000000000000000000000" + }, + "0x7685d04f0b7657017b77efa004a14ff9f022acab": { + "balance": "1000000000000000000000000000000" + }, + "0x76b545cb6a2fc671f741950eeb27627e69a1e69b": { + "balance": "1000000000000000000000000000000" + }, + "0x77a0bc73442d3d9cb993e8d9752f95babf0ccaa6": { + "balance": "1000000000000000000000000000000" + }, + "0x7a89A6c323FaCfF0ADeF7EEF3e491aD4044d0592": { + "balance": "100000000000000000000000" + }, + "0x7e7E68F04D1799Fa25C8cff57314c8a5d3942e69": { + "balance": "1000000000000000000000000" + }, + "0x811d701d14539d190a8593fe901eafe8eff511f5": { + "balance": "1000000000000000000000000000000" + }, + "0x81dcbd71da28fafb9ca99ff5a22bfcebba84fecc": { + "balance": "100000000000000000000000" + }, + "0x83c1479d2a32d9ed9fa699289b6c2db56b7cd045": { + "balance": "1000000000000000000000000000000" + }, + "0x85b33f0853ab8eaa4e602bdfd724d44bc2731e90": { + "balance": "1000000000000000000000000000000" + }, + "0x863f816036e3cbba90855196c9d1e339fcff1650": { + "balance": "1000000000000000000000000000000" + }, + "0x87ea381878572d63b3453033d7540abddd191186": { + "balance": "1000000000000000000000000000000" + }, + "0x88fd5e01078629cc194c933d9631b9448fe10b1d": { + "balance": "1000000000000000000000000000000" + }, + "0x8945e48bd056f45c8b57f9025d2674bb03a24035": { + "balance": "1000000000000000000000000000000" + }, + "0x8a920edc1021ce76c22774e0e83723a6e51c2439": { + "balance": "1000000000000000000000000000000" + }, + "0x8e6081e272c8f4d49f5b29157b52f68cbd6307ad": { + "balance": "1000000000000000000000000000000" + }, + "0x8fe24dbbf9884bd458d8cfac528b4ad70e82497d": { + "balance": "1000000000000000000000000000000" + }, + "0x90431f3f75b26657f74abbb5c759b12e78f916cc": { + "balance": "1000000000000000000000000000000" + }, + "0x907cd0881E50d359bb9Fd120B1A5A143b1C97De6": { + "balance": "1000000000000000000000000000000000000000000000000000000000" + }, + "0x94c6e5746971d6aebeaa42cbbe2feca0f6b5b24f": { + "balance": "1000000000000000000000000000000" + }, + "0x96672f9e982936e1904b15c948cc81bf18027db6": { + "balance": "1000000000000000000000000000000" + }, + "0x97b921ba45e0aa8830701aa62050a83ee00a1bb8": { + "balance": "1000000000000000000000000000000" + }, + "0x98e50c97baf98dc6a81bdb95067339a269a36fc1": { + "balance": "1000000000000000000000000000000" + }, + "0x9b77f28285a49601169a33332f08aa309d97edd0": { + "balance": "1000000000000000000000000000000" + }, + "0x9f62f4215cd277ca40dede101b4ccb29290de6bb": { + "balance": "1000000000000000000000000000000" + }, + "0xD1001000000000000000000000000000000000D1": { + "balance": "0", + "code": "0x608060405260043610603f576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680636d4ce63c146044575b600080fd5b348015604f57600080fd5b506056606c565b6040518082815260200191505060405180910390f35b60006001600060048152602001908152602001600020600060098152602001908152602001600020600101549050905600a165627a7a723058208fe64219becc0bcab1c8f854f05804ebb6bb555da5dbc49e8f7021c31d77636a0029", + "nonce": "0", + "storage": { + "0x3b4da637a1b0e6dbfc6795f2b7f0cb29eebb91b3af4dcc335e1633f6b4af810b": "1111" + } + }, + "0xD3001000000000000000000000000000000000D3": { + "balance": "0", + "code": "0x60806040526004361061007b5760003560e01c80639623609d1161004e5780639623609d1461013657806399a88ec4146101f5578063f2fde38b14610230578063f3b7dead146102635761007b565b8063204e1c7a14610080578063715018a6146100cf5780637eff275e146100e65780638da5cb5b14610121575b600080fd5b34801561008c57600080fd5b506100b3600480360360208110156100a357600080fd5b50356001600160a01b0316610296565b604080516001600160a01b039092168252519081900360200190f35b3480156100db57600080fd5b506100e4610328565b005b3480156100f257600080fd5b506100e46004803603604081101561010957600080fd5b506001600160a01b03813581169160200135166103ca565b34801561012d57600080fd5b506100b3610496565b6100e46004803603606081101561014c57600080fd5b6001600160a01b03823581169260208101359091169181019060608101604082013564010000000081111561018057600080fd5b82018360208201111561019257600080fd5b803590602001918460018302840111640100000000831117156101b457600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506104a5945050505050565b34801561020157600080fd5b506100e46004803603604081101561021857600080fd5b506001600160a01b03813581169160200135166105dd565b34801561023c57600080fd5b506100e46004803603602081101561025357600080fd5b50356001600160a01b031661068d565b34801561026f57600080fd5b506100b36004803603602081101561028657600080fd5b50356001600160a01b0316610785565b6000806060836001600160a01b03166040518080635c60da1b60e01b8152506004019050600060405180830381855afa9150503d80600081146102f5576040519150601f19603f3d011682016040523d82523d6000602084013e6102fa565b606091505b50915091508161030957600080fd5b80806020019051602081101561031e57600080fd5b5051949350505050565b6103306107e4565b6000546001600160a01b03908116911614610380576040805162461bcd60e51b8152602060048201819052602482015260008051602061080f833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6103d26107e4565b6000546001600160a01b03908116911614610422576040805162461bcd60e51b8152602060048201819052602482015260008051602061080f833981519152604482015290519081900360640190fd5b816001600160a01b0316638f283970826040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050600060405180830381600087803b15801561047a57600080fd5b505af115801561048e573d6000803e3d6000fd5b505050505050565b6000546001600160a01b031690565b6104ad6107e4565b6000546001600160a01b039081169116146104fd576040805162461bcd60e51b8152602060048201819052602482015260008051602061080f833981519152604482015290519081900360640190fd5b826001600160a01b0316634f1ef2863484846040518463ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561057357818101518382015260200161055b565b50505050905090810190601f1680156105a05780820380516001836020036101000a031916815260200191505b5093505050506000604051808303818588803b1580156105bf57600080fd5b505af11580156105d3573d6000803e3d6000fd5b5050505050505050565b6105e56107e4565b6000546001600160a01b03908116911614610635576040805162461bcd60e51b8152602060048201819052602482015260008051602061080f833981519152604482015290519081900360640190fd5b816001600160a01b0316633659cfe6826040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050600060405180830381600087803b15801561047a57600080fd5b6106956107e4565b6000546001600160a01b039081169116146106e5576040805162461bcd60e51b8152602060048201819052602482015260008051602061080f833981519152604482015290519081900360640190fd5b6001600160a01b03811661072a5760405162461bcd60e51b81526004018080602001828103825260268152602001806107e96026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000806060836001600160a01b031660405180806303e1469160e61b8152506004019050600060405180830381855afa9150503d80600081146102f5576040519150601f19603f3d011682016040523d82523d6000602084013e6102fa565b339056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a26469706673582212201d968ac32bef5562c6b4f1bd5d2f2a74c14d07ce008ca6fdc5a3bd0f5fc265f564736f6c63430006080033", + "nonce": "0", + "storage": { + "0x0": "0x907cd0881E50d359bb9Fd120B1A5A143b1C97De6" + } + }, + "0xD3002000000000000000000000000000000000D3": { + "balance": "0", + "code": "0x60806040526004361061004e5760003560e01c80633659cfe6146100655780634f1ef286146100985780635c60da1b146101185780638f28397014610149578063f851a4401461017c5761005d565b3661005d5761005b610191565b005b61005b610191565b34801561007157600080fd5b5061005b6004803603602081101561008857600080fd5b50356001600160a01b03166101ab565b61005b600480360360408110156100ae57600080fd5b6001600160a01b0382351691908101906040810160208201356401000000008111156100d957600080fd5b8201836020820111156100eb57600080fd5b8035906020019184600183028401116401000000008311171561010d57600080fd5b5090925090506101e5565b34801561012457600080fd5b5061012d610292565b604080516001600160a01b039092168252519081900360200190f35b34801561015557600080fd5b5061005b6004803603602081101561016c57600080fd5b50356001600160a01b03166102cf565b34801561018857600080fd5b5061012d610389565b6101996103ba565b6101a96101a461041a565b61043f565b565b6101b3610463565b6001600160a01b0316336001600160a01b031614156101da576101d581610488565b6101e2565b6101e2610191565b50565b6101ed610463565b6001600160a01b0316336001600160a01b031614156102855761020f83610488565b6000836001600160a01b031683836040518083838082843760405192019450600093509091505080830381855af49150503d806000811461026c576040519150601f19603f3d011682016040523d82523d6000602084013e610271565b606091505b505090508061027f57600080fd5b5061028d565b61028d610191565b505050565b600061029c610463565b6001600160a01b0316336001600160a01b031614156102c4576102bd61041a565b90506102cc565b6102cc610191565b90565b6102d7610463565b6001600160a01b0316336001600160a01b031614156101da576001600160a01b0381166103355760405162461bcd60e51b81526004018080602001828103825260368152602001806105876036913960400191505060405180910390fd5b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f61035e610463565b604080516001600160a01b03928316815291841660208301528051918290030190a16101d5816104c8565b6000610393610463565b6001600160a01b0316336001600160a01b031614156102c4576102bd610463565b3b151590565b6103c2610463565b6001600160a01b0316336001600160a01b031614156104125760405162461bcd60e51b81526004018080602001828103825260328152602001806105556032913960400191505060405180910390fd5b6101a96101a9565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b3660008037600080366000845af43d6000803e80801561045e573d6000f35b3d6000fd5b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b610491816104ec565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610355565b6104f5816103b4565b6105305760405162461bcd60e51b815260040180806020018281038252603b8152602001806105bd603b913960400191505060405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5556fe43616e6e6f742063616c6c2066616c6c6261636b2066756e6374696f6e2066726f6d207468652070726f78792061646d696e43616e6e6f74206368616e6765207468652061646d696e206f6620612070726f787920746f20746865207a65726f206164647265737343616e6e6f742073657420612070726f787920696d706c656d656e746174696f6e20746f2061206e6f6e2d636f6e74726163742061646472657373a26469706673582212206e221e2a3547bd97244b05ed46430b1b078ba097cb2a4e25ec3d79cf9ac9f02c64736f6c63430006080033", + "nonce": "0", + "storage": { + "0x0": "1000000", + "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0xD3003000000000000000000000000000000000D3", + "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "0xD3001000000000000000000000000000000000D3" + } + }, + "0xD3003000000000000000000000000000000000D3": { + "balance": "0", + "code": "0x608060405234801561001057600080fd5b50600436106100b45760003560e01c806379210e8e1161007157806379210e8e1461017757806381a8235a146101a757806385aeeb17146101c35780639a9a5593146101f3578063a99100541461020f578063b57321221461022b576100b4565b806307c6e7d3146100b9578063122f4fba146100d55780631c6ec7a9146101055780631cfe4e3b14610121578063373dedb41461013d57806361e46db51461015b575b600080fd5b6100d360048036036100ce9190810190613e94565b61025b565b005b6100ef60048036036100ea9190810190613e94565b610862565b6040516100fc9190614b38565b60405180910390f35b61011f600480360361011a9190810190613e94565b610ba1565b005b61013b60048036036101369190810190613e58565b610fce565b005b6101456111ec565b6040516101529190614eb3565b60405180910390f35b61017560048036036101709190810190613f29565b6111f6565b005b610191600480360361018c9190810190613fa8565b611456565b60405161019e9190614af9565b60405180910390f35b6101c160048036036101bc9190810190613e94565b611756565b005b6101dd60048036036101d89190810190613e94565b6118fb565b6040516101ea9190614b16565b60405180910390f35b61020d60048036036102089190810190613ed5565b611bfa565b005b61022960048036036102249190810190613e94565b612195565b005b61024560048036036102409190810190613e94565b612849565b6040516102529190614eb3565b60405180910390f35b6000339050606061026b83612ac9565b90506000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b825181101561037c576000826001018460018403815181106102d557fe5b60200260200101516040516102ea9190614aa1565b90815260200160405180910390205411610339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161033090614cb3565b60405180910390fd5b8160020183600183038151811061034c57fe5b60200260200101516040516103619190614aa1565b908152602001604051809103902091508060010190506102b7565b506060600183511161038e57846103a7565b8260018451038151811061039e57fe5b60200260200101515b9050600082600101826040516103bd9190614ab8565b9081526020016040518091039020541161040c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161040390614cb3565b60405180910390fd5b600082600201826040516104209190614ab8565b90815260200160405180910390206000018054905014610475576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161046c90614d33565b60405180910390fd5b60006104818587612cc9565b9050806104c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ba90614c53565b60405180910390fd5b6104cb613a4f565b836000016001856000018054905003815481106104e457fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156105965780601f1061056b57610100808354040283529160200191610596565b820191906000526020600020905b81548152906001019060200180831161057957829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff1660028111156105e257fe5b60028111156105ed57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561066557602002820191906000526020600020906000905b82829054906101000a900460ff1615158152602001906001019060208260000104928301926001038202915080841161062f5790505b50505050508152505090508084600001600186600101866040516106899190614ab8565b90815260200160405180910390205403815481106106a357fe5b906000526020600020906005020160008201518160000190805190602001906106cd929190613a8b565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561071c57fe5b0217905550608082015181600401908051906020019061073d929190613b0b565b5090505083600101836040516107539190614ab8565b9081526020016040518091039020548460010182600001516040516107789190614aa1565b9081526020016040518091039020819055506000846001018460405161079e9190614ab8565b908152602001604051809103902081905550836000018054806107bd57fe5b6001900381819060005260206000209060050201600080820160006107e29190613bb1565b6001820160006101000a81549060ff021916905560028201600090556003820160006101000a81549060ff02191690556004820160006108229190613bf9565b5050905583600201836040516108389190614ab8565b9081526020016040518091039020600080820160006108579190613c21565b505050505050505050565b600080606061087084612d2d565b91509150606061087f82612ac9565b90506000600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015610964576000826001018460018403815181106108e957fe5b60200260200101516040516108fe9190614aa1565b908152602001604051809103902054141561092157600095505050505050610b9c565b8160020183600183038151811061093457fe5b60200260200101516040516109499190614aa1565b908152602001604051809103902091508060010190506108cb565b5060606001835111610976578361098f565b8260018451038151811061098657fe5b60200260200101515b9050600082600101826040516109a59190614ab8565b90815260200160405180910390205414156109c857600095505050505050610b9c565b6109d0613a4f565b82600001600184600101846040516109e89190614ab8565b9081526020016040518091039020540381548110610a0257fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610ab45780601f10610a8957610100808354040283529160200191610ab4565b820191906000526020600020905b815481529060010190602001808311610a9757829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115610b0057fe5b6002811115610b0b57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015610b8357602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411610b4d5790505b5050505050815250509050806060015196505050505050505b919050565b600360009054906101000a900460ff16610be457612000600481905550621000006005819055506001600360006101000a81548160ff0219169083151502179055505b6000815111610c28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1f90614cb3565b60405180910390fd5b60003390506060610c3883612ac9565b90506000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015610d4957600082600101846001840381518110610ca257fe5b6020026020010151604051610cb79190614aa1565b90815260200160405180910390205411610d06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cfd90614cb3565b60405180910390fd5b81600201836001830381518110610d1957fe5b6020026020010151604051610d2e9190614aa1565b90815260200160405180910390209150806001019050610c84565b50600454816000018054905010610d95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8c90614dd3565b60405180910390fd5b60606001835111610da65784610dbf565b82600184510381518110610db657fe5b60200260200101515b905060008260010182604051610dd59190614ab8565b90815260200160405180910390205414610e24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1b90614e13565b60405180910390fd5b610e2d816130af565b610e6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6390614cd3565b60405180910390fd5b6000610e788587613190565b905080610eba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb190614b73565b60405180910390fd5b610ec2613a4f565b8281600001819052506000816020019015159081151581525050836000018190806001815401808255809150506001900390600052602060002090600502016000909190919091506000820151816000019080519060200190610f26929190613a8b565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff02191690836002811115610f7557fe5b02179055506080820151816004019080519060200190610f96929190613b0b565b50505083600001805490508460010184604051610fb39190614ab8565b90815260200160405180910390208190555050505050505050565b610fd66131f4565b73ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16148061103b57503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614155b61107a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107190614c33565b60405180910390fd5b80600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411156110fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f390614d13565b60405180910390fd5b60025460095482011115611145576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113c90614b93565b60405180910390fd5b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460096000828254039250508190555080600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550806009600082825401925050819055505050565b6000600254905090565b60003390506000611207828661328d565b90506001600281111561121657fe5b8160030160009054906101000a900460ff16600281111561123357fe5b14611273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126a90614df3565b60405180910390fd5b6000600554858161128057fe5b061480156112915750806002015484105b6112d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c790614b53565b60405180910390fd5b600554848260020154031080156112ed5750838160020154038351145b806112fa57506005548351145b611339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133090614bf3565b60405180910390fd5b6000151581600401600554868161134c57fe5b048154811061135757fe5b90600052602060002090602091828204019190069054906101000a900460ff161515146113b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b090614bd3565b60405180910390fd5b60006113c78387878761348c565b905080611409576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140090614cf3565b60405180910390fd5b600182600401600554878161141a57fe5b048154811061142557fe5b90600052602060002090602091828204019190066101000a81548160ff021916908315150217905550505050505050565b61145e613c45565b6000606061146b86612d2d565b91509150611477613a4f565b611481838361328d565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156115255780601f106114fa57610100808354040283529160200191611525565b820191906000526020600020905b81548152906001019060200180831161150857829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561157157fe5b600281111561157c57fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156115f457602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116115be5790505b505050505081525050905060028081111561160b57fe5b8160600151600281111561161b57fe5b1461165b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165290614e93565b60405180910390fd5b600554851115801561166d5750600085115b6116ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a390614bf3565b60405180910390fd5b806040015185870111156116f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ec90614b53565b60405180910390fd5b60006117038484898961353d565b80965081925050508061174b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174290614d73565b60405180910390fd5b505050509392505050565b60003390506000611767828461328d565b90506001600281111561177657fe5b8160030160009054906101000a900460ff16600281111561179357fe5b146117d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ca90614df3565b60405180910390fd5b60006001905060008260040180549050905060008090505b8181101561183e576000151584600401828154811061180657fe5b90600052602060002090602091828204019190069054906101000a900460ff161515141561183357600092505b8060010190506117eb565b508161187f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187690614d53565b60405180910390fd5b60028360030160006101000a81548160ff021916908360028111156118a057fe5b021790555060006118b185876135d0565b9050806118f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ea90614bb3565b60405180910390fd5b505050505050565b60606000606061190a84612d2d565b91509150606061191982612ac9565b90506000600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008090505b8251811015611a235760008260010184838151811061197f57fe5b60200260200101516040516119949190614aa1565b908152602001604051809103902054116119e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119da90614cb3565b60405180910390fd5b816002018382815181106119f357fe5b6020026020010151604051611a089190614aa1565b90815260200160405180910390209150806001019050611964565b5080600001805480602002602001604051908101604052809291908181526020016000905b82821015611beb57838290600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611b045780601f10611ad957610100808354040283529160200191611b04565b820191906000526020600020905b815481529060010190602001808311611ae757829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115611b5057fe5b6002811115611b5b57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015611bd357602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411611b9d5790505b50505050508152505081526020019060010190611a48565b50505050945050505050919050565b600360009054906101000a900460ff16611c3d57612000600481905550621000006005819055506001600360006101000a81548160ff0219169083151502179055505b60003390506305f5e100821115611c89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8090614db3565b60405180910390fd5b600660008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205483011115611d4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4390614e33565b60405180910390fd5b6060611d5784612ac9565b90506000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015611e6857600082600101846001840381518110611dc157fe5b6020026020010151604051611dd69190614aa1565b90815260200160405180910390205411611e25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1c90614cb3565b60405180910390fd5b81600201836001830381518110611e3857fe5b6020026020010151604051611e4d9190614aa1565b90815260200160405180910390209150806001019050611da3565b50600454816000018054905010611eb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eab90614dd3565b60405180910390fd5b60606001835111611ec55785611ede565b82600184510381518110611ed557fe5b60200260200101515b905060008260010182604051611ef49190614ab8565b90815260200160405180910390205414611f43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3a90614e13565b60405180910390fd5b611f4c816130af565b611f8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8290614d93565b60405180910390fd5b6000611f98858888613634565b905080611fda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd190614e73565b60405180910390fd5b6060600554600160055489010381611fee57fe5b0460405190808252806020026020018201604052801561201d5781602001602082028038833980820191505090505b509050836000016040518060a001604052808581526020016001151581526020018981526020016001600281111561205157fe5b8152602001838152509080600181540180825580915050600190039060005260206000209060050201600090919091909150600082015181600001908051906020019061209f929190613a8b565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff021916908360028111156120ee57fe5b0217905550608082015181600401908051906020019061210f929190613b0b565b5050508360000180549050846001018460405161212c9190614ab8565b90815260200160405180910390208190555086600760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505050505050505050565b60003390506121a2613a4f565b6121ac828461328d565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156122505780601f1061222557610100808354040283529160200191612250565b820191906000526020600020905b81548152906001019060200180831161223357829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561229c57fe5b60028111156122a757fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561231f57602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116122e95790505b50505050508152505090506000600281111561233757fe5b8160600151600281111561234757fe5b1415612388576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161237f90614c13565b60405180910390fd5b600061239483856136a1565b9050806123d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123cd90614c73565b60405180910390fd5b60606123e185612ac9565b90506000600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015612479578160020183600183038151811061244957fe5b602002602001015160405161245e9190614aa1565b9081526020016040518091039020915080600101905061242d565b50600060018260010186600001516040516124949190614aa1565b9081526020016040518091039020540390506124ae613a4f565b826000016001846000018054905003815481106124c757fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156125795780601f1061254e57610100808354040283529160200191612579565b820191906000526020600020905b81548152906001019060200180831161255c57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff1660028111156125c557fe5b60028111156125d057fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561264857602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116126125790505b50505050508152505090508083600001838154811061266357fe5b9060005260206000209060050201600082015181600001908051906020019061268d929190613a8b565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff021916908360028111156126dc57fe5b021790555060808201518160040190805190602001906126fd929190613b0b565b509050508260000180548061270e57fe5b6001900381819060005260206000209060050201600080820160006127339190613bb1565b6001820160006101000a81549060ff021916905560028201600090556003820160006101000a81549060ff02191690556004820160006127739190613bf9565b5050905582600101866000015160405161278d9190614aa1565b9081526020016040518091039020548360010182600001516040516127b29190614aa1565b90815260200160405180910390208190555060008360010187600001516040516127dc9190614aa1565b9081526020016040518091039020819055508560400151600760008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505050505050505050565b600080606061285784612d2d565b91509150612863613a4f565b61286d838361328d565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156129115780601f106128e657610100808354040283529160200191612911565b820191906000526020600020905b8154815290600101906020018083116128f457829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561295d57fe5b600281111561296857fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156129e057602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116129aa5790505b5050505050815250509050600160028111156129f857fe5b81606001516002811115612a0857fe5b1480612a2d5750600280811115612a1b57fe5b81606001516002811115612a2b57fe5b145b612a6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a6390614df3565b60405180910390fd5b6000612a788484613705565b809650819250505080612ac0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ab790614e53565b60405180910390fd5b50505050919050565b6060612ad3613c6a565b612adc8361376e565b9050612ae6613c6a565b612b246040518060400160405280600181526020017f2f0000000000000000000000000000000000000000000000000000000000000081525061376e565b905060606001612b3d838561379c90919063ffffffff16565b01604051908082528060200260200182016040528015612b7157816020015b6060815260200190600190039081612b5c5790505b50905060008090505b8151811015612bc257612b9e612b99848661381190919063ffffffff16565b61382b565b828281518110612baa57fe5b60200260200101819052508080600101915050612b7a565b50600081600183510381518110612bd557fe5b6020026020010151511415612c405780600182510381518110612bf457fe5b6020026020010160608152506001815103604051908082528060200260200182016040528015612c3857816020015b6060815260200190600190039081612c235790505b509350612c79565b8051604051908082528060200260200182016040528015612c7557816020015b6060815260200190600190039081612c605790505b5093505b60008090505b8451811015612cc057818181518110612c9457fe5b6020026020010151858281518110612ca857fe5b60200260200101819052508080600101915050612c7f565b50505050919050565b60008060016020601f85510181612cdc57fe5b040190506040518481526020810160005b83811015612d0e578060200286015181602002830152806001019050612ced565b50602082602085026040018460006010600019f1935050505092915050565b6000606060006028905080845111612d7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d7190614c93565b60405180910390fd5b6060816040519080825280601f01601f191660200182016040528015612daf5781602001600182028038833980820191505090505b50905060008090505b82811015612e1f57858181518110612dcc57fe5b602001015160f81c60f81b828281518110612de357fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050612db8565b50600080905060008090505b83811015612f4e576000838281518110612e4157fe5b602001015160f81c60f81b60f81c60ff16905060308110158015612e66575060398111155b80612e7f575060418110158015612e7e5750605a8111155b5b80612e98575060618110158015612e97575060668111155b5b612ed7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ece90614c93565b60405180910390fd5b60308110158015612ee9575060398111155b15612efa5760308103601084020192505b60418110158015612f0c5750605a8111155b15612f1d5760378103601084020192505b60618110158015612f2f575060668111155b15612f405760578103601084020192505b508080600101915050612e2b565b508094507f2f00000000000000000000000000000000000000000000000000000000000000868481518110612f7f57fe5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612fec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fe390614c93565b60405180910390fd5b6000600184885103039050806040519080825280601f01601f19166020018201604052801561302a5781602001600182028038833980820191505090505b50945060008090505b818110156130a5576000886001878401018151811061304e57fe5b602001015160f81c60f81b90508087838151811061306857fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350508080600101915050613033565b5050505050915091565b60006040516020016130c090614ae4565b60405160208183030381529060405280519060200120826040516020016130e79190614ab8565b604051602081830303815290604052805190602001201480613152575060405160200161311390614acf565b604051602081830303815290604052805190602001208260405160200161313a9190614ab8565b60405160208183030381529060405280519060200120145b8061315e575060008251145b1561316c576000905061318b565b60008251905060ff81111561318557600091505061318b565b60019150505b919050565b60008060016020601f855101816131a357fe5b040190506040518481526020810160005b838110156131d55780602002860151816020028301528060010190506131b4565b5060208260208502604001846000600f600019f1935050505092915050565b600073d2001000000000000000000000000000000000d273ffffffffffffffffffffffffffffffffffffffff166383e781fe6040518163ffffffff1660e01b815260040160206040518083038186803b15801561325057600080fd5b505afa158015613264573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506132889190810190613e2f565b905090565b6000606061329a83612ac9565b90506000600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b82518110156133ab5760008260010184600184038151811061330457fe5b60200260200101516040516133199190614aa1565b90815260200160405180910390205411613368576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161335f90614cb3565b60405180910390fd5b8160020183600183038151811061337b57fe5b60200260200101516040516133909190614aa1565b908152602001604051809103902091508060010190506132e6565b50606060018351116133bd57846133d6565b826001845103815181106133cd57fe5b60200260200101515b9050600082600101826040516133ec9190614ab8565b9081526020016040518091039020541161343b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161343290614cb3565b60405180910390fd5b600082600001600184600101846040516134559190614ab8565b908152602001604051809103902054038154811061346f57fe5b906000526020600020906005020190508094505050505092915050565b60008060016020601f8551018161349f57fe5b04019050600060016020601f885101816134b557fe5b040190506040518781526020810160005b838110156134e75780602002890151816020028301528060010190506134c6565b50868360200282015260005b8481101561351957806020028701518185600101016020028301528060010190506134f3565b50602082848601602002606001846000600c600019f1945050505050949350505050565b6000613547613c45565b600060016020601f8851018161355957fe5b0401905060006020601f86018161356c57fe5b0490506040518881526020810160005b8481101561359d57806020028a01518160200283015280600101905061357c565b5083602002810188815287816020015283602002868660030160200285600a600019fa9650505050505094509492505050565b60008060016020601f855101816135e357fe5b040190506040518481526020810160005b838110156136155780602002860151816020028301528060010190506135f4565b50602082602085026040018460006011600019f1935050505092915050565b60008060016020601f8651018161364757fe5b040190506040518581526020810160005b83811015613679578060200287015181602002830152806001019050613658565b50846020840282015260208260208502604001846000600b600019f193505050509392505050565b60008060016020601f855101816136b457fe5b040190506040518481526020810160005b838110156136e65780602002860151816020028301528060010190506136c5565b5060208260208502604001846000600e600019f1935050505092915050565b600080600060016020601f8651018161371a57fe5b040190506040518581526020810160005b8381101561374c57806020028701518160200283015280600101905061372b565b506020826020850260200184600d600019fa9450815193505050509250929050565b613776613c6a565b600060208301905060405180604001604052808451815260200182815250915050919050565b60008082600001516137c0856000015186602001518660000151876020015161388d565b0190505b8360000151846020015101811161380a578180600101925050826000015161380285602001518303866000015103838660000151876020015161388d565b0190506137c4565b5092915050565b613819613c6a565b613824838383613968565b5092915050565b60608082600001516040519080825280601f01601f1916602001820160405280156138655781602001600182028038833980820191505090505b50905060006020820190506138838185602001518660000151613a06565b8192505050919050565b6000808490506000868511613958576020851161391257600060018660200360080260020a031960001b905060008186511690506000878a8a0103905060008386511690505b828114613904578186106138f1578a8a019650505050505050613960565b85806001019650508386511690506138d3565b859650505050505050613960565b60008585209050600091505b85880382116139565760008684209050808214156139425783945050505050613960565b60018401935050818060010192505061391e565b505b868601925050505b949350505050565b613970613c6a565b600061398e856000015186602001518660000151876020015161388d565b905084602001518360200181815250508460200151810383600001818152505084600001518560200151018114156139d05760008560000181815250506139fb565b8360000151836000015101856000018181510391508181525050836000015181018560200181815250505b829150509392505050565b5b60208110613a2a5781518352602083019250602082019150602081039050613a07565b60006001826020036101000a0390508019835116818551168181178652505050505050565b6040518060a00160405280606081526020016000151581526020016000815260200160006002811115613a7e57fe5b8152602001606081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613acc57805160ff1916838001178555613afa565b82800160010185558215613afa579182015b82811115613af9578251825591602001919060010190613ade565b5b509050613b079190613c84565b5090565b82805482825590600052602060002090601f01602090048101928215613ba05791602002820160005b83821115613b7157835183826101000a81548160ff0219169083151502179055509260200192600101602081600001049283019260010302613b34565b8015613b9e5782816101000a81549060ff0219169055600101602081600001049283019260010302613b71565b505b509050613bad9190613ca9565b5090565b50805460018160011615610100020316600290046000825580601f10613bd75750613bf6565b601f016020900490600052602060002090810190613bf59190613c84565b5b50565b50805460008255601f016020900490600052602060002090810190613c1e9190613c84565b50565b5080546000825560050290600052602060002090810190613c429190613cd9565b50565b6040518062100000016040528061800090602082028038833980820191505090505090565b604051806040016040528060008152602001600081525090565b613ca691905b80821115613ca2576000816000905550600101613c8a565b5090565b90565b613cd691905b80821115613cd257600081816101000a81549060ff021916905550600101613caf565b5090565b90565b613d4591905b80821115613d415760008082016000613cf89190613bb1565b6001820160006101000a81549060ff021916905560028201600090556003820160006101000a81549060ff0219169055600482016000613d389190613bf9565b50600501613cdf565b5090565b90565b600081359050613d578161510d565b92915050565b600081519050613d6c8161510d565b92915050565b600082601f830112613d8357600080fd5b8135613d96613d9182614efb565b614ece565b91508082526020830160208301858383011115613db257600080fd5b613dbd8382846150ad565b50505092915050565b600082601f830112613dd757600080fd5b8135613dea613de582614f27565b614ece565b91508082526020830160208301858383011115613e0657600080fd5b613e118382846150ad565b50505092915050565b600081359050613e2981615124565b92915050565b600060208284031215613e4157600080fd5b6000613e4f84828501613d5d565b91505092915050565b60008060408385031215613e6b57600080fd5b6000613e7985828601613d48565b9250506020613e8a85828601613e1a565b9150509250929050565b600060208284031215613ea657600080fd5b600082013567ffffffffffffffff811115613ec057600080fd5b613ecc84828501613dc6565b91505092915050565b60008060408385031215613ee857600080fd5b600083013567ffffffffffffffff811115613f0257600080fd5b613f0e85828601613dc6565b9250506020613f1f85828601613e1a565b9150509250929050565b600080600060608486031215613f3e57600080fd5b600084013567ffffffffffffffff811115613f5857600080fd5b613f6486828701613dc6565b9350506020613f7586828701613e1a565b925050604084013567ffffffffffffffff811115613f9257600080fd5b613f9e86828701613d72565b9150509250925092565b600080600060608486031215613fbd57600080fd5b600084013567ffffffffffffffff811115613fd757600080fd5b613fe386828701613dc6565b9350506020613ff486828701613e1a565b925050604061400586828701613e1a565b9150509250925092565b600061401b838361417d565b60208301905092915050565b6000614033838361418c565b60208301905092915050565b600061404b8383614a06565b905092915050565b600061405e82614f7d565b6140688185614fdc565b935061407383614f53565b8060005b838110156140a457815161408b888261400f565b975061409683614fb5565b925050600181019050614077565b5085935050505092915050565b6140ba81614f88565b6140c48184614fed565b92506140cf82614f63565b8060005b838110156141005781516140e78782614027565b96506140f283614fc2565b9250506001810190506140d3565b505050505050565b600061411382614f94565b61411d8185614ff8565b93508360208202850161412f85614f6d565b8060005b8581101561416b578484038952815161414c858261403f565b945061415783614fcf565b925060208a01995050600181019050614133565b50829750879550505050505092915050565b61418681615048565b82525050565b61419581615054565b82525050565b6141a48161509b565b82525050565b6141b38161509b565b82525050565b60006141c482614faa565b6141ce818561502b565b93506141de8185602086016150bc565b80840191505092915050565b60006141f582614f9f565b6141ff8185615009565b935061420f8185602086016150bc565b614218816150ef565b840191505092915050565b600061422e82614f9f565b614238818561502b565b93506142488185602086016150bc565b80840191505092915050565b600061426160188361501a565b91507f496e636f7272656374206368756e6b20706f736974696f6e00000000000000006000830152602082019050919050565b60006142a160158361501a565b91507f4469726563746f7279206e6f74206372656174656400000000000000000000006000830152602082019050919050565b60006142e160248361501a565b91507f4e6f7420656e6f756768206d656d6f727920696e207468652046696c6573746f60008301527f72616765000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614347601b8361501a565b91507f48617368206861736e2774206265656e2063616c63756c6174656400000000006000830152602082019050919050565b600061438760198361501a565b91507f4368756e6b20697320616c72656164792075706c6f61646564000000000000006000830152602082019050919050565b60006143c760168361501a565b91507f496e636f7272656374206368756e6b206c656e677468000000000000000000006000830152602082019050919050565b6000614407600f8361501a565b91507f46696c65206e6f742065786973747300000000000000000000000000000000006000830152602082019050919050565b6000614447600e8361501a565b91507f496e76616c69642073656e6465720000000000000000000000000000000000006000830152602082019050919050565b600061448760188361501a565b91507f4469726563746f7279206973206e6f742064656c6574656400000000000000006000830152602082019050919050565b60006144c760108361501a565b91507f46696c65206e6f742064656c65746564000000000000000000000000000000006000830152602082019050919050565b600061450760138361501a565b91507f496e76616c69642073746f7261676550617468000000000000000000000000006000830152602082019050919050565b6000614547600c8361501a565b91507f496e76616c6964207061746800000000000000000000000000000000000000006000830152602082019050919050565b600061458760018361502b565b91507f2e000000000000000000000000000000000000000000000000000000000000006000830152600182019050919050565b60006145c760168361501a565b91507f496e76616c6964206469726563746f7279206e616d65000000000000000000006000830152602082019050919050565b600061460760158361501a565b91507f4368756e6b207761736e27742075706c6f6164656400000000000000000000006000830152602082019050919050565b600061464760268361501a565b91507f436f756c64206e6f742072657365727665206c657373207468616e207573656460008301527f20737061636500000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006146ad60168361501a565b91507f4469726563746f7279206973206e6f7420656d707479000000000000000000006000830152602082019050919050565b60006146ed60238361501a565b91507f46696c65206861736e2774206265656e2075706c6f6164656420636f7272656360008301527f746c7900000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061475360118361501a565b91507f4368756e6b207761736e277420726561640000000000000000000000000000006000830152602082019050919050565b600061479360188361501a565b91507f46696c656e616d652073686f756c64206265203c2032353600000000000000006000830152602082019050919050565b60006147d3601f8361501a565b91507f46696c652073686f756c64206265206c657373207468616e20313030204d42006000830152602082019050919050565b600061481360028361502b565b91507f2e2e0000000000000000000000000000000000000000000000000000000000006000830152600282019050919050565b600061485360118361501a565b91507f4469726563746f72792069732066756c6c0000000000000000000000000000006000830152602082019050919050565b6000614893600e8361501a565b91507f46696c65206e6f7420666f756e640000000000000000000000000000000000006000830152602082019050919050565b60006148d360188361501a565b91507f46696c65206f72206469726563746f72792065786973747300000000000000006000830152602082019050919050565b600061491360198361501a565b91507f4e6f7420656e6f756768207265736572766564207370616365000000000000006000830152602082019050919050565b600061495360188361501a565b91507f45564d206572726f7220696e2067657446696c6553697a6500000000000000006000830152602082019050919050565b600061499360108361501a565b91507f46696c65206e6f742063726561746564000000000000000000000000000000006000830152602082019050919050565b60006149d360198361501a565b91507f46696c65206861736e2774206265656e2075706c6f61646564000000000000006000830152602082019050919050565b600060a0830160008301518482036000860152614a2382826141ea565b9150506020830151614a38602086018261417d565b506040830151614a4b6040860182614a83565b506060830151614a5e606086018261419b565b5060808301518482036080860152614a768282614053565b9150508091505092915050565b614a8c81615091565b82525050565b614a9b81615091565b82525050565b6000614aad8284614223565b915081905092915050565b6000614ac482846141b9565b915081905092915050565b6000614ada8261457a565b9150819050919050565b6000614aef82614806565b9150819050919050565b60006210000082019050614b1060008301846140b1565b92915050565b60006020820190508181036000830152614b308184614108565b905092915050565b6000602082019050614b4d60008301846141aa565b92915050565b60006020820190508181036000830152614b6c81614254565b9050919050565b60006020820190508181036000830152614b8c81614294565b9050919050565b60006020820190508181036000830152614bac816142d4565b9050919050565b60006020820190508181036000830152614bcc8161433a565b9050919050565b60006020820190508181036000830152614bec8161437a565b9050919050565b60006020820190508181036000830152614c0c816143ba565b9050919050565b60006020820190508181036000830152614c2c816143fa565b9050919050565b60006020820190508181036000830152614c4c8161443a565b9050919050565b60006020820190508181036000830152614c6c8161447a565b9050919050565b60006020820190508181036000830152614c8c816144ba565b9050919050565b60006020820190508181036000830152614cac816144fa565b9050919050565b60006020820190508181036000830152614ccc8161453a565b9050919050565b60006020820190508181036000830152614cec816145ba565b9050919050565b60006020820190508181036000830152614d0c816145fa565b9050919050565b60006020820190508181036000830152614d2c8161463a565b9050919050565b60006020820190508181036000830152614d4c816146a0565b9050919050565b60006020820190508181036000830152614d6c816146e0565b9050919050565b60006020820190508181036000830152614d8c81614746565b9050919050565b60006020820190508181036000830152614dac81614786565b9050919050565b60006020820190508181036000830152614dcc816147c6565b9050919050565b60006020820190508181036000830152614dec81614846565b9050919050565b60006020820190508181036000830152614e0c81614886565b9050919050565b60006020820190508181036000830152614e2c816148c6565b9050919050565b60006020820190508181036000830152614e4c81614906565b9050919050565b60006020820190508181036000830152614e6c81614946565b9050919050565b60006020820190508181036000830152614e8c81614986565b9050919050565b60006020820190508181036000830152614eac816149c6565b9050919050565b6000602082019050614ec86000830184614a92565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614ef157600080fd5b8060405250919050565b600067ffffffffffffffff821115614f1257600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614f3e57600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050919050565b6000819050602082019050919050565b600081519050919050565b60006180009050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061504182615071565b9050919050565b60008115159050919050565b6000819050919050565b600081905061506c82615100565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006150a68261505e565b9050919050565b82818337600083830152505050565b60005b838110156150da5780820151818401526020810190506150bf565b838111156150e9576000848401525b50505050565b6000601f19601f8301169050919050565b6003811061510a57fe5b50565b61511681615036565b811461512157600080fd5b50565b61512d81615091565b811461513857600080fd5b5056fea2646970667358221220a549ad9e778ae8bb3048c0a1805e77745871cc1560637ae1c3ebccb76638d9c464736f6c63430006020033", + "nonce": "0", + "storage": {} + }, + "0xa096b05a489831db893fc53aacc7ed20efb36382": { + "balance": "1000000000000000000000000000000" + }, + "0xa1cd651d99283be60e2a9d2e3bc8a90aedb8244f": { + "balance": "1000000000000000000000000000000" + }, + "0xa2969e82619021ea407338f8bdf7c6f2bd679673": { + "balance": "1000000000000000000000000000000" + }, + "0xa3597b1162b6559cb5e966904b63e762ece756a4": { + "balance": "1000000000000000000000000000000" + }, + "0xa68f946090c600eda6f139783077ee802afeb990": { + "balance": "1000000000000000000000000000000" + }, + "0xa6d50055592cecb795bc1ed3b9ea57ed426b0b7c": { + "balance": "1000000000000000000000000000000" + }, + "0xa7c0789bdeee38c6b59111a789dfb6b815489847": { + "balance": "1000000000000000000000000000000" + }, + "0xa8c813ee806b4c8537ff5f16084d44db18ea9ab1": { + "balance": "1000000000000000000000000000000" + }, + "0xaa6a87bbb74bc1f3cb40c1efb7fc171ee6407560": { + "balance": "1000000000000000000000000000000" + }, + "0xabf920b89f5a2487fdb70be17fd01a99a0602e62": { + "balance": "1000000000000000000000000000000" + }, + "0xac5df92da5171ba24a9618018b4f79494040334b": { + "balance": "1000000000000000000000000000000" + }, + "0xaf97a8318a1a51d5daeeb9650024b63ee44f45bd": { + "balance": "1000000000000000000000000000000" + }, + "0xb28c45b98ae43a5e9ee5509c97ea037b5de5d6d9": { + "balance": "1000000000000000000000000000000" + }, + "0xb64989ab32b089da3da103b93e6781d6d5dd10b4": { + "balance": "1000000000000000000000000000000" + }, + "0xb67e6f4a21f93c250fa6ff0cb142bd14dd4ca8eb": { + "balance": "1000000000000000000000000000000" + }, + "0xb70603c505f85130b5b2e73cd82d196dfd7d8b5e": { + "balance": "1000000000000000000000000000000" + }, + "0xb942414cae2a1ab1056657b905845c0ab6b6280a": { + "balance": "1000000000000000000000000000000" + }, + "0xbee0e5c1961d51be9bd670876caa9c90ba7d9016": { + "balance": "1000000000000000000000000000000" + }, + "0xbf2d8cebdeeb8ad8fed7b2a75f35922106f8d75c": { + "balance": "1000000000000000000000000000000" + }, + "0xbf5aa678b969c0871e2fbcf09c3dbb5d5865ac1e": { + "balance": "1000000000000000000000000000000" + }, + "0xc12bcedd9bcad9120150122cd50f39576ecccc08": { + "balance": "1000000000000000000000000000000" + }, + "0xc2d3852f3292acb81bd164dbae5f1e2a87535150": { + "balance": "1000000000000000000000000000000" + }, + "0xc3820490201e94d76b44655d2df713fec29d9795": { + "balance": "1000000000000000000000000000000" + }, + "0xc58744e2eceefd45cc5469f0e0a708ad24ddbbdb": { + "balance": "1000000000000000000000000000000" + }, + "0xc7865200e8e51ba1c8d695f327deed432930f2cc": { + "balance": "1000000000000000000000000000000" + }, + "0xc8e4d709eb3eb335dc69c9fbf2d24d447cb86105": { + "balance": "1000000000000000000000000000000" + }, + "0xc98af661e44c5bf31d2f8bdff4bbf2808ed4e991": { + "balance": "1000000000000000000000000000000" + }, + "0xca4409573a5129a72edf85d6c51e26760fc9c903": { + "balance": "100000000000000000000000" + }, + "0xcc33e23b04b74f7ba8fbe315083182224af973fa": { + "balance": "1000000000000000000000000000000" + }, + "0xce1c62d0a77600fb2f959b4da76fcb9b3b9430a3": { + "balance": "1000000000000000000000000000000" + }, + "0xd1b6c947fb14060b38945584714491592e84875d": { + "balance": "1000000000000000000000000000000" + }, + "0xd23cd6a9ddcc3470300003621bbac1e06a7919d5": { + "balance": "1000000000000000000000000000000" + }, + "0xd2c5b39B4e735C17612Bb5a08FD024ccc5dBCb23": { + "balance": "100000000000000000000000" + }, + "0xd2cd302eb060e375a65d65946692a3ac2d838d35": { + "balance": "1000000000000000000000000000000" + }, + "0xd2e75c41ced8699e3176f6e335355701a2568b7b": { + "balance": "1000000000000000000000000000000" + }, + "0xd3d38f4cb0aeb4c7c2527ddaeec2ab3b910c8528": { + "balance": "1000000000000000000000000000000" + }, + "0xd5b561a27cca5049650a14ab93dbf1a20c0cefc1": { + "balance": "1000000000000000000000000000000" + }, + "0xd90045420b8abc37b3f9304ed2b385fc1b7fa8c5": { + "balance": "1000000000000000000000000000000" + }, + "0xd951bf4cff429062702a7d8699a5f0bf14845d9b": { + "balance": "1000000000000000000000000000000" + }, + "0xdc6a269c58e58a93a22b5df8cdf1af630c47481f": { + "balance": "1000000000000000000000000000000" + }, + "0xdc6d02ef4003a4f2d0ccff65ae1a2d8157fbb23e": { + "balance": "1000000000000000000000000000000" + }, + "0xde14aca36acc62c305a7ee571da37840a408e600": { + "balance": "1000000000000000000000000000000" + }, + "0xdee32ae508cf783f53ab8bc39d878fe323cdfae3": { + "balance": "1000000000000000000000000000000" + }, + "0xe083a100d51fc4f38aae4a3a68404c36ad96c612": { + "balance": "1000000000000000000000000000000" + }, + "0xe1607990ce800407e3c206e58de4917977181d4d": { + "balance": "1000000000000000000000000000000" + }, + "0xe25e5b63dfd4cf59b81eddf64f1195858634b8a6": { + "balance": "1000000000000000000000000000000" + }, + "0xe372377decb3bdc0c7f5272d38ce0ba2a54934fe": { + "balance": "1000000000000000000000000000000" + }, + "0xe3cc6ec63b5652d1594bc63bb293f4e80f76dbdd": { + "balance": "1000000000000000000000000000000" + }, + "0xe3da7c014286258944ab20a31e4d861b4c9262f1": { + "balance": "1000000000000000000000000000000" + }, + "0xe8b57f330d56081c856e618210fbedb414925ff0": { + "balance": "1000000000000000000000000000000" + }, + "0xe91ac72a568e752eb7c9f5235100586ce97c8cc1": { + "balance": "1000000000000000000000000000000" + }, + "0xf184c8c243a178c1748a0af45caedeca476105b4": { + "balance": "1000000000000000000000000000000" + }, + "0xf1a5912ff318aebf312cdb54c75642a9e632703c": { + "balance": "1000000000000000000000000000000" + }, + "0xf2197b153b4c9086fc5410431fbf7960d284c65e": { + "balance": "1000000000000000000000000000000" + }, + "0xf36620e71327f4a55d550d46e030ccf0c728f154": { + "balance": "1000000000000000000000000000000" + }, + "0xf9817fB82fc767aA9A4A97a1901676244b88ce0E": { + "balance": "100000000000000000000000" + }, + "0xfa723938fa8da1a8a2114ad409a11581761ee40d": { + "balance": "1000000000000000000000000000000" + }, + "0xfa7a8c69810eaf16a395d2a93b3ab51efeed2a1c": { + "balance": "1000000000000000000000000000000" + }, + "0xfaa1038074941571524934ba52d312e88b3577f5": { + "balance": "1000000000000000000000000000000" + }, + "0xfe14077c26a507496b7208384d459e21c49c4212": { + "balance": "1000000000000000000000000000000" + }, + "0xfe275c9b5ac792327da509b27eb9614196dfb07d": { + "balance": "1000000000000000000000000000000" + }, + "0xfe2c5aa110fff89361806ea7ee080bfffba0d3dd": { + "balance": "1000000000000000000000000000000" + }, + "0xfe3d4f1fc038f4f756ba44995129cd45c9e0e861": { + "balance": "1000000000000000000000000000000" + }, + "0xfee314cdc84ecfaa675e41b3559c0101e1eba6b8": { + "balance": "1000000000000000000000000000000" + } + }, + "genesis": { + "author": "0x0000000000000000000000000000000000000001", + "difficulty": "0x0", + "extraData": "0x11bbe8db4e347b4e8c937c1c8370e4b5ed33adb3db69cbdb7a38e1e50b1b82fa", + "gasLimit": "0xFFFFFFFFF", + "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000abc", + "nonce": "0x0000000000000042", + "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "timestamp": "0x00" + }, + "params": { + "EIP150ForkBlock": "0x00", + "EIP158ForkBlock": "0x00", + "accountStartNonce": "0x00", + "blockReward": "0x4563918244F40000", + "byzantiumForkBlock": "0x0", + "chainID": "0x12345", + "constantinopleForkBlock": "0x0", + "daoHardforkBlock": "0x0", + "difficultyBoundDivisor": "0x0800", + "durationLimit": "0x0d", + "externalGasDifficulty": "0x01", + "gasLimitBoundDivisor": "0x0400", + "homesteadForkBlock": "0x0", + "maxGasLimit": "0xFFFFFFFFF", + "maximumExtraDataSize": "0x20", + "minGasLimit": "0xFFFFFFFFF", + "minimumDifficulty": "0x0", + "networkID": "12313219", + "tieBreakingGas": false + }, + "sealEngine": "Ethash", + "skaleConfig": { + "nodeInfo": { + "basePort": 2331, + "bindIP": "0.0.0.0", + "collectionDuration": 10, + "collectionQueueSize": 2, + "db-path": "/tmp/test_eth_12_of_16", + "ecdsaKeyName": "", + "httpRpcPort": 2334, + "httpsRpcPort": 1239, + "logLevel": "info", + "logLevelProposal": "info", + "maxCacheSize": 2000, + "maxOpenLeveldbFiles": 25, + "minCacheSize": 1000, + "nodeID": 1612, + "nodeName": "Node1", + "rotateAfterBlock": 0, + "testSignatures": true, + "transactionQueueSize": 10000, + "wsRpcPort": 2333, + "wssRpcPort": 2338 + }, + "sChain": { + "EIP1559TransactionsPatchTimestamp": 1, + "contractStorageLimit": 10000000000, + "contractStoragePatchTimestamp": 1, + "contractStorageZeroValuePatchTimestamp": 1, + "correctForkInPowPatchTimestamp": 1, + "emptyBlockIntervalMs": 10000, + "fastConsensusPatchTimestamp": 1, + "flexibleDeploymentPatchTimestamp": 1, + "levelDBReopenIntervalMs": 1, + "multiTransactionMode": false, + "nodes": [ + { + "basePort": 1231, + "ip": "127.0.0.1", + "nodeID": 1601, + "publicKey": "", + "schainIndex": 1 + }, + { + "basePort": 1331, + "ip": "127.0.0.1", + "nodeID": 1602, + "publicKey": "", + "schainIndex": 2 + }, + { + "basePort": 1431, + "ip": "127.0.0.1", + "nodeID": 1603, + "publicKey": "", + "schainIndex": 3 + }, + { + "basePort": 1531, + "ip": "127.0.0.1", + "nodeID": 1604, + "publicKey": "", + "schainIndex": 4 + }, + { + "basePort": 1631, + "ip": "127.0.0.1", + "nodeID": 1605, + "publicKey": "", + "schainIndex": 5 + }, + { + "basePort": 1731, + "ip": "127.0.0.1", + "nodeID": 1606, + "publicKey": "", + "schainIndex": 6 + }, + { + "basePort": 1831, + "ip": "127.0.0.1", + "nodeID": 1607, + "publicKey": "", + "schainIndex": 7 + }, + { + "basePort": 1931, + "ip": "127.0.0.1", + "nodeID": 1608, + "publicKey": "", + "schainIndex": 8 + }, + { + "basePort": 2031, + "ip": "127.0.0.1", + "nodeID": 1609, + "publicKey": "", + "schainIndex": 9 + }, + { + "basePort": 2131, + "ip": "127.0.0.1", + "nodeID": 1610, + "publicKey": "", + "schainIndex": 10 + }, + { + "basePort": 2231, + "ip": "127.0.0.1", + "nodeID": 1611, + "publicKey": "", + "schainIndex": 11 + }, + { + "basePort": 2331, + "ip": "127.0.0.1", + "nodeID": 1612, + "publicKey": "", + "schainIndex": 12 + }, + { + "basePort": 2431, + "ip": "127.0.0.1", + "nodeID": 1613, + "publicKey": "", + "schainIndex": 13 + }, + { + "basePort": 2531, + "ip": "127.0.0.1", + "nodeID": 1614, + "publicKey": "", + "schainIndex": 14 + }, + { + "basePort": 2631, + "ip": "127.0.0.1", + "nodeID": 1615, + "publicKey": "", + "schainIndex": 15 + }, + { + "basePort": 2731, + "ip": "127.0.0.1", + "nodeID": 1616, + "publicKey": "", + "schainIndex": 16 + } + ], + "powCheckPatchTimestamp": 1, + "precompiledConfigPatchTimestamp": 1, + "pushZeroPatchTimestamp": 1, + "revertableFSPatchTimestamp": 1, + "schainID": 5, + "schainName": "TestChain", + "schainOwner": "0x907cd0881E50d359bb9Fd120B1A5A143b1C97De6", + "skipInvalidTransactionsPatchTimestamp": 1, + "storageDestructionPatchTimestamp": 1, + "verifyBlsSyncPatchTimestamp": 1, + "verifyDaSigsPatchTimestamp": 1 + } + }, + "unddos": { + "origins": [ + { + "ban_lengthy": 0, + "ban_peak": 0, + "max_calls_per_minute": 1000000000, + "max_calls_per_second": 1000000000, + "max_ws_conn": 65535, + "origin": [ + "*" + ] + } + ] + } +} \ No newline at end of file diff --git a/test/historicstate/configs/test_13_of_16.json b/test/historicstate/configs/test_13_of_16.json new file mode 100644 index 000000000..5ac767b63 --- /dev/null +++ b/test/historicstate/configs/test_13_of_16.json @@ -0,0 +1,910 @@ +{ + "accounts": { + "0000000000000000000000000000000000000001": { + "precompiled": { + "linear": { + "base": 3000, + "word": 0 + }, + "name": "ecrecover" + } + }, + "0000000000000000000000000000000000000002": { + "precompiled": { + "linear": { + "base": 60, + "word": 12 + }, + "name": "sha256" + } + }, + "0000000000000000000000000000000000000003": { + "precompiled": { + "linear": { + "base": 600, + "word": 120 + }, + "name": "ripemd160" + } + }, + "0000000000000000000000000000000000000004": { + "precompiled": { + "linear": { + "base": 15, + "word": 3 + }, + "name": "identity" + } + }, + "0000000000000000000000000000000000000005": { + "precompiled": { + "name": "modexp", + "startingBlock": "0x2dc6c0" + } + }, + "0000000000000000000000000000000000000006": { + "precompiled": { + "linear": { + "base": 500, + "word": 0 + }, + "name": "alt_bn128_G1_add", + "startingBlock": "0x2dc6c0" + } + }, + "0000000000000000000000000000000000000007": { + "precompiled": { + "linear": { + "base": 40000, + "word": 0 + }, + "name": "alt_bn128_G1_mul", + "startingBlock": "0x2dc6c0" + } + }, + "0000000000000000000000000000000000000008": { + "precompiled": { + "name": "alt_bn128_pairing_product", + "startingBlock": "0x2dc6c0" + } + }, + "000000000000000000000000000000000000000A": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "readChunk", + "startingBlock": "0x0" + } + }, + "000000000000000000000000000000000000000B": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "createFile", + "restrictAccess": [ + "69362535ec535F0643cBf62D16aDeDCAf32Ee6F7" + ], + "startingBlock": "0x0" + } + }, + "000000000000000000000000000000000000000C": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "uploadChunk", + "startingBlock": "0x0" + } + }, + "000000000000000000000000000000000000000D": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "getFileSize", + "startingBlock": "0x0" + } + }, + "000000000000000000000000000000000000000E": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "deleteFile", + "startingBlock": "0x0" + } + }, + "000000000000000000000000000000000000000F": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "createDirectory", + "startingBlock": "0x0" + } + }, + "0000000000000000000000000000000000000010": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "deleteDirectory", + "startingBlock": "0x0" + } + }, + "0x006d8e49ce0b9eb5646e34a4d91934801b9044fd": { + "balance": "1000000000000000000000000000000" + }, + "0x0150b461b06922a5030784ba888962c28bb1f188": { + "balance": "1000000000000000000000000000000" + }, + "0x03309956988ae70152ae4469daf99b0cac2306c5": { + "balance": "1000000000000000000000000000000" + }, + "0x06104a85a380895b6dd4030113806df2b044905e": { + "balance": "1000000000000000000000000000000" + }, + "0x079cf317ef40b16141784b6fabff812d64f7c0fd": { + "balance": "1000000000000000000000000000000" + }, + "0x0966454f51166c68b73b2865473c8fb2fcdefdd5": { + "balance": "1000000000000000000000000000000" + }, + "0x099452fedc71897880f584b1bc1706efc4e76e36": { + "balance": "1000000000000000000000000000000" + }, + "0x0aa6a44690ef52354e976990292cf9c5cd36ad59": { + "balance": "1000000000000000000000000000000" + }, + "0x0fbbe17a0e5a61ee3e8661f442d7f6b177c49820": { + "balance": "1000000000000000000000000000000" + }, + "0x1239fe658b410dbbac5bbd572035f5041542f9e5": { + "balance": "1000000000000000000000000000000" + }, + "0x12d5d7340a93be7be28ea7a3ae198242f8e1282c": { + "balance": "1000000000000000000000000000000" + }, + "0x137048b9fa4f1234d6519271b2c5ec64f480db0f": { + "balance": "1000000000000000000000000000000" + }, + "0x13867af77a63048e17380e39248ada90521e97e4": { + "balance": "1000000000000000000000000000000" + }, + "0x138ea4bdf0382c2deffd5b0bff0afe59f471467f": { + "balance": "1000000000000000000000000000000" + }, + "0x13d19c55ee0a212249d26b9d741ff6d7f416db01": { + "balance": "1000000000000000000000000000000" + }, + "0x157d38b52196b248e9fe6a2172e32ce2b8c078e6": { + "balance": "1000000000000000000000000000000" + }, + "0x16e8c390f8e576161cfe966f2c3e5dd303eb9039": { + "balance": "1000000000000000000000000000000" + }, + "0x194cb9991d3d94c43e400becf21dfea45e7b3b4c": { + "balance": "1000000000000000000000000000000" + }, + "0x1C9abe4ff0CcECa40fc404c74AB7d4923fEF8901": { + "balance": "100000000000000000000000" + }, + "0x1a66fc89809112c20aa76a993db712fa9e003e4e": { + "balance": "1000000000000000000000000000000" + }, + "0x1f1d6041e12a18cf1202019f146f2fc150915e8d": { + "balance": "1000000000000000000000000000000" + }, + "0x1feaf1671c1f0faf0d44c152f72dc755db932569": { + "balance": "1000000000000000000000000000000" + }, + "0x236bf02dfafaf03851a4e6f5d69052f4884cec32": { + "balance": "1000000000000000000000000000000" + }, + "0x26d88f6a8b659be4165ee53774a057e41b5201c9": { + "balance": "1000000000000000000000000000000" + }, + "0x28353685b0b986a724b92113debb3d8cd9a6b263": { + "balance": "1000000000000000000000000000000" + }, + "0x29d83322219fdfb821459d5fdf796360faf3166a": { + "balance": "1000000000000000000000000000000" + }, + "0x2bee474be207bdbeac83d6672da5ed2fd417eac9": { + "balance": "1000000000000000000000000000000" + }, + "0x2d93455b07bccf38e8d019f7f43a2c2d70b46b4e": { + "balance": "1000000000000000000000000000000" + }, + "0x2f971bd38806c3ca45ae0a125d1267118bf5619c": { + "balance": "1000000000000000000000000000000" + }, + "0x30aaab366dfac8331f3e827495c789cde9b437c0": { + "balance": "1000000000000000000000000000000" + }, + "0x32ea0400dc2d20664cc4744b2fab04ecb709445c": { + "balance": "1000000000000000000000000000000" + }, + "0x3760dc9594ccac0f33ade5cc5371402131696341": { + "balance": "1000000000000000000000000000000" + }, + "0x38855e430611bc179cd777a8704679ffc43921de": { + "balance": "1000000000000000000000000000000" + }, + "0x3a921471a2397644c37c88ef9572c421ab37145d": { + "balance": "1000000000000000000000000000000" + }, + "0x3bcca8a8471d55a1a668bc163c0336e4a57e5c99": { + "balance": "1000000000000000000000000000000" + }, + "0x3d46ee560227c1d73cd6042b47fc8fddd8a06ecb": { + "balance": "1000000000000000000000000000000" + }, + "0x3f5bdf5d4c274c82b8d17aa2810b00d2cf050f24": { + "balance": "1000000000000000000000000000000" + }, + "0x3ffe1c9183e0f97f52a816405a7d2350624ec88b": { + "balance": "1000000000000000000000000000000" + }, + "0x426ec5f07847674aada3856609d8baaa16805d88": { + "balance": "1000000000000000000000000000000" + }, + "0x482d7f53cba6ae73a354533673c48e2dfd560949": { + "balance": "1000000000000000000000000000000" + }, + "0x48acbd6a2724eadcc2a11144ab84b6a617d1a241": { + "balance": "1000000000000000000000000000000" + }, + "0x49ef89840e400026eb5c8d79bd1b0adc152fe86d": { + "balance": "1000000000000000000000000000000" + }, + "0x4bf989fa6572af36b190032505506f1db888357f": { + "balance": "1000000000000000000000000000000" + }, + "0x4cf9b195f7cb5f86694d9b399fe21a5f34616fd3": { + "balance": "1000000000000000000000000000000" + }, + "0x4e9b85904bca60aeb5b916ca86ac622096908427": { + "balance": "1000000000000000000000000000000" + }, + "0x50120c17d7b59200e9b76e89e4e3de2f0cd00090": { + "balance": "1000000000000000000000000000000" + }, + "0x54db355342c35085a1a53184162b2fddd0a43b0f": { + "balance": "1000000000000000000000000000000" + }, + "0x54e228d8fea148cfe2b109b3b152ff21321d09a2": { + "balance": "1000000000000000000000000000000" + }, + "0x5667601b7dcde6f24d06bccc4f291cb06976f4ee": { + "balance": "1000000000000000000000000000000" + }, + "0x57829f2ecca390cd9d1c41f92328bad4d1073bbb": { + "balance": "1000000000000000000000000000000" + }, + "0x5EF25557E2ed6AFfF321B266C93e95A0B4B05AbC": { + "balance": "1000000000000000000000000" + }, + "0x5a3adad4382b3eb1e0c65f2de2845901081039b5": { + "balance": "1000000000000000000000000000000" + }, + "0x5cdb7392efdce502ccc6fba5c3c1dd1653967b4d": { + "balance": "1000000000000000000000000000000" + }, + "0x5d012c13b2854bda8b7b6580e97e52751884f827": { + "balance": "1000000000000000000000000000000" + }, + "0x5d9326c6504833d84f8a0d65ded59b1a6e768ca2": { + "balance": "1000000000000000000000000000000" + }, + "0x60268f799d8f1808e4a32c2eb898e73a8881f6f0": { + "balance": "1000000000000000000000000000000" + }, + "0x605ba4a05d779f9869bd9a10234c22f516766cfe": { + "balance": "1000000000000000000000000000000" + }, + "0x6093f0f2a7b5148b71603ac439adbc4c0e5aa5da": { + "balance": "1000000000000000000000000000000" + }, + "0x6196d135CdDb9d73A0756C1E44b5b02B11acf594": { + "balance": "2000000000000000000000", + "code": "", + "nonce": "5076", + "storage": {} + }, + "0x62712ceccb50f62ca4c5402fff6da9c819c866cf": { + "balance": "1000000000000000000000000000000" + }, + "0x62971de462ea1ec0d3b43a6a85b6fb975e6c6f64": { + "balance": "1000000000000000000000000000000" + }, + "0x62cf32dfb9eb6358dc5deb006aef1d75fb153e5f": { + "balance": "1000000000000000000000000000000" + }, + "0x62d8b22c1d71577829b2fee20a5c3fff43aed0ec": { + "balance": "100000000000000000000000" + }, + "0x6314956b78bb2eaed1c49b3ae71d4d0ec501cfab": { + "balance": "1000000000000000000000000000000" + }, + "0x661bda4daeba3ce9ac2aa30b80d463580f90d31a": { + "balance": "1000000000000000000000000000000" + }, + "0x66c5a87f4a49DD75e970055A265E8dd5C3F8f852": { + "balance": "1000000000000000000000" + }, + "0x66cd465ddcd85504c0d2cfb1728acee994d55a3f": { + "balance": "1000000000000000000000000000000" + }, + "0x68bca79ae7aae796027ff843d2303444da5cf5d8": { + "balance": "1000000000000000000000000000000" + }, + "0x6923877b65e24966efa9efd1207822fa2eaf601a": { + "balance": "1000000000000000000000000000000" + }, + "0x69362535ec535F0643cBf62D16aDeDCAf32Ee6F7": { + "balance": "0", + "code": "0x608060405234801561001057600080fd5b50600436106100b45760003560e01c806379210e8e1161007157806379210e8e1461017757806381a8235a146101a757806385aeeb17146101c35780639a9a5593146101f3578063a99100541461020f578063b57321221461022b576100b4565b806307c6e7d3146100b9578063122f4fba146100d55780631c6ec7a9146101055780631cfe4e3b14610121578063373dedb41461013d57806361e46db51461015b575b600080fd5b6100d360048036036100ce9190810190613cff565b61025b565b005b6100ef60048036036100ea9190810190613cff565b610804565b6040516100fc9190614963565b60405180910390f35b61011f600480360361011a9190810190613cff565b610b43565b005b61013b60048036036101369190810190613cc3565b610f72565b005b610145611190565b6040516101529190614cbe565b60405180910390f35b61017560048036036101709190810190613d94565b611199565b005b610191600480360361018c9190810190613e13565b6113f9565b60405161019e9190614924565b60405180910390f35b6101c160048036036101bc9190810190613cff565b6116f9565b005b6101dd60048036036101d89190810190613cff565b61189e565b6040516101ea9190614941565b60405180910390f35b61020d60048036036102089190810190613d40565b611b9d565b005b61022960048036036102249190810190613cff565b61202c565b005b61024560048036036102409190810190613cff565b612682565b6040516102529190614cbe565b60405180910390f35b6000339050606061026b83612902565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b825181101561037c576000826001018460018403815181106102d557fe5b60200260200101516040516102ea91906148cc565b90815260200160405180910390205411610339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161033090614ade565b60405180910390fd5b8160020183600183038151811061034c57fe5b602002602001015160405161036191906148cc565b908152602001604051809103902091508060010190506102b7565b506060600183511161038e57846103a7565b8260018451038151811061039e57fe5b60200260200101515b9050600082600101826040516103bd91906148e3565b9081526020016040518091039020541161040c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161040390614ade565b60405180910390fd5b6000826002018260405161042091906148e3565b90815260200160405180910390206000018054905014610475576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161046c90614b5e565b60405180910390fd5b60006104818587612b02565b9050806104c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ba90614a7e565b60405180910390fd5b6104cb613888565b836000016001856000018054905003815481106104e457fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156105965780601f1061056b57610100808354040283529160200191610596565b820191906000526020600020905b81548152906001019060200180831161057957829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff1660028111156105e257fe5b60028111156105ed57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561066557602002820191906000526020600020906000905b82829054906101000a900460ff1615158152602001906001019060208260000104928301926001038202915080841161062f5790505b505050505081525050905080846000016001866001018660405161068991906148e3565b90815260200160405180910390205403815481106106a357fe5b906000526020600020906005020160008201518160000190805190602001906106cd9291906138c4565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561071c57fe5b0217905550608082015181600401908051906020019061073d929190613944565b50905050836001018360405161075391906148e3565b90815260200160405180910390205484600101826000015160405161077891906148cc565b9081526020016040518091039020819055506000846001018460405161079e91906148e3565b908152602001604051809103902081905550836000018054809190600190036107c791906139ea565b5083600201836040516107da91906148e3565b9081526020016040518091039020600080820160006107f99190613a1c565b505050505050505050565b600080606061081284612b66565b91509150606061082182612902565b90506000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b82518110156109065760008260010184600184038151811061088b57fe5b60200260200101516040516108a091906148cc565b90815260200160405180910390205414156108c357600095505050505050610b3e565b816002018360018303815181106108d657fe5b60200260200101516040516108eb91906148cc565b9081526020016040518091039020915080600101905061086d565b50606060018351116109185783610931565b8260018451038151811061092857fe5b60200260200101515b90506000826001018260405161094791906148e3565b908152602001604051809103902054141561096a57600095505050505050610b3e565b610972613888565b826000016001846001018460405161098a91906148e3565b90815260200160405180910390205403815481106109a457fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610a565780601f10610a2b57610100808354040283529160200191610a56565b820191906000526020600020905b815481529060010190602001808311610a3957829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115610aa257fe5b6002811115610aad57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015610b2557602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411610aef5790505b5050505050815250509050806060015196505050505050505b919050565b600160009054906101000a900460ff16610b85576120006002819055506210000060038190555060018060006101000a81548160ff0219169083151502179055505b6000815111610bc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc090614ade565b60405180910390fd5b60003390506060610bd983612902565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015610cea57600082600101846001840381518110610c4357fe5b6020026020010151604051610c5891906148cc565b90815260200160405180910390205411610ca7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9e90614ade565b60405180910390fd5b81600201836001830381518110610cba57fe5b6020026020010151604051610ccf91906148cc565b90815260200160405180910390209150806001019050610c25565b50600254816000018054905010610d36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2d90614bfe565b60405180910390fd5b60606001835111610d475784610d60565b82600184510381518110610d5757fe5b60200260200101515b905060008260010182604051610d7691906148e3565b90815260200160405180910390205414610dc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbc90614c3e565b60405180910390fd5b610dce81612ee8565b610e0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0490614afe565b60405180910390fd5b6000610e198587612fc9565b905080610e5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e529061499e565b60405180910390fd5b610e63613888565b82816000018190525060008160200190151590811515815250508360000181908060018154018082558091505090600182039060005260206000209060050201600090919290919091506000820151816000019080519060200190610ec99291906138c4565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff02191690836002811115610f1857fe5b02179055506080820151816004019080519060200190610f39929190613944565b5050505083600001805490508460010184604051610f5791906148e3565b90815260200160405180910390208190555050505050505050565b610f7a61302d565b73ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161480610fdf57503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614155b61101e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101590614a5e565b60405180910390fd5b80600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411156110a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109790614b3e565b60405180910390fd5b600054600754820111156110e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e0906149be565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460076000828254039250508190555080600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550806007600082825401925050819055505050565b60008054905090565b600033905060006111aa82866130c6565b9050600160028111156111b957fe5b8160030160009054906101000a900460ff1660028111156111d657fe5b14611216576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120d90614c1e565b60405180910390fd5b6000600354858161122357fe5b061480156112345750806002015484105b611273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126a9061497e565b60405180910390fd5b600354848260020154031080156112905750838160020154038351145b8061129d57506003548351145b6112dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d390614a1e565b60405180910390fd5b600015158160040160035486816112ef57fe5b04815481106112fa57fe5b90600052602060002090602091828204019190069054906101000a900460ff1615151461135c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611353906149fe565b60405180910390fd5b600061136a838787876132c5565b9050806113ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a390614b1e565b60405180910390fd5b60018260040160035487816113bd57fe5b04815481106113c857fe5b90600052602060002090602091828204019190066101000a81548160ff021916908315150217905550505050505050565b611401613a40565b6000606061140e86612b66565b9150915061141a613888565b61142483836130c6565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156114c85780601f1061149d576101008083540402835291602001916114c8565b820191906000526020600020905b8154815290600101906020018083116114ab57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561151457fe5b600281111561151f57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561159757602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116115615790505b50505050508152505090506002808111156115ae57fe5b816060015160028111156115be57fe5b146115fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f590614c9e565b60405180910390fd5b60035485111580156116105750600085115b61164f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164690614a1e565b60405180910390fd5b80604001518587011115611698576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168f9061497e565b60405180910390fd5b60006116a684848989613376565b8096508192505050806116ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e590614b9e565b60405180910390fd5b505050509392505050565b6000339050600061170a82846130c6565b90506001600281111561171957fe5b8160030160009054906101000a900460ff16600281111561173657fe5b14611776576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176d90614c1e565b60405180910390fd5b60006001905060008260040180549050905060008090505b818110156117e157600015158460040182815481106117a957fe5b90600052602060002090602091828204019190069054906101000a900460ff16151514156117d657600092505b80600101905061178e565b5081611822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181990614b7e565b60405180910390fd5b60028360030160006101000a81548160ff0219169083600281111561184357fe5b021790555060006118548587613409565b905080611896576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188d906149de565b60405180910390fd5b505050505050565b6060600060606118ad84612b66565b9150915060606118bc82612902565b90506000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008090505b82518110156119c65760008260010184838151811061192257fe5b602002602001015160405161193791906148cc565b90815260200160405180910390205411611986576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197d90614ade565b60405180910390fd5b8160020183828151811061199657fe5b60200260200101516040516119ab91906148cc565b90815260200160405180910390209150806001019050611907565b5080600001805480602002602001604051908101604052809291908181526020016000905b82821015611b8e57838290600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611aa75780601f10611a7c57610100808354040283529160200191611aa7565b820191906000526020600020905b815481529060010190602001808311611a8a57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115611af357fe5b6002811115611afe57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015611b7657602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411611b405790505b505050505081525050815260200190600101906119eb565b50505050945050505050919050565b600160009054906101000a900460ff16611bdf576120006002819055506210000060038190555060018060006101000a81548160ff0219169083151502179055505b60003390506305f5e100821115611c2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2290614bde565b60405180910390fd5b6060611c3684612902565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015611d4757600082600101846001840381518110611ca057fe5b6020026020010151604051611cb591906148cc565b90815260200160405180910390205411611d04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cfb90614ade565b60405180910390fd5b81600201836001830381518110611d1757fe5b6020026020010151604051611d2c91906148cc565b90815260200160405180910390209150806001019050611c82565b5060606001835111611d595785611d72565b82600184510381518110611d6957fe5b60200260200101515b905060008260010182604051611d8891906148e3565b90815260200160405180910390205414611dd7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dce90614c3e565b60405180910390fd5b611de081612ee8565b611e1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1690614bbe565b60405180910390fd5b6000611e2c85888861346d565b905080611e6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6590614c7e565b60405180910390fd5b6060600354600160035489010381611e8257fe5b04604051908082528060200260200182016040528015611eb15781602001602082028038833980820191505090505b509050836000016040518060a0016040528085815260200160011515815260200189815260200160016002811115611ee557fe5b815260200183815250908060018154018082558091505090600182039060005260206000209060050201600090919290919091506000820151816000019080519060200190611f359291906138c4565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff02191690836002811115611f8457fe5b02179055506080820151816004019080519060200190611fa5929190613944565b5050505083600001805490508460010184604051611fc391906148e3565b90815260200160405180910390208190555086600560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505050505050505050565b6000339050612039613888565b61204382846130c6565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156120e75780601f106120bc576101008083540402835291602001916120e7565b820191906000526020600020905b8154815290600101906020018083116120ca57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561213357fe5b600281111561213e57fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156121b657602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116121805790505b5050505050815250509050600060028111156121ce57fe5b816060015160028111156121de57fe5b141561221f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221690614a3e565b60405180910390fd5b600061222b83856134da565b90508061226d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226490614a9e565b60405180910390fd5b606061227885612902565b90506000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b825181101561231057816002018360018303815181106122e057fe5b60200260200101516040516122f591906148cc565b908152602001604051809103902091508060010190506122c4565b506000600182600101866000015160405161232b91906148cc565b908152602001604051809103902054039050612345613888565b8260000160018460000180549050038154811061235e57fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156124105780601f106123e557610100808354040283529160200191612410565b820191906000526020600020905b8154815290600101906020018083116123f357829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561245c57fe5b600281111561246757fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156124df57602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116124a95790505b5050505050815250509050808360000183815481106124fa57fe5b906000526020600020906005020160008201518160000190805190602001906125249291906138c4565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561257357fe5b02179055506080820151816004019080519060200190612594929190613944565b50905050826000018054809190600190036125af91906139ea565b508260010186600001516040516125c691906148cc565b9081526020016040518091039020548360010182600001516040516125eb91906148cc565b908152602001604051809103902081905550600083600101876000015160405161261591906148cc565b9081526020016040518091039020819055508560400151600560008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505050505050505050565b600080606061269084612b66565b9150915061269c613888565b6126a683836130c6565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561274a5780601f1061271f5761010080835404028352916020019161274a565b820191906000526020600020905b81548152906001019060200180831161272d57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561279657fe5b60028111156127a157fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561281957602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116127e35790505b50505050508152505090506001600281111561283157fe5b8160600151600281111561284157fe5b1480612866575060028081111561285457fe5b8160600151600281111561286457fe5b145b6128a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161289c90614c1e565b60405180910390fd5b60006128b1848461353e565b8096508192505050806128f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128f090614c5e565b60405180910390fd5b50505050919050565b606061290c613a65565b612915836135a7565b905061291f613a65565b61295d6040518060400160405280600181526020017f2f000000000000000000000000000000000000000000000000000000000000008152506135a7565b90506060600161297683856135d590919063ffffffff16565b016040519080825280602002602001820160405280156129aa57816020015b60608152602001906001900390816129955790505b50905060008090505b81518110156129fb576129d76129d2848661364a90919063ffffffff16565b613664565b8282815181106129e357fe5b602002602001018190525080806001019150506129b3565b50600081600183510381518110612a0e57fe5b6020026020010151511415612a795780600182510381518110612a2d57fe5b6020026020010160608152506001815103604051908082528060200260200182016040528015612a7157816020015b6060815260200190600190039081612a5c5790505b509350612ab2565b8051604051908082528060200260200182016040528015612aae57816020015b6060815260200190600190039081612a995790505b5093505b60008090505b8451811015612af957818181518110612acd57fe5b6020026020010151858281518110612ae157fe5b60200260200101819052508080600101915050612ab8565b50505050919050565b60008060016020601f85510181612b1557fe5b040190506040518481526020810160005b83811015612b47578060200286015181602002830152806001019050612b26565b50602082602085026040018460006010600019f1935050505092915050565b6000606060006028905080845111612bb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612baa90614abe565b60405180910390fd5b6060816040519080825280601f01601f191660200182016040528015612be85781602001600182028038833980820191505090505b50905060008090505b82811015612c5857858181518110612c0557fe5b602001015160f81c60f81b828281518110612c1c57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050612bf1565b50600080905060008090505b83811015612d87576000838281518110612c7a57fe5b602001015160f81c60f81b60f81c60ff16905060308110158015612c9f575060398111155b80612cb8575060418110158015612cb75750605a8111155b5b80612cd1575060618110158015612cd0575060668111155b5b612d10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d0790614abe565b60405180910390fd5b60308110158015612d22575060398111155b15612d335760308103601084020192505b60418110158015612d455750605a8111155b15612d565760378103601084020192505b60618110158015612d68575060668111155b15612d795760578103601084020192505b508080600101915050612c64565b508094507f2f00000000000000000000000000000000000000000000000000000000000000868481518110612db857fe5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612e25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e1c90614abe565b60405180910390fd5b6000600184885103039050806040519080825280601f01601f191660200182016040528015612e635781602001600182028038833980820191505090505b50945060008090505b81811015612ede5760008860018784010181518110612e8757fe5b602001015160f81c60f81b905080878381518110612ea157fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350508080600101915050612e6c565b5050505050915091565b6000604051602001612ef99061490f565b6040516020818303038152906040528051906020012082604051602001612f2091906148e3565b604051602081830303815290604052805190602001201480612f8b5750604051602001612f4c906148fa565b6040516020818303038152906040528051906020012082604051602001612f7391906148e3565b60405160208183030381529060405280519060200120145b80612f97575060008251145b15612fa55760009050612fc4565b60008251905060ff811115612fbe576000915050612fc4565b60019150505b919050565b60008060016020601f85510181612fdc57fe5b040190506040518481526020810160005b8381101561300e578060200286015181602002830152806001019050612fed565b5060208260208502604001846000600f600019f1935050505092915050565b600073d2001000000000000000000000000000000000d273ffffffffffffffffffffffffffffffffffffffff166383e781fe6040518163ffffffff1660e01b815260040160206040518083038186803b15801561308957600080fd5b505afa15801561309d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506130c19190810190613c9a565b905090565b600060606130d383612902565b90506000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b82518110156131e45760008260010184600184038151811061313d57fe5b602002602001015160405161315291906148cc565b908152602001604051809103902054116131a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161319890614ade565b60405180910390fd5b816002018360018303815181106131b457fe5b60200260200101516040516131c991906148cc565b9081526020016040518091039020915080600101905061311f565b50606060018351116131f6578461320f565b8260018451038151811061320657fe5b60200260200101515b90506000826001018260405161322591906148e3565b90815260200160405180910390205411613274576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161326b90614ade565b60405180910390fd5b6000826000016001846001018460405161328e91906148e3565b90815260200160405180910390205403815481106132a857fe5b906000526020600020906005020190508094505050505092915050565b60008060016020601f855101816132d857fe5b04019050600060016020601f885101816132ee57fe5b040190506040518781526020810160005b838110156133205780602002890151816020028301528060010190506132ff565b50868360200282015260005b84811015613352578060200287015181856001010160200283015280600101905061332c565b50602082848601602002606001846000600c600019f1945050505050949350505050565b6000613380613a40565b600060016020601f8851018161339257fe5b0401905060006020601f8601816133a557fe5b0490506040518881526020810160005b848110156133d657806020028a0151816020028301528060010190506133b5565b5083602002810188815287816020015283602002868660030160200285600a600019fa9650505050505094509492505050565b60008060016020601f8551018161341c57fe5b040190506040518481526020810160005b8381101561344e57806020028601518160200283015280600101905061342d565b50602082602085026040018460006011600019f1935050505092915050565b60008060016020601f8651018161348057fe5b040190506040518581526020810160005b838110156134b2578060200287015181602002830152806001019050613491565b50846020840282015260208260208502604001846000600b600019f193505050509392505050565b60008060016020601f855101816134ed57fe5b040190506040518481526020810160005b8381101561351f5780602002860151816020028301528060010190506134fe565b5060208260208502604001846000600e600019f1935050505092915050565b600080600060016020601f8651018161355357fe5b040190506040518581526020810160005b83811015613585578060200287015181602002830152806001019050613564565b506020826020850260200184600d600019fa9450815193505050509250929050565b6135af613a65565b600060208301905060405180604001604052808451815260200182815250915050919050565b60008082600001516135f985600001518660200151866000015187602001516136c6565b0190505b83600001518460200151018111613643578180600101925050826000015161363b8560200151830386600001510383866000015187602001516136c6565b0190506135fd565b5092915050565b613652613a65565b61365d8383836137a1565b5092915050565b60608082600001516040519080825280601f01601f19166020018201604052801561369e5781602001600182028038833980820191505090505b50905060006020820190506136bc818560200151866000015161383f565b8192505050919050565b6000808490506000868511613791576020851161374b57600060018660200360080260020a031960001b905060008186511690506000878a8a0103905060008386511690505b82811461373d5781861061372a578a8a019650505050505050613799565b858060010196505083865116905061370c565b859650505050505050613799565b60008585209050600091505b858803821161378f57600086842090508082141561377b5783945050505050613799565b600184019350508180600101925050613757565b505b868601925050505b949350505050565b6137a9613a65565b60006137c785600001518660200151866000015187602001516136c6565b90508460200151836020018181525050846020015181038360000181815250508460000151856020015101811415613809576000856000018181525050613834565b8360000151836000015101856000018181510391508181525050836000015181018560200181815250505b829150509392505050565b5b602081106138635781518352602083019250602082019150602081039050613840565b60006001826020036101000a0390508019835116818551168181178652505050505050565b6040518060a001604052806060815260200160001515815260200160008152602001600060028111156138b757fe5b8152602001606081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061390557805160ff1916838001178555613933565b82800160010185558215613933579182015b82811115613932578251825591602001919060010190613917565b5b5090506139409190613a7f565b5090565b82805482825590600052602060002090601f016020900481019282156139d95791602002820160005b838211156139aa57835183826101000a81548160ff021916908315150217905550926020019260010160208160000104928301926001030261396d565b80156139d75782816101000a81549060ff02191690556001016020816000010492830192600103026139aa565b505b5090506139e69190613aa4565b5090565b815481835581811115613a1757600502816005028360005260206000209182019101613a169190613ad4565b5b505050565b5080546000825560050290600052602060002090810190613a3d9190613ad4565b50565b6040518062100000016040528061800090602082028038833980820191505090505090565b604051806040016040528060008152602001600081525090565b613aa191905b80821115613a9d576000816000905550600101613a85565b5090565b90565b613ad191905b80821115613acd57600081816101000a81549060ff021916905550600101613aaa565b5090565b90565b613b4091905b80821115613b3c5760008082016000613af39190613b43565b6001820160006101000a81549060ff021916905560028201600090556003820160006101000a81549060ff0219169055600482016000613b339190613b8b565b50600501613ada565b5090565b90565b50805460018160011615610100020316600290046000825580601f10613b695750613b88565b601f016020900490600052602060002090810190613b879190613a7f565b5b50565b50805460008255601f016020900490600052602060002090810190613bb09190613a7f565b50565b600081359050613bc281614f18565b92915050565b600081519050613bd781614f18565b92915050565b600082601f830112613bee57600080fd5b8135613c01613bfc82614d06565b614cd9565b91508082526020830160208301858383011115613c1d57600080fd5b613c28838284614eb8565b50505092915050565b600082601f830112613c4257600080fd5b8135613c55613c5082614d32565b614cd9565b91508082526020830160208301858383011115613c7157600080fd5b613c7c838284614eb8565b50505092915050565b600081359050613c9481614f2f565b92915050565b600060208284031215613cac57600080fd5b6000613cba84828501613bc8565b91505092915050565b60008060408385031215613cd657600080fd5b6000613ce485828601613bb3565b9250506020613cf585828601613c85565b9150509250929050565b600060208284031215613d1157600080fd5b600082013567ffffffffffffffff811115613d2b57600080fd5b613d3784828501613c31565b91505092915050565b60008060408385031215613d5357600080fd5b600083013567ffffffffffffffff811115613d6d57600080fd5b613d7985828601613c31565b9250506020613d8a85828601613c85565b9150509250929050565b600080600060608486031215613da957600080fd5b600084013567ffffffffffffffff811115613dc357600080fd5b613dcf86828701613c31565b9350506020613de086828701613c85565b925050604084013567ffffffffffffffff811115613dfd57600080fd5b613e0986828701613bdd565b9150509250925092565b600080600060608486031215613e2857600080fd5b600084013567ffffffffffffffff811115613e4257600080fd5b613e4e86828701613c31565b9350506020613e5f86828701613c85565b9250506040613e7086828701613c85565b9150509250925092565b6000613e868383613fe8565b60208301905092915050565b6000613e9e8383613ff7565b60208301905092915050565b6000613eb68383614831565b905092915050565b6000613ec982614d88565b613ed38185614de7565b9350613ede83614d5e565b8060005b83811015613f0f578151613ef68882613e7a565b9750613f0183614dc0565b925050600181019050613ee2565b5085935050505092915050565b613f2581614d93565b613f2f8184614df8565b9250613f3a82614d6e565b8060005b83811015613f6b578151613f528782613e92565b9650613f5d83614dcd565b925050600181019050613f3e565b505050505050565b6000613f7e82614d9f565b613f888185614e03565b935083602082028501613f9a85614d78565b8060005b85811015613fd65784840389528151613fb78582613eaa565b9450613fc283614dda565b925060208a01995050600181019050613f9e565b50829750879550505050505092915050565b613ff181614e53565b82525050565b61400081614e5f565b82525050565b61400f81614ea6565b82525050565b61401e81614ea6565b82525050565b600061402f82614db5565b6140398185614e36565b9350614049818560208601614ec7565b80840191505092915050565b600061406082614daa565b61406a8185614e14565b935061407a818560208601614ec7565b61408381614efa565b840191505092915050565b600061409982614daa565b6140a38185614e36565b93506140b3818560208601614ec7565b80840191505092915050565b60006140cc601883614e25565b91507f496e636f7272656374206368756e6b20706f736974696f6e00000000000000006000830152602082019050919050565b600061410c601583614e25565b91507f4469726563746f7279206e6f74206372656174656400000000000000000000006000830152602082019050919050565b600061414c602483614e25565b91507f4e6f7420656e6f756768206d656d6f727920696e207468652046696c6573746f60008301527f72616765000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006141b2601b83614e25565b91507f48617368206861736e2774206265656e2063616c63756c6174656400000000006000830152602082019050919050565b60006141f2601983614e25565b91507f4368756e6b20697320616c72656164792075706c6f61646564000000000000006000830152602082019050919050565b6000614232601683614e25565b91507f496e636f7272656374206368756e6b206c656e677468000000000000000000006000830152602082019050919050565b6000614272600f83614e25565b91507f46696c65206e6f742065786973747300000000000000000000000000000000006000830152602082019050919050565b60006142b2600e83614e25565b91507f496e76616c69642073656e6465720000000000000000000000000000000000006000830152602082019050919050565b60006142f2601883614e25565b91507f4469726563746f7279206973206e6f742064656c6574656400000000000000006000830152602082019050919050565b6000614332601083614e25565b91507f46696c65206e6f742064656c65746564000000000000000000000000000000006000830152602082019050919050565b6000614372601383614e25565b91507f496e76616c69642073746f7261676550617468000000000000000000000000006000830152602082019050919050565b60006143b2600c83614e25565b91507f496e76616c6964207061746800000000000000000000000000000000000000006000830152602082019050919050565b60006143f2600183614e36565b91507f2e000000000000000000000000000000000000000000000000000000000000006000830152600182019050919050565b6000614432601683614e25565b91507f496e76616c6964206469726563746f7279206e616d65000000000000000000006000830152602082019050919050565b6000614472601583614e25565b91507f4368756e6b207761736e27742075706c6f6164656400000000000000000000006000830152602082019050919050565b60006144b2602683614e25565b91507f436f756c64206e6f742072657365727665206c657373207468616e207573656460008301527f20737061636500000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614518601683614e25565b91507f4469726563746f7279206973206e6f7420656d707479000000000000000000006000830152602082019050919050565b6000614558602383614e25565b91507f46696c65206861736e2774206265656e2075706c6f6164656420636f7272656360008301527f746c7900000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006145be601183614e25565b91507f4368756e6b207761736e277420726561640000000000000000000000000000006000830152602082019050919050565b60006145fe601883614e25565b91507f46696c656e616d652073686f756c64206265203c2032353600000000000000006000830152602082019050919050565b600061463e601f83614e25565b91507f46696c652073686f756c64206265206c657373207468616e20313030204d42006000830152602082019050919050565b600061467e600283614e36565b91507f2e2e0000000000000000000000000000000000000000000000000000000000006000830152600282019050919050565b60006146be601183614e25565b91507f4469726563746f72792069732066756c6c0000000000000000000000000000006000830152602082019050919050565b60006146fe600e83614e25565b91507f46696c65206e6f7420666f756e640000000000000000000000000000000000006000830152602082019050919050565b600061473e601883614e25565b91507f46696c65206f72206469726563746f72792065786973747300000000000000006000830152602082019050919050565b600061477e601883614e25565b91507f45564d206572726f7220696e2067657446696c6553697a6500000000000000006000830152602082019050919050565b60006147be601083614e25565b91507f46696c65206e6f742063726561746564000000000000000000000000000000006000830152602082019050919050565b60006147fe601983614e25565b91507f46696c65206861736e2774206265656e2075706c6f61646564000000000000006000830152602082019050919050565b600060a083016000830151848203600086015261484e8282614055565b91505060208301516148636020860182613fe8565b50604083015161487660408601826148ae565b5060608301516148896060860182614006565b50608083015184820360808601526148a18282613ebe565b9150508091505092915050565b6148b781614e9c565b82525050565b6148c681614e9c565b82525050565b60006148d8828461408e565b915081905092915050565b60006148ef8284614024565b915081905092915050565b6000614905826143e5565b9150819050919050565b600061491a82614671565b9150819050919050565b6000621000008201905061493b6000830184613f1c565b92915050565b6000602082019050818103600083015261495b8184613f73565b905092915050565b60006020820190506149786000830184614015565b92915050565b60006020820190508181036000830152614997816140bf565b9050919050565b600060208201905081810360008301526149b7816140ff565b9050919050565b600060208201905081810360008301526149d78161413f565b9050919050565b600060208201905081810360008301526149f7816141a5565b9050919050565b60006020820190508181036000830152614a17816141e5565b9050919050565b60006020820190508181036000830152614a3781614225565b9050919050565b60006020820190508181036000830152614a5781614265565b9050919050565b60006020820190508181036000830152614a77816142a5565b9050919050565b60006020820190508181036000830152614a97816142e5565b9050919050565b60006020820190508181036000830152614ab781614325565b9050919050565b60006020820190508181036000830152614ad781614365565b9050919050565b60006020820190508181036000830152614af7816143a5565b9050919050565b60006020820190508181036000830152614b1781614425565b9050919050565b60006020820190508181036000830152614b3781614465565b9050919050565b60006020820190508181036000830152614b57816144a5565b9050919050565b60006020820190508181036000830152614b778161450b565b9050919050565b60006020820190508181036000830152614b978161454b565b9050919050565b60006020820190508181036000830152614bb7816145b1565b9050919050565b60006020820190508181036000830152614bd7816145f1565b9050919050565b60006020820190508181036000830152614bf781614631565b9050919050565b60006020820190508181036000830152614c17816146b1565b9050919050565b60006020820190508181036000830152614c37816146f1565b9050919050565b60006020820190508181036000830152614c5781614731565b9050919050565b60006020820190508181036000830152614c7781614771565b9050919050565b60006020820190508181036000830152614c97816147b1565b9050919050565b60006020820190508181036000830152614cb7816147f1565b9050919050565b6000602082019050614cd360008301846148bd565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614cfc57600080fd5b8060405250919050565b600067ffffffffffffffff821115614d1d57600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614d4957600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050919050565b6000819050602082019050919050565b600081519050919050565b60006180009050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614e4c82614e7c565b9050919050565b60008115159050919050565b6000819050919050565b6000819050614e7782614f0b565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000614eb182614e69565b9050919050565b82818337600083830152505050565b60005b83811015614ee5578082015181840152602081019050614eca565b83811115614ef4576000848401525b50505050565b6000601f19601f8301169050919050565b60038110614f1557fe5b50565b614f2181614e41565b8114614f2c57600080fd5b50565b614f3881614e9c565b8114614f4357600080fd5b5056fea365627a7a723158202ae226b25ad72f9cff2d74c6dc7bcfb78530ab1d2438f48a8dab67499b37a8e56c6578706572696d656e74616cf564736f6c634300050d0040", + "nonce": "0", + "storage": { + "0x0": "2868903936" + } + }, + "0x69362535ec535F0643cBf62D16aDeDCAf32Ee6F8": { + "balance": "0", + "code": "0x608060405234801561001057600080fd5b50600436106100b45760003560e01c806379210e8e1161007157806379210e8e1461017757806381a8235a146101a757806385aeeb17146101c35780639a9a5593146101f3578063a99100541461020f578063b57321221461022b576100b4565b806307c6e7d3146100b9578063122f4fba146100d55780631c6ec7a9146101055780631cfe4e3b14610121578063373dedb41461013d57806361e46db51461015b575b600080fd5b6100d360048036036100ce9190810190613e0d565b61025b565b005b6100ef60048036036100ea9190810190613e0d565b610804565b6040516100fc9190614ab1565b60405180910390f35b61011f600480360361011a9190810190613e0d565b610b43565b005b61013b60048036036101369190810190613dd1565b610f72565b005b610145611190565b6040516101529190614e2c565b60405180910390f35b61017560048036036101709190810190613ea2565b611199565b005b610191600480360361018c9190810190613f21565b6113f9565b60405161019e9190614a72565b60405180910390f35b6101c160048036036101bc9190810190613e0d565b6116f9565b005b6101dd60048036036101d89190810190613e0d565b61189e565b6040516101ea9190614a8f565b60405180910390f35b61020d60048036036102089190810190613e4e565b611b9d565b005b61022960048036036102249190810190613e0d565b61213a565b005b61024560048036036102409190810190613e0d565b612790565b6040516102529190614e2c565b60405180910390f35b6000339050606061026b83612a10565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b825181101561037c576000826001018460018403815181106102d557fe5b60200260200101516040516102ea9190614a1a565b90815260200160405180910390205411610339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161033090614c2c565b60405180910390fd5b8160020183600183038151811061034c57fe5b60200260200101516040516103619190614a1a565b908152602001604051809103902091508060010190506102b7565b506060600183511161038e57846103a7565b8260018451038151811061039e57fe5b60200260200101515b9050600082600101826040516103bd9190614a31565b9081526020016040518091039020541161040c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161040390614c2c565b60405180910390fd5b600082600201826040516104209190614a31565b90815260200160405180910390206000018054905014610475576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161046c90614cac565b60405180910390fd5b60006104818587612c10565b9050806104c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ba90614bcc565b60405180910390fd5b6104cb613996565b836000016001856000018054905003815481106104e457fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156105965780601f1061056b57610100808354040283529160200191610596565b820191906000526020600020905b81548152906001019060200180831161057957829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff1660028111156105e257fe5b60028111156105ed57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561066557602002820191906000526020600020906000905b82829054906101000a900460ff1615158152602001906001019060208260000104928301926001038202915080841161062f5790505b50505050508152505090508084600001600186600101866040516106899190614a31565b90815260200160405180910390205403815481106106a357fe5b906000526020600020906005020160008201518160000190805190602001906106cd9291906139d2565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561071c57fe5b0217905550608082015181600401908051906020019061073d929190613a52565b5090505083600101836040516107539190614a31565b9081526020016040518091039020548460010182600001516040516107789190614a1a565b9081526020016040518091039020819055506000846001018460405161079e9190614a31565b908152602001604051809103902081905550836000018054809190600190036107c79190613af8565b5083600201836040516107da9190614a31565b9081526020016040518091039020600080820160006107f99190613b2a565b505050505050505050565b600080606061081284612c74565b91509150606061082182612a10565b90506000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b82518110156109065760008260010184600184038151811061088b57fe5b60200260200101516040516108a09190614a1a565b90815260200160405180910390205414156108c357600095505050505050610b3e565b816002018360018303815181106108d657fe5b60200260200101516040516108eb9190614a1a565b9081526020016040518091039020915080600101905061086d565b50606060018351116109185783610931565b8260018451038151811061092857fe5b60200260200101515b9050600082600101826040516109479190614a31565b908152602001604051809103902054141561096a57600095505050505050610b3e565b610972613996565b826000016001846001018460405161098a9190614a31565b90815260200160405180910390205403815481106109a457fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610a565780601f10610a2b57610100808354040283529160200191610a56565b820191906000526020600020905b815481529060010190602001808311610a3957829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115610aa257fe5b6002811115610aad57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015610b2557602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411610aef5790505b5050505050815250509050806060015196505050505050505b919050565b600160009054906101000a900460ff16610b85576120006002819055506210000060038190555060018060006101000a81548160ff0219169083151502179055505b6000815111610bc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc090614c2c565b60405180910390fd5b60003390506060610bd983612a10565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015610cea57600082600101846001840381518110610c4357fe5b6020026020010151604051610c589190614a1a565b90815260200160405180910390205411610ca7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9e90614c2c565b60405180910390fd5b81600201836001830381518110610cba57fe5b6020026020010151604051610ccf9190614a1a565b90815260200160405180910390209150806001019050610c25565b50600254816000018054905010610d36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2d90614d4c565b60405180910390fd5b60606001835111610d475784610d60565b82600184510381518110610d5757fe5b60200260200101515b905060008260010182604051610d769190614a31565b90815260200160405180910390205414610dc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbc90614d8c565b60405180910390fd5b610dce81612ff6565b610e0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0490614c4c565b60405180910390fd5b6000610e1985876130d7565b905080610e5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5290614aec565b60405180910390fd5b610e63613996565b82816000018190525060008160200190151590811515815250508360000181908060018154018082558091505090600182039060005260206000209060050201600090919290919091506000820151816000019080519060200190610ec99291906139d2565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff02191690836002811115610f1857fe5b02179055506080820151816004019080519060200190610f39929190613a52565b5050505083600001805490508460010184604051610f579190614a31565b90815260200160405180910390208190555050505050505050565b610f7a61313b565b73ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161480610fdf57503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614155b61101e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101590614bac565b60405180910390fd5b80600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411156110a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109790614c8c565b60405180910390fd5b600054600754820111156110e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e090614b0c565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460076000828254039250508190555080600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550806007600082825401925050819055505050565b60008054905090565b600033905060006111aa82866131d4565b9050600160028111156111b957fe5b8160030160009054906101000a900460ff1660028111156111d657fe5b14611216576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120d90614d6c565b60405180910390fd5b6000600354858161122357fe5b061480156112345750806002015484105b611273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126a90614acc565b60405180910390fd5b600354848260020154031080156112905750838160020154038351145b8061129d57506003548351145b6112dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d390614b6c565b60405180910390fd5b600015158160040160035486816112ef57fe5b04815481106112fa57fe5b90600052602060002090602091828204019190069054906101000a900460ff1615151461135c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135390614b4c565b60405180910390fd5b600061136a838787876133d3565b9050806113ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a390614c6c565b60405180910390fd5b60018260040160035487816113bd57fe5b04815481106113c857fe5b90600052602060002090602091828204019190066101000a81548160ff021916908315150217905550505050505050565b611401613b4e565b6000606061140e86612c74565b9150915061141a613996565b61142483836131d4565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156114c85780601f1061149d576101008083540402835291602001916114c8565b820191906000526020600020905b8154815290600101906020018083116114ab57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561151457fe5b600281111561151f57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561159757602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116115615790505b50505050508152505090506002808111156115ae57fe5b816060015160028111156115be57fe5b146115fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f590614e0c565b60405180910390fd5b60035485111580156116105750600085115b61164f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164690614b6c565b60405180910390fd5b80604001518587011115611698576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168f90614acc565b60405180910390fd5b60006116a684848989613484565b8096508192505050806116ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e590614cec565b60405180910390fd5b505050509392505050565b6000339050600061170a82846131d4565b90506001600281111561171957fe5b8160030160009054906101000a900460ff16600281111561173657fe5b14611776576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176d90614d6c565b60405180910390fd5b60006001905060008260040180549050905060008090505b818110156117e157600015158460040182815481106117a957fe5b90600052602060002090602091828204019190069054906101000a900460ff16151514156117d657600092505b80600101905061178e565b5081611822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181990614ccc565b60405180910390fd5b60028360030160006101000a81548160ff0219169083600281111561184357fe5b021790555060006118548587613517565b905080611896576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188d90614b2c565b60405180910390fd5b505050505050565b6060600060606118ad84612c74565b9150915060606118bc82612a10565b90506000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008090505b82518110156119c65760008260010184838151811061192257fe5b60200260200101516040516119379190614a1a565b90815260200160405180910390205411611986576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197d90614c2c565b60405180910390fd5b8160020183828151811061199657fe5b60200260200101516040516119ab9190614a1a565b90815260200160405180910390209150806001019050611907565b5080600001805480602002602001604051908101604052809291908181526020016000905b82821015611b8e57838290600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611aa75780601f10611a7c57610100808354040283529160200191611aa7565b820191906000526020600020905b815481529060010190602001808311611a8a57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115611af357fe5b6002811115611afe57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015611b7657602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411611b405790505b505050505081525050815260200190600101906119eb565b50505050945050505050919050565b600160009054906101000a900460ff16611bdf576120006002819055506210000060038190555060018060006101000a81548160ff0219169083151502179055505b60003390506305f5e100821115611c2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2290614d2c565b60405180910390fd5b600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205483011115611cee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce590614dac565b60405180910390fd5b6060611cf984612a10565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015611e0a57600082600101846001840381518110611d6357fe5b6020026020010151604051611d789190614a1a565b90815260200160405180910390205411611dc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dbe90614c2c565b60405180910390fd5b81600201836001830381518110611dda57fe5b6020026020010151604051611def9190614a1a565b90815260200160405180910390209150806001019050611d45565b50600254816000018054905010611e56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4d90614d4c565b60405180910390fd5b60606001835111611e675785611e80565b82600184510381518110611e7757fe5b60200260200101515b905060008260010182604051611e969190614a31565b90815260200160405180910390205414611ee5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611edc90614d8c565b60405180910390fd5b611eee81612ff6565b611f2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2490614d0c565b60405180910390fd5b6000611f3a85888861357b565b905080611f7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7390614dec565b60405180910390fd5b6060600354600160035489010381611f9057fe5b04604051908082528060200260200182016040528015611fbf5781602001602082028038833980820191505090505b509050836000016040518060a0016040528085815260200160011515815260200189815260200160016002811115611ff357fe5b8152602001838152509080600181540180825580915050906001820390600052602060002090600502016000909192909190915060008201518160000190805190602001906120439291906139d2565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561209257fe5b021790555060808201518160040190805190602001906120b3929190613a52565b50505050836000018054905084600101846040516120d19190614a31565b90815260200160405180910390208190555086600560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505050505050505050565b6000339050612147613996565b61215182846131d4565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156121f55780601f106121ca576101008083540402835291602001916121f5565b820191906000526020600020905b8154815290600101906020018083116121d857829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561224157fe5b600281111561224c57fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156122c457602002820191906000526020600020906000905b82829054906101000a900460ff1615158152602001906001019060208260000104928301926001038202915080841161228e5790505b5050505050815250509050600060028111156122dc57fe5b816060015160028111156122ec57fe5b141561232d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232490614b8c565b60405180910390fd5b600061233983856135e8565b90508061237b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161237290614bec565b60405180910390fd5b606061238685612a10565b90506000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b825181101561241e57816002018360018303815181106123ee57fe5b60200260200101516040516124039190614a1a565b908152602001604051809103902091508060010190506123d2565b50600060018260010186600001516040516124399190614a1a565b908152602001604051809103902054039050612453613996565b8260000160018460000180549050038154811061246c57fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561251e5780601f106124f35761010080835404028352916020019161251e565b820191906000526020600020905b81548152906001019060200180831161250157829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561256a57fe5b600281111561257557fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156125ed57602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116125b75790505b50505050508152505090508083600001838154811061260857fe5b906000526020600020906005020160008201518160000190805190602001906126329291906139d2565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561268157fe5b021790555060808201518160040190805190602001906126a2929190613a52565b50905050826000018054809190600190036126bd9190613af8565b508260010186600001516040516126d49190614a1a565b9081526020016040518091039020548360010182600001516040516126f99190614a1a565b90815260200160405180910390208190555060008360010187600001516040516127239190614a1a565b9081526020016040518091039020819055508560400151600560008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505050505050505050565b600080606061279e84612c74565b915091506127aa613996565b6127b483836131d4565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156128585780601f1061282d57610100808354040283529160200191612858565b820191906000526020600020905b81548152906001019060200180831161283b57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff1660028111156128a457fe5b60028111156128af57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561292757602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116128f15790505b50505050508152505090506001600281111561293f57fe5b8160600151600281111561294f57fe5b1480612974575060028081111561296257fe5b8160600151600281111561297257fe5b145b6129b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129aa90614d6c565b60405180910390fd5b60006129bf848461364c565b809650819250505080612a07576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129fe90614dcc565b60405180910390fd5b50505050919050565b6060612a1a613b73565b612a23836136b5565b9050612a2d613b73565b612a6b6040518060400160405280600181526020017f2f000000000000000000000000000000000000000000000000000000000000008152506136b5565b905060606001612a8483856136e390919063ffffffff16565b01604051908082528060200260200182016040528015612ab857816020015b6060815260200190600190039081612aa35790505b50905060008090505b8151811015612b0957612ae5612ae0848661375890919063ffffffff16565b613772565b828281518110612af157fe5b60200260200101819052508080600101915050612ac1565b50600081600183510381518110612b1c57fe5b6020026020010151511415612b875780600182510381518110612b3b57fe5b6020026020010160608152506001815103604051908082528060200260200182016040528015612b7f57816020015b6060815260200190600190039081612b6a5790505b509350612bc0565b8051604051908082528060200260200182016040528015612bbc57816020015b6060815260200190600190039081612ba75790505b5093505b60008090505b8451811015612c0757818181518110612bdb57fe5b6020026020010151858281518110612bef57fe5b60200260200101819052508080600101915050612bc6565b50505050919050565b60008060016020601f85510181612c2357fe5b040190506040518481526020810160005b83811015612c55578060200286015181602002830152806001019050612c34565b50602082602085026040018460006010600019f1935050505092915050565b6000606060006028905080845111612cc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cb890614c0c565b60405180910390fd5b6060816040519080825280601f01601f191660200182016040528015612cf65781602001600182028038833980820191505090505b50905060008090505b82811015612d6657858181518110612d1357fe5b602001015160f81c60f81b828281518110612d2a57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050612cff565b50600080905060008090505b83811015612e95576000838281518110612d8857fe5b602001015160f81c60f81b60f81c60ff16905060308110158015612dad575060398111155b80612dc6575060418110158015612dc55750605a8111155b5b80612ddf575060618110158015612dde575060668111155b5b612e1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e1590614c0c565b60405180910390fd5b60308110158015612e30575060398111155b15612e415760308103601084020192505b60418110158015612e535750605a8111155b15612e645760378103601084020192505b60618110158015612e76575060668111155b15612e875760578103601084020192505b508080600101915050612d72565b508094507f2f00000000000000000000000000000000000000000000000000000000000000868481518110612ec657fe5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612f33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f2a90614c0c565b60405180910390fd5b6000600184885103039050806040519080825280601f01601f191660200182016040528015612f715781602001600182028038833980820191505090505b50945060008090505b81811015612fec5760008860018784010181518110612f9557fe5b602001015160f81c60f81b905080878381518110612faf57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350508080600101915050612f7a565b5050505050915091565b600060405160200161300790614a5d565b604051602081830303815290604052805190602001208260405160200161302e9190614a31565b604051602081830303815290604052805190602001201480613099575060405160200161305a90614a48565b60405160208183030381529060405280519060200120826040516020016130819190614a31565b60405160208183030381529060405280519060200120145b806130a5575060008251145b156130b357600090506130d2565b60008251905060ff8111156130cc5760009150506130d2565b60019150505b919050565b60008060016020601f855101816130ea57fe5b040190506040518481526020810160005b8381101561311c5780602002860151816020028301528060010190506130fb565b5060208260208502604001846000600f600019f1935050505092915050565b600073d2001000000000000000000000000000000000d273ffffffffffffffffffffffffffffffffffffffff166383e781fe6040518163ffffffff1660e01b815260040160206040518083038186803b15801561319757600080fd5b505afa1580156131ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506131cf9190810190613da8565b905090565b600060606131e183612a10565b90506000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b82518110156132f25760008260010184600184038151811061324b57fe5b60200260200101516040516132609190614a1a565b908152602001604051809103902054116132af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132a690614c2c565b60405180910390fd5b816002018360018303815181106132c257fe5b60200260200101516040516132d79190614a1a565b9081526020016040518091039020915080600101905061322d565b5060606001835111613304578461331d565b8260018451038151811061331457fe5b60200260200101515b9050600082600101826040516133339190614a31565b90815260200160405180910390205411613382576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161337990614c2c565b60405180910390fd5b6000826000016001846001018460405161339c9190614a31565b90815260200160405180910390205403815481106133b657fe5b906000526020600020906005020190508094505050505092915050565b60008060016020601f855101816133e657fe5b04019050600060016020601f885101816133fc57fe5b040190506040518781526020810160005b8381101561342e57806020028901518160200283015280600101905061340d565b50868360200282015260005b84811015613460578060200287015181856001010160200283015280600101905061343a565b50602082848601602002606001846000600c600019f1945050505050949350505050565b600061348e613b4e565b600060016020601f885101816134a057fe5b0401905060006020601f8601816134b357fe5b0490506040518881526020810160005b848110156134e457806020028a0151816020028301528060010190506134c3565b5083602002810188815287816020015283602002868660030160200285600a600019fa9650505050505094509492505050565b60008060016020601f8551018161352a57fe5b040190506040518481526020810160005b8381101561355c57806020028601518160200283015280600101905061353b565b50602082602085026040018460006011600019f1935050505092915050565b60008060016020601f8651018161358e57fe5b040190506040518581526020810160005b838110156135c057806020028701518160200283015280600101905061359f565b50846020840282015260208260208502604001846000600b600019f193505050509392505050565b60008060016020601f855101816135fb57fe5b040190506040518481526020810160005b8381101561362d57806020028601518160200283015280600101905061360c565b5060208260208502604001846000600e600019f1935050505092915050565b600080600060016020601f8651018161366157fe5b040190506040518581526020810160005b83811015613693578060200287015181602002830152806001019050613672565b506020826020850260200184600d600019fa9450815193505050509250929050565b6136bd613b73565b600060208301905060405180604001604052808451815260200182815250915050919050565b600080826000015161370785600001518660200151866000015187602001516137d4565b0190505b8360000151846020015101811161375157818060010192505082600001516137498560200151830386600001510383866000015187602001516137d4565b01905061370b565b5092915050565b613760613b73565b61376b8383836138af565b5092915050565b60608082600001516040519080825280601f01601f1916602001820160405280156137ac5781602001600182028038833980820191505090505b50905060006020820190506137ca818560200151866000015161394d565b8192505050919050565b600080849050600086851161389f576020851161385957600060018660200360080260020a031960001b905060008186511690506000878a8a0103905060008386511690505b82811461384b57818610613838578a8a0196505050505050506138a7565b858060010196505083865116905061381a565b8596505050505050506138a7565b60008585209050600091505b858803821161389d57600086842090508082141561388957839450505050506138a7565b600184019350508180600101925050613865565b505b868601925050505b949350505050565b6138b7613b73565b60006138d585600001518660200151866000015187602001516137d4565b90508460200151836020018181525050846020015181038360000181815250508460000151856020015101811415613917576000856000018181525050613942565b8360000151836000015101856000018181510391508181525050836000015181018560200181815250505b829150509392505050565b5b60208110613971578151835260208301925060208201915060208103905061394e565b60006001826020036101000a0390508019835116818551168181178652505050505050565b6040518060a001604052806060815260200160001515815260200160008152602001600060028111156139c557fe5b8152602001606081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613a1357805160ff1916838001178555613a41565b82800160010185558215613a41579182015b82811115613a40578251825591602001919060010190613a25565b5b509050613a4e9190613b8d565b5090565b82805482825590600052602060002090601f01602090048101928215613ae75791602002820160005b83821115613ab857835183826101000a81548160ff0219169083151502179055509260200192600101602081600001049283019260010302613a7b565b8015613ae55782816101000a81549060ff0219169055600101602081600001049283019260010302613ab8565b505b509050613af49190613bb2565b5090565b815481835581811115613b2557600502816005028360005260206000209182019101613b249190613be2565b5b505050565b5080546000825560050290600052602060002090810190613b4b9190613be2565b50565b6040518062100000016040528061800090602082028038833980820191505090505090565b604051806040016040528060008152602001600081525090565b613baf91905b80821115613bab576000816000905550600101613b93565b5090565b90565b613bdf91905b80821115613bdb57600081816101000a81549060ff021916905550600101613bb8565b5090565b90565b613c4e91905b80821115613c4a5760008082016000613c019190613c51565b6001820160006101000a81549060ff021916905560028201600090556003820160006101000a81549060ff0219169055600482016000613c419190613c99565b50600501613be8565b5090565b90565b50805460018160011615610100020316600290046000825580601f10613c775750613c96565b601f016020900490600052602060002090810190613c959190613b8d565b5b50565b50805460008255601f016020900490600052602060002090810190613cbe9190613b8d565b50565b600081359050613cd081615086565b92915050565b600081519050613ce581615086565b92915050565b600082601f830112613cfc57600080fd5b8135613d0f613d0a82614e74565b614e47565b91508082526020830160208301858383011115613d2b57600080fd5b613d36838284615026565b50505092915050565b600082601f830112613d5057600080fd5b8135613d63613d5e82614ea0565b614e47565b91508082526020830160208301858383011115613d7f57600080fd5b613d8a838284615026565b50505092915050565b600081359050613da28161509d565b92915050565b600060208284031215613dba57600080fd5b6000613dc884828501613cd6565b91505092915050565b60008060408385031215613de457600080fd5b6000613df285828601613cc1565b9250506020613e0385828601613d93565b9150509250929050565b600060208284031215613e1f57600080fd5b600082013567ffffffffffffffff811115613e3957600080fd5b613e4584828501613d3f565b91505092915050565b60008060408385031215613e6157600080fd5b600083013567ffffffffffffffff811115613e7b57600080fd5b613e8785828601613d3f565b9250506020613e9885828601613d93565b9150509250929050565b600080600060608486031215613eb757600080fd5b600084013567ffffffffffffffff811115613ed157600080fd5b613edd86828701613d3f565b9350506020613eee86828701613d93565b925050604084013567ffffffffffffffff811115613f0b57600080fd5b613f1786828701613ceb565b9150509250925092565b600080600060608486031215613f3657600080fd5b600084013567ffffffffffffffff811115613f5057600080fd5b613f5c86828701613d3f565b9350506020613f6d86828701613d93565b9250506040613f7e86828701613d93565b9150509250925092565b6000613f9483836140f6565b60208301905092915050565b6000613fac8383614105565b60208301905092915050565b6000613fc4838361497f565b905092915050565b6000613fd782614ef6565b613fe18185614f55565b9350613fec83614ecc565b8060005b8381101561401d5781516140048882613f88565b975061400f83614f2e565b925050600181019050613ff0565b5085935050505092915050565b61403381614f01565b61403d8184614f66565b925061404882614edc565b8060005b838110156140795781516140608782613fa0565b965061406b83614f3b565b92505060018101905061404c565b505050505050565b600061408c82614f0d565b6140968185614f71565b9350836020820285016140a885614ee6565b8060005b858110156140e457848403895281516140c58582613fb8565b94506140d083614f48565b925060208a019950506001810190506140ac565b50829750879550505050505092915050565b6140ff81614fc1565b82525050565b61410e81614fcd565b82525050565b61411d81615014565b82525050565b61412c81615014565b82525050565b600061413d82614f23565b6141478185614fa4565b9350614157818560208601615035565b80840191505092915050565b600061416e82614f18565b6141788185614f82565b9350614188818560208601615035565b61419181615068565b840191505092915050565b60006141a782614f18565b6141b18185614fa4565b93506141c1818560208601615035565b80840191505092915050565b60006141da601883614f93565b91507f496e636f7272656374206368756e6b20706f736974696f6e00000000000000006000830152602082019050919050565b600061421a601583614f93565b91507f4469726563746f7279206e6f74206372656174656400000000000000000000006000830152602082019050919050565b600061425a602483614f93565b91507f4e6f7420656e6f756768206d656d6f727920696e207468652046696c6573746f60008301527f72616765000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006142c0601b83614f93565b91507f48617368206861736e2774206265656e2063616c63756c6174656400000000006000830152602082019050919050565b6000614300601983614f93565b91507f4368756e6b20697320616c72656164792075706c6f61646564000000000000006000830152602082019050919050565b6000614340601683614f93565b91507f496e636f7272656374206368756e6b206c656e677468000000000000000000006000830152602082019050919050565b6000614380600f83614f93565b91507f46696c65206e6f742065786973747300000000000000000000000000000000006000830152602082019050919050565b60006143c0600e83614f93565b91507f496e76616c69642073656e6465720000000000000000000000000000000000006000830152602082019050919050565b6000614400601883614f93565b91507f4469726563746f7279206973206e6f742064656c6574656400000000000000006000830152602082019050919050565b6000614440601083614f93565b91507f46696c65206e6f742064656c65746564000000000000000000000000000000006000830152602082019050919050565b6000614480601383614f93565b91507f496e76616c69642073746f7261676550617468000000000000000000000000006000830152602082019050919050565b60006144c0600c83614f93565b91507f496e76616c6964207061746800000000000000000000000000000000000000006000830152602082019050919050565b6000614500600183614fa4565b91507f2e000000000000000000000000000000000000000000000000000000000000006000830152600182019050919050565b6000614540601683614f93565b91507f496e76616c6964206469726563746f7279206e616d65000000000000000000006000830152602082019050919050565b6000614580601583614f93565b91507f4368756e6b207761736e27742075706c6f6164656400000000000000000000006000830152602082019050919050565b60006145c0602683614f93565b91507f436f756c64206e6f742072657365727665206c657373207468616e207573656460008301527f20737061636500000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614626601683614f93565b91507f4469726563746f7279206973206e6f7420656d707479000000000000000000006000830152602082019050919050565b6000614666602383614f93565b91507f46696c65206861736e2774206265656e2075706c6f6164656420636f7272656360008301527f746c7900000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006146cc601183614f93565b91507f4368756e6b207761736e277420726561640000000000000000000000000000006000830152602082019050919050565b600061470c601883614f93565b91507f46696c656e616d652073686f756c64206265203c2032353600000000000000006000830152602082019050919050565b600061474c601f83614f93565b91507f46696c652073686f756c64206265206c657373207468616e20313030204d42006000830152602082019050919050565b600061478c600283614fa4565b91507f2e2e0000000000000000000000000000000000000000000000000000000000006000830152600282019050919050565b60006147cc601183614f93565b91507f4469726563746f72792069732066756c6c0000000000000000000000000000006000830152602082019050919050565b600061480c600e83614f93565b91507f46696c65206e6f7420666f756e640000000000000000000000000000000000006000830152602082019050919050565b600061484c601883614f93565b91507f46696c65206f72206469726563746f72792065786973747300000000000000006000830152602082019050919050565b600061488c601983614f93565b91507f4e6f7420656e6f756768207265736572766564207370616365000000000000006000830152602082019050919050565b60006148cc601883614f93565b91507f45564d206572726f7220696e2067657446696c6553697a6500000000000000006000830152602082019050919050565b600061490c601083614f93565b91507f46696c65206e6f742063726561746564000000000000000000000000000000006000830152602082019050919050565b600061494c601983614f93565b91507f46696c65206861736e2774206265656e2075706c6f61646564000000000000006000830152602082019050919050565b600060a083016000830151848203600086015261499c8282614163565b91505060208301516149b160208601826140f6565b5060408301516149c460408601826149fc565b5060608301516149d76060860182614114565b50608083015184820360808601526149ef8282613fcc565b9150508091505092915050565b614a058161500a565b82525050565b614a148161500a565b82525050565b6000614a26828461419c565b915081905092915050565b6000614a3d8284614132565b915081905092915050565b6000614a53826144f3565b9150819050919050565b6000614a688261477f565b9150819050919050565b60006210000082019050614a89600083018461402a565b92915050565b60006020820190508181036000830152614aa98184614081565b905092915050565b6000602082019050614ac66000830184614123565b92915050565b60006020820190508181036000830152614ae5816141cd565b9050919050565b60006020820190508181036000830152614b058161420d565b9050919050565b60006020820190508181036000830152614b258161424d565b9050919050565b60006020820190508181036000830152614b45816142b3565b9050919050565b60006020820190508181036000830152614b65816142f3565b9050919050565b60006020820190508181036000830152614b8581614333565b9050919050565b60006020820190508181036000830152614ba581614373565b9050919050565b60006020820190508181036000830152614bc5816143b3565b9050919050565b60006020820190508181036000830152614be5816143f3565b9050919050565b60006020820190508181036000830152614c0581614433565b9050919050565b60006020820190508181036000830152614c2581614473565b9050919050565b60006020820190508181036000830152614c45816144b3565b9050919050565b60006020820190508181036000830152614c6581614533565b9050919050565b60006020820190508181036000830152614c8581614573565b9050919050565b60006020820190508181036000830152614ca5816145b3565b9050919050565b60006020820190508181036000830152614cc581614619565b9050919050565b60006020820190508181036000830152614ce581614659565b9050919050565b60006020820190508181036000830152614d05816146bf565b9050919050565b60006020820190508181036000830152614d25816146ff565b9050919050565b60006020820190508181036000830152614d458161473f565b9050919050565b60006020820190508181036000830152614d65816147bf565b9050919050565b60006020820190508181036000830152614d85816147ff565b9050919050565b60006020820190508181036000830152614da58161483f565b9050919050565b60006020820190508181036000830152614dc58161487f565b9050919050565b60006020820190508181036000830152614de5816148bf565b9050919050565b60006020820190508181036000830152614e05816148ff565b9050919050565b60006020820190508181036000830152614e258161493f565b9050919050565b6000602082019050614e416000830184614a0b565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614e6a57600080fd5b8060405250919050565b600067ffffffffffffffff821115614e8b57600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614eb757600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050919050565b6000819050602082019050919050565b600081519050919050565b60006180009050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614fba82614fea565b9050919050565b60008115159050919050565b6000819050919050565b6000819050614fe582615079565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061501f82614fd7565b9050919050565b82818337600083830152505050565b60005b83811015615053578082015181840152602081019050615038565b83811115615062576000848401525b50505050565b6000601f19601f8301169050919050565b6003811061508357fe5b50565b61508f81614faf565b811461509a57600080fd5b50565b6150a68161500a565b81146150b157600080fd5b5056fea365627a7a72315820314a90e541327f2678eaf7815f54348c3702e4fa45cdf1d5595b378d08af86896c6578706572696d656e74616cf564736f6c634300050d0040", + "nonce": "0", + "storage": { + "0x0": "2868903936" + } + }, + "0x69bfcdcb98c9562e0a2faee3ecdfd65e8a0adb19": { + "balance": "1000000000000000000000000000000" + }, + "0x6a37ad7dceec4595eea9f03b82d2710e738343ac": { + "balance": "1000000000000000000000000000000" + }, + "0x6b806862a977a0e22ed1752f858e5332647121c8": { + "balance": "1000000000000000000000000000000" + }, + "0x6c0ef9084a57df13c175afea32ea47a510c5506e": { + "balance": "1000000000000000000000000000000" + }, + "0x6cd5e637266e18d3e888ee99451eb828c6b491f4": { + "balance": "1000000000000000000000000000000" + }, + "0x6d0d7f0ff51917bd84a5f7270d31a894282aaf4b": { + "balance": "1000000000000000000000000000000" + }, + "0x6d8092cb926daf29236f866cd31c327ff73323d1": { + "balance": "1000000000000000000000000000000" + }, + "0x6d80aAC61F6d92c7F4A3c412850474ba963B698E": { + "balance": "1000000000000000000000" + }, + "0x6fec280c0ab320715b17d70e8b02c2d4141c1372": { + "balance": "1000000000000000000000000000000" + }, + "0x733ad609ef2e742334d96266fbc13733f1cf5e4a": { + "balance": "1000000000000000000000000000000" + }, + "0x7525198d8cd1121d57358a0b0ed037e924581a76": { + "balance": "1000000000000000000000000000000" + }, + "0x765708943c3b791563d1e3f0533b6d7e7d769e4d": { + "balance": "1000000000000000000000000000000" + }, + "0x7685d04f0b7657017b77efa004a14ff9f022acab": { + "balance": "1000000000000000000000000000000" + }, + "0x76b545cb6a2fc671f741950eeb27627e69a1e69b": { + "balance": "1000000000000000000000000000000" + }, + "0x77a0bc73442d3d9cb993e8d9752f95babf0ccaa6": { + "balance": "1000000000000000000000000000000" + }, + "0x7a89A6c323FaCfF0ADeF7EEF3e491aD4044d0592": { + "balance": "100000000000000000000000" + }, + "0x7e7E68F04D1799Fa25C8cff57314c8a5d3942e69": { + "balance": "1000000000000000000000000" + }, + "0x811d701d14539d190a8593fe901eafe8eff511f5": { + "balance": "1000000000000000000000000000000" + }, + "0x81dcbd71da28fafb9ca99ff5a22bfcebba84fecc": { + "balance": "100000000000000000000000" + }, + "0x83c1479d2a32d9ed9fa699289b6c2db56b7cd045": { + "balance": "1000000000000000000000000000000" + }, + "0x85b33f0853ab8eaa4e602bdfd724d44bc2731e90": { + "balance": "1000000000000000000000000000000" + }, + "0x863f816036e3cbba90855196c9d1e339fcff1650": { + "balance": "1000000000000000000000000000000" + }, + "0x87ea381878572d63b3453033d7540abddd191186": { + "balance": "1000000000000000000000000000000" + }, + "0x88fd5e01078629cc194c933d9631b9448fe10b1d": { + "balance": "1000000000000000000000000000000" + }, + "0x8945e48bd056f45c8b57f9025d2674bb03a24035": { + "balance": "1000000000000000000000000000000" + }, + "0x8a920edc1021ce76c22774e0e83723a6e51c2439": { + "balance": "1000000000000000000000000000000" + }, + "0x8e6081e272c8f4d49f5b29157b52f68cbd6307ad": { + "balance": "1000000000000000000000000000000" + }, + "0x8fe24dbbf9884bd458d8cfac528b4ad70e82497d": { + "balance": "1000000000000000000000000000000" + }, + "0x90431f3f75b26657f74abbb5c759b12e78f916cc": { + "balance": "1000000000000000000000000000000" + }, + "0x907cd0881E50d359bb9Fd120B1A5A143b1C97De6": { + "balance": "1000000000000000000000000000000000000000000000000000000000" + }, + "0x94c6e5746971d6aebeaa42cbbe2feca0f6b5b24f": { + "balance": "1000000000000000000000000000000" + }, + "0x96672f9e982936e1904b15c948cc81bf18027db6": { + "balance": "1000000000000000000000000000000" + }, + "0x97b921ba45e0aa8830701aa62050a83ee00a1bb8": { + "balance": "1000000000000000000000000000000" + }, + "0x98e50c97baf98dc6a81bdb95067339a269a36fc1": { + "balance": "1000000000000000000000000000000" + }, + "0x9b77f28285a49601169a33332f08aa309d97edd0": { + "balance": "1000000000000000000000000000000" + }, + "0x9f62f4215cd277ca40dede101b4ccb29290de6bb": { + "balance": "1000000000000000000000000000000" + }, + "0xD1001000000000000000000000000000000000D1": { + "balance": "0", + "code": "0x608060405260043610603f576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680636d4ce63c146044575b600080fd5b348015604f57600080fd5b506056606c565b6040518082815260200191505060405180910390f35b60006001600060048152602001908152602001600020600060098152602001908152602001600020600101549050905600a165627a7a723058208fe64219becc0bcab1c8f854f05804ebb6bb555da5dbc49e8f7021c31d77636a0029", + "nonce": "0", + "storage": { + "0x3b4da637a1b0e6dbfc6795f2b7f0cb29eebb91b3af4dcc335e1633f6b4af810b": "1111" + } + }, + "0xD3001000000000000000000000000000000000D3": { + "balance": "0", + "code": "0x60806040526004361061007b5760003560e01c80639623609d1161004e5780639623609d1461013657806399a88ec4146101f5578063f2fde38b14610230578063f3b7dead146102635761007b565b8063204e1c7a14610080578063715018a6146100cf5780637eff275e146100e65780638da5cb5b14610121575b600080fd5b34801561008c57600080fd5b506100b3600480360360208110156100a357600080fd5b50356001600160a01b0316610296565b604080516001600160a01b039092168252519081900360200190f35b3480156100db57600080fd5b506100e4610328565b005b3480156100f257600080fd5b506100e46004803603604081101561010957600080fd5b506001600160a01b03813581169160200135166103ca565b34801561012d57600080fd5b506100b3610496565b6100e46004803603606081101561014c57600080fd5b6001600160a01b03823581169260208101359091169181019060608101604082013564010000000081111561018057600080fd5b82018360208201111561019257600080fd5b803590602001918460018302840111640100000000831117156101b457600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506104a5945050505050565b34801561020157600080fd5b506100e46004803603604081101561021857600080fd5b506001600160a01b03813581169160200135166105dd565b34801561023c57600080fd5b506100e46004803603602081101561025357600080fd5b50356001600160a01b031661068d565b34801561026f57600080fd5b506100b36004803603602081101561028657600080fd5b50356001600160a01b0316610785565b6000806060836001600160a01b03166040518080635c60da1b60e01b8152506004019050600060405180830381855afa9150503d80600081146102f5576040519150601f19603f3d011682016040523d82523d6000602084013e6102fa565b606091505b50915091508161030957600080fd5b80806020019051602081101561031e57600080fd5b5051949350505050565b6103306107e4565b6000546001600160a01b03908116911614610380576040805162461bcd60e51b8152602060048201819052602482015260008051602061080f833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6103d26107e4565b6000546001600160a01b03908116911614610422576040805162461bcd60e51b8152602060048201819052602482015260008051602061080f833981519152604482015290519081900360640190fd5b816001600160a01b0316638f283970826040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050600060405180830381600087803b15801561047a57600080fd5b505af115801561048e573d6000803e3d6000fd5b505050505050565b6000546001600160a01b031690565b6104ad6107e4565b6000546001600160a01b039081169116146104fd576040805162461bcd60e51b8152602060048201819052602482015260008051602061080f833981519152604482015290519081900360640190fd5b826001600160a01b0316634f1ef2863484846040518463ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561057357818101518382015260200161055b565b50505050905090810190601f1680156105a05780820380516001836020036101000a031916815260200191505b5093505050506000604051808303818588803b1580156105bf57600080fd5b505af11580156105d3573d6000803e3d6000fd5b5050505050505050565b6105e56107e4565b6000546001600160a01b03908116911614610635576040805162461bcd60e51b8152602060048201819052602482015260008051602061080f833981519152604482015290519081900360640190fd5b816001600160a01b0316633659cfe6826040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050600060405180830381600087803b15801561047a57600080fd5b6106956107e4565b6000546001600160a01b039081169116146106e5576040805162461bcd60e51b8152602060048201819052602482015260008051602061080f833981519152604482015290519081900360640190fd5b6001600160a01b03811661072a5760405162461bcd60e51b81526004018080602001828103825260268152602001806107e96026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000806060836001600160a01b031660405180806303e1469160e61b8152506004019050600060405180830381855afa9150503d80600081146102f5576040519150601f19603f3d011682016040523d82523d6000602084013e6102fa565b339056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a26469706673582212201d968ac32bef5562c6b4f1bd5d2f2a74c14d07ce008ca6fdc5a3bd0f5fc265f564736f6c63430006080033", + "nonce": "0", + "storage": { + "0x0": "0x907cd0881E50d359bb9Fd120B1A5A143b1C97De6" + } + }, + "0xD3002000000000000000000000000000000000D3": { + "balance": "0", + "code": "0x60806040526004361061004e5760003560e01c80633659cfe6146100655780634f1ef286146100985780635c60da1b146101185780638f28397014610149578063f851a4401461017c5761005d565b3661005d5761005b610191565b005b61005b610191565b34801561007157600080fd5b5061005b6004803603602081101561008857600080fd5b50356001600160a01b03166101ab565b61005b600480360360408110156100ae57600080fd5b6001600160a01b0382351691908101906040810160208201356401000000008111156100d957600080fd5b8201836020820111156100eb57600080fd5b8035906020019184600183028401116401000000008311171561010d57600080fd5b5090925090506101e5565b34801561012457600080fd5b5061012d610292565b604080516001600160a01b039092168252519081900360200190f35b34801561015557600080fd5b5061005b6004803603602081101561016c57600080fd5b50356001600160a01b03166102cf565b34801561018857600080fd5b5061012d610389565b6101996103ba565b6101a96101a461041a565b61043f565b565b6101b3610463565b6001600160a01b0316336001600160a01b031614156101da576101d581610488565b6101e2565b6101e2610191565b50565b6101ed610463565b6001600160a01b0316336001600160a01b031614156102855761020f83610488565b6000836001600160a01b031683836040518083838082843760405192019450600093509091505080830381855af49150503d806000811461026c576040519150601f19603f3d011682016040523d82523d6000602084013e610271565b606091505b505090508061027f57600080fd5b5061028d565b61028d610191565b505050565b600061029c610463565b6001600160a01b0316336001600160a01b031614156102c4576102bd61041a565b90506102cc565b6102cc610191565b90565b6102d7610463565b6001600160a01b0316336001600160a01b031614156101da576001600160a01b0381166103355760405162461bcd60e51b81526004018080602001828103825260368152602001806105876036913960400191505060405180910390fd5b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f61035e610463565b604080516001600160a01b03928316815291841660208301528051918290030190a16101d5816104c8565b6000610393610463565b6001600160a01b0316336001600160a01b031614156102c4576102bd610463565b3b151590565b6103c2610463565b6001600160a01b0316336001600160a01b031614156104125760405162461bcd60e51b81526004018080602001828103825260328152602001806105556032913960400191505060405180910390fd5b6101a96101a9565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b3660008037600080366000845af43d6000803e80801561045e573d6000f35b3d6000fd5b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b610491816104ec565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610355565b6104f5816103b4565b6105305760405162461bcd60e51b815260040180806020018281038252603b8152602001806105bd603b913960400191505060405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5556fe43616e6e6f742063616c6c2066616c6c6261636b2066756e6374696f6e2066726f6d207468652070726f78792061646d696e43616e6e6f74206368616e6765207468652061646d696e206f6620612070726f787920746f20746865207a65726f206164647265737343616e6e6f742073657420612070726f787920696d706c656d656e746174696f6e20746f2061206e6f6e2d636f6e74726163742061646472657373a26469706673582212206e221e2a3547bd97244b05ed46430b1b078ba097cb2a4e25ec3d79cf9ac9f02c64736f6c63430006080033", + "nonce": "0", + "storage": { + "0x0": "1000000", + "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0xD3003000000000000000000000000000000000D3", + "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "0xD3001000000000000000000000000000000000D3" + } + }, + "0xD3003000000000000000000000000000000000D3": { + "balance": "0", + "code": "0x608060405234801561001057600080fd5b50600436106100b45760003560e01c806379210e8e1161007157806379210e8e1461017757806381a8235a146101a757806385aeeb17146101c35780639a9a5593146101f3578063a99100541461020f578063b57321221461022b576100b4565b806307c6e7d3146100b9578063122f4fba146100d55780631c6ec7a9146101055780631cfe4e3b14610121578063373dedb41461013d57806361e46db51461015b575b600080fd5b6100d360048036036100ce9190810190613e94565b61025b565b005b6100ef60048036036100ea9190810190613e94565b610862565b6040516100fc9190614b38565b60405180910390f35b61011f600480360361011a9190810190613e94565b610ba1565b005b61013b60048036036101369190810190613e58565b610fce565b005b6101456111ec565b6040516101529190614eb3565b60405180910390f35b61017560048036036101709190810190613f29565b6111f6565b005b610191600480360361018c9190810190613fa8565b611456565b60405161019e9190614af9565b60405180910390f35b6101c160048036036101bc9190810190613e94565b611756565b005b6101dd60048036036101d89190810190613e94565b6118fb565b6040516101ea9190614b16565b60405180910390f35b61020d60048036036102089190810190613ed5565b611bfa565b005b61022960048036036102249190810190613e94565b612195565b005b61024560048036036102409190810190613e94565b612849565b6040516102529190614eb3565b60405180910390f35b6000339050606061026b83612ac9565b90506000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b825181101561037c576000826001018460018403815181106102d557fe5b60200260200101516040516102ea9190614aa1565b90815260200160405180910390205411610339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161033090614cb3565b60405180910390fd5b8160020183600183038151811061034c57fe5b60200260200101516040516103619190614aa1565b908152602001604051809103902091508060010190506102b7565b506060600183511161038e57846103a7565b8260018451038151811061039e57fe5b60200260200101515b9050600082600101826040516103bd9190614ab8565b9081526020016040518091039020541161040c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161040390614cb3565b60405180910390fd5b600082600201826040516104209190614ab8565b90815260200160405180910390206000018054905014610475576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161046c90614d33565b60405180910390fd5b60006104818587612cc9565b9050806104c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ba90614c53565b60405180910390fd5b6104cb613a4f565b836000016001856000018054905003815481106104e457fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156105965780601f1061056b57610100808354040283529160200191610596565b820191906000526020600020905b81548152906001019060200180831161057957829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff1660028111156105e257fe5b60028111156105ed57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561066557602002820191906000526020600020906000905b82829054906101000a900460ff1615158152602001906001019060208260000104928301926001038202915080841161062f5790505b50505050508152505090508084600001600186600101866040516106899190614ab8565b90815260200160405180910390205403815481106106a357fe5b906000526020600020906005020160008201518160000190805190602001906106cd929190613a8b565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561071c57fe5b0217905550608082015181600401908051906020019061073d929190613b0b565b5090505083600101836040516107539190614ab8565b9081526020016040518091039020548460010182600001516040516107789190614aa1565b9081526020016040518091039020819055506000846001018460405161079e9190614ab8565b908152602001604051809103902081905550836000018054806107bd57fe5b6001900381819060005260206000209060050201600080820160006107e29190613bb1565b6001820160006101000a81549060ff021916905560028201600090556003820160006101000a81549060ff02191690556004820160006108229190613bf9565b5050905583600201836040516108389190614ab8565b9081526020016040518091039020600080820160006108579190613c21565b505050505050505050565b600080606061087084612d2d565b91509150606061087f82612ac9565b90506000600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015610964576000826001018460018403815181106108e957fe5b60200260200101516040516108fe9190614aa1565b908152602001604051809103902054141561092157600095505050505050610b9c565b8160020183600183038151811061093457fe5b60200260200101516040516109499190614aa1565b908152602001604051809103902091508060010190506108cb565b5060606001835111610976578361098f565b8260018451038151811061098657fe5b60200260200101515b9050600082600101826040516109a59190614ab8565b90815260200160405180910390205414156109c857600095505050505050610b9c565b6109d0613a4f565b82600001600184600101846040516109e89190614ab8565b9081526020016040518091039020540381548110610a0257fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610ab45780601f10610a8957610100808354040283529160200191610ab4565b820191906000526020600020905b815481529060010190602001808311610a9757829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115610b0057fe5b6002811115610b0b57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015610b8357602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411610b4d5790505b5050505050815250509050806060015196505050505050505b919050565b600360009054906101000a900460ff16610be457612000600481905550621000006005819055506001600360006101000a81548160ff0219169083151502179055505b6000815111610c28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1f90614cb3565b60405180910390fd5b60003390506060610c3883612ac9565b90506000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015610d4957600082600101846001840381518110610ca257fe5b6020026020010151604051610cb79190614aa1565b90815260200160405180910390205411610d06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cfd90614cb3565b60405180910390fd5b81600201836001830381518110610d1957fe5b6020026020010151604051610d2e9190614aa1565b90815260200160405180910390209150806001019050610c84565b50600454816000018054905010610d95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8c90614dd3565b60405180910390fd5b60606001835111610da65784610dbf565b82600184510381518110610db657fe5b60200260200101515b905060008260010182604051610dd59190614ab8565b90815260200160405180910390205414610e24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1b90614e13565b60405180910390fd5b610e2d816130af565b610e6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6390614cd3565b60405180910390fd5b6000610e788587613190565b905080610eba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb190614b73565b60405180910390fd5b610ec2613a4f565b8281600001819052506000816020019015159081151581525050836000018190806001815401808255809150506001900390600052602060002090600502016000909190919091506000820151816000019080519060200190610f26929190613a8b565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff02191690836002811115610f7557fe5b02179055506080820151816004019080519060200190610f96929190613b0b565b50505083600001805490508460010184604051610fb39190614ab8565b90815260200160405180910390208190555050505050505050565b610fd66131f4565b73ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16148061103b57503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614155b61107a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107190614c33565b60405180910390fd5b80600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411156110fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f390614d13565b60405180910390fd5b60025460095482011115611145576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113c90614b93565b60405180910390fd5b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460096000828254039250508190555080600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550806009600082825401925050819055505050565b6000600254905090565b60003390506000611207828661328d565b90506001600281111561121657fe5b8160030160009054906101000a900460ff16600281111561123357fe5b14611273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126a90614df3565b60405180910390fd5b6000600554858161128057fe5b061480156112915750806002015484105b6112d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c790614b53565b60405180910390fd5b600554848260020154031080156112ed5750838160020154038351145b806112fa57506005548351145b611339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133090614bf3565b60405180910390fd5b6000151581600401600554868161134c57fe5b048154811061135757fe5b90600052602060002090602091828204019190069054906101000a900460ff161515146113b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b090614bd3565b60405180910390fd5b60006113c78387878761348c565b905080611409576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140090614cf3565b60405180910390fd5b600182600401600554878161141a57fe5b048154811061142557fe5b90600052602060002090602091828204019190066101000a81548160ff021916908315150217905550505050505050565b61145e613c45565b6000606061146b86612d2d565b91509150611477613a4f565b611481838361328d565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156115255780601f106114fa57610100808354040283529160200191611525565b820191906000526020600020905b81548152906001019060200180831161150857829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561157157fe5b600281111561157c57fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156115f457602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116115be5790505b505050505081525050905060028081111561160b57fe5b8160600151600281111561161b57fe5b1461165b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165290614e93565b60405180910390fd5b600554851115801561166d5750600085115b6116ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a390614bf3565b60405180910390fd5b806040015185870111156116f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ec90614b53565b60405180910390fd5b60006117038484898961353d565b80965081925050508061174b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174290614d73565b60405180910390fd5b505050509392505050565b60003390506000611767828461328d565b90506001600281111561177657fe5b8160030160009054906101000a900460ff16600281111561179357fe5b146117d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ca90614df3565b60405180910390fd5b60006001905060008260040180549050905060008090505b8181101561183e576000151584600401828154811061180657fe5b90600052602060002090602091828204019190069054906101000a900460ff161515141561183357600092505b8060010190506117eb565b508161187f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187690614d53565b60405180910390fd5b60028360030160006101000a81548160ff021916908360028111156118a057fe5b021790555060006118b185876135d0565b9050806118f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ea90614bb3565b60405180910390fd5b505050505050565b60606000606061190a84612d2d565b91509150606061191982612ac9565b90506000600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008090505b8251811015611a235760008260010184838151811061197f57fe5b60200260200101516040516119949190614aa1565b908152602001604051809103902054116119e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119da90614cb3565b60405180910390fd5b816002018382815181106119f357fe5b6020026020010151604051611a089190614aa1565b90815260200160405180910390209150806001019050611964565b5080600001805480602002602001604051908101604052809291908181526020016000905b82821015611beb57838290600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611b045780601f10611ad957610100808354040283529160200191611b04565b820191906000526020600020905b815481529060010190602001808311611ae757829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115611b5057fe5b6002811115611b5b57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015611bd357602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411611b9d5790505b50505050508152505081526020019060010190611a48565b50505050945050505050919050565b600360009054906101000a900460ff16611c3d57612000600481905550621000006005819055506001600360006101000a81548160ff0219169083151502179055505b60003390506305f5e100821115611c89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8090614db3565b60405180910390fd5b600660008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205483011115611d4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4390614e33565b60405180910390fd5b6060611d5784612ac9565b90506000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015611e6857600082600101846001840381518110611dc157fe5b6020026020010151604051611dd69190614aa1565b90815260200160405180910390205411611e25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1c90614cb3565b60405180910390fd5b81600201836001830381518110611e3857fe5b6020026020010151604051611e4d9190614aa1565b90815260200160405180910390209150806001019050611da3565b50600454816000018054905010611eb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eab90614dd3565b60405180910390fd5b60606001835111611ec55785611ede565b82600184510381518110611ed557fe5b60200260200101515b905060008260010182604051611ef49190614ab8565b90815260200160405180910390205414611f43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3a90614e13565b60405180910390fd5b611f4c816130af565b611f8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8290614d93565b60405180910390fd5b6000611f98858888613634565b905080611fda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd190614e73565b60405180910390fd5b6060600554600160055489010381611fee57fe5b0460405190808252806020026020018201604052801561201d5781602001602082028038833980820191505090505b509050836000016040518060a001604052808581526020016001151581526020018981526020016001600281111561205157fe5b8152602001838152509080600181540180825580915050600190039060005260206000209060050201600090919091909150600082015181600001908051906020019061209f929190613a8b565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff021916908360028111156120ee57fe5b0217905550608082015181600401908051906020019061210f929190613b0b565b5050508360000180549050846001018460405161212c9190614ab8565b90815260200160405180910390208190555086600760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505050505050505050565b60003390506121a2613a4f565b6121ac828461328d565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156122505780601f1061222557610100808354040283529160200191612250565b820191906000526020600020905b81548152906001019060200180831161223357829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561229c57fe5b60028111156122a757fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561231f57602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116122e95790505b50505050508152505090506000600281111561233757fe5b8160600151600281111561234757fe5b1415612388576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161237f90614c13565b60405180910390fd5b600061239483856136a1565b9050806123d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123cd90614c73565b60405180910390fd5b60606123e185612ac9565b90506000600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015612479578160020183600183038151811061244957fe5b602002602001015160405161245e9190614aa1565b9081526020016040518091039020915080600101905061242d565b50600060018260010186600001516040516124949190614aa1565b9081526020016040518091039020540390506124ae613a4f565b826000016001846000018054905003815481106124c757fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156125795780601f1061254e57610100808354040283529160200191612579565b820191906000526020600020905b81548152906001019060200180831161255c57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff1660028111156125c557fe5b60028111156125d057fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561264857602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116126125790505b50505050508152505090508083600001838154811061266357fe5b9060005260206000209060050201600082015181600001908051906020019061268d929190613a8b565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff021916908360028111156126dc57fe5b021790555060808201518160040190805190602001906126fd929190613b0b565b509050508260000180548061270e57fe5b6001900381819060005260206000209060050201600080820160006127339190613bb1565b6001820160006101000a81549060ff021916905560028201600090556003820160006101000a81549060ff02191690556004820160006127739190613bf9565b5050905582600101866000015160405161278d9190614aa1565b9081526020016040518091039020548360010182600001516040516127b29190614aa1565b90815260200160405180910390208190555060008360010187600001516040516127dc9190614aa1565b9081526020016040518091039020819055508560400151600760008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505050505050505050565b600080606061285784612d2d565b91509150612863613a4f565b61286d838361328d565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156129115780601f106128e657610100808354040283529160200191612911565b820191906000526020600020905b8154815290600101906020018083116128f457829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561295d57fe5b600281111561296857fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156129e057602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116129aa5790505b5050505050815250509050600160028111156129f857fe5b81606001516002811115612a0857fe5b1480612a2d5750600280811115612a1b57fe5b81606001516002811115612a2b57fe5b145b612a6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a6390614df3565b60405180910390fd5b6000612a788484613705565b809650819250505080612ac0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ab790614e53565b60405180910390fd5b50505050919050565b6060612ad3613c6a565b612adc8361376e565b9050612ae6613c6a565b612b246040518060400160405280600181526020017f2f0000000000000000000000000000000000000000000000000000000000000081525061376e565b905060606001612b3d838561379c90919063ffffffff16565b01604051908082528060200260200182016040528015612b7157816020015b6060815260200190600190039081612b5c5790505b50905060008090505b8151811015612bc257612b9e612b99848661381190919063ffffffff16565b61382b565b828281518110612baa57fe5b60200260200101819052508080600101915050612b7a565b50600081600183510381518110612bd557fe5b6020026020010151511415612c405780600182510381518110612bf457fe5b6020026020010160608152506001815103604051908082528060200260200182016040528015612c3857816020015b6060815260200190600190039081612c235790505b509350612c79565b8051604051908082528060200260200182016040528015612c7557816020015b6060815260200190600190039081612c605790505b5093505b60008090505b8451811015612cc057818181518110612c9457fe5b6020026020010151858281518110612ca857fe5b60200260200101819052508080600101915050612c7f565b50505050919050565b60008060016020601f85510181612cdc57fe5b040190506040518481526020810160005b83811015612d0e578060200286015181602002830152806001019050612ced565b50602082602085026040018460006010600019f1935050505092915050565b6000606060006028905080845111612d7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d7190614c93565b60405180910390fd5b6060816040519080825280601f01601f191660200182016040528015612daf5781602001600182028038833980820191505090505b50905060008090505b82811015612e1f57858181518110612dcc57fe5b602001015160f81c60f81b828281518110612de357fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050612db8565b50600080905060008090505b83811015612f4e576000838281518110612e4157fe5b602001015160f81c60f81b60f81c60ff16905060308110158015612e66575060398111155b80612e7f575060418110158015612e7e5750605a8111155b5b80612e98575060618110158015612e97575060668111155b5b612ed7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ece90614c93565b60405180910390fd5b60308110158015612ee9575060398111155b15612efa5760308103601084020192505b60418110158015612f0c5750605a8111155b15612f1d5760378103601084020192505b60618110158015612f2f575060668111155b15612f405760578103601084020192505b508080600101915050612e2b565b508094507f2f00000000000000000000000000000000000000000000000000000000000000868481518110612f7f57fe5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612fec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fe390614c93565b60405180910390fd5b6000600184885103039050806040519080825280601f01601f19166020018201604052801561302a5781602001600182028038833980820191505090505b50945060008090505b818110156130a5576000886001878401018151811061304e57fe5b602001015160f81c60f81b90508087838151811061306857fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350508080600101915050613033565b5050505050915091565b60006040516020016130c090614ae4565b60405160208183030381529060405280519060200120826040516020016130e79190614ab8565b604051602081830303815290604052805190602001201480613152575060405160200161311390614acf565b604051602081830303815290604052805190602001208260405160200161313a9190614ab8565b60405160208183030381529060405280519060200120145b8061315e575060008251145b1561316c576000905061318b565b60008251905060ff81111561318557600091505061318b565b60019150505b919050565b60008060016020601f855101816131a357fe5b040190506040518481526020810160005b838110156131d55780602002860151816020028301528060010190506131b4565b5060208260208502604001846000600f600019f1935050505092915050565b600073d2001000000000000000000000000000000000d273ffffffffffffffffffffffffffffffffffffffff166383e781fe6040518163ffffffff1660e01b815260040160206040518083038186803b15801561325057600080fd5b505afa158015613264573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506132889190810190613e2f565b905090565b6000606061329a83612ac9565b90506000600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b82518110156133ab5760008260010184600184038151811061330457fe5b60200260200101516040516133199190614aa1565b90815260200160405180910390205411613368576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161335f90614cb3565b60405180910390fd5b8160020183600183038151811061337b57fe5b60200260200101516040516133909190614aa1565b908152602001604051809103902091508060010190506132e6565b50606060018351116133bd57846133d6565b826001845103815181106133cd57fe5b60200260200101515b9050600082600101826040516133ec9190614ab8565b9081526020016040518091039020541161343b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161343290614cb3565b60405180910390fd5b600082600001600184600101846040516134559190614ab8565b908152602001604051809103902054038154811061346f57fe5b906000526020600020906005020190508094505050505092915050565b60008060016020601f8551018161349f57fe5b04019050600060016020601f885101816134b557fe5b040190506040518781526020810160005b838110156134e75780602002890151816020028301528060010190506134c6565b50868360200282015260005b8481101561351957806020028701518185600101016020028301528060010190506134f3565b50602082848601602002606001846000600c600019f1945050505050949350505050565b6000613547613c45565b600060016020601f8851018161355957fe5b0401905060006020601f86018161356c57fe5b0490506040518881526020810160005b8481101561359d57806020028a01518160200283015280600101905061357c565b5083602002810188815287816020015283602002868660030160200285600a600019fa9650505050505094509492505050565b60008060016020601f855101816135e357fe5b040190506040518481526020810160005b838110156136155780602002860151816020028301528060010190506135f4565b50602082602085026040018460006011600019f1935050505092915050565b60008060016020601f8651018161364757fe5b040190506040518581526020810160005b83811015613679578060200287015181602002830152806001019050613658565b50846020840282015260208260208502604001846000600b600019f193505050509392505050565b60008060016020601f855101816136b457fe5b040190506040518481526020810160005b838110156136e65780602002860151816020028301528060010190506136c5565b5060208260208502604001846000600e600019f1935050505092915050565b600080600060016020601f8651018161371a57fe5b040190506040518581526020810160005b8381101561374c57806020028701518160200283015280600101905061372b565b506020826020850260200184600d600019fa9450815193505050509250929050565b613776613c6a565b600060208301905060405180604001604052808451815260200182815250915050919050565b60008082600001516137c0856000015186602001518660000151876020015161388d565b0190505b8360000151846020015101811161380a578180600101925050826000015161380285602001518303866000015103838660000151876020015161388d565b0190506137c4565b5092915050565b613819613c6a565b613824838383613968565b5092915050565b60608082600001516040519080825280601f01601f1916602001820160405280156138655781602001600182028038833980820191505090505b50905060006020820190506138838185602001518660000151613a06565b8192505050919050565b6000808490506000868511613958576020851161391257600060018660200360080260020a031960001b905060008186511690506000878a8a0103905060008386511690505b828114613904578186106138f1578a8a019650505050505050613960565b85806001019650508386511690506138d3565b859650505050505050613960565b60008585209050600091505b85880382116139565760008684209050808214156139425783945050505050613960565b60018401935050818060010192505061391e565b505b868601925050505b949350505050565b613970613c6a565b600061398e856000015186602001518660000151876020015161388d565b905084602001518360200181815250508460200151810383600001818152505084600001518560200151018114156139d05760008560000181815250506139fb565b8360000151836000015101856000018181510391508181525050836000015181018560200181815250505b829150509392505050565b5b60208110613a2a5781518352602083019250602082019150602081039050613a07565b60006001826020036101000a0390508019835116818551168181178652505050505050565b6040518060a00160405280606081526020016000151581526020016000815260200160006002811115613a7e57fe5b8152602001606081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613acc57805160ff1916838001178555613afa565b82800160010185558215613afa579182015b82811115613af9578251825591602001919060010190613ade565b5b509050613b079190613c84565b5090565b82805482825590600052602060002090601f01602090048101928215613ba05791602002820160005b83821115613b7157835183826101000a81548160ff0219169083151502179055509260200192600101602081600001049283019260010302613b34565b8015613b9e5782816101000a81549060ff0219169055600101602081600001049283019260010302613b71565b505b509050613bad9190613ca9565b5090565b50805460018160011615610100020316600290046000825580601f10613bd75750613bf6565b601f016020900490600052602060002090810190613bf59190613c84565b5b50565b50805460008255601f016020900490600052602060002090810190613c1e9190613c84565b50565b5080546000825560050290600052602060002090810190613c429190613cd9565b50565b6040518062100000016040528061800090602082028038833980820191505090505090565b604051806040016040528060008152602001600081525090565b613ca691905b80821115613ca2576000816000905550600101613c8a565b5090565b90565b613cd691905b80821115613cd257600081816101000a81549060ff021916905550600101613caf565b5090565b90565b613d4591905b80821115613d415760008082016000613cf89190613bb1565b6001820160006101000a81549060ff021916905560028201600090556003820160006101000a81549060ff0219169055600482016000613d389190613bf9565b50600501613cdf565b5090565b90565b600081359050613d578161510d565b92915050565b600081519050613d6c8161510d565b92915050565b600082601f830112613d8357600080fd5b8135613d96613d9182614efb565b614ece565b91508082526020830160208301858383011115613db257600080fd5b613dbd8382846150ad565b50505092915050565b600082601f830112613dd757600080fd5b8135613dea613de582614f27565b614ece565b91508082526020830160208301858383011115613e0657600080fd5b613e118382846150ad565b50505092915050565b600081359050613e2981615124565b92915050565b600060208284031215613e4157600080fd5b6000613e4f84828501613d5d565b91505092915050565b60008060408385031215613e6b57600080fd5b6000613e7985828601613d48565b9250506020613e8a85828601613e1a565b9150509250929050565b600060208284031215613ea657600080fd5b600082013567ffffffffffffffff811115613ec057600080fd5b613ecc84828501613dc6565b91505092915050565b60008060408385031215613ee857600080fd5b600083013567ffffffffffffffff811115613f0257600080fd5b613f0e85828601613dc6565b9250506020613f1f85828601613e1a565b9150509250929050565b600080600060608486031215613f3e57600080fd5b600084013567ffffffffffffffff811115613f5857600080fd5b613f6486828701613dc6565b9350506020613f7586828701613e1a565b925050604084013567ffffffffffffffff811115613f9257600080fd5b613f9e86828701613d72565b9150509250925092565b600080600060608486031215613fbd57600080fd5b600084013567ffffffffffffffff811115613fd757600080fd5b613fe386828701613dc6565b9350506020613ff486828701613e1a565b925050604061400586828701613e1a565b9150509250925092565b600061401b838361417d565b60208301905092915050565b6000614033838361418c565b60208301905092915050565b600061404b8383614a06565b905092915050565b600061405e82614f7d565b6140688185614fdc565b935061407383614f53565b8060005b838110156140a457815161408b888261400f565b975061409683614fb5565b925050600181019050614077565b5085935050505092915050565b6140ba81614f88565b6140c48184614fed565b92506140cf82614f63565b8060005b838110156141005781516140e78782614027565b96506140f283614fc2565b9250506001810190506140d3565b505050505050565b600061411382614f94565b61411d8185614ff8565b93508360208202850161412f85614f6d565b8060005b8581101561416b578484038952815161414c858261403f565b945061415783614fcf565b925060208a01995050600181019050614133565b50829750879550505050505092915050565b61418681615048565b82525050565b61419581615054565b82525050565b6141a48161509b565b82525050565b6141b38161509b565b82525050565b60006141c482614faa565b6141ce818561502b565b93506141de8185602086016150bc565b80840191505092915050565b60006141f582614f9f565b6141ff8185615009565b935061420f8185602086016150bc565b614218816150ef565b840191505092915050565b600061422e82614f9f565b614238818561502b565b93506142488185602086016150bc565b80840191505092915050565b600061426160188361501a565b91507f496e636f7272656374206368756e6b20706f736974696f6e00000000000000006000830152602082019050919050565b60006142a160158361501a565b91507f4469726563746f7279206e6f74206372656174656400000000000000000000006000830152602082019050919050565b60006142e160248361501a565b91507f4e6f7420656e6f756768206d656d6f727920696e207468652046696c6573746f60008301527f72616765000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614347601b8361501a565b91507f48617368206861736e2774206265656e2063616c63756c6174656400000000006000830152602082019050919050565b600061438760198361501a565b91507f4368756e6b20697320616c72656164792075706c6f61646564000000000000006000830152602082019050919050565b60006143c760168361501a565b91507f496e636f7272656374206368756e6b206c656e677468000000000000000000006000830152602082019050919050565b6000614407600f8361501a565b91507f46696c65206e6f742065786973747300000000000000000000000000000000006000830152602082019050919050565b6000614447600e8361501a565b91507f496e76616c69642073656e6465720000000000000000000000000000000000006000830152602082019050919050565b600061448760188361501a565b91507f4469726563746f7279206973206e6f742064656c6574656400000000000000006000830152602082019050919050565b60006144c760108361501a565b91507f46696c65206e6f742064656c65746564000000000000000000000000000000006000830152602082019050919050565b600061450760138361501a565b91507f496e76616c69642073746f7261676550617468000000000000000000000000006000830152602082019050919050565b6000614547600c8361501a565b91507f496e76616c6964207061746800000000000000000000000000000000000000006000830152602082019050919050565b600061458760018361502b565b91507f2e000000000000000000000000000000000000000000000000000000000000006000830152600182019050919050565b60006145c760168361501a565b91507f496e76616c6964206469726563746f7279206e616d65000000000000000000006000830152602082019050919050565b600061460760158361501a565b91507f4368756e6b207761736e27742075706c6f6164656400000000000000000000006000830152602082019050919050565b600061464760268361501a565b91507f436f756c64206e6f742072657365727665206c657373207468616e207573656460008301527f20737061636500000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006146ad60168361501a565b91507f4469726563746f7279206973206e6f7420656d707479000000000000000000006000830152602082019050919050565b60006146ed60238361501a565b91507f46696c65206861736e2774206265656e2075706c6f6164656420636f7272656360008301527f746c7900000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061475360118361501a565b91507f4368756e6b207761736e277420726561640000000000000000000000000000006000830152602082019050919050565b600061479360188361501a565b91507f46696c656e616d652073686f756c64206265203c2032353600000000000000006000830152602082019050919050565b60006147d3601f8361501a565b91507f46696c652073686f756c64206265206c657373207468616e20313030204d42006000830152602082019050919050565b600061481360028361502b565b91507f2e2e0000000000000000000000000000000000000000000000000000000000006000830152600282019050919050565b600061485360118361501a565b91507f4469726563746f72792069732066756c6c0000000000000000000000000000006000830152602082019050919050565b6000614893600e8361501a565b91507f46696c65206e6f7420666f756e640000000000000000000000000000000000006000830152602082019050919050565b60006148d360188361501a565b91507f46696c65206f72206469726563746f72792065786973747300000000000000006000830152602082019050919050565b600061491360198361501a565b91507f4e6f7420656e6f756768207265736572766564207370616365000000000000006000830152602082019050919050565b600061495360188361501a565b91507f45564d206572726f7220696e2067657446696c6553697a6500000000000000006000830152602082019050919050565b600061499360108361501a565b91507f46696c65206e6f742063726561746564000000000000000000000000000000006000830152602082019050919050565b60006149d360198361501a565b91507f46696c65206861736e2774206265656e2075706c6f61646564000000000000006000830152602082019050919050565b600060a0830160008301518482036000860152614a2382826141ea565b9150506020830151614a38602086018261417d565b506040830151614a4b6040860182614a83565b506060830151614a5e606086018261419b565b5060808301518482036080860152614a768282614053565b9150508091505092915050565b614a8c81615091565b82525050565b614a9b81615091565b82525050565b6000614aad8284614223565b915081905092915050565b6000614ac482846141b9565b915081905092915050565b6000614ada8261457a565b9150819050919050565b6000614aef82614806565b9150819050919050565b60006210000082019050614b1060008301846140b1565b92915050565b60006020820190508181036000830152614b308184614108565b905092915050565b6000602082019050614b4d60008301846141aa565b92915050565b60006020820190508181036000830152614b6c81614254565b9050919050565b60006020820190508181036000830152614b8c81614294565b9050919050565b60006020820190508181036000830152614bac816142d4565b9050919050565b60006020820190508181036000830152614bcc8161433a565b9050919050565b60006020820190508181036000830152614bec8161437a565b9050919050565b60006020820190508181036000830152614c0c816143ba565b9050919050565b60006020820190508181036000830152614c2c816143fa565b9050919050565b60006020820190508181036000830152614c4c8161443a565b9050919050565b60006020820190508181036000830152614c6c8161447a565b9050919050565b60006020820190508181036000830152614c8c816144ba565b9050919050565b60006020820190508181036000830152614cac816144fa565b9050919050565b60006020820190508181036000830152614ccc8161453a565b9050919050565b60006020820190508181036000830152614cec816145ba565b9050919050565b60006020820190508181036000830152614d0c816145fa565b9050919050565b60006020820190508181036000830152614d2c8161463a565b9050919050565b60006020820190508181036000830152614d4c816146a0565b9050919050565b60006020820190508181036000830152614d6c816146e0565b9050919050565b60006020820190508181036000830152614d8c81614746565b9050919050565b60006020820190508181036000830152614dac81614786565b9050919050565b60006020820190508181036000830152614dcc816147c6565b9050919050565b60006020820190508181036000830152614dec81614846565b9050919050565b60006020820190508181036000830152614e0c81614886565b9050919050565b60006020820190508181036000830152614e2c816148c6565b9050919050565b60006020820190508181036000830152614e4c81614906565b9050919050565b60006020820190508181036000830152614e6c81614946565b9050919050565b60006020820190508181036000830152614e8c81614986565b9050919050565b60006020820190508181036000830152614eac816149c6565b9050919050565b6000602082019050614ec86000830184614a92565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614ef157600080fd5b8060405250919050565b600067ffffffffffffffff821115614f1257600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614f3e57600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050919050565b6000819050602082019050919050565b600081519050919050565b60006180009050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061504182615071565b9050919050565b60008115159050919050565b6000819050919050565b600081905061506c82615100565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006150a68261505e565b9050919050565b82818337600083830152505050565b60005b838110156150da5780820151818401526020810190506150bf565b838111156150e9576000848401525b50505050565b6000601f19601f8301169050919050565b6003811061510a57fe5b50565b61511681615036565b811461512157600080fd5b50565b61512d81615091565b811461513857600080fd5b5056fea2646970667358221220a549ad9e778ae8bb3048c0a1805e77745871cc1560637ae1c3ebccb76638d9c464736f6c63430006020033", + "nonce": "0", + "storage": {} + }, + "0xa096b05a489831db893fc53aacc7ed20efb36382": { + "balance": "1000000000000000000000000000000" + }, + "0xa1cd651d99283be60e2a9d2e3bc8a90aedb8244f": { + "balance": "1000000000000000000000000000000" + }, + "0xa2969e82619021ea407338f8bdf7c6f2bd679673": { + "balance": "1000000000000000000000000000000" + }, + "0xa3597b1162b6559cb5e966904b63e762ece756a4": { + "balance": "1000000000000000000000000000000" + }, + "0xa68f946090c600eda6f139783077ee802afeb990": { + "balance": "1000000000000000000000000000000" + }, + "0xa6d50055592cecb795bc1ed3b9ea57ed426b0b7c": { + "balance": "1000000000000000000000000000000" + }, + "0xa7c0789bdeee38c6b59111a789dfb6b815489847": { + "balance": "1000000000000000000000000000000" + }, + "0xa8c813ee806b4c8537ff5f16084d44db18ea9ab1": { + "balance": "1000000000000000000000000000000" + }, + "0xaa6a87bbb74bc1f3cb40c1efb7fc171ee6407560": { + "balance": "1000000000000000000000000000000" + }, + "0xabf920b89f5a2487fdb70be17fd01a99a0602e62": { + "balance": "1000000000000000000000000000000" + }, + "0xac5df92da5171ba24a9618018b4f79494040334b": { + "balance": "1000000000000000000000000000000" + }, + "0xaf97a8318a1a51d5daeeb9650024b63ee44f45bd": { + "balance": "1000000000000000000000000000000" + }, + "0xb28c45b98ae43a5e9ee5509c97ea037b5de5d6d9": { + "balance": "1000000000000000000000000000000" + }, + "0xb64989ab32b089da3da103b93e6781d6d5dd10b4": { + "balance": "1000000000000000000000000000000" + }, + "0xb67e6f4a21f93c250fa6ff0cb142bd14dd4ca8eb": { + "balance": "1000000000000000000000000000000" + }, + "0xb70603c505f85130b5b2e73cd82d196dfd7d8b5e": { + "balance": "1000000000000000000000000000000" + }, + "0xb942414cae2a1ab1056657b905845c0ab6b6280a": { + "balance": "1000000000000000000000000000000" + }, + "0xbee0e5c1961d51be9bd670876caa9c90ba7d9016": { + "balance": "1000000000000000000000000000000" + }, + "0xbf2d8cebdeeb8ad8fed7b2a75f35922106f8d75c": { + "balance": "1000000000000000000000000000000" + }, + "0xbf5aa678b969c0871e2fbcf09c3dbb5d5865ac1e": { + "balance": "1000000000000000000000000000000" + }, + "0xc12bcedd9bcad9120150122cd50f39576ecccc08": { + "balance": "1000000000000000000000000000000" + }, + "0xc2d3852f3292acb81bd164dbae5f1e2a87535150": { + "balance": "1000000000000000000000000000000" + }, + "0xc3820490201e94d76b44655d2df713fec29d9795": { + "balance": "1000000000000000000000000000000" + }, + "0xc58744e2eceefd45cc5469f0e0a708ad24ddbbdb": { + "balance": "1000000000000000000000000000000" + }, + "0xc7865200e8e51ba1c8d695f327deed432930f2cc": { + "balance": "1000000000000000000000000000000" + }, + "0xc8e4d709eb3eb335dc69c9fbf2d24d447cb86105": { + "balance": "1000000000000000000000000000000" + }, + "0xc98af661e44c5bf31d2f8bdff4bbf2808ed4e991": { + "balance": "1000000000000000000000000000000" + }, + "0xca4409573a5129a72edf85d6c51e26760fc9c903": { + "balance": "100000000000000000000000" + }, + "0xcc33e23b04b74f7ba8fbe315083182224af973fa": { + "balance": "1000000000000000000000000000000" + }, + "0xce1c62d0a77600fb2f959b4da76fcb9b3b9430a3": { + "balance": "1000000000000000000000000000000" + }, + "0xd1b6c947fb14060b38945584714491592e84875d": { + "balance": "1000000000000000000000000000000" + }, + "0xd23cd6a9ddcc3470300003621bbac1e06a7919d5": { + "balance": "1000000000000000000000000000000" + }, + "0xd2c5b39B4e735C17612Bb5a08FD024ccc5dBCb23": { + "balance": "100000000000000000000000" + }, + "0xd2cd302eb060e375a65d65946692a3ac2d838d35": { + "balance": "1000000000000000000000000000000" + }, + "0xd2e75c41ced8699e3176f6e335355701a2568b7b": { + "balance": "1000000000000000000000000000000" + }, + "0xd3d38f4cb0aeb4c7c2527ddaeec2ab3b910c8528": { + "balance": "1000000000000000000000000000000" + }, + "0xd5b561a27cca5049650a14ab93dbf1a20c0cefc1": { + "balance": "1000000000000000000000000000000" + }, + "0xd90045420b8abc37b3f9304ed2b385fc1b7fa8c5": { + "balance": "1000000000000000000000000000000" + }, + "0xd951bf4cff429062702a7d8699a5f0bf14845d9b": { + "balance": "1000000000000000000000000000000" + }, + "0xdc6a269c58e58a93a22b5df8cdf1af630c47481f": { + "balance": "1000000000000000000000000000000" + }, + "0xdc6d02ef4003a4f2d0ccff65ae1a2d8157fbb23e": { + "balance": "1000000000000000000000000000000" + }, + "0xde14aca36acc62c305a7ee571da37840a408e600": { + "balance": "1000000000000000000000000000000" + }, + "0xdee32ae508cf783f53ab8bc39d878fe323cdfae3": { + "balance": "1000000000000000000000000000000" + }, + "0xe083a100d51fc4f38aae4a3a68404c36ad96c612": { + "balance": "1000000000000000000000000000000" + }, + "0xe1607990ce800407e3c206e58de4917977181d4d": { + "balance": "1000000000000000000000000000000" + }, + "0xe25e5b63dfd4cf59b81eddf64f1195858634b8a6": { + "balance": "1000000000000000000000000000000" + }, + "0xe372377decb3bdc0c7f5272d38ce0ba2a54934fe": { + "balance": "1000000000000000000000000000000" + }, + "0xe3cc6ec63b5652d1594bc63bb293f4e80f76dbdd": { + "balance": "1000000000000000000000000000000" + }, + "0xe3da7c014286258944ab20a31e4d861b4c9262f1": { + "balance": "1000000000000000000000000000000" + }, + "0xe8b57f330d56081c856e618210fbedb414925ff0": { + "balance": "1000000000000000000000000000000" + }, + "0xe91ac72a568e752eb7c9f5235100586ce97c8cc1": { + "balance": "1000000000000000000000000000000" + }, + "0xf184c8c243a178c1748a0af45caedeca476105b4": { + "balance": "1000000000000000000000000000000" + }, + "0xf1a5912ff318aebf312cdb54c75642a9e632703c": { + "balance": "1000000000000000000000000000000" + }, + "0xf2197b153b4c9086fc5410431fbf7960d284c65e": { + "balance": "1000000000000000000000000000000" + }, + "0xf36620e71327f4a55d550d46e030ccf0c728f154": { + "balance": "1000000000000000000000000000000" + }, + "0xf9817fB82fc767aA9A4A97a1901676244b88ce0E": { + "balance": "100000000000000000000000" + }, + "0xfa723938fa8da1a8a2114ad409a11581761ee40d": { + "balance": "1000000000000000000000000000000" + }, + "0xfa7a8c69810eaf16a395d2a93b3ab51efeed2a1c": { + "balance": "1000000000000000000000000000000" + }, + "0xfaa1038074941571524934ba52d312e88b3577f5": { + "balance": "1000000000000000000000000000000" + }, + "0xfe14077c26a507496b7208384d459e21c49c4212": { + "balance": "1000000000000000000000000000000" + }, + "0xfe275c9b5ac792327da509b27eb9614196dfb07d": { + "balance": "1000000000000000000000000000000" + }, + "0xfe2c5aa110fff89361806ea7ee080bfffba0d3dd": { + "balance": "1000000000000000000000000000000" + }, + "0xfe3d4f1fc038f4f756ba44995129cd45c9e0e861": { + "balance": "1000000000000000000000000000000" + }, + "0xfee314cdc84ecfaa675e41b3559c0101e1eba6b8": { + "balance": "1000000000000000000000000000000" + } + }, + "genesis": { + "author": "0x0000000000000000000000000000000000000001", + "difficulty": "0x0", + "extraData": "0x11bbe8db4e347b4e8c937c1c8370e4b5ed33adb3db69cbdb7a38e1e50b1b82fa", + "gasLimit": "0xFFFFFFFFF", + "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000abc", + "nonce": "0x0000000000000042", + "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "timestamp": "0x00" + }, + "params": { + "EIP150ForkBlock": "0x00", + "EIP158ForkBlock": "0x00", + "accountStartNonce": "0x00", + "blockReward": "0x4563918244F40000", + "byzantiumForkBlock": "0x0", + "chainID": "0x12345", + "constantinopleForkBlock": "0x0", + "daoHardforkBlock": "0x0", + "difficultyBoundDivisor": "0x0800", + "durationLimit": "0x0d", + "externalGasDifficulty": "0x01", + "gasLimitBoundDivisor": "0x0400", + "homesteadForkBlock": "0x0", + "maxGasLimit": "0xFFFFFFFFF", + "maximumExtraDataSize": "0x20", + "minGasLimit": "0xFFFFFFFFF", + "minimumDifficulty": "0x0", + "networkID": "12313219", + "tieBreakingGas": false + }, + "sealEngine": "Ethash", + "skaleConfig": { + "nodeInfo": { + "basePort": 2431, + "bindIP": "0.0.0.0", + "collectionDuration": 10, + "collectionQueueSize": 2, + "db-path": "/tmp/test_eth_13_of_16", + "ecdsaKeyName": "", + "httpRpcPort": 2434, + "httpsRpcPort": 1239, + "logLevel": "info", + "logLevelProposal": "info", + "maxCacheSize": 2000, + "maxOpenLeveldbFiles": 25, + "minCacheSize": 1000, + "nodeID": 1613, + "nodeName": "Node1", + "rotateAfterBlock": 0, + "testSignatures": true, + "transactionQueueSize": 10000, + "wsRpcPort": 2433, + "wssRpcPort": 2438 + }, + "sChain": { + "EIP1559TransactionsPatchTimestamp": 1, + "contractStorageLimit": 10000000000, + "contractStoragePatchTimestamp": 1, + "contractStorageZeroValuePatchTimestamp": 1, + "correctForkInPowPatchTimestamp": 1, + "emptyBlockIntervalMs": 10000, + "fastConsensusPatchTimestamp": 1, + "flexibleDeploymentPatchTimestamp": 1, + "levelDBReopenIntervalMs": 1, + "multiTransactionMode": false, + "nodes": [ + { + "basePort": 1231, + "ip": "127.0.0.1", + "nodeID": 1601, + "publicKey": "", + "schainIndex": 1 + }, + { + "basePort": 1331, + "ip": "127.0.0.1", + "nodeID": 1602, + "publicKey": "", + "schainIndex": 2 + }, + { + "basePort": 1431, + "ip": "127.0.0.1", + "nodeID": 1603, + "publicKey": "", + "schainIndex": 3 + }, + { + "basePort": 1531, + "ip": "127.0.0.1", + "nodeID": 1604, + "publicKey": "", + "schainIndex": 4 + }, + { + "basePort": 1631, + "ip": "127.0.0.1", + "nodeID": 1605, + "publicKey": "", + "schainIndex": 5 + }, + { + "basePort": 1731, + "ip": "127.0.0.1", + "nodeID": 1606, + "publicKey": "", + "schainIndex": 6 + }, + { + "basePort": 1831, + "ip": "127.0.0.1", + "nodeID": 1607, + "publicKey": "", + "schainIndex": 7 + }, + { + "basePort": 1931, + "ip": "127.0.0.1", + "nodeID": 1608, + "publicKey": "", + "schainIndex": 8 + }, + { + "basePort": 2031, + "ip": "127.0.0.1", + "nodeID": 1609, + "publicKey": "", + "schainIndex": 9 + }, + { + "basePort": 2131, + "ip": "127.0.0.1", + "nodeID": 1610, + "publicKey": "", + "schainIndex": 10 + }, + { + "basePort": 2231, + "ip": "127.0.0.1", + "nodeID": 1611, + "publicKey": "", + "schainIndex": 11 + }, + { + "basePort": 2331, + "ip": "127.0.0.1", + "nodeID": 1612, + "publicKey": "", + "schainIndex": 12 + }, + { + "basePort": 2431, + "ip": "127.0.0.1", + "nodeID": 1613, + "publicKey": "", + "schainIndex": 13 + }, + { + "basePort": 2531, + "ip": "127.0.0.1", + "nodeID": 1614, + "publicKey": "", + "schainIndex": 14 + }, + { + "basePort": 2631, + "ip": "127.0.0.1", + "nodeID": 1615, + "publicKey": "", + "schainIndex": 15 + }, + { + "basePort": 2731, + "ip": "127.0.0.1", + "nodeID": 1616, + "publicKey": "", + "schainIndex": 16 + } + ], + "powCheckPatchTimestamp": 1, + "precompiledConfigPatchTimestamp": 1, + "pushZeroPatchTimestamp": 1, + "revertableFSPatchTimestamp": 1, + "schainID": 5, + "schainName": "TestChain", + "schainOwner": "0x907cd0881E50d359bb9Fd120B1A5A143b1C97De6", + "skipInvalidTransactionsPatchTimestamp": 1, + "storageDestructionPatchTimestamp": 1, + "verifyBlsSyncPatchTimestamp": 1, + "verifyDaSigsPatchTimestamp": 1 + } + }, + "unddos": { + "origins": [ + { + "ban_lengthy": 0, + "ban_peak": 0, + "max_calls_per_minute": 1000000000, + "max_calls_per_second": 1000000000, + "max_ws_conn": 65535, + "origin": [ + "*" + ] + } + ] + } +} \ No newline at end of file diff --git a/test/historicstate/configs/test_14_of_16.json b/test/historicstate/configs/test_14_of_16.json new file mode 100644 index 000000000..4c3fa3486 --- /dev/null +++ b/test/historicstate/configs/test_14_of_16.json @@ -0,0 +1,910 @@ +{ + "accounts": { + "0000000000000000000000000000000000000001": { + "precompiled": { + "linear": { + "base": 3000, + "word": 0 + }, + "name": "ecrecover" + } + }, + "0000000000000000000000000000000000000002": { + "precompiled": { + "linear": { + "base": 60, + "word": 12 + }, + "name": "sha256" + } + }, + "0000000000000000000000000000000000000003": { + "precompiled": { + "linear": { + "base": 600, + "word": 120 + }, + "name": "ripemd160" + } + }, + "0000000000000000000000000000000000000004": { + "precompiled": { + "linear": { + "base": 15, + "word": 3 + }, + "name": "identity" + } + }, + "0000000000000000000000000000000000000005": { + "precompiled": { + "name": "modexp", + "startingBlock": "0x2dc6c0" + } + }, + "0000000000000000000000000000000000000006": { + "precompiled": { + "linear": { + "base": 500, + "word": 0 + }, + "name": "alt_bn128_G1_add", + "startingBlock": "0x2dc6c0" + } + }, + "0000000000000000000000000000000000000007": { + "precompiled": { + "linear": { + "base": 40000, + "word": 0 + }, + "name": "alt_bn128_G1_mul", + "startingBlock": "0x2dc6c0" + } + }, + "0000000000000000000000000000000000000008": { + "precompiled": { + "name": "alt_bn128_pairing_product", + "startingBlock": "0x2dc6c0" + } + }, + "000000000000000000000000000000000000000A": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "readChunk", + "startingBlock": "0x0" + } + }, + "000000000000000000000000000000000000000B": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "createFile", + "restrictAccess": [ + "69362535ec535F0643cBf62D16aDeDCAf32Ee6F7" + ], + "startingBlock": "0x0" + } + }, + "000000000000000000000000000000000000000C": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "uploadChunk", + "startingBlock": "0x0" + } + }, + "000000000000000000000000000000000000000D": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "getFileSize", + "startingBlock": "0x0" + } + }, + "000000000000000000000000000000000000000E": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "deleteFile", + "startingBlock": "0x0" + } + }, + "000000000000000000000000000000000000000F": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "createDirectory", + "startingBlock": "0x0" + } + }, + "0000000000000000000000000000000000000010": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "deleteDirectory", + "startingBlock": "0x0" + } + }, + "0x006d8e49ce0b9eb5646e34a4d91934801b9044fd": { + "balance": "1000000000000000000000000000000" + }, + "0x0150b461b06922a5030784ba888962c28bb1f188": { + "balance": "1000000000000000000000000000000" + }, + "0x03309956988ae70152ae4469daf99b0cac2306c5": { + "balance": "1000000000000000000000000000000" + }, + "0x06104a85a380895b6dd4030113806df2b044905e": { + "balance": "1000000000000000000000000000000" + }, + "0x079cf317ef40b16141784b6fabff812d64f7c0fd": { + "balance": "1000000000000000000000000000000" + }, + "0x0966454f51166c68b73b2865473c8fb2fcdefdd5": { + "balance": "1000000000000000000000000000000" + }, + "0x099452fedc71897880f584b1bc1706efc4e76e36": { + "balance": "1000000000000000000000000000000" + }, + "0x0aa6a44690ef52354e976990292cf9c5cd36ad59": { + "balance": "1000000000000000000000000000000" + }, + "0x0fbbe17a0e5a61ee3e8661f442d7f6b177c49820": { + "balance": "1000000000000000000000000000000" + }, + "0x1239fe658b410dbbac5bbd572035f5041542f9e5": { + "balance": "1000000000000000000000000000000" + }, + "0x12d5d7340a93be7be28ea7a3ae198242f8e1282c": { + "balance": "1000000000000000000000000000000" + }, + "0x137048b9fa4f1234d6519271b2c5ec64f480db0f": { + "balance": "1000000000000000000000000000000" + }, + "0x13867af77a63048e17380e39248ada90521e97e4": { + "balance": "1000000000000000000000000000000" + }, + "0x138ea4bdf0382c2deffd5b0bff0afe59f471467f": { + "balance": "1000000000000000000000000000000" + }, + "0x13d19c55ee0a212249d26b9d741ff6d7f416db01": { + "balance": "1000000000000000000000000000000" + }, + "0x157d38b52196b248e9fe6a2172e32ce2b8c078e6": { + "balance": "1000000000000000000000000000000" + }, + "0x16e8c390f8e576161cfe966f2c3e5dd303eb9039": { + "balance": "1000000000000000000000000000000" + }, + "0x194cb9991d3d94c43e400becf21dfea45e7b3b4c": { + "balance": "1000000000000000000000000000000" + }, + "0x1C9abe4ff0CcECa40fc404c74AB7d4923fEF8901": { + "balance": "100000000000000000000000" + }, + "0x1a66fc89809112c20aa76a993db712fa9e003e4e": { + "balance": "1000000000000000000000000000000" + }, + "0x1f1d6041e12a18cf1202019f146f2fc150915e8d": { + "balance": "1000000000000000000000000000000" + }, + "0x1feaf1671c1f0faf0d44c152f72dc755db932569": { + "balance": "1000000000000000000000000000000" + }, + "0x236bf02dfafaf03851a4e6f5d69052f4884cec32": { + "balance": "1000000000000000000000000000000" + }, + "0x26d88f6a8b659be4165ee53774a057e41b5201c9": { + "balance": "1000000000000000000000000000000" + }, + "0x28353685b0b986a724b92113debb3d8cd9a6b263": { + "balance": "1000000000000000000000000000000" + }, + "0x29d83322219fdfb821459d5fdf796360faf3166a": { + "balance": "1000000000000000000000000000000" + }, + "0x2bee474be207bdbeac83d6672da5ed2fd417eac9": { + "balance": "1000000000000000000000000000000" + }, + "0x2d93455b07bccf38e8d019f7f43a2c2d70b46b4e": { + "balance": "1000000000000000000000000000000" + }, + "0x2f971bd38806c3ca45ae0a125d1267118bf5619c": { + "balance": "1000000000000000000000000000000" + }, + "0x30aaab366dfac8331f3e827495c789cde9b437c0": { + "balance": "1000000000000000000000000000000" + }, + "0x32ea0400dc2d20664cc4744b2fab04ecb709445c": { + "balance": "1000000000000000000000000000000" + }, + "0x3760dc9594ccac0f33ade5cc5371402131696341": { + "balance": "1000000000000000000000000000000" + }, + "0x38855e430611bc179cd777a8704679ffc43921de": { + "balance": "1000000000000000000000000000000" + }, + "0x3a921471a2397644c37c88ef9572c421ab37145d": { + "balance": "1000000000000000000000000000000" + }, + "0x3bcca8a8471d55a1a668bc163c0336e4a57e5c99": { + "balance": "1000000000000000000000000000000" + }, + "0x3d46ee560227c1d73cd6042b47fc8fddd8a06ecb": { + "balance": "1000000000000000000000000000000" + }, + "0x3f5bdf5d4c274c82b8d17aa2810b00d2cf050f24": { + "balance": "1000000000000000000000000000000" + }, + "0x3ffe1c9183e0f97f52a816405a7d2350624ec88b": { + "balance": "1000000000000000000000000000000" + }, + "0x426ec5f07847674aada3856609d8baaa16805d88": { + "balance": "1000000000000000000000000000000" + }, + "0x482d7f53cba6ae73a354533673c48e2dfd560949": { + "balance": "1000000000000000000000000000000" + }, + "0x48acbd6a2724eadcc2a11144ab84b6a617d1a241": { + "balance": "1000000000000000000000000000000" + }, + "0x49ef89840e400026eb5c8d79bd1b0adc152fe86d": { + "balance": "1000000000000000000000000000000" + }, + "0x4bf989fa6572af36b190032505506f1db888357f": { + "balance": "1000000000000000000000000000000" + }, + "0x4cf9b195f7cb5f86694d9b399fe21a5f34616fd3": { + "balance": "1000000000000000000000000000000" + }, + "0x4e9b85904bca60aeb5b916ca86ac622096908427": { + "balance": "1000000000000000000000000000000" + }, + "0x50120c17d7b59200e9b76e89e4e3de2f0cd00090": { + "balance": "1000000000000000000000000000000" + }, + "0x54db355342c35085a1a53184162b2fddd0a43b0f": { + "balance": "1000000000000000000000000000000" + }, + "0x54e228d8fea148cfe2b109b3b152ff21321d09a2": { + "balance": "1000000000000000000000000000000" + }, + "0x5667601b7dcde6f24d06bccc4f291cb06976f4ee": { + "balance": "1000000000000000000000000000000" + }, + "0x57829f2ecca390cd9d1c41f92328bad4d1073bbb": { + "balance": "1000000000000000000000000000000" + }, + "0x5EF25557E2ed6AFfF321B266C93e95A0B4B05AbC": { + "balance": "1000000000000000000000000" + }, + "0x5a3adad4382b3eb1e0c65f2de2845901081039b5": { + "balance": "1000000000000000000000000000000" + }, + "0x5cdb7392efdce502ccc6fba5c3c1dd1653967b4d": { + "balance": "1000000000000000000000000000000" + }, + "0x5d012c13b2854bda8b7b6580e97e52751884f827": { + "balance": "1000000000000000000000000000000" + }, + "0x5d9326c6504833d84f8a0d65ded59b1a6e768ca2": { + "balance": "1000000000000000000000000000000" + }, + "0x60268f799d8f1808e4a32c2eb898e73a8881f6f0": { + "balance": "1000000000000000000000000000000" + }, + "0x605ba4a05d779f9869bd9a10234c22f516766cfe": { + "balance": "1000000000000000000000000000000" + }, + "0x6093f0f2a7b5148b71603ac439adbc4c0e5aa5da": { + "balance": "1000000000000000000000000000000" + }, + "0x6196d135CdDb9d73A0756C1E44b5b02B11acf594": { + "balance": "2000000000000000000000", + "code": "", + "nonce": "5076", + "storage": {} + }, + "0x62712ceccb50f62ca4c5402fff6da9c819c866cf": { + "balance": "1000000000000000000000000000000" + }, + "0x62971de462ea1ec0d3b43a6a85b6fb975e6c6f64": { + "balance": "1000000000000000000000000000000" + }, + "0x62cf32dfb9eb6358dc5deb006aef1d75fb153e5f": { + "balance": "1000000000000000000000000000000" + }, + "0x62d8b22c1d71577829b2fee20a5c3fff43aed0ec": { + "balance": "100000000000000000000000" + }, + "0x6314956b78bb2eaed1c49b3ae71d4d0ec501cfab": { + "balance": "1000000000000000000000000000000" + }, + "0x661bda4daeba3ce9ac2aa30b80d463580f90d31a": { + "balance": "1000000000000000000000000000000" + }, + "0x66c5a87f4a49DD75e970055A265E8dd5C3F8f852": { + "balance": "1000000000000000000000" + }, + "0x66cd465ddcd85504c0d2cfb1728acee994d55a3f": { + "balance": "1000000000000000000000000000000" + }, + "0x68bca79ae7aae796027ff843d2303444da5cf5d8": { + "balance": "1000000000000000000000000000000" + }, + "0x6923877b65e24966efa9efd1207822fa2eaf601a": { + "balance": "1000000000000000000000000000000" + }, + "0x69362535ec535F0643cBf62D16aDeDCAf32Ee6F7": { + "balance": "0", + "code": "0x608060405234801561001057600080fd5b50600436106100b45760003560e01c806379210e8e1161007157806379210e8e1461017757806381a8235a146101a757806385aeeb17146101c35780639a9a5593146101f3578063a99100541461020f578063b57321221461022b576100b4565b806307c6e7d3146100b9578063122f4fba146100d55780631c6ec7a9146101055780631cfe4e3b14610121578063373dedb41461013d57806361e46db51461015b575b600080fd5b6100d360048036036100ce9190810190613cff565b61025b565b005b6100ef60048036036100ea9190810190613cff565b610804565b6040516100fc9190614963565b60405180910390f35b61011f600480360361011a9190810190613cff565b610b43565b005b61013b60048036036101369190810190613cc3565b610f72565b005b610145611190565b6040516101529190614cbe565b60405180910390f35b61017560048036036101709190810190613d94565b611199565b005b610191600480360361018c9190810190613e13565b6113f9565b60405161019e9190614924565b60405180910390f35b6101c160048036036101bc9190810190613cff565b6116f9565b005b6101dd60048036036101d89190810190613cff565b61189e565b6040516101ea9190614941565b60405180910390f35b61020d60048036036102089190810190613d40565b611b9d565b005b61022960048036036102249190810190613cff565b61202c565b005b61024560048036036102409190810190613cff565b612682565b6040516102529190614cbe565b60405180910390f35b6000339050606061026b83612902565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b825181101561037c576000826001018460018403815181106102d557fe5b60200260200101516040516102ea91906148cc565b90815260200160405180910390205411610339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161033090614ade565b60405180910390fd5b8160020183600183038151811061034c57fe5b602002602001015160405161036191906148cc565b908152602001604051809103902091508060010190506102b7565b506060600183511161038e57846103a7565b8260018451038151811061039e57fe5b60200260200101515b9050600082600101826040516103bd91906148e3565b9081526020016040518091039020541161040c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161040390614ade565b60405180910390fd5b6000826002018260405161042091906148e3565b90815260200160405180910390206000018054905014610475576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161046c90614b5e565b60405180910390fd5b60006104818587612b02565b9050806104c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ba90614a7e565b60405180910390fd5b6104cb613888565b836000016001856000018054905003815481106104e457fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156105965780601f1061056b57610100808354040283529160200191610596565b820191906000526020600020905b81548152906001019060200180831161057957829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff1660028111156105e257fe5b60028111156105ed57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561066557602002820191906000526020600020906000905b82829054906101000a900460ff1615158152602001906001019060208260000104928301926001038202915080841161062f5790505b505050505081525050905080846000016001866001018660405161068991906148e3565b90815260200160405180910390205403815481106106a357fe5b906000526020600020906005020160008201518160000190805190602001906106cd9291906138c4565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561071c57fe5b0217905550608082015181600401908051906020019061073d929190613944565b50905050836001018360405161075391906148e3565b90815260200160405180910390205484600101826000015160405161077891906148cc565b9081526020016040518091039020819055506000846001018460405161079e91906148e3565b908152602001604051809103902081905550836000018054809190600190036107c791906139ea565b5083600201836040516107da91906148e3565b9081526020016040518091039020600080820160006107f99190613a1c565b505050505050505050565b600080606061081284612b66565b91509150606061082182612902565b90506000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b82518110156109065760008260010184600184038151811061088b57fe5b60200260200101516040516108a091906148cc565b90815260200160405180910390205414156108c357600095505050505050610b3e565b816002018360018303815181106108d657fe5b60200260200101516040516108eb91906148cc565b9081526020016040518091039020915080600101905061086d565b50606060018351116109185783610931565b8260018451038151811061092857fe5b60200260200101515b90506000826001018260405161094791906148e3565b908152602001604051809103902054141561096a57600095505050505050610b3e565b610972613888565b826000016001846001018460405161098a91906148e3565b90815260200160405180910390205403815481106109a457fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610a565780601f10610a2b57610100808354040283529160200191610a56565b820191906000526020600020905b815481529060010190602001808311610a3957829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115610aa257fe5b6002811115610aad57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015610b2557602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411610aef5790505b5050505050815250509050806060015196505050505050505b919050565b600160009054906101000a900460ff16610b85576120006002819055506210000060038190555060018060006101000a81548160ff0219169083151502179055505b6000815111610bc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc090614ade565b60405180910390fd5b60003390506060610bd983612902565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015610cea57600082600101846001840381518110610c4357fe5b6020026020010151604051610c5891906148cc565b90815260200160405180910390205411610ca7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9e90614ade565b60405180910390fd5b81600201836001830381518110610cba57fe5b6020026020010151604051610ccf91906148cc565b90815260200160405180910390209150806001019050610c25565b50600254816000018054905010610d36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2d90614bfe565b60405180910390fd5b60606001835111610d475784610d60565b82600184510381518110610d5757fe5b60200260200101515b905060008260010182604051610d7691906148e3565b90815260200160405180910390205414610dc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbc90614c3e565b60405180910390fd5b610dce81612ee8565b610e0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0490614afe565b60405180910390fd5b6000610e198587612fc9565b905080610e5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e529061499e565b60405180910390fd5b610e63613888565b82816000018190525060008160200190151590811515815250508360000181908060018154018082558091505090600182039060005260206000209060050201600090919290919091506000820151816000019080519060200190610ec99291906138c4565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff02191690836002811115610f1857fe5b02179055506080820151816004019080519060200190610f39929190613944565b5050505083600001805490508460010184604051610f5791906148e3565b90815260200160405180910390208190555050505050505050565b610f7a61302d565b73ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161480610fdf57503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614155b61101e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101590614a5e565b60405180910390fd5b80600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411156110a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109790614b3e565b60405180910390fd5b600054600754820111156110e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e0906149be565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460076000828254039250508190555080600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550806007600082825401925050819055505050565b60008054905090565b600033905060006111aa82866130c6565b9050600160028111156111b957fe5b8160030160009054906101000a900460ff1660028111156111d657fe5b14611216576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120d90614c1e565b60405180910390fd5b6000600354858161122357fe5b061480156112345750806002015484105b611273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126a9061497e565b60405180910390fd5b600354848260020154031080156112905750838160020154038351145b8061129d57506003548351145b6112dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d390614a1e565b60405180910390fd5b600015158160040160035486816112ef57fe5b04815481106112fa57fe5b90600052602060002090602091828204019190069054906101000a900460ff1615151461135c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611353906149fe565b60405180910390fd5b600061136a838787876132c5565b9050806113ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a390614b1e565b60405180910390fd5b60018260040160035487816113bd57fe5b04815481106113c857fe5b90600052602060002090602091828204019190066101000a81548160ff021916908315150217905550505050505050565b611401613a40565b6000606061140e86612b66565b9150915061141a613888565b61142483836130c6565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156114c85780601f1061149d576101008083540402835291602001916114c8565b820191906000526020600020905b8154815290600101906020018083116114ab57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561151457fe5b600281111561151f57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561159757602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116115615790505b50505050508152505090506002808111156115ae57fe5b816060015160028111156115be57fe5b146115fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f590614c9e565b60405180910390fd5b60035485111580156116105750600085115b61164f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164690614a1e565b60405180910390fd5b80604001518587011115611698576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168f9061497e565b60405180910390fd5b60006116a684848989613376565b8096508192505050806116ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e590614b9e565b60405180910390fd5b505050509392505050565b6000339050600061170a82846130c6565b90506001600281111561171957fe5b8160030160009054906101000a900460ff16600281111561173657fe5b14611776576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176d90614c1e565b60405180910390fd5b60006001905060008260040180549050905060008090505b818110156117e157600015158460040182815481106117a957fe5b90600052602060002090602091828204019190069054906101000a900460ff16151514156117d657600092505b80600101905061178e565b5081611822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181990614b7e565b60405180910390fd5b60028360030160006101000a81548160ff0219169083600281111561184357fe5b021790555060006118548587613409565b905080611896576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188d906149de565b60405180910390fd5b505050505050565b6060600060606118ad84612b66565b9150915060606118bc82612902565b90506000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008090505b82518110156119c65760008260010184838151811061192257fe5b602002602001015160405161193791906148cc565b90815260200160405180910390205411611986576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197d90614ade565b60405180910390fd5b8160020183828151811061199657fe5b60200260200101516040516119ab91906148cc565b90815260200160405180910390209150806001019050611907565b5080600001805480602002602001604051908101604052809291908181526020016000905b82821015611b8e57838290600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611aa75780601f10611a7c57610100808354040283529160200191611aa7565b820191906000526020600020905b815481529060010190602001808311611a8a57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115611af357fe5b6002811115611afe57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015611b7657602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411611b405790505b505050505081525050815260200190600101906119eb565b50505050945050505050919050565b600160009054906101000a900460ff16611bdf576120006002819055506210000060038190555060018060006101000a81548160ff0219169083151502179055505b60003390506305f5e100821115611c2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2290614bde565b60405180910390fd5b6060611c3684612902565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015611d4757600082600101846001840381518110611ca057fe5b6020026020010151604051611cb591906148cc565b90815260200160405180910390205411611d04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cfb90614ade565b60405180910390fd5b81600201836001830381518110611d1757fe5b6020026020010151604051611d2c91906148cc565b90815260200160405180910390209150806001019050611c82565b5060606001835111611d595785611d72565b82600184510381518110611d6957fe5b60200260200101515b905060008260010182604051611d8891906148e3565b90815260200160405180910390205414611dd7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dce90614c3e565b60405180910390fd5b611de081612ee8565b611e1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1690614bbe565b60405180910390fd5b6000611e2c85888861346d565b905080611e6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6590614c7e565b60405180910390fd5b6060600354600160035489010381611e8257fe5b04604051908082528060200260200182016040528015611eb15781602001602082028038833980820191505090505b509050836000016040518060a0016040528085815260200160011515815260200189815260200160016002811115611ee557fe5b815260200183815250908060018154018082558091505090600182039060005260206000209060050201600090919290919091506000820151816000019080519060200190611f359291906138c4565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff02191690836002811115611f8457fe5b02179055506080820151816004019080519060200190611fa5929190613944565b5050505083600001805490508460010184604051611fc391906148e3565b90815260200160405180910390208190555086600560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505050505050505050565b6000339050612039613888565b61204382846130c6565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156120e75780601f106120bc576101008083540402835291602001916120e7565b820191906000526020600020905b8154815290600101906020018083116120ca57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561213357fe5b600281111561213e57fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156121b657602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116121805790505b5050505050815250509050600060028111156121ce57fe5b816060015160028111156121de57fe5b141561221f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221690614a3e565b60405180910390fd5b600061222b83856134da565b90508061226d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226490614a9e565b60405180910390fd5b606061227885612902565b90506000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b825181101561231057816002018360018303815181106122e057fe5b60200260200101516040516122f591906148cc565b908152602001604051809103902091508060010190506122c4565b506000600182600101866000015160405161232b91906148cc565b908152602001604051809103902054039050612345613888565b8260000160018460000180549050038154811061235e57fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156124105780601f106123e557610100808354040283529160200191612410565b820191906000526020600020905b8154815290600101906020018083116123f357829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561245c57fe5b600281111561246757fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156124df57602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116124a95790505b5050505050815250509050808360000183815481106124fa57fe5b906000526020600020906005020160008201518160000190805190602001906125249291906138c4565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561257357fe5b02179055506080820151816004019080519060200190612594929190613944565b50905050826000018054809190600190036125af91906139ea565b508260010186600001516040516125c691906148cc565b9081526020016040518091039020548360010182600001516040516125eb91906148cc565b908152602001604051809103902081905550600083600101876000015160405161261591906148cc565b9081526020016040518091039020819055508560400151600560008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505050505050505050565b600080606061269084612b66565b9150915061269c613888565b6126a683836130c6565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561274a5780601f1061271f5761010080835404028352916020019161274a565b820191906000526020600020905b81548152906001019060200180831161272d57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561279657fe5b60028111156127a157fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561281957602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116127e35790505b50505050508152505090506001600281111561283157fe5b8160600151600281111561284157fe5b1480612866575060028081111561285457fe5b8160600151600281111561286457fe5b145b6128a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161289c90614c1e565b60405180910390fd5b60006128b1848461353e565b8096508192505050806128f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128f090614c5e565b60405180910390fd5b50505050919050565b606061290c613a65565b612915836135a7565b905061291f613a65565b61295d6040518060400160405280600181526020017f2f000000000000000000000000000000000000000000000000000000000000008152506135a7565b90506060600161297683856135d590919063ffffffff16565b016040519080825280602002602001820160405280156129aa57816020015b60608152602001906001900390816129955790505b50905060008090505b81518110156129fb576129d76129d2848661364a90919063ffffffff16565b613664565b8282815181106129e357fe5b602002602001018190525080806001019150506129b3565b50600081600183510381518110612a0e57fe5b6020026020010151511415612a795780600182510381518110612a2d57fe5b6020026020010160608152506001815103604051908082528060200260200182016040528015612a7157816020015b6060815260200190600190039081612a5c5790505b509350612ab2565b8051604051908082528060200260200182016040528015612aae57816020015b6060815260200190600190039081612a995790505b5093505b60008090505b8451811015612af957818181518110612acd57fe5b6020026020010151858281518110612ae157fe5b60200260200101819052508080600101915050612ab8565b50505050919050565b60008060016020601f85510181612b1557fe5b040190506040518481526020810160005b83811015612b47578060200286015181602002830152806001019050612b26565b50602082602085026040018460006010600019f1935050505092915050565b6000606060006028905080845111612bb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612baa90614abe565b60405180910390fd5b6060816040519080825280601f01601f191660200182016040528015612be85781602001600182028038833980820191505090505b50905060008090505b82811015612c5857858181518110612c0557fe5b602001015160f81c60f81b828281518110612c1c57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050612bf1565b50600080905060008090505b83811015612d87576000838281518110612c7a57fe5b602001015160f81c60f81b60f81c60ff16905060308110158015612c9f575060398111155b80612cb8575060418110158015612cb75750605a8111155b5b80612cd1575060618110158015612cd0575060668111155b5b612d10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d0790614abe565b60405180910390fd5b60308110158015612d22575060398111155b15612d335760308103601084020192505b60418110158015612d455750605a8111155b15612d565760378103601084020192505b60618110158015612d68575060668111155b15612d795760578103601084020192505b508080600101915050612c64565b508094507f2f00000000000000000000000000000000000000000000000000000000000000868481518110612db857fe5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612e25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e1c90614abe565b60405180910390fd5b6000600184885103039050806040519080825280601f01601f191660200182016040528015612e635781602001600182028038833980820191505090505b50945060008090505b81811015612ede5760008860018784010181518110612e8757fe5b602001015160f81c60f81b905080878381518110612ea157fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350508080600101915050612e6c565b5050505050915091565b6000604051602001612ef99061490f565b6040516020818303038152906040528051906020012082604051602001612f2091906148e3565b604051602081830303815290604052805190602001201480612f8b5750604051602001612f4c906148fa565b6040516020818303038152906040528051906020012082604051602001612f7391906148e3565b60405160208183030381529060405280519060200120145b80612f97575060008251145b15612fa55760009050612fc4565b60008251905060ff811115612fbe576000915050612fc4565b60019150505b919050565b60008060016020601f85510181612fdc57fe5b040190506040518481526020810160005b8381101561300e578060200286015181602002830152806001019050612fed565b5060208260208502604001846000600f600019f1935050505092915050565b600073d2001000000000000000000000000000000000d273ffffffffffffffffffffffffffffffffffffffff166383e781fe6040518163ffffffff1660e01b815260040160206040518083038186803b15801561308957600080fd5b505afa15801561309d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506130c19190810190613c9a565b905090565b600060606130d383612902565b90506000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b82518110156131e45760008260010184600184038151811061313d57fe5b602002602001015160405161315291906148cc565b908152602001604051809103902054116131a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161319890614ade565b60405180910390fd5b816002018360018303815181106131b457fe5b60200260200101516040516131c991906148cc565b9081526020016040518091039020915080600101905061311f565b50606060018351116131f6578461320f565b8260018451038151811061320657fe5b60200260200101515b90506000826001018260405161322591906148e3565b90815260200160405180910390205411613274576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161326b90614ade565b60405180910390fd5b6000826000016001846001018460405161328e91906148e3565b90815260200160405180910390205403815481106132a857fe5b906000526020600020906005020190508094505050505092915050565b60008060016020601f855101816132d857fe5b04019050600060016020601f885101816132ee57fe5b040190506040518781526020810160005b838110156133205780602002890151816020028301528060010190506132ff565b50868360200282015260005b84811015613352578060200287015181856001010160200283015280600101905061332c565b50602082848601602002606001846000600c600019f1945050505050949350505050565b6000613380613a40565b600060016020601f8851018161339257fe5b0401905060006020601f8601816133a557fe5b0490506040518881526020810160005b848110156133d657806020028a0151816020028301528060010190506133b5565b5083602002810188815287816020015283602002868660030160200285600a600019fa9650505050505094509492505050565b60008060016020601f8551018161341c57fe5b040190506040518481526020810160005b8381101561344e57806020028601518160200283015280600101905061342d565b50602082602085026040018460006011600019f1935050505092915050565b60008060016020601f8651018161348057fe5b040190506040518581526020810160005b838110156134b2578060200287015181602002830152806001019050613491565b50846020840282015260208260208502604001846000600b600019f193505050509392505050565b60008060016020601f855101816134ed57fe5b040190506040518481526020810160005b8381101561351f5780602002860151816020028301528060010190506134fe565b5060208260208502604001846000600e600019f1935050505092915050565b600080600060016020601f8651018161355357fe5b040190506040518581526020810160005b83811015613585578060200287015181602002830152806001019050613564565b506020826020850260200184600d600019fa9450815193505050509250929050565b6135af613a65565b600060208301905060405180604001604052808451815260200182815250915050919050565b60008082600001516135f985600001518660200151866000015187602001516136c6565b0190505b83600001518460200151018111613643578180600101925050826000015161363b8560200151830386600001510383866000015187602001516136c6565b0190506135fd565b5092915050565b613652613a65565b61365d8383836137a1565b5092915050565b60608082600001516040519080825280601f01601f19166020018201604052801561369e5781602001600182028038833980820191505090505b50905060006020820190506136bc818560200151866000015161383f565b8192505050919050565b6000808490506000868511613791576020851161374b57600060018660200360080260020a031960001b905060008186511690506000878a8a0103905060008386511690505b82811461373d5781861061372a578a8a019650505050505050613799565b858060010196505083865116905061370c565b859650505050505050613799565b60008585209050600091505b858803821161378f57600086842090508082141561377b5783945050505050613799565b600184019350508180600101925050613757565b505b868601925050505b949350505050565b6137a9613a65565b60006137c785600001518660200151866000015187602001516136c6565b90508460200151836020018181525050846020015181038360000181815250508460000151856020015101811415613809576000856000018181525050613834565b8360000151836000015101856000018181510391508181525050836000015181018560200181815250505b829150509392505050565b5b602081106138635781518352602083019250602082019150602081039050613840565b60006001826020036101000a0390508019835116818551168181178652505050505050565b6040518060a001604052806060815260200160001515815260200160008152602001600060028111156138b757fe5b8152602001606081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061390557805160ff1916838001178555613933565b82800160010185558215613933579182015b82811115613932578251825591602001919060010190613917565b5b5090506139409190613a7f565b5090565b82805482825590600052602060002090601f016020900481019282156139d95791602002820160005b838211156139aa57835183826101000a81548160ff021916908315150217905550926020019260010160208160000104928301926001030261396d565b80156139d75782816101000a81549060ff02191690556001016020816000010492830192600103026139aa565b505b5090506139e69190613aa4565b5090565b815481835581811115613a1757600502816005028360005260206000209182019101613a169190613ad4565b5b505050565b5080546000825560050290600052602060002090810190613a3d9190613ad4565b50565b6040518062100000016040528061800090602082028038833980820191505090505090565b604051806040016040528060008152602001600081525090565b613aa191905b80821115613a9d576000816000905550600101613a85565b5090565b90565b613ad191905b80821115613acd57600081816101000a81549060ff021916905550600101613aaa565b5090565b90565b613b4091905b80821115613b3c5760008082016000613af39190613b43565b6001820160006101000a81549060ff021916905560028201600090556003820160006101000a81549060ff0219169055600482016000613b339190613b8b565b50600501613ada565b5090565b90565b50805460018160011615610100020316600290046000825580601f10613b695750613b88565b601f016020900490600052602060002090810190613b879190613a7f565b5b50565b50805460008255601f016020900490600052602060002090810190613bb09190613a7f565b50565b600081359050613bc281614f18565b92915050565b600081519050613bd781614f18565b92915050565b600082601f830112613bee57600080fd5b8135613c01613bfc82614d06565b614cd9565b91508082526020830160208301858383011115613c1d57600080fd5b613c28838284614eb8565b50505092915050565b600082601f830112613c4257600080fd5b8135613c55613c5082614d32565b614cd9565b91508082526020830160208301858383011115613c7157600080fd5b613c7c838284614eb8565b50505092915050565b600081359050613c9481614f2f565b92915050565b600060208284031215613cac57600080fd5b6000613cba84828501613bc8565b91505092915050565b60008060408385031215613cd657600080fd5b6000613ce485828601613bb3565b9250506020613cf585828601613c85565b9150509250929050565b600060208284031215613d1157600080fd5b600082013567ffffffffffffffff811115613d2b57600080fd5b613d3784828501613c31565b91505092915050565b60008060408385031215613d5357600080fd5b600083013567ffffffffffffffff811115613d6d57600080fd5b613d7985828601613c31565b9250506020613d8a85828601613c85565b9150509250929050565b600080600060608486031215613da957600080fd5b600084013567ffffffffffffffff811115613dc357600080fd5b613dcf86828701613c31565b9350506020613de086828701613c85565b925050604084013567ffffffffffffffff811115613dfd57600080fd5b613e0986828701613bdd565b9150509250925092565b600080600060608486031215613e2857600080fd5b600084013567ffffffffffffffff811115613e4257600080fd5b613e4e86828701613c31565b9350506020613e5f86828701613c85565b9250506040613e7086828701613c85565b9150509250925092565b6000613e868383613fe8565b60208301905092915050565b6000613e9e8383613ff7565b60208301905092915050565b6000613eb68383614831565b905092915050565b6000613ec982614d88565b613ed38185614de7565b9350613ede83614d5e565b8060005b83811015613f0f578151613ef68882613e7a565b9750613f0183614dc0565b925050600181019050613ee2565b5085935050505092915050565b613f2581614d93565b613f2f8184614df8565b9250613f3a82614d6e565b8060005b83811015613f6b578151613f528782613e92565b9650613f5d83614dcd565b925050600181019050613f3e565b505050505050565b6000613f7e82614d9f565b613f888185614e03565b935083602082028501613f9a85614d78565b8060005b85811015613fd65784840389528151613fb78582613eaa565b9450613fc283614dda565b925060208a01995050600181019050613f9e565b50829750879550505050505092915050565b613ff181614e53565b82525050565b61400081614e5f565b82525050565b61400f81614ea6565b82525050565b61401e81614ea6565b82525050565b600061402f82614db5565b6140398185614e36565b9350614049818560208601614ec7565b80840191505092915050565b600061406082614daa565b61406a8185614e14565b935061407a818560208601614ec7565b61408381614efa565b840191505092915050565b600061409982614daa565b6140a38185614e36565b93506140b3818560208601614ec7565b80840191505092915050565b60006140cc601883614e25565b91507f496e636f7272656374206368756e6b20706f736974696f6e00000000000000006000830152602082019050919050565b600061410c601583614e25565b91507f4469726563746f7279206e6f74206372656174656400000000000000000000006000830152602082019050919050565b600061414c602483614e25565b91507f4e6f7420656e6f756768206d656d6f727920696e207468652046696c6573746f60008301527f72616765000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006141b2601b83614e25565b91507f48617368206861736e2774206265656e2063616c63756c6174656400000000006000830152602082019050919050565b60006141f2601983614e25565b91507f4368756e6b20697320616c72656164792075706c6f61646564000000000000006000830152602082019050919050565b6000614232601683614e25565b91507f496e636f7272656374206368756e6b206c656e677468000000000000000000006000830152602082019050919050565b6000614272600f83614e25565b91507f46696c65206e6f742065786973747300000000000000000000000000000000006000830152602082019050919050565b60006142b2600e83614e25565b91507f496e76616c69642073656e6465720000000000000000000000000000000000006000830152602082019050919050565b60006142f2601883614e25565b91507f4469726563746f7279206973206e6f742064656c6574656400000000000000006000830152602082019050919050565b6000614332601083614e25565b91507f46696c65206e6f742064656c65746564000000000000000000000000000000006000830152602082019050919050565b6000614372601383614e25565b91507f496e76616c69642073746f7261676550617468000000000000000000000000006000830152602082019050919050565b60006143b2600c83614e25565b91507f496e76616c6964207061746800000000000000000000000000000000000000006000830152602082019050919050565b60006143f2600183614e36565b91507f2e000000000000000000000000000000000000000000000000000000000000006000830152600182019050919050565b6000614432601683614e25565b91507f496e76616c6964206469726563746f7279206e616d65000000000000000000006000830152602082019050919050565b6000614472601583614e25565b91507f4368756e6b207761736e27742075706c6f6164656400000000000000000000006000830152602082019050919050565b60006144b2602683614e25565b91507f436f756c64206e6f742072657365727665206c657373207468616e207573656460008301527f20737061636500000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614518601683614e25565b91507f4469726563746f7279206973206e6f7420656d707479000000000000000000006000830152602082019050919050565b6000614558602383614e25565b91507f46696c65206861736e2774206265656e2075706c6f6164656420636f7272656360008301527f746c7900000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006145be601183614e25565b91507f4368756e6b207761736e277420726561640000000000000000000000000000006000830152602082019050919050565b60006145fe601883614e25565b91507f46696c656e616d652073686f756c64206265203c2032353600000000000000006000830152602082019050919050565b600061463e601f83614e25565b91507f46696c652073686f756c64206265206c657373207468616e20313030204d42006000830152602082019050919050565b600061467e600283614e36565b91507f2e2e0000000000000000000000000000000000000000000000000000000000006000830152600282019050919050565b60006146be601183614e25565b91507f4469726563746f72792069732066756c6c0000000000000000000000000000006000830152602082019050919050565b60006146fe600e83614e25565b91507f46696c65206e6f7420666f756e640000000000000000000000000000000000006000830152602082019050919050565b600061473e601883614e25565b91507f46696c65206f72206469726563746f72792065786973747300000000000000006000830152602082019050919050565b600061477e601883614e25565b91507f45564d206572726f7220696e2067657446696c6553697a6500000000000000006000830152602082019050919050565b60006147be601083614e25565b91507f46696c65206e6f742063726561746564000000000000000000000000000000006000830152602082019050919050565b60006147fe601983614e25565b91507f46696c65206861736e2774206265656e2075706c6f61646564000000000000006000830152602082019050919050565b600060a083016000830151848203600086015261484e8282614055565b91505060208301516148636020860182613fe8565b50604083015161487660408601826148ae565b5060608301516148896060860182614006565b50608083015184820360808601526148a18282613ebe565b9150508091505092915050565b6148b781614e9c565b82525050565b6148c681614e9c565b82525050565b60006148d8828461408e565b915081905092915050565b60006148ef8284614024565b915081905092915050565b6000614905826143e5565b9150819050919050565b600061491a82614671565b9150819050919050565b6000621000008201905061493b6000830184613f1c565b92915050565b6000602082019050818103600083015261495b8184613f73565b905092915050565b60006020820190506149786000830184614015565b92915050565b60006020820190508181036000830152614997816140bf565b9050919050565b600060208201905081810360008301526149b7816140ff565b9050919050565b600060208201905081810360008301526149d78161413f565b9050919050565b600060208201905081810360008301526149f7816141a5565b9050919050565b60006020820190508181036000830152614a17816141e5565b9050919050565b60006020820190508181036000830152614a3781614225565b9050919050565b60006020820190508181036000830152614a5781614265565b9050919050565b60006020820190508181036000830152614a77816142a5565b9050919050565b60006020820190508181036000830152614a97816142e5565b9050919050565b60006020820190508181036000830152614ab781614325565b9050919050565b60006020820190508181036000830152614ad781614365565b9050919050565b60006020820190508181036000830152614af7816143a5565b9050919050565b60006020820190508181036000830152614b1781614425565b9050919050565b60006020820190508181036000830152614b3781614465565b9050919050565b60006020820190508181036000830152614b57816144a5565b9050919050565b60006020820190508181036000830152614b778161450b565b9050919050565b60006020820190508181036000830152614b978161454b565b9050919050565b60006020820190508181036000830152614bb7816145b1565b9050919050565b60006020820190508181036000830152614bd7816145f1565b9050919050565b60006020820190508181036000830152614bf781614631565b9050919050565b60006020820190508181036000830152614c17816146b1565b9050919050565b60006020820190508181036000830152614c37816146f1565b9050919050565b60006020820190508181036000830152614c5781614731565b9050919050565b60006020820190508181036000830152614c7781614771565b9050919050565b60006020820190508181036000830152614c97816147b1565b9050919050565b60006020820190508181036000830152614cb7816147f1565b9050919050565b6000602082019050614cd360008301846148bd565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614cfc57600080fd5b8060405250919050565b600067ffffffffffffffff821115614d1d57600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614d4957600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050919050565b6000819050602082019050919050565b600081519050919050565b60006180009050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614e4c82614e7c565b9050919050565b60008115159050919050565b6000819050919050565b6000819050614e7782614f0b565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000614eb182614e69565b9050919050565b82818337600083830152505050565b60005b83811015614ee5578082015181840152602081019050614eca565b83811115614ef4576000848401525b50505050565b6000601f19601f8301169050919050565b60038110614f1557fe5b50565b614f2181614e41565b8114614f2c57600080fd5b50565b614f3881614e9c565b8114614f4357600080fd5b5056fea365627a7a723158202ae226b25ad72f9cff2d74c6dc7bcfb78530ab1d2438f48a8dab67499b37a8e56c6578706572696d656e74616cf564736f6c634300050d0040", + "nonce": "0", + "storage": { + "0x0": "2868903936" + } + }, + "0x69362535ec535F0643cBf62D16aDeDCAf32Ee6F8": { + "balance": "0", + "code": "0x608060405234801561001057600080fd5b50600436106100b45760003560e01c806379210e8e1161007157806379210e8e1461017757806381a8235a146101a757806385aeeb17146101c35780639a9a5593146101f3578063a99100541461020f578063b57321221461022b576100b4565b806307c6e7d3146100b9578063122f4fba146100d55780631c6ec7a9146101055780631cfe4e3b14610121578063373dedb41461013d57806361e46db51461015b575b600080fd5b6100d360048036036100ce9190810190613e0d565b61025b565b005b6100ef60048036036100ea9190810190613e0d565b610804565b6040516100fc9190614ab1565b60405180910390f35b61011f600480360361011a9190810190613e0d565b610b43565b005b61013b60048036036101369190810190613dd1565b610f72565b005b610145611190565b6040516101529190614e2c565b60405180910390f35b61017560048036036101709190810190613ea2565b611199565b005b610191600480360361018c9190810190613f21565b6113f9565b60405161019e9190614a72565b60405180910390f35b6101c160048036036101bc9190810190613e0d565b6116f9565b005b6101dd60048036036101d89190810190613e0d565b61189e565b6040516101ea9190614a8f565b60405180910390f35b61020d60048036036102089190810190613e4e565b611b9d565b005b61022960048036036102249190810190613e0d565b61213a565b005b61024560048036036102409190810190613e0d565b612790565b6040516102529190614e2c565b60405180910390f35b6000339050606061026b83612a10565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b825181101561037c576000826001018460018403815181106102d557fe5b60200260200101516040516102ea9190614a1a565b90815260200160405180910390205411610339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161033090614c2c565b60405180910390fd5b8160020183600183038151811061034c57fe5b60200260200101516040516103619190614a1a565b908152602001604051809103902091508060010190506102b7565b506060600183511161038e57846103a7565b8260018451038151811061039e57fe5b60200260200101515b9050600082600101826040516103bd9190614a31565b9081526020016040518091039020541161040c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161040390614c2c565b60405180910390fd5b600082600201826040516104209190614a31565b90815260200160405180910390206000018054905014610475576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161046c90614cac565b60405180910390fd5b60006104818587612c10565b9050806104c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ba90614bcc565b60405180910390fd5b6104cb613996565b836000016001856000018054905003815481106104e457fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156105965780601f1061056b57610100808354040283529160200191610596565b820191906000526020600020905b81548152906001019060200180831161057957829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff1660028111156105e257fe5b60028111156105ed57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561066557602002820191906000526020600020906000905b82829054906101000a900460ff1615158152602001906001019060208260000104928301926001038202915080841161062f5790505b50505050508152505090508084600001600186600101866040516106899190614a31565b90815260200160405180910390205403815481106106a357fe5b906000526020600020906005020160008201518160000190805190602001906106cd9291906139d2565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561071c57fe5b0217905550608082015181600401908051906020019061073d929190613a52565b5090505083600101836040516107539190614a31565b9081526020016040518091039020548460010182600001516040516107789190614a1a565b9081526020016040518091039020819055506000846001018460405161079e9190614a31565b908152602001604051809103902081905550836000018054809190600190036107c79190613af8565b5083600201836040516107da9190614a31565b9081526020016040518091039020600080820160006107f99190613b2a565b505050505050505050565b600080606061081284612c74565b91509150606061082182612a10565b90506000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b82518110156109065760008260010184600184038151811061088b57fe5b60200260200101516040516108a09190614a1a565b90815260200160405180910390205414156108c357600095505050505050610b3e565b816002018360018303815181106108d657fe5b60200260200101516040516108eb9190614a1a565b9081526020016040518091039020915080600101905061086d565b50606060018351116109185783610931565b8260018451038151811061092857fe5b60200260200101515b9050600082600101826040516109479190614a31565b908152602001604051809103902054141561096a57600095505050505050610b3e565b610972613996565b826000016001846001018460405161098a9190614a31565b90815260200160405180910390205403815481106109a457fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610a565780601f10610a2b57610100808354040283529160200191610a56565b820191906000526020600020905b815481529060010190602001808311610a3957829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115610aa257fe5b6002811115610aad57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015610b2557602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411610aef5790505b5050505050815250509050806060015196505050505050505b919050565b600160009054906101000a900460ff16610b85576120006002819055506210000060038190555060018060006101000a81548160ff0219169083151502179055505b6000815111610bc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc090614c2c565b60405180910390fd5b60003390506060610bd983612a10565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015610cea57600082600101846001840381518110610c4357fe5b6020026020010151604051610c589190614a1a565b90815260200160405180910390205411610ca7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9e90614c2c565b60405180910390fd5b81600201836001830381518110610cba57fe5b6020026020010151604051610ccf9190614a1a565b90815260200160405180910390209150806001019050610c25565b50600254816000018054905010610d36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2d90614d4c565b60405180910390fd5b60606001835111610d475784610d60565b82600184510381518110610d5757fe5b60200260200101515b905060008260010182604051610d769190614a31565b90815260200160405180910390205414610dc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbc90614d8c565b60405180910390fd5b610dce81612ff6565b610e0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0490614c4c565b60405180910390fd5b6000610e1985876130d7565b905080610e5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5290614aec565b60405180910390fd5b610e63613996565b82816000018190525060008160200190151590811515815250508360000181908060018154018082558091505090600182039060005260206000209060050201600090919290919091506000820151816000019080519060200190610ec99291906139d2565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff02191690836002811115610f1857fe5b02179055506080820151816004019080519060200190610f39929190613a52565b5050505083600001805490508460010184604051610f579190614a31565b90815260200160405180910390208190555050505050505050565b610f7a61313b565b73ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161480610fdf57503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614155b61101e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101590614bac565b60405180910390fd5b80600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411156110a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109790614c8c565b60405180910390fd5b600054600754820111156110e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e090614b0c565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460076000828254039250508190555080600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550806007600082825401925050819055505050565b60008054905090565b600033905060006111aa82866131d4565b9050600160028111156111b957fe5b8160030160009054906101000a900460ff1660028111156111d657fe5b14611216576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120d90614d6c565b60405180910390fd5b6000600354858161122357fe5b061480156112345750806002015484105b611273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126a90614acc565b60405180910390fd5b600354848260020154031080156112905750838160020154038351145b8061129d57506003548351145b6112dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d390614b6c565b60405180910390fd5b600015158160040160035486816112ef57fe5b04815481106112fa57fe5b90600052602060002090602091828204019190069054906101000a900460ff1615151461135c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135390614b4c565b60405180910390fd5b600061136a838787876133d3565b9050806113ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a390614c6c565b60405180910390fd5b60018260040160035487816113bd57fe5b04815481106113c857fe5b90600052602060002090602091828204019190066101000a81548160ff021916908315150217905550505050505050565b611401613b4e565b6000606061140e86612c74565b9150915061141a613996565b61142483836131d4565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156114c85780601f1061149d576101008083540402835291602001916114c8565b820191906000526020600020905b8154815290600101906020018083116114ab57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561151457fe5b600281111561151f57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561159757602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116115615790505b50505050508152505090506002808111156115ae57fe5b816060015160028111156115be57fe5b146115fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f590614e0c565b60405180910390fd5b60035485111580156116105750600085115b61164f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164690614b6c565b60405180910390fd5b80604001518587011115611698576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168f90614acc565b60405180910390fd5b60006116a684848989613484565b8096508192505050806116ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e590614cec565b60405180910390fd5b505050509392505050565b6000339050600061170a82846131d4565b90506001600281111561171957fe5b8160030160009054906101000a900460ff16600281111561173657fe5b14611776576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176d90614d6c565b60405180910390fd5b60006001905060008260040180549050905060008090505b818110156117e157600015158460040182815481106117a957fe5b90600052602060002090602091828204019190069054906101000a900460ff16151514156117d657600092505b80600101905061178e565b5081611822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181990614ccc565b60405180910390fd5b60028360030160006101000a81548160ff0219169083600281111561184357fe5b021790555060006118548587613517565b905080611896576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188d90614b2c565b60405180910390fd5b505050505050565b6060600060606118ad84612c74565b9150915060606118bc82612a10565b90506000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008090505b82518110156119c65760008260010184838151811061192257fe5b60200260200101516040516119379190614a1a565b90815260200160405180910390205411611986576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197d90614c2c565b60405180910390fd5b8160020183828151811061199657fe5b60200260200101516040516119ab9190614a1a565b90815260200160405180910390209150806001019050611907565b5080600001805480602002602001604051908101604052809291908181526020016000905b82821015611b8e57838290600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611aa75780601f10611a7c57610100808354040283529160200191611aa7565b820191906000526020600020905b815481529060010190602001808311611a8a57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115611af357fe5b6002811115611afe57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015611b7657602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411611b405790505b505050505081525050815260200190600101906119eb565b50505050945050505050919050565b600160009054906101000a900460ff16611bdf576120006002819055506210000060038190555060018060006101000a81548160ff0219169083151502179055505b60003390506305f5e100821115611c2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2290614d2c565b60405180910390fd5b600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205483011115611cee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce590614dac565b60405180910390fd5b6060611cf984612a10565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015611e0a57600082600101846001840381518110611d6357fe5b6020026020010151604051611d789190614a1a565b90815260200160405180910390205411611dc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dbe90614c2c565b60405180910390fd5b81600201836001830381518110611dda57fe5b6020026020010151604051611def9190614a1a565b90815260200160405180910390209150806001019050611d45565b50600254816000018054905010611e56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4d90614d4c565b60405180910390fd5b60606001835111611e675785611e80565b82600184510381518110611e7757fe5b60200260200101515b905060008260010182604051611e969190614a31565b90815260200160405180910390205414611ee5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611edc90614d8c565b60405180910390fd5b611eee81612ff6565b611f2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2490614d0c565b60405180910390fd5b6000611f3a85888861357b565b905080611f7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7390614dec565b60405180910390fd5b6060600354600160035489010381611f9057fe5b04604051908082528060200260200182016040528015611fbf5781602001602082028038833980820191505090505b509050836000016040518060a0016040528085815260200160011515815260200189815260200160016002811115611ff357fe5b8152602001838152509080600181540180825580915050906001820390600052602060002090600502016000909192909190915060008201518160000190805190602001906120439291906139d2565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561209257fe5b021790555060808201518160040190805190602001906120b3929190613a52565b50505050836000018054905084600101846040516120d19190614a31565b90815260200160405180910390208190555086600560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505050505050505050565b6000339050612147613996565b61215182846131d4565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156121f55780601f106121ca576101008083540402835291602001916121f5565b820191906000526020600020905b8154815290600101906020018083116121d857829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561224157fe5b600281111561224c57fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156122c457602002820191906000526020600020906000905b82829054906101000a900460ff1615158152602001906001019060208260000104928301926001038202915080841161228e5790505b5050505050815250509050600060028111156122dc57fe5b816060015160028111156122ec57fe5b141561232d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232490614b8c565b60405180910390fd5b600061233983856135e8565b90508061237b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161237290614bec565b60405180910390fd5b606061238685612a10565b90506000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b825181101561241e57816002018360018303815181106123ee57fe5b60200260200101516040516124039190614a1a565b908152602001604051809103902091508060010190506123d2565b50600060018260010186600001516040516124399190614a1a565b908152602001604051809103902054039050612453613996565b8260000160018460000180549050038154811061246c57fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561251e5780601f106124f35761010080835404028352916020019161251e565b820191906000526020600020905b81548152906001019060200180831161250157829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561256a57fe5b600281111561257557fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156125ed57602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116125b75790505b50505050508152505090508083600001838154811061260857fe5b906000526020600020906005020160008201518160000190805190602001906126329291906139d2565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561268157fe5b021790555060808201518160040190805190602001906126a2929190613a52565b50905050826000018054809190600190036126bd9190613af8565b508260010186600001516040516126d49190614a1a565b9081526020016040518091039020548360010182600001516040516126f99190614a1a565b90815260200160405180910390208190555060008360010187600001516040516127239190614a1a565b9081526020016040518091039020819055508560400151600560008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505050505050505050565b600080606061279e84612c74565b915091506127aa613996565b6127b483836131d4565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156128585780601f1061282d57610100808354040283529160200191612858565b820191906000526020600020905b81548152906001019060200180831161283b57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff1660028111156128a457fe5b60028111156128af57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561292757602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116128f15790505b50505050508152505090506001600281111561293f57fe5b8160600151600281111561294f57fe5b1480612974575060028081111561296257fe5b8160600151600281111561297257fe5b145b6129b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129aa90614d6c565b60405180910390fd5b60006129bf848461364c565b809650819250505080612a07576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129fe90614dcc565b60405180910390fd5b50505050919050565b6060612a1a613b73565b612a23836136b5565b9050612a2d613b73565b612a6b6040518060400160405280600181526020017f2f000000000000000000000000000000000000000000000000000000000000008152506136b5565b905060606001612a8483856136e390919063ffffffff16565b01604051908082528060200260200182016040528015612ab857816020015b6060815260200190600190039081612aa35790505b50905060008090505b8151811015612b0957612ae5612ae0848661375890919063ffffffff16565b613772565b828281518110612af157fe5b60200260200101819052508080600101915050612ac1565b50600081600183510381518110612b1c57fe5b6020026020010151511415612b875780600182510381518110612b3b57fe5b6020026020010160608152506001815103604051908082528060200260200182016040528015612b7f57816020015b6060815260200190600190039081612b6a5790505b509350612bc0565b8051604051908082528060200260200182016040528015612bbc57816020015b6060815260200190600190039081612ba75790505b5093505b60008090505b8451811015612c0757818181518110612bdb57fe5b6020026020010151858281518110612bef57fe5b60200260200101819052508080600101915050612bc6565b50505050919050565b60008060016020601f85510181612c2357fe5b040190506040518481526020810160005b83811015612c55578060200286015181602002830152806001019050612c34565b50602082602085026040018460006010600019f1935050505092915050565b6000606060006028905080845111612cc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cb890614c0c565b60405180910390fd5b6060816040519080825280601f01601f191660200182016040528015612cf65781602001600182028038833980820191505090505b50905060008090505b82811015612d6657858181518110612d1357fe5b602001015160f81c60f81b828281518110612d2a57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050612cff565b50600080905060008090505b83811015612e95576000838281518110612d8857fe5b602001015160f81c60f81b60f81c60ff16905060308110158015612dad575060398111155b80612dc6575060418110158015612dc55750605a8111155b5b80612ddf575060618110158015612dde575060668111155b5b612e1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e1590614c0c565b60405180910390fd5b60308110158015612e30575060398111155b15612e415760308103601084020192505b60418110158015612e535750605a8111155b15612e645760378103601084020192505b60618110158015612e76575060668111155b15612e875760578103601084020192505b508080600101915050612d72565b508094507f2f00000000000000000000000000000000000000000000000000000000000000868481518110612ec657fe5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612f33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f2a90614c0c565b60405180910390fd5b6000600184885103039050806040519080825280601f01601f191660200182016040528015612f715781602001600182028038833980820191505090505b50945060008090505b81811015612fec5760008860018784010181518110612f9557fe5b602001015160f81c60f81b905080878381518110612faf57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350508080600101915050612f7a565b5050505050915091565b600060405160200161300790614a5d565b604051602081830303815290604052805190602001208260405160200161302e9190614a31565b604051602081830303815290604052805190602001201480613099575060405160200161305a90614a48565b60405160208183030381529060405280519060200120826040516020016130819190614a31565b60405160208183030381529060405280519060200120145b806130a5575060008251145b156130b357600090506130d2565b60008251905060ff8111156130cc5760009150506130d2565b60019150505b919050565b60008060016020601f855101816130ea57fe5b040190506040518481526020810160005b8381101561311c5780602002860151816020028301528060010190506130fb565b5060208260208502604001846000600f600019f1935050505092915050565b600073d2001000000000000000000000000000000000d273ffffffffffffffffffffffffffffffffffffffff166383e781fe6040518163ffffffff1660e01b815260040160206040518083038186803b15801561319757600080fd5b505afa1580156131ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506131cf9190810190613da8565b905090565b600060606131e183612a10565b90506000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b82518110156132f25760008260010184600184038151811061324b57fe5b60200260200101516040516132609190614a1a565b908152602001604051809103902054116132af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132a690614c2c565b60405180910390fd5b816002018360018303815181106132c257fe5b60200260200101516040516132d79190614a1a565b9081526020016040518091039020915080600101905061322d565b5060606001835111613304578461331d565b8260018451038151811061331457fe5b60200260200101515b9050600082600101826040516133339190614a31565b90815260200160405180910390205411613382576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161337990614c2c565b60405180910390fd5b6000826000016001846001018460405161339c9190614a31565b90815260200160405180910390205403815481106133b657fe5b906000526020600020906005020190508094505050505092915050565b60008060016020601f855101816133e657fe5b04019050600060016020601f885101816133fc57fe5b040190506040518781526020810160005b8381101561342e57806020028901518160200283015280600101905061340d565b50868360200282015260005b84811015613460578060200287015181856001010160200283015280600101905061343a565b50602082848601602002606001846000600c600019f1945050505050949350505050565b600061348e613b4e565b600060016020601f885101816134a057fe5b0401905060006020601f8601816134b357fe5b0490506040518881526020810160005b848110156134e457806020028a0151816020028301528060010190506134c3565b5083602002810188815287816020015283602002868660030160200285600a600019fa9650505050505094509492505050565b60008060016020601f8551018161352a57fe5b040190506040518481526020810160005b8381101561355c57806020028601518160200283015280600101905061353b565b50602082602085026040018460006011600019f1935050505092915050565b60008060016020601f8651018161358e57fe5b040190506040518581526020810160005b838110156135c057806020028701518160200283015280600101905061359f565b50846020840282015260208260208502604001846000600b600019f193505050509392505050565b60008060016020601f855101816135fb57fe5b040190506040518481526020810160005b8381101561362d57806020028601518160200283015280600101905061360c565b5060208260208502604001846000600e600019f1935050505092915050565b600080600060016020601f8651018161366157fe5b040190506040518581526020810160005b83811015613693578060200287015181602002830152806001019050613672565b506020826020850260200184600d600019fa9450815193505050509250929050565b6136bd613b73565b600060208301905060405180604001604052808451815260200182815250915050919050565b600080826000015161370785600001518660200151866000015187602001516137d4565b0190505b8360000151846020015101811161375157818060010192505082600001516137498560200151830386600001510383866000015187602001516137d4565b01905061370b565b5092915050565b613760613b73565b61376b8383836138af565b5092915050565b60608082600001516040519080825280601f01601f1916602001820160405280156137ac5781602001600182028038833980820191505090505b50905060006020820190506137ca818560200151866000015161394d565b8192505050919050565b600080849050600086851161389f576020851161385957600060018660200360080260020a031960001b905060008186511690506000878a8a0103905060008386511690505b82811461384b57818610613838578a8a0196505050505050506138a7565b858060010196505083865116905061381a565b8596505050505050506138a7565b60008585209050600091505b858803821161389d57600086842090508082141561388957839450505050506138a7565b600184019350508180600101925050613865565b505b868601925050505b949350505050565b6138b7613b73565b60006138d585600001518660200151866000015187602001516137d4565b90508460200151836020018181525050846020015181038360000181815250508460000151856020015101811415613917576000856000018181525050613942565b8360000151836000015101856000018181510391508181525050836000015181018560200181815250505b829150509392505050565b5b60208110613971578151835260208301925060208201915060208103905061394e565b60006001826020036101000a0390508019835116818551168181178652505050505050565b6040518060a001604052806060815260200160001515815260200160008152602001600060028111156139c557fe5b8152602001606081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613a1357805160ff1916838001178555613a41565b82800160010185558215613a41579182015b82811115613a40578251825591602001919060010190613a25565b5b509050613a4e9190613b8d565b5090565b82805482825590600052602060002090601f01602090048101928215613ae75791602002820160005b83821115613ab857835183826101000a81548160ff0219169083151502179055509260200192600101602081600001049283019260010302613a7b565b8015613ae55782816101000a81549060ff0219169055600101602081600001049283019260010302613ab8565b505b509050613af49190613bb2565b5090565b815481835581811115613b2557600502816005028360005260206000209182019101613b249190613be2565b5b505050565b5080546000825560050290600052602060002090810190613b4b9190613be2565b50565b6040518062100000016040528061800090602082028038833980820191505090505090565b604051806040016040528060008152602001600081525090565b613baf91905b80821115613bab576000816000905550600101613b93565b5090565b90565b613bdf91905b80821115613bdb57600081816101000a81549060ff021916905550600101613bb8565b5090565b90565b613c4e91905b80821115613c4a5760008082016000613c019190613c51565b6001820160006101000a81549060ff021916905560028201600090556003820160006101000a81549060ff0219169055600482016000613c419190613c99565b50600501613be8565b5090565b90565b50805460018160011615610100020316600290046000825580601f10613c775750613c96565b601f016020900490600052602060002090810190613c959190613b8d565b5b50565b50805460008255601f016020900490600052602060002090810190613cbe9190613b8d565b50565b600081359050613cd081615086565b92915050565b600081519050613ce581615086565b92915050565b600082601f830112613cfc57600080fd5b8135613d0f613d0a82614e74565b614e47565b91508082526020830160208301858383011115613d2b57600080fd5b613d36838284615026565b50505092915050565b600082601f830112613d5057600080fd5b8135613d63613d5e82614ea0565b614e47565b91508082526020830160208301858383011115613d7f57600080fd5b613d8a838284615026565b50505092915050565b600081359050613da28161509d565b92915050565b600060208284031215613dba57600080fd5b6000613dc884828501613cd6565b91505092915050565b60008060408385031215613de457600080fd5b6000613df285828601613cc1565b9250506020613e0385828601613d93565b9150509250929050565b600060208284031215613e1f57600080fd5b600082013567ffffffffffffffff811115613e3957600080fd5b613e4584828501613d3f565b91505092915050565b60008060408385031215613e6157600080fd5b600083013567ffffffffffffffff811115613e7b57600080fd5b613e8785828601613d3f565b9250506020613e9885828601613d93565b9150509250929050565b600080600060608486031215613eb757600080fd5b600084013567ffffffffffffffff811115613ed157600080fd5b613edd86828701613d3f565b9350506020613eee86828701613d93565b925050604084013567ffffffffffffffff811115613f0b57600080fd5b613f1786828701613ceb565b9150509250925092565b600080600060608486031215613f3657600080fd5b600084013567ffffffffffffffff811115613f5057600080fd5b613f5c86828701613d3f565b9350506020613f6d86828701613d93565b9250506040613f7e86828701613d93565b9150509250925092565b6000613f9483836140f6565b60208301905092915050565b6000613fac8383614105565b60208301905092915050565b6000613fc4838361497f565b905092915050565b6000613fd782614ef6565b613fe18185614f55565b9350613fec83614ecc565b8060005b8381101561401d5781516140048882613f88565b975061400f83614f2e565b925050600181019050613ff0565b5085935050505092915050565b61403381614f01565b61403d8184614f66565b925061404882614edc565b8060005b838110156140795781516140608782613fa0565b965061406b83614f3b565b92505060018101905061404c565b505050505050565b600061408c82614f0d565b6140968185614f71565b9350836020820285016140a885614ee6565b8060005b858110156140e457848403895281516140c58582613fb8565b94506140d083614f48565b925060208a019950506001810190506140ac565b50829750879550505050505092915050565b6140ff81614fc1565b82525050565b61410e81614fcd565b82525050565b61411d81615014565b82525050565b61412c81615014565b82525050565b600061413d82614f23565b6141478185614fa4565b9350614157818560208601615035565b80840191505092915050565b600061416e82614f18565b6141788185614f82565b9350614188818560208601615035565b61419181615068565b840191505092915050565b60006141a782614f18565b6141b18185614fa4565b93506141c1818560208601615035565b80840191505092915050565b60006141da601883614f93565b91507f496e636f7272656374206368756e6b20706f736974696f6e00000000000000006000830152602082019050919050565b600061421a601583614f93565b91507f4469726563746f7279206e6f74206372656174656400000000000000000000006000830152602082019050919050565b600061425a602483614f93565b91507f4e6f7420656e6f756768206d656d6f727920696e207468652046696c6573746f60008301527f72616765000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006142c0601b83614f93565b91507f48617368206861736e2774206265656e2063616c63756c6174656400000000006000830152602082019050919050565b6000614300601983614f93565b91507f4368756e6b20697320616c72656164792075706c6f61646564000000000000006000830152602082019050919050565b6000614340601683614f93565b91507f496e636f7272656374206368756e6b206c656e677468000000000000000000006000830152602082019050919050565b6000614380600f83614f93565b91507f46696c65206e6f742065786973747300000000000000000000000000000000006000830152602082019050919050565b60006143c0600e83614f93565b91507f496e76616c69642073656e6465720000000000000000000000000000000000006000830152602082019050919050565b6000614400601883614f93565b91507f4469726563746f7279206973206e6f742064656c6574656400000000000000006000830152602082019050919050565b6000614440601083614f93565b91507f46696c65206e6f742064656c65746564000000000000000000000000000000006000830152602082019050919050565b6000614480601383614f93565b91507f496e76616c69642073746f7261676550617468000000000000000000000000006000830152602082019050919050565b60006144c0600c83614f93565b91507f496e76616c6964207061746800000000000000000000000000000000000000006000830152602082019050919050565b6000614500600183614fa4565b91507f2e000000000000000000000000000000000000000000000000000000000000006000830152600182019050919050565b6000614540601683614f93565b91507f496e76616c6964206469726563746f7279206e616d65000000000000000000006000830152602082019050919050565b6000614580601583614f93565b91507f4368756e6b207761736e27742075706c6f6164656400000000000000000000006000830152602082019050919050565b60006145c0602683614f93565b91507f436f756c64206e6f742072657365727665206c657373207468616e207573656460008301527f20737061636500000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614626601683614f93565b91507f4469726563746f7279206973206e6f7420656d707479000000000000000000006000830152602082019050919050565b6000614666602383614f93565b91507f46696c65206861736e2774206265656e2075706c6f6164656420636f7272656360008301527f746c7900000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006146cc601183614f93565b91507f4368756e6b207761736e277420726561640000000000000000000000000000006000830152602082019050919050565b600061470c601883614f93565b91507f46696c656e616d652073686f756c64206265203c2032353600000000000000006000830152602082019050919050565b600061474c601f83614f93565b91507f46696c652073686f756c64206265206c657373207468616e20313030204d42006000830152602082019050919050565b600061478c600283614fa4565b91507f2e2e0000000000000000000000000000000000000000000000000000000000006000830152600282019050919050565b60006147cc601183614f93565b91507f4469726563746f72792069732066756c6c0000000000000000000000000000006000830152602082019050919050565b600061480c600e83614f93565b91507f46696c65206e6f7420666f756e640000000000000000000000000000000000006000830152602082019050919050565b600061484c601883614f93565b91507f46696c65206f72206469726563746f72792065786973747300000000000000006000830152602082019050919050565b600061488c601983614f93565b91507f4e6f7420656e6f756768207265736572766564207370616365000000000000006000830152602082019050919050565b60006148cc601883614f93565b91507f45564d206572726f7220696e2067657446696c6553697a6500000000000000006000830152602082019050919050565b600061490c601083614f93565b91507f46696c65206e6f742063726561746564000000000000000000000000000000006000830152602082019050919050565b600061494c601983614f93565b91507f46696c65206861736e2774206265656e2075706c6f61646564000000000000006000830152602082019050919050565b600060a083016000830151848203600086015261499c8282614163565b91505060208301516149b160208601826140f6565b5060408301516149c460408601826149fc565b5060608301516149d76060860182614114565b50608083015184820360808601526149ef8282613fcc565b9150508091505092915050565b614a058161500a565b82525050565b614a148161500a565b82525050565b6000614a26828461419c565b915081905092915050565b6000614a3d8284614132565b915081905092915050565b6000614a53826144f3565b9150819050919050565b6000614a688261477f565b9150819050919050565b60006210000082019050614a89600083018461402a565b92915050565b60006020820190508181036000830152614aa98184614081565b905092915050565b6000602082019050614ac66000830184614123565b92915050565b60006020820190508181036000830152614ae5816141cd565b9050919050565b60006020820190508181036000830152614b058161420d565b9050919050565b60006020820190508181036000830152614b258161424d565b9050919050565b60006020820190508181036000830152614b45816142b3565b9050919050565b60006020820190508181036000830152614b65816142f3565b9050919050565b60006020820190508181036000830152614b8581614333565b9050919050565b60006020820190508181036000830152614ba581614373565b9050919050565b60006020820190508181036000830152614bc5816143b3565b9050919050565b60006020820190508181036000830152614be5816143f3565b9050919050565b60006020820190508181036000830152614c0581614433565b9050919050565b60006020820190508181036000830152614c2581614473565b9050919050565b60006020820190508181036000830152614c45816144b3565b9050919050565b60006020820190508181036000830152614c6581614533565b9050919050565b60006020820190508181036000830152614c8581614573565b9050919050565b60006020820190508181036000830152614ca5816145b3565b9050919050565b60006020820190508181036000830152614cc581614619565b9050919050565b60006020820190508181036000830152614ce581614659565b9050919050565b60006020820190508181036000830152614d05816146bf565b9050919050565b60006020820190508181036000830152614d25816146ff565b9050919050565b60006020820190508181036000830152614d458161473f565b9050919050565b60006020820190508181036000830152614d65816147bf565b9050919050565b60006020820190508181036000830152614d85816147ff565b9050919050565b60006020820190508181036000830152614da58161483f565b9050919050565b60006020820190508181036000830152614dc58161487f565b9050919050565b60006020820190508181036000830152614de5816148bf565b9050919050565b60006020820190508181036000830152614e05816148ff565b9050919050565b60006020820190508181036000830152614e258161493f565b9050919050565b6000602082019050614e416000830184614a0b565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614e6a57600080fd5b8060405250919050565b600067ffffffffffffffff821115614e8b57600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614eb757600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050919050565b6000819050602082019050919050565b600081519050919050565b60006180009050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614fba82614fea565b9050919050565b60008115159050919050565b6000819050919050565b6000819050614fe582615079565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061501f82614fd7565b9050919050565b82818337600083830152505050565b60005b83811015615053578082015181840152602081019050615038565b83811115615062576000848401525b50505050565b6000601f19601f8301169050919050565b6003811061508357fe5b50565b61508f81614faf565b811461509a57600080fd5b50565b6150a68161500a565b81146150b157600080fd5b5056fea365627a7a72315820314a90e541327f2678eaf7815f54348c3702e4fa45cdf1d5595b378d08af86896c6578706572696d656e74616cf564736f6c634300050d0040", + "nonce": "0", + "storage": { + "0x0": "2868903936" + } + }, + "0x69bfcdcb98c9562e0a2faee3ecdfd65e8a0adb19": { + "balance": "1000000000000000000000000000000" + }, + "0x6a37ad7dceec4595eea9f03b82d2710e738343ac": { + "balance": "1000000000000000000000000000000" + }, + "0x6b806862a977a0e22ed1752f858e5332647121c8": { + "balance": "1000000000000000000000000000000" + }, + "0x6c0ef9084a57df13c175afea32ea47a510c5506e": { + "balance": "1000000000000000000000000000000" + }, + "0x6cd5e637266e18d3e888ee99451eb828c6b491f4": { + "balance": "1000000000000000000000000000000" + }, + "0x6d0d7f0ff51917bd84a5f7270d31a894282aaf4b": { + "balance": "1000000000000000000000000000000" + }, + "0x6d8092cb926daf29236f866cd31c327ff73323d1": { + "balance": "1000000000000000000000000000000" + }, + "0x6d80aAC61F6d92c7F4A3c412850474ba963B698E": { + "balance": "1000000000000000000000" + }, + "0x6fec280c0ab320715b17d70e8b02c2d4141c1372": { + "balance": "1000000000000000000000000000000" + }, + "0x733ad609ef2e742334d96266fbc13733f1cf5e4a": { + "balance": "1000000000000000000000000000000" + }, + "0x7525198d8cd1121d57358a0b0ed037e924581a76": { + "balance": "1000000000000000000000000000000" + }, + "0x765708943c3b791563d1e3f0533b6d7e7d769e4d": { + "balance": "1000000000000000000000000000000" + }, + "0x7685d04f0b7657017b77efa004a14ff9f022acab": { + "balance": "1000000000000000000000000000000" + }, + "0x76b545cb6a2fc671f741950eeb27627e69a1e69b": { + "balance": "1000000000000000000000000000000" + }, + "0x77a0bc73442d3d9cb993e8d9752f95babf0ccaa6": { + "balance": "1000000000000000000000000000000" + }, + "0x7a89A6c323FaCfF0ADeF7EEF3e491aD4044d0592": { + "balance": "100000000000000000000000" + }, + "0x7e7E68F04D1799Fa25C8cff57314c8a5d3942e69": { + "balance": "1000000000000000000000000" + }, + "0x811d701d14539d190a8593fe901eafe8eff511f5": { + "balance": "1000000000000000000000000000000" + }, + "0x81dcbd71da28fafb9ca99ff5a22bfcebba84fecc": { + "balance": "100000000000000000000000" + }, + "0x83c1479d2a32d9ed9fa699289b6c2db56b7cd045": { + "balance": "1000000000000000000000000000000" + }, + "0x85b33f0853ab8eaa4e602bdfd724d44bc2731e90": { + "balance": "1000000000000000000000000000000" + }, + "0x863f816036e3cbba90855196c9d1e339fcff1650": { + "balance": "1000000000000000000000000000000" + }, + "0x87ea381878572d63b3453033d7540abddd191186": { + "balance": "1000000000000000000000000000000" + }, + "0x88fd5e01078629cc194c933d9631b9448fe10b1d": { + "balance": "1000000000000000000000000000000" + }, + "0x8945e48bd056f45c8b57f9025d2674bb03a24035": { + "balance": "1000000000000000000000000000000" + }, + "0x8a920edc1021ce76c22774e0e83723a6e51c2439": { + "balance": "1000000000000000000000000000000" + }, + "0x8e6081e272c8f4d49f5b29157b52f68cbd6307ad": { + "balance": "1000000000000000000000000000000" + }, + "0x8fe24dbbf9884bd458d8cfac528b4ad70e82497d": { + "balance": "1000000000000000000000000000000" + }, + "0x90431f3f75b26657f74abbb5c759b12e78f916cc": { + "balance": "1000000000000000000000000000000" + }, + "0x907cd0881E50d359bb9Fd120B1A5A143b1C97De6": { + "balance": "1000000000000000000000000000000000000000000000000000000000" + }, + "0x94c6e5746971d6aebeaa42cbbe2feca0f6b5b24f": { + "balance": "1000000000000000000000000000000" + }, + "0x96672f9e982936e1904b15c948cc81bf18027db6": { + "balance": "1000000000000000000000000000000" + }, + "0x97b921ba45e0aa8830701aa62050a83ee00a1bb8": { + "balance": "1000000000000000000000000000000" + }, + "0x98e50c97baf98dc6a81bdb95067339a269a36fc1": { + "balance": "1000000000000000000000000000000" + }, + "0x9b77f28285a49601169a33332f08aa309d97edd0": { + "balance": "1000000000000000000000000000000" + }, + "0x9f62f4215cd277ca40dede101b4ccb29290de6bb": { + "balance": "1000000000000000000000000000000" + }, + "0xD1001000000000000000000000000000000000D1": { + "balance": "0", + "code": "0x608060405260043610603f576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680636d4ce63c146044575b600080fd5b348015604f57600080fd5b506056606c565b6040518082815260200191505060405180910390f35b60006001600060048152602001908152602001600020600060098152602001908152602001600020600101549050905600a165627a7a723058208fe64219becc0bcab1c8f854f05804ebb6bb555da5dbc49e8f7021c31d77636a0029", + "nonce": "0", + "storage": { + "0x3b4da637a1b0e6dbfc6795f2b7f0cb29eebb91b3af4dcc335e1633f6b4af810b": "1111" + } + }, + "0xD3001000000000000000000000000000000000D3": { + "balance": "0", + "code": "0x60806040526004361061007b5760003560e01c80639623609d1161004e5780639623609d1461013657806399a88ec4146101f5578063f2fde38b14610230578063f3b7dead146102635761007b565b8063204e1c7a14610080578063715018a6146100cf5780637eff275e146100e65780638da5cb5b14610121575b600080fd5b34801561008c57600080fd5b506100b3600480360360208110156100a357600080fd5b50356001600160a01b0316610296565b604080516001600160a01b039092168252519081900360200190f35b3480156100db57600080fd5b506100e4610328565b005b3480156100f257600080fd5b506100e46004803603604081101561010957600080fd5b506001600160a01b03813581169160200135166103ca565b34801561012d57600080fd5b506100b3610496565b6100e46004803603606081101561014c57600080fd5b6001600160a01b03823581169260208101359091169181019060608101604082013564010000000081111561018057600080fd5b82018360208201111561019257600080fd5b803590602001918460018302840111640100000000831117156101b457600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506104a5945050505050565b34801561020157600080fd5b506100e46004803603604081101561021857600080fd5b506001600160a01b03813581169160200135166105dd565b34801561023c57600080fd5b506100e46004803603602081101561025357600080fd5b50356001600160a01b031661068d565b34801561026f57600080fd5b506100b36004803603602081101561028657600080fd5b50356001600160a01b0316610785565b6000806060836001600160a01b03166040518080635c60da1b60e01b8152506004019050600060405180830381855afa9150503d80600081146102f5576040519150601f19603f3d011682016040523d82523d6000602084013e6102fa565b606091505b50915091508161030957600080fd5b80806020019051602081101561031e57600080fd5b5051949350505050565b6103306107e4565b6000546001600160a01b03908116911614610380576040805162461bcd60e51b8152602060048201819052602482015260008051602061080f833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6103d26107e4565b6000546001600160a01b03908116911614610422576040805162461bcd60e51b8152602060048201819052602482015260008051602061080f833981519152604482015290519081900360640190fd5b816001600160a01b0316638f283970826040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050600060405180830381600087803b15801561047a57600080fd5b505af115801561048e573d6000803e3d6000fd5b505050505050565b6000546001600160a01b031690565b6104ad6107e4565b6000546001600160a01b039081169116146104fd576040805162461bcd60e51b8152602060048201819052602482015260008051602061080f833981519152604482015290519081900360640190fd5b826001600160a01b0316634f1ef2863484846040518463ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561057357818101518382015260200161055b565b50505050905090810190601f1680156105a05780820380516001836020036101000a031916815260200191505b5093505050506000604051808303818588803b1580156105bf57600080fd5b505af11580156105d3573d6000803e3d6000fd5b5050505050505050565b6105e56107e4565b6000546001600160a01b03908116911614610635576040805162461bcd60e51b8152602060048201819052602482015260008051602061080f833981519152604482015290519081900360640190fd5b816001600160a01b0316633659cfe6826040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050600060405180830381600087803b15801561047a57600080fd5b6106956107e4565b6000546001600160a01b039081169116146106e5576040805162461bcd60e51b8152602060048201819052602482015260008051602061080f833981519152604482015290519081900360640190fd5b6001600160a01b03811661072a5760405162461bcd60e51b81526004018080602001828103825260268152602001806107e96026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000806060836001600160a01b031660405180806303e1469160e61b8152506004019050600060405180830381855afa9150503d80600081146102f5576040519150601f19603f3d011682016040523d82523d6000602084013e6102fa565b339056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a26469706673582212201d968ac32bef5562c6b4f1bd5d2f2a74c14d07ce008ca6fdc5a3bd0f5fc265f564736f6c63430006080033", + "nonce": "0", + "storage": { + "0x0": "0x907cd0881E50d359bb9Fd120B1A5A143b1C97De6" + } + }, + "0xD3002000000000000000000000000000000000D3": { + "balance": "0", + "code": "0x60806040526004361061004e5760003560e01c80633659cfe6146100655780634f1ef286146100985780635c60da1b146101185780638f28397014610149578063f851a4401461017c5761005d565b3661005d5761005b610191565b005b61005b610191565b34801561007157600080fd5b5061005b6004803603602081101561008857600080fd5b50356001600160a01b03166101ab565b61005b600480360360408110156100ae57600080fd5b6001600160a01b0382351691908101906040810160208201356401000000008111156100d957600080fd5b8201836020820111156100eb57600080fd5b8035906020019184600183028401116401000000008311171561010d57600080fd5b5090925090506101e5565b34801561012457600080fd5b5061012d610292565b604080516001600160a01b039092168252519081900360200190f35b34801561015557600080fd5b5061005b6004803603602081101561016c57600080fd5b50356001600160a01b03166102cf565b34801561018857600080fd5b5061012d610389565b6101996103ba565b6101a96101a461041a565b61043f565b565b6101b3610463565b6001600160a01b0316336001600160a01b031614156101da576101d581610488565b6101e2565b6101e2610191565b50565b6101ed610463565b6001600160a01b0316336001600160a01b031614156102855761020f83610488565b6000836001600160a01b031683836040518083838082843760405192019450600093509091505080830381855af49150503d806000811461026c576040519150601f19603f3d011682016040523d82523d6000602084013e610271565b606091505b505090508061027f57600080fd5b5061028d565b61028d610191565b505050565b600061029c610463565b6001600160a01b0316336001600160a01b031614156102c4576102bd61041a565b90506102cc565b6102cc610191565b90565b6102d7610463565b6001600160a01b0316336001600160a01b031614156101da576001600160a01b0381166103355760405162461bcd60e51b81526004018080602001828103825260368152602001806105876036913960400191505060405180910390fd5b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f61035e610463565b604080516001600160a01b03928316815291841660208301528051918290030190a16101d5816104c8565b6000610393610463565b6001600160a01b0316336001600160a01b031614156102c4576102bd610463565b3b151590565b6103c2610463565b6001600160a01b0316336001600160a01b031614156104125760405162461bcd60e51b81526004018080602001828103825260328152602001806105556032913960400191505060405180910390fd5b6101a96101a9565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b3660008037600080366000845af43d6000803e80801561045e573d6000f35b3d6000fd5b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b610491816104ec565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610355565b6104f5816103b4565b6105305760405162461bcd60e51b815260040180806020018281038252603b8152602001806105bd603b913960400191505060405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5556fe43616e6e6f742063616c6c2066616c6c6261636b2066756e6374696f6e2066726f6d207468652070726f78792061646d696e43616e6e6f74206368616e6765207468652061646d696e206f6620612070726f787920746f20746865207a65726f206164647265737343616e6e6f742073657420612070726f787920696d706c656d656e746174696f6e20746f2061206e6f6e2d636f6e74726163742061646472657373a26469706673582212206e221e2a3547bd97244b05ed46430b1b078ba097cb2a4e25ec3d79cf9ac9f02c64736f6c63430006080033", + "nonce": "0", + "storage": { + "0x0": "1000000", + "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0xD3003000000000000000000000000000000000D3", + "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "0xD3001000000000000000000000000000000000D3" + } + }, + "0xD3003000000000000000000000000000000000D3": { + "balance": "0", + "code": "0x608060405234801561001057600080fd5b50600436106100b45760003560e01c806379210e8e1161007157806379210e8e1461017757806381a8235a146101a757806385aeeb17146101c35780639a9a5593146101f3578063a99100541461020f578063b57321221461022b576100b4565b806307c6e7d3146100b9578063122f4fba146100d55780631c6ec7a9146101055780631cfe4e3b14610121578063373dedb41461013d57806361e46db51461015b575b600080fd5b6100d360048036036100ce9190810190613e94565b61025b565b005b6100ef60048036036100ea9190810190613e94565b610862565b6040516100fc9190614b38565b60405180910390f35b61011f600480360361011a9190810190613e94565b610ba1565b005b61013b60048036036101369190810190613e58565b610fce565b005b6101456111ec565b6040516101529190614eb3565b60405180910390f35b61017560048036036101709190810190613f29565b6111f6565b005b610191600480360361018c9190810190613fa8565b611456565b60405161019e9190614af9565b60405180910390f35b6101c160048036036101bc9190810190613e94565b611756565b005b6101dd60048036036101d89190810190613e94565b6118fb565b6040516101ea9190614b16565b60405180910390f35b61020d60048036036102089190810190613ed5565b611bfa565b005b61022960048036036102249190810190613e94565b612195565b005b61024560048036036102409190810190613e94565b612849565b6040516102529190614eb3565b60405180910390f35b6000339050606061026b83612ac9565b90506000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b825181101561037c576000826001018460018403815181106102d557fe5b60200260200101516040516102ea9190614aa1565b90815260200160405180910390205411610339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161033090614cb3565b60405180910390fd5b8160020183600183038151811061034c57fe5b60200260200101516040516103619190614aa1565b908152602001604051809103902091508060010190506102b7565b506060600183511161038e57846103a7565b8260018451038151811061039e57fe5b60200260200101515b9050600082600101826040516103bd9190614ab8565b9081526020016040518091039020541161040c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161040390614cb3565b60405180910390fd5b600082600201826040516104209190614ab8565b90815260200160405180910390206000018054905014610475576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161046c90614d33565b60405180910390fd5b60006104818587612cc9565b9050806104c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ba90614c53565b60405180910390fd5b6104cb613a4f565b836000016001856000018054905003815481106104e457fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156105965780601f1061056b57610100808354040283529160200191610596565b820191906000526020600020905b81548152906001019060200180831161057957829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff1660028111156105e257fe5b60028111156105ed57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561066557602002820191906000526020600020906000905b82829054906101000a900460ff1615158152602001906001019060208260000104928301926001038202915080841161062f5790505b50505050508152505090508084600001600186600101866040516106899190614ab8565b90815260200160405180910390205403815481106106a357fe5b906000526020600020906005020160008201518160000190805190602001906106cd929190613a8b565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561071c57fe5b0217905550608082015181600401908051906020019061073d929190613b0b565b5090505083600101836040516107539190614ab8565b9081526020016040518091039020548460010182600001516040516107789190614aa1565b9081526020016040518091039020819055506000846001018460405161079e9190614ab8565b908152602001604051809103902081905550836000018054806107bd57fe5b6001900381819060005260206000209060050201600080820160006107e29190613bb1565b6001820160006101000a81549060ff021916905560028201600090556003820160006101000a81549060ff02191690556004820160006108229190613bf9565b5050905583600201836040516108389190614ab8565b9081526020016040518091039020600080820160006108579190613c21565b505050505050505050565b600080606061087084612d2d565b91509150606061087f82612ac9565b90506000600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015610964576000826001018460018403815181106108e957fe5b60200260200101516040516108fe9190614aa1565b908152602001604051809103902054141561092157600095505050505050610b9c565b8160020183600183038151811061093457fe5b60200260200101516040516109499190614aa1565b908152602001604051809103902091508060010190506108cb565b5060606001835111610976578361098f565b8260018451038151811061098657fe5b60200260200101515b9050600082600101826040516109a59190614ab8565b90815260200160405180910390205414156109c857600095505050505050610b9c565b6109d0613a4f565b82600001600184600101846040516109e89190614ab8565b9081526020016040518091039020540381548110610a0257fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610ab45780601f10610a8957610100808354040283529160200191610ab4565b820191906000526020600020905b815481529060010190602001808311610a9757829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115610b0057fe5b6002811115610b0b57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015610b8357602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411610b4d5790505b5050505050815250509050806060015196505050505050505b919050565b600360009054906101000a900460ff16610be457612000600481905550621000006005819055506001600360006101000a81548160ff0219169083151502179055505b6000815111610c28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1f90614cb3565b60405180910390fd5b60003390506060610c3883612ac9565b90506000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015610d4957600082600101846001840381518110610ca257fe5b6020026020010151604051610cb79190614aa1565b90815260200160405180910390205411610d06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cfd90614cb3565b60405180910390fd5b81600201836001830381518110610d1957fe5b6020026020010151604051610d2e9190614aa1565b90815260200160405180910390209150806001019050610c84565b50600454816000018054905010610d95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8c90614dd3565b60405180910390fd5b60606001835111610da65784610dbf565b82600184510381518110610db657fe5b60200260200101515b905060008260010182604051610dd59190614ab8565b90815260200160405180910390205414610e24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1b90614e13565b60405180910390fd5b610e2d816130af565b610e6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6390614cd3565b60405180910390fd5b6000610e788587613190565b905080610eba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb190614b73565b60405180910390fd5b610ec2613a4f565b8281600001819052506000816020019015159081151581525050836000018190806001815401808255809150506001900390600052602060002090600502016000909190919091506000820151816000019080519060200190610f26929190613a8b565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff02191690836002811115610f7557fe5b02179055506080820151816004019080519060200190610f96929190613b0b565b50505083600001805490508460010184604051610fb39190614ab8565b90815260200160405180910390208190555050505050505050565b610fd66131f4565b73ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16148061103b57503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614155b61107a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107190614c33565b60405180910390fd5b80600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411156110fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f390614d13565b60405180910390fd5b60025460095482011115611145576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113c90614b93565b60405180910390fd5b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460096000828254039250508190555080600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550806009600082825401925050819055505050565b6000600254905090565b60003390506000611207828661328d565b90506001600281111561121657fe5b8160030160009054906101000a900460ff16600281111561123357fe5b14611273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126a90614df3565b60405180910390fd5b6000600554858161128057fe5b061480156112915750806002015484105b6112d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c790614b53565b60405180910390fd5b600554848260020154031080156112ed5750838160020154038351145b806112fa57506005548351145b611339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133090614bf3565b60405180910390fd5b6000151581600401600554868161134c57fe5b048154811061135757fe5b90600052602060002090602091828204019190069054906101000a900460ff161515146113b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b090614bd3565b60405180910390fd5b60006113c78387878761348c565b905080611409576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140090614cf3565b60405180910390fd5b600182600401600554878161141a57fe5b048154811061142557fe5b90600052602060002090602091828204019190066101000a81548160ff021916908315150217905550505050505050565b61145e613c45565b6000606061146b86612d2d565b91509150611477613a4f565b611481838361328d565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156115255780601f106114fa57610100808354040283529160200191611525565b820191906000526020600020905b81548152906001019060200180831161150857829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561157157fe5b600281111561157c57fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156115f457602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116115be5790505b505050505081525050905060028081111561160b57fe5b8160600151600281111561161b57fe5b1461165b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165290614e93565b60405180910390fd5b600554851115801561166d5750600085115b6116ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a390614bf3565b60405180910390fd5b806040015185870111156116f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ec90614b53565b60405180910390fd5b60006117038484898961353d565b80965081925050508061174b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174290614d73565b60405180910390fd5b505050509392505050565b60003390506000611767828461328d565b90506001600281111561177657fe5b8160030160009054906101000a900460ff16600281111561179357fe5b146117d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ca90614df3565b60405180910390fd5b60006001905060008260040180549050905060008090505b8181101561183e576000151584600401828154811061180657fe5b90600052602060002090602091828204019190069054906101000a900460ff161515141561183357600092505b8060010190506117eb565b508161187f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187690614d53565b60405180910390fd5b60028360030160006101000a81548160ff021916908360028111156118a057fe5b021790555060006118b185876135d0565b9050806118f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ea90614bb3565b60405180910390fd5b505050505050565b60606000606061190a84612d2d565b91509150606061191982612ac9565b90506000600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008090505b8251811015611a235760008260010184838151811061197f57fe5b60200260200101516040516119949190614aa1565b908152602001604051809103902054116119e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119da90614cb3565b60405180910390fd5b816002018382815181106119f357fe5b6020026020010151604051611a089190614aa1565b90815260200160405180910390209150806001019050611964565b5080600001805480602002602001604051908101604052809291908181526020016000905b82821015611beb57838290600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611b045780601f10611ad957610100808354040283529160200191611b04565b820191906000526020600020905b815481529060010190602001808311611ae757829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115611b5057fe5b6002811115611b5b57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015611bd357602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411611b9d5790505b50505050508152505081526020019060010190611a48565b50505050945050505050919050565b600360009054906101000a900460ff16611c3d57612000600481905550621000006005819055506001600360006101000a81548160ff0219169083151502179055505b60003390506305f5e100821115611c89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8090614db3565b60405180910390fd5b600660008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205483011115611d4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4390614e33565b60405180910390fd5b6060611d5784612ac9565b90506000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015611e6857600082600101846001840381518110611dc157fe5b6020026020010151604051611dd69190614aa1565b90815260200160405180910390205411611e25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1c90614cb3565b60405180910390fd5b81600201836001830381518110611e3857fe5b6020026020010151604051611e4d9190614aa1565b90815260200160405180910390209150806001019050611da3565b50600454816000018054905010611eb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eab90614dd3565b60405180910390fd5b60606001835111611ec55785611ede565b82600184510381518110611ed557fe5b60200260200101515b905060008260010182604051611ef49190614ab8565b90815260200160405180910390205414611f43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3a90614e13565b60405180910390fd5b611f4c816130af565b611f8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8290614d93565b60405180910390fd5b6000611f98858888613634565b905080611fda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd190614e73565b60405180910390fd5b6060600554600160055489010381611fee57fe5b0460405190808252806020026020018201604052801561201d5781602001602082028038833980820191505090505b509050836000016040518060a001604052808581526020016001151581526020018981526020016001600281111561205157fe5b8152602001838152509080600181540180825580915050600190039060005260206000209060050201600090919091909150600082015181600001908051906020019061209f929190613a8b565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff021916908360028111156120ee57fe5b0217905550608082015181600401908051906020019061210f929190613b0b565b5050508360000180549050846001018460405161212c9190614ab8565b90815260200160405180910390208190555086600760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505050505050505050565b60003390506121a2613a4f565b6121ac828461328d565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156122505780601f1061222557610100808354040283529160200191612250565b820191906000526020600020905b81548152906001019060200180831161223357829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561229c57fe5b60028111156122a757fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561231f57602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116122e95790505b50505050508152505090506000600281111561233757fe5b8160600151600281111561234757fe5b1415612388576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161237f90614c13565b60405180910390fd5b600061239483856136a1565b9050806123d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123cd90614c73565b60405180910390fd5b60606123e185612ac9565b90506000600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015612479578160020183600183038151811061244957fe5b602002602001015160405161245e9190614aa1565b9081526020016040518091039020915080600101905061242d565b50600060018260010186600001516040516124949190614aa1565b9081526020016040518091039020540390506124ae613a4f565b826000016001846000018054905003815481106124c757fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156125795780601f1061254e57610100808354040283529160200191612579565b820191906000526020600020905b81548152906001019060200180831161255c57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff1660028111156125c557fe5b60028111156125d057fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561264857602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116126125790505b50505050508152505090508083600001838154811061266357fe5b9060005260206000209060050201600082015181600001908051906020019061268d929190613a8b565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff021916908360028111156126dc57fe5b021790555060808201518160040190805190602001906126fd929190613b0b565b509050508260000180548061270e57fe5b6001900381819060005260206000209060050201600080820160006127339190613bb1565b6001820160006101000a81549060ff021916905560028201600090556003820160006101000a81549060ff02191690556004820160006127739190613bf9565b5050905582600101866000015160405161278d9190614aa1565b9081526020016040518091039020548360010182600001516040516127b29190614aa1565b90815260200160405180910390208190555060008360010187600001516040516127dc9190614aa1565b9081526020016040518091039020819055508560400151600760008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505050505050505050565b600080606061285784612d2d565b91509150612863613a4f565b61286d838361328d565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156129115780601f106128e657610100808354040283529160200191612911565b820191906000526020600020905b8154815290600101906020018083116128f457829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561295d57fe5b600281111561296857fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156129e057602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116129aa5790505b5050505050815250509050600160028111156129f857fe5b81606001516002811115612a0857fe5b1480612a2d5750600280811115612a1b57fe5b81606001516002811115612a2b57fe5b145b612a6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a6390614df3565b60405180910390fd5b6000612a788484613705565b809650819250505080612ac0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ab790614e53565b60405180910390fd5b50505050919050565b6060612ad3613c6a565b612adc8361376e565b9050612ae6613c6a565b612b246040518060400160405280600181526020017f2f0000000000000000000000000000000000000000000000000000000000000081525061376e565b905060606001612b3d838561379c90919063ffffffff16565b01604051908082528060200260200182016040528015612b7157816020015b6060815260200190600190039081612b5c5790505b50905060008090505b8151811015612bc257612b9e612b99848661381190919063ffffffff16565b61382b565b828281518110612baa57fe5b60200260200101819052508080600101915050612b7a565b50600081600183510381518110612bd557fe5b6020026020010151511415612c405780600182510381518110612bf457fe5b6020026020010160608152506001815103604051908082528060200260200182016040528015612c3857816020015b6060815260200190600190039081612c235790505b509350612c79565b8051604051908082528060200260200182016040528015612c7557816020015b6060815260200190600190039081612c605790505b5093505b60008090505b8451811015612cc057818181518110612c9457fe5b6020026020010151858281518110612ca857fe5b60200260200101819052508080600101915050612c7f565b50505050919050565b60008060016020601f85510181612cdc57fe5b040190506040518481526020810160005b83811015612d0e578060200286015181602002830152806001019050612ced565b50602082602085026040018460006010600019f1935050505092915050565b6000606060006028905080845111612d7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d7190614c93565b60405180910390fd5b6060816040519080825280601f01601f191660200182016040528015612daf5781602001600182028038833980820191505090505b50905060008090505b82811015612e1f57858181518110612dcc57fe5b602001015160f81c60f81b828281518110612de357fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050612db8565b50600080905060008090505b83811015612f4e576000838281518110612e4157fe5b602001015160f81c60f81b60f81c60ff16905060308110158015612e66575060398111155b80612e7f575060418110158015612e7e5750605a8111155b5b80612e98575060618110158015612e97575060668111155b5b612ed7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ece90614c93565b60405180910390fd5b60308110158015612ee9575060398111155b15612efa5760308103601084020192505b60418110158015612f0c5750605a8111155b15612f1d5760378103601084020192505b60618110158015612f2f575060668111155b15612f405760578103601084020192505b508080600101915050612e2b565b508094507f2f00000000000000000000000000000000000000000000000000000000000000868481518110612f7f57fe5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612fec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fe390614c93565b60405180910390fd5b6000600184885103039050806040519080825280601f01601f19166020018201604052801561302a5781602001600182028038833980820191505090505b50945060008090505b818110156130a5576000886001878401018151811061304e57fe5b602001015160f81c60f81b90508087838151811061306857fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350508080600101915050613033565b5050505050915091565b60006040516020016130c090614ae4565b60405160208183030381529060405280519060200120826040516020016130e79190614ab8565b604051602081830303815290604052805190602001201480613152575060405160200161311390614acf565b604051602081830303815290604052805190602001208260405160200161313a9190614ab8565b60405160208183030381529060405280519060200120145b8061315e575060008251145b1561316c576000905061318b565b60008251905060ff81111561318557600091505061318b565b60019150505b919050565b60008060016020601f855101816131a357fe5b040190506040518481526020810160005b838110156131d55780602002860151816020028301528060010190506131b4565b5060208260208502604001846000600f600019f1935050505092915050565b600073d2001000000000000000000000000000000000d273ffffffffffffffffffffffffffffffffffffffff166383e781fe6040518163ffffffff1660e01b815260040160206040518083038186803b15801561325057600080fd5b505afa158015613264573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506132889190810190613e2f565b905090565b6000606061329a83612ac9565b90506000600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b82518110156133ab5760008260010184600184038151811061330457fe5b60200260200101516040516133199190614aa1565b90815260200160405180910390205411613368576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161335f90614cb3565b60405180910390fd5b8160020183600183038151811061337b57fe5b60200260200101516040516133909190614aa1565b908152602001604051809103902091508060010190506132e6565b50606060018351116133bd57846133d6565b826001845103815181106133cd57fe5b60200260200101515b9050600082600101826040516133ec9190614ab8565b9081526020016040518091039020541161343b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161343290614cb3565b60405180910390fd5b600082600001600184600101846040516134559190614ab8565b908152602001604051809103902054038154811061346f57fe5b906000526020600020906005020190508094505050505092915050565b60008060016020601f8551018161349f57fe5b04019050600060016020601f885101816134b557fe5b040190506040518781526020810160005b838110156134e75780602002890151816020028301528060010190506134c6565b50868360200282015260005b8481101561351957806020028701518185600101016020028301528060010190506134f3565b50602082848601602002606001846000600c600019f1945050505050949350505050565b6000613547613c45565b600060016020601f8851018161355957fe5b0401905060006020601f86018161356c57fe5b0490506040518881526020810160005b8481101561359d57806020028a01518160200283015280600101905061357c565b5083602002810188815287816020015283602002868660030160200285600a600019fa9650505050505094509492505050565b60008060016020601f855101816135e357fe5b040190506040518481526020810160005b838110156136155780602002860151816020028301528060010190506135f4565b50602082602085026040018460006011600019f1935050505092915050565b60008060016020601f8651018161364757fe5b040190506040518581526020810160005b83811015613679578060200287015181602002830152806001019050613658565b50846020840282015260208260208502604001846000600b600019f193505050509392505050565b60008060016020601f855101816136b457fe5b040190506040518481526020810160005b838110156136e65780602002860151816020028301528060010190506136c5565b5060208260208502604001846000600e600019f1935050505092915050565b600080600060016020601f8651018161371a57fe5b040190506040518581526020810160005b8381101561374c57806020028701518160200283015280600101905061372b565b506020826020850260200184600d600019fa9450815193505050509250929050565b613776613c6a565b600060208301905060405180604001604052808451815260200182815250915050919050565b60008082600001516137c0856000015186602001518660000151876020015161388d565b0190505b8360000151846020015101811161380a578180600101925050826000015161380285602001518303866000015103838660000151876020015161388d565b0190506137c4565b5092915050565b613819613c6a565b613824838383613968565b5092915050565b60608082600001516040519080825280601f01601f1916602001820160405280156138655781602001600182028038833980820191505090505b50905060006020820190506138838185602001518660000151613a06565b8192505050919050565b6000808490506000868511613958576020851161391257600060018660200360080260020a031960001b905060008186511690506000878a8a0103905060008386511690505b828114613904578186106138f1578a8a019650505050505050613960565b85806001019650508386511690506138d3565b859650505050505050613960565b60008585209050600091505b85880382116139565760008684209050808214156139425783945050505050613960565b60018401935050818060010192505061391e565b505b868601925050505b949350505050565b613970613c6a565b600061398e856000015186602001518660000151876020015161388d565b905084602001518360200181815250508460200151810383600001818152505084600001518560200151018114156139d05760008560000181815250506139fb565b8360000151836000015101856000018181510391508181525050836000015181018560200181815250505b829150509392505050565b5b60208110613a2a5781518352602083019250602082019150602081039050613a07565b60006001826020036101000a0390508019835116818551168181178652505050505050565b6040518060a00160405280606081526020016000151581526020016000815260200160006002811115613a7e57fe5b8152602001606081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613acc57805160ff1916838001178555613afa565b82800160010185558215613afa579182015b82811115613af9578251825591602001919060010190613ade565b5b509050613b079190613c84565b5090565b82805482825590600052602060002090601f01602090048101928215613ba05791602002820160005b83821115613b7157835183826101000a81548160ff0219169083151502179055509260200192600101602081600001049283019260010302613b34565b8015613b9e5782816101000a81549060ff0219169055600101602081600001049283019260010302613b71565b505b509050613bad9190613ca9565b5090565b50805460018160011615610100020316600290046000825580601f10613bd75750613bf6565b601f016020900490600052602060002090810190613bf59190613c84565b5b50565b50805460008255601f016020900490600052602060002090810190613c1e9190613c84565b50565b5080546000825560050290600052602060002090810190613c429190613cd9565b50565b6040518062100000016040528061800090602082028038833980820191505090505090565b604051806040016040528060008152602001600081525090565b613ca691905b80821115613ca2576000816000905550600101613c8a565b5090565b90565b613cd691905b80821115613cd257600081816101000a81549060ff021916905550600101613caf565b5090565b90565b613d4591905b80821115613d415760008082016000613cf89190613bb1565b6001820160006101000a81549060ff021916905560028201600090556003820160006101000a81549060ff0219169055600482016000613d389190613bf9565b50600501613cdf565b5090565b90565b600081359050613d578161510d565b92915050565b600081519050613d6c8161510d565b92915050565b600082601f830112613d8357600080fd5b8135613d96613d9182614efb565b614ece565b91508082526020830160208301858383011115613db257600080fd5b613dbd8382846150ad565b50505092915050565b600082601f830112613dd757600080fd5b8135613dea613de582614f27565b614ece565b91508082526020830160208301858383011115613e0657600080fd5b613e118382846150ad565b50505092915050565b600081359050613e2981615124565b92915050565b600060208284031215613e4157600080fd5b6000613e4f84828501613d5d565b91505092915050565b60008060408385031215613e6b57600080fd5b6000613e7985828601613d48565b9250506020613e8a85828601613e1a565b9150509250929050565b600060208284031215613ea657600080fd5b600082013567ffffffffffffffff811115613ec057600080fd5b613ecc84828501613dc6565b91505092915050565b60008060408385031215613ee857600080fd5b600083013567ffffffffffffffff811115613f0257600080fd5b613f0e85828601613dc6565b9250506020613f1f85828601613e1a565b9150509250929050565b600080600060608486031215613f3e57600080fd5b600084013567ffffffffffffffff811115613f5857600080fd5b613f6486828701613dc6565b9350506020613f7586828701613e1a565b925050604084013567ffffffffffffffff811115613f9257600080fd5b613f9e86828701613d72565b9150509250925092565b600080600060608486031215613fbd57600080fd5b600084013567ffffffffffffffff811115613fd757600080fd5b613fe386828701613dc6565b9350506020613ff486828701613e1a565b925050604061400586828701613e1a565b9150509250925092565b600061401b838361417d565b60208301905092915050565b6000614033838361418c565b60208301905092915050565b600061404b8383614a06565b905092915050565b600061405e82614f7d565b6140688185614fdc565b935061407383614f53565b8060005b838110156140a457815161408b888261400f565b975061409683614fb5565b925050600181019050614077565b5085935050505092915050565b6140ba81614f88565b6140c48184614fed565b92506140cf82614f63565b8060005b838110156141005781516140e78782614027565b96506140f283614fc2565b9250506001810190506140d3565b505050505050565b600061411382614f94565b61411d8185614ff8565b93508360208202850161412f85614f6d565b8060005b8581101561416b578484038952815161414c858261403f565b945061415783614fcf565b925060208a01995050600181019050614133565b50829750879550505050505092915050565b61418681615048565b82525050565b61419581615054565b82525050565b6141a48161509b565b82525050565b6141b38161509b565b82525050565b60006141c482614faa565b6141ce818561502b565b93506141de8185602086016150bc565b80840191505092915050565b60006141f582614f9f565b6141ff8185615009565b935061420f8185602086016150bc565b614218816150ef565b840191505092915050565b600061422e82614f9f565b614238818561502b565b93506142488185602086016150bc565b80840191505092915050565b600061426160188361501a565b91507f496e636f7272656374206368756e6b20706f736974696f6e00000000000000006000830152602082019050919050565b60006142a160158361501a565b91507f4469726563746f7279206e6f74206372656174656400000000000000000000006000830152602082019050919050565b60006142e160248361501a565b91507f4e6f7420656e6f756768206d656d6f727920696e207468652046696c6573746f60008301527f72616765000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614347601b8361501a565b91507f48617368206861736e2774206265656e2063616c63756c6174656400000000006000830152602082019050919050565b600061438760198361501a565b91507f4368756e6b20697320616c72656164792075706c6f61646564000000000000006000830152602082019050919050565b60006143c760168361501a565b91507f496e636f7272656374206368756e6b206c656e677468000000000000000000006000830152602082019050919050565b6000614407600f8361501a565b91507f46696c65206e6f742065786973747300000000000000000000000000000000006000830152602082019050919050565b6000614447600e8361501a565b91507f496e76616c69642073656e6465720000000000000000000000000000000000006000830152602082019050919050565b600061448760188361501a565b91507f4469726563746f7279206973206e6f742064656c6574656400000000000000006000830152602082019050919050565b60006144c760108361501a565b91507f46696c65206e6f742064656c65746564000000000000000000000000000000006000830152602082019050919050565b600061450760138361501a565b91507f496e76616c69642073746f7261676550617468000000000000000000000000006000830152602082019050919050565b6000614547600c8361501a565b91507f496e76616c6964207061746800000000000000000000000000000000000000006000830152602082019050919050565b600061458760018361502b565b91507f2e000000000000000000000000000000000000000000000000000000000000006000830152600182019050919050565b60006145c760168361501a565b91507f496e76616c6964206469726563746f7279206e616d65000000000000000000006000830152602082019050919050565b600061460760158361501a565b91507f4368756e6b207761736e27742075706c6f6164656400000000000000000000006000830152602082019050919050565b600061464760268361501a565b91507f436f756c64206e6f742072657365727665206c657373207468616e207573656460008301527f20737061636500000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006146ad60168361501a565b91507f4469726563746f7279206973206e6f7420656d707479000000000000000000006000830152602082019050919050565b60006146ed60238361501a565b91507f46696c65206861736e2774206265656e2075706c6f6164656420636f7272656360008301527f746c7900000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061475360118361501a565b91507f4368756e6b207761736e277420726561640000000000000000000000000000006000830152602082019050919050565b600061479360188361501a565b91507f46696c656e616d652073686f756c64206265203c2032353600000000000000006000830152602082019050919050565b60006147d3601f8361501a565b91507f46696c652073686f756c64206265206c657373207468616e20313030204d42006000830152602082019050919050565b600061481360028361502b565b91507f2e2e0000000000000000000000000000000000000000000000000000000000006000830152600282019050919050565b600061485360118361501a565b91507f4469726563746f72792069732066756c6c0000000000000000000000000000006000830152602082019050919050565b6000614893600e8361501a565b91507f46696c65206e6f7420666f756e640000000000000000000000000000000000006000830152602082019050919050565b60006148d360188361501a565b91507f46696c65206f72206469726563746f72792065786973747300000000000000006000830152602082019050919050565b600061491360198361501a565b91507f4e6f7420656e6f756768207265736572766564207370616365000000000000006000830152602082019050919050565b600061495360188361501a565b91507f45564d206572726f7220696e2067657446696c6553697a6500000000000000006000830152602082019050919050565b600061499360108361501a565b91507f46696c65206e6f742063726561746564000000000000000000000000000000006000830152602082019050919050565b60006149d360198361501a565b91507f46696c65206861736e2774206265656e2075706c6f61646564000000000000006000830152602082019050919050565b600060a0830160008301518482036000860152614a2382826141ea565b9150506020830151614a38602086018261417d565b506040830151614a4b6040860182614a83565b506060830151614a5e606086018261419b565b5060808301518482036080860152614a768282614053565b9150508091505092915050565b614a8c81615091565b82525050565b614a9b81615091565b82525050565b6000614aad8284614223565b915081905092915050565b6000614ac482846141b9565b915081905092915050565b6000614ada8261457a565b9150819050919050565b6000614aef82614806565b9150819050919050565b60006210000082019050614b1060008301846140b1565b92915050565b60006020820190508181036000830152614b308184614108565b905092915050565b6000602082019050614b4d60008301846141aa565b92915050565b60006020820190508181036000830152614b6c81614254565b9050919050565b60006020820190508181036000830152614b8c81614294565b9050919050565b60006020820190508181036000830152614bac816142d4565b9050919050565b60006020820190508181036000830152614bcc8161433a565b9050919050565b60006020820190508181036000830152614bec8161437a565b9050919050565b60006020820190508181036000830152614c0c816143ba565b9050919050565b60006020820190508181036000830152614c2c816143fa565b9050919050565b60006020820190508181036000830152614c4c8161443a565b9050919050565b60006020820190508181036000830152614c6c8161447a565b9050919050565b60006020820190508181036000830152614c8c816144ba565b9050919050565b60006020820190508181036000830152614cac816144fa565b9050919050565b60006020820190508181036000830152614ccc8161453a565b9050919050565b60006020820190508181036000830152614cec816145ba565b9050919050565b60006020820190508181036000830152614d0c816145fa565b9050919050565b60006020820190508181036000830152614d2c8161463a565b9050919050565b60006020820190508181036000830152614d4c816146a0565b9050919050565b60006020820190508181036000830152614d6c816146e0565b9050919050565b60006020820190508181036000830152614d8c81614746565b9050919050565b60006020820190508181036000830152614dac81614786565b9050919050565b60006020820190508181036000830152614dcc816147c6565b9050919050565b60006020820190508181036000830152614dec81614846565b9050919050565b60006020820190508181036000830152614e0c81614886565b9050919050565b60006020820190508181036000830152614e2c816148c6565b9050919050565b60006020820190508181036000830152614e4c81614906565b9050919050565b60006020820190508181036000830152614e6c81614946565b9050919050565b60006020820190508181036000830152614e8c81614986565b9050919050565b60006020820190508181036000830152614eac816149c6565b9050919050565b6000602082019050614ec86000830184614a92565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614ef157600080fd5b8060405250919050565b600067ffffffffffffffff821115614f1257600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614f3e57600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050919050565b6000819050602082019050919050565b600081519050919050565b60006180009050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061504182615071565b9050919050565b60008115159050919050565b6000819050919050565b600081905061506c82615100565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006150a68261505e565b9050919050565b82818337600083830152505050565b60005b838110156150da5780820151818401526020810190506150bf565b838111156150e9576000848401525b50505050565b6000601f19601f8301169050919050565b6003811061510a57fe5b50565b61511681615036565b811461512157600080fd5b50565b61512d81615091565b811461513857600080fd5b5056fea2646970667358221220a549ad9e778ae8bb3048c0a1805e77745871cc1560637ae1c3ebccb76638d9c464736f6c63430006020033", + "nonce": "0", + "storage": {} + }, + "0xa096b05a489831db893fc53aacc7ed20efb36382": { + "balance": "1000000000000000000000000000000" + }, + "0xa1cd651d99283be60e2a9d2e3bc8a90aedb8244f": { + "balance": "1000000000000000000000000000000" + }, + "0xa2969e82619021ea407338f8bdf7c6f2bd679673": { + "balance": "1000000000000000000000000000000" + }, + "0xa3597b1162b6559cb5e966904b63e762ece756a4": { + "balance": "1000000000000000000000000000000" + }, + "0xa68f946090c600eda6f139783077ee802afeb990": { + "balance": "1000000000000000000000000000000" + }, + "0xa6d50055592cecb795bc1ed3b9ea57ed426b0b7c": { + "balance": "1000000000000000000000000000000" + }, + "0xa7c0789bdeee38c6b59111a789dfb6b815489847": { + "balance": "1000000000000000000000000000000" + }, + "0xa8c813ee806b4c8537ff5f16084d44db18ea9ab1": { + "balance": "1000000000000000000000000000000" + }, + "0xaa6a87bbb74bc1f3cb40c1efb7fc171ee6407560": { + "balance": "1000000000000000000000000000000" + }, + "0xabf920b89f5a2487fdb70be17fd01a99a0602e62": { + "balance": "1000000000000000000000000000000" + }, + "0xac5df92da5171ba24a9618018b4f79494040334b": { + "balance": "1000000000000000000000000000000" + }, + "0xaf97a8318a1a51d5daeeb9650024b63ee44f45bd": { + "balance": "1000000000000000000000000000000" + }, + "0xb28c45b98ae43a5e9ee5509c97ea037b5de5d6d9": { + "balance": "1000000000000000000000000000000" + }, + "0xb64989ab32b089da3da103b93e6781d6d5dd10b4": { + "balance": "1000000000000000000000000000000" + }, + "0xb67e6f4a21f93c250fa6ff0cb142bd14dd4ca8eb": { + "balance": "1000000000000000000000000000000" + }, + "0xb70603c505f85130b5b2e73cd82d196dfd7d8b5e": { + "balance": "1000000000000000000000000000000" + }, + "0xb942414cae2a1ab1056657b905845c0ab6b6280a": { + "balance": "1000000000000000000000000000000" + }, + "0xbee0e5c1961d51be9bd670876caa9c90ba7d9016": { + "balance": "1000000000000000000000000000000" + }, + "0xbf2d8cebdeeb8ad8fed7b2a75f35922106f8d75c": { + "balance": "1000000000000000000000000000000" + }, + "0xbf5aa678b969c0871e2fbcf09c3dbb5d5865ac1e": { + "balance": "1000000000000000000000000000000" + }, + "0xc12bcedd9bcad9120150122cd50f39576ecccc08": { + "balance": "1000000000000000000000000000000" + }, + "0xc2d3852f3292acb81bd164dbae5f1e2a87535150": { + "balance": "1000000000000000000000000000000" + }, + "0xc3820490201e94d76b44655d2df713fec29d9795": { + "balance": "1000000000000000000000000000000" + }, + "0xc58744e2eceefd45cc5469f0e0a708ad24ddbbdb": { + "balance": "1000000000000000000000000000000" + }, + "0xc7865200e8e51ba1c8d695f327deed432930f2cc": { + "balance": "1000000000000000000000000000000" + }, + "0xc8e4d709eb3eb335dc69c9fbf2d24d447cb86105": { + "balance": "1000000000000000000000000000000" + }, + "0xc98af661e44c5bf31d2f8bdff4bbf2808ed4e991": { + "balance": "1000000000000000000000000000000" + }, + "0xca4409573a5129a72edf85d6c51e26760fc9c903": { + "balance": "100000000000000000000000" + }, + "0xcc33e23b04b74f7ba8fbe315083182224af973fa": { + "balance": "1000000000000000000000000000000" + }, + "0xce1c62d0a77600fb2f959b4da76fcb9b3b9430a3": { + "balance": "1000000000000000000000000000000" + }, + "0xd1b6c947fb14060b38945584714491592e84875d": { + "balance": "1000000000000000000000000000000" + }, + "0xd23cd6a9ddcc3470300003621bbac1e06a7919d5": { + "balance": "1000000000000000000000000000000" + }, + "0xd2c5b39B4e735C17612Bb5a08FD024ccc5dBCb23": { + "balance": "100000000000000000000000" + }, + "0xd2cd302eb060e375a65d65946692a3ac2d838d35": { + "balance": "1000000000000000000000000000000" + }, + "0xd2e75c41ced8699e3176f6e335355701a2568b7b": { + "balance": "1000000000000000000000000000000" + }, + "0xd3d38f4cb0aeb4c7c2527ddaeec2ab3b910c8528": { + "balance": "1000000000000000000000000000000" + }, + "0xd5b561a27cca5049650a14ab93dbf1a20c0cefc1": { + "balance": "1000000000000000000000000000000" + }, + "0xd90045420b8abc37b3f9304ed2b385fc1b7fa8c5": { + "balance": "1000000000000000000000000000000" + }, + "0xd951bf4cff429062702a7d8699a5f0bf14845d9b": { + "balance": "1000000000000000000000000000000" + }, + "0xdc6a269c58e58a93a22b5df8cdf1af630c47481f": { + "balance": "1000000000000000000000000000000" + }, + "0xdc6d02ef4003a4f2d0ccff65ae1a2d8157fbb23e": { + "balance": "1000000000000000000000000000000" + }, + "0xde14aca36acc62c305a7ee571da37840a408e600": { + "balance": "1000000000000000000000000000000" + }, + "0xdee32ae508cf783f53ab8bc39d878fe323cdfae3": { + "balance": "1000000000000000000000000000000" + }, + "0xe083a100d51fc4f38aae4a3a68404c36ad96c612": { + "balance": "1000000000000000000000000000000" + }, + "0xe1607990ce800407e3c206e58de4917977181d4d": { + "balance": "1000000000000000000000000000000" + }, + "0xe25e5b63dfd4cf59b81eddf64f1195858634b8a6": { + "balance": "1000000000000000000000000000000" + }, + "0xe372377decb3bdc0c7f5272d38ce0ba2a54934fe": { + "balance": "1000000000000000000000000000000" + }, + "0xe3cc6ec63b5652d1594bc63bb293f4e80f76dbdd": { + "balance": "1000000000000000000000000000000" + }, + "0xe3da7c014286258944ab20a31e4d861b4c9262f1": { + "balance": "1000000000000000000000000000000" + }, + "0xe8b57f330d56081c856e618210fbedb414925ff0": { + "balance": "1000000000000000000000000000000" + }, + "0xe91ac72a568e752eb7c9f5235100586ce97c8cc1": { + "balance": "1000000000000000000000000000000" + }, + "0xf184c8c243a178c1748a0af45caedeca476105b4": { + "balance": "1000000000000000000000000000000" + }, + "0xf1a5912ff318aebf312cdb54c75642a9e632703c": { + "balance": "1000000000000000000000000000000" + }, + "0xf2197b153b4c9086fc5410431fbf7960d284c65e": { + "balance": "1000000000000000000000000000000" + }, + "0xf36620e71327f4a55d550d46e030ccf0c728f154": { + "balance": "1000000000000000000000000000000" + }, + "0xf9817fB82fc767aA9A4A97a1901676244b88ce0E": { + "balance": "100000000000000000000000" + }, + "0xfa723938fa8da1a8a2114ad409a11581761ee40d": { + "balance": "1000000000000000000000000000000" + }, + "0xfa7a8c69810eaf16a395d2a93b3ab51efeed2a1c": { + "balance": "1000000000000000000000000000000" + }, + "0xfaa1038074941571524934ba52d312e88b3577f5": { + "balance": "1000000000000000000000000000000" + }, + "0xfe14077c26a507496b7208384d459e21c49c4212": { + "balance": "1000000000000000000000000000000" + }, + "0xfe275c9b5ac792327da509b27eb9614196dfb07d": { + "balance": "1000000000000000000000000000000" + }, + "0xfe2c5aa110fff89361806ea7ee080bfffba0d3dd": { + "balance": "1000000000000000000000000000000" + }, + "0xfe3d4f1fc038f4f756ba44995129cd45c9e0e861": { + "balance": "1000000000000000000000000000000" + }, + "0xfee314cdc84ecfaa675e41b3559c0101e1eba6b8": { + "balance": "1000000000000000000000000000000" + } + }, + "genesis": { + "author": "0x0000000000000000000000000000000000000001", + "difficulty": "0x0", + "extraData": "0x11bbe8db4e347b4e8c937c1c8370e4b5ed33adb3db69cbdb7a38e1e50b1b82fa", + "gasLimit": "0xFFFFFFFFF", + "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000abc", + "nonce": "0x0000000000000042", + "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "timestamp": "0x00" + }, + "params": { + "EIP150ForkBlock": "0x00", + "EIP158ForkBlock": "0x00", + "accountStartNonce": "0x00", + "blockReward": "0x4563918244F40000", + "byzantiumForkBlock": "0x0", + "chainID": "0x12345", + "constantinopleForkBlock": "0x0", + "daoHardforkBlock": "0x0", + "difficultyBoundDivisor": "0x0800", + "durationLimit": "0x0d", + "externalGasDifficulty": "0x01", + "gasLimitBoundDivisor": "0x0400", + "homesteadForkBlock": "0x0", + "maxGasLimit": "0xFFFFFFFFF", + "maximumExtraDataSize": "0x20", + "minGasLimit": "0xFFFFFFFFF", + "minimumDifficulty": "0x0", + "networkID": "12313219", + "tieBreakingGas": false + }, + "sealEngine": "Ethash", + "skaleConfig": { + "nodeInfo": { + "basePort": 2531, + "bindIP": "0.0.0.0", + "collectionDuration": 10, + "collectionQueueSize": 2, + "db-path": "/tmp/test_eth_14_of_16", + "ecdsaKeyName": "", + "httpRpcPort": 2534, + "httpsRpcPort": 1239, + "logLevel": "info", + "logLevelProposal": "info", + "maxCacheSize": 2000, + "maxOpenLeveldbFiles": 25, + "minCacheSize": 1000, + "nodeID": 1614, + "nodeName": "Node1", + "rotateAfterBlock": 0, + "testSignatures": true, + "transactionQueueSize": 10000, + "wsRpcPort": 2533, + "wssRpcPort": 2538 + }, + "sChain": { + "EIP1559TransactionsPatchTimestamp": 1, + "contractStorageLimit": 10000000000, + "contractStoragePatchTimestamp": 1, + "contractStorageZeroValuePatchTimestamp": 1, + "correctForkInPowPatchTimestamp": 1, + "emptyBlockIntervalMs": 10000, + "fastConsensusPatchTimestamp": 1, + "flexibleDeploymentPatchTimestamp": 1, + "levelDBReopenIntervalMs": 1, + "multiTransactionMode": false, + "nodes": [ + { + "basePort": 1231, + "ip": "127.0.0.1", + "nodeID": 1601, + "publicKey": "", + "schainIndex": 1 + }, + { + "basePort": 1331, + "ip": "127.0.0.1", + "nodeID": 1602, + "publicKey": "", + "schainIndex": 2 + }, + { + "basePort": 1431, + "ip": "127.0.0.1", + "nodeID": 1603, + "publicKey": "", + "schainIndex": 3 + }, + { + "basePort": 1531, + "ip": "127.0.0.1", + "nodeID": 1604, + "publicKey": "", + "schainIndex": 4 + }, + { + "basePort": 1631, + "ip": "127.0.0.1", + "nodeID": 1605, + "publicKey": "", + "schainIndex": 5 + }, + { + "basePort": 1731, + "ip": "127.0.0.1", + "nodeID": 1606, + "publicKey": "", + "schainIndex": 6 + }, + { + "basePort": 1831, + "ip": "127.0.0.1", + "nodeID": 1607, + "publicKey": "", + "schainIndex": 7 + }, + { + "basePort": 1931, + "ip": "127.0.0.1", + "nodeID": 1608, + "publicKey": "", + "schainIndex": 8 + }, + { + "basePort": 2031, + "ip": "127.0.0.1", + "nodeID": 1609, + "publicKey": "", + "schainIndex": 9 + }, + { + "basePort": 2131, + "ip": "127.0.0.1", + "nodeID": 1610, + "publicKey": "", + "schainIndex": 10 + }, + { + "basePort": 2231, + "ip": "127.0.0.1", + "nodeID": 1611, + "publicKey": "", + "schainIndex": 11 + }, + { + "basePort": 2331, + "ip": "127.0.0.1", + "nodeID": 1612, + "publicKey": "", + "schainIndex": 12 + }, + { + "basePort": 2431, + "ip": "127.0.0.1", + "nodeID": 1613, + "publicKey": "", + "schainIndex": 13 + }, + { + "basePort": 2531, + "ip": "127.0.0.1", + "nodeID": 1614, + "publicKey": "", + "schainIndex": 14 + }, + { + "basePort": 2631, + "ip": "127.0.0.1", + "nodeID": 1615, + "publicKey": "", + "schainIndex": 15 + }, + { + "basePort": 2731, + "ip": "127.0.0.1", + "nodeID": 1616, + "publicKey": "", + "schainIndex": 16 + } + ], + "powCheckPatchTimestamp": 1, + "precompiledConfigPatchTimestamp": 1, + "pushZeroPatchTimestamp": 1, + "revertableFSPatchTimestamp": 1, + "schainID": 5, + "schainName": "TestChain", + "schainOwner": "0x907cd0881E50d359bb9Fd120B1A5A143b1C97De6", + "skipInvalidTransactionsPatchTimestamp": 1, + "storageDestructionPatchTimestamp": 1, + "verifyBlsSyncPatchTimestamp": 1, + "verifyDaSigsPatchTimestamp": 1 + } + }, + "unddos": { + "origins": [ + { + "ban_lengthy": 0, + "ban_peak": 0, + "max_calls_per_minute": 1000000000, + "max_calls_per_second": 1000000000, + "max_ws_conn": 65535, + "origin": [ + "*" + ] + } + ] + } +} \ No newline at end of file diff --git a/test/historicstate/configs/test_15_of_16.json b/test/historicstate/configs/test_15_of_16.json new file mode 100644 index 000000000..8bf623a2f --- /dev/null +++ b/test/historicstate/configs/test_15_of_16.json @@ -0,0 +1,910 @@ +{ + "accounts": { + "0000000000000000000000000000000000000001": { + "precompiled": { + "linear": { + "base": 3000, + "word": 0 + }, + "name": "ecrecover" + } + }, + "0000000000000000000000000000000000000002": { + "precompiled": { + "linear": { + "base": 60, + "word": 12 + }, + "name": "sha256" + } + }, + "0000000000000000000000000000000000000003": { + "precompiled": { + "linear": { + "base": 600, + "word": 120 + }, + "name": "ripemd160" + } + }, + "0000000000000000000000000000000000000004": { + "precompiled": { + "linear": { + "base": 15, + "word": 3 + }, + "name": "identity" + } + }, + "0000000000000000000000000000000000000005": { + "precompiled": { + "name": "modexp", + "startingBlock": "0x2dc6c0" + } + }, + "0000000000000000000000000000000000000006": { + "precompiled": { + "linear": { + "base": 500, + "word": 0 + }, + "name": "alt_bn128_G1_add", + "startingBlock": "0x2dc6c0" + } + }, + "0000000000000000000000000000000000000007": { + "precompiled": { + "linear": { + "base": 40000, + "word": 0 + }, + "name": "alt_bn128_G1_mul", + "startingBlock": "0x2dc6c0" + } + }, + "0000000000000000000000000000000000000008": { + "precompiled": { + "name": "alt_bn128_pairing_product", + "startingBlock": "0x2dc6c0" + } + }, + "000000000000000000000000000000000000000A": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "readChunk", + "startingBlock": "0x0" + } + }, + "000000000000000000000000000000000000000B": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "createFile", + "restrictAccess": [ + "69362535ec535F0643cBf62D16aDeDCAf32Ee6F7" + ], + "startingBlock": "0x0" + } + }, + "000000000000000000000000000000000000000C": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "uploadChunk", + "startingBlock": "0x0" + } + }, + "000000000000000000000000000000000000000D": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "getFileSize", + "startingBlock": "0x0" + } + }, + "000000000000000000000000000000000000000E": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "deleteFile", + "startingBlock": "0x0" + } + }, + "000000000000000000000000000000000000000F": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "createDirectory", + "startingBlock": "0x0" + } + }, + "0000000000000000000000000000000000000010": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "deleteDirectory", + "startingBlock": "0x0" + } + }, + "0x006d8e49ce0b9eb5646e34a4d91934801b9044fd": { + "balance": "1000000000000000000000000000000" + }, + "0x0150b461b06922a5030784ba888962c28bb1f188": { + "balance": "1000000000000000000000000000000" + }, + "0x03309956988ae70152ae4469daf99b0cac2306c5": { + "balance": "1000000000000000000000000000000" + }, + "0x06104a85a380895b6dd4030113806df2b044905e": { + "balance": "1000000000000000000000000000000" + }, + "0x079cf317ef40b16141784b6fabff812d64f7c0fd": { + "balance": "1000000000000000000000000000000" + }, + "0x0966454f51166c68b73b2865473c8fb2fcdefdd5": { + "balance": "1000000000000000000000000000000" + }, + "0x099452fedc71897880f584b1bc1706efc4e76e36": { + "balance": "1000000000000000000000000000000" + }, + "0x0aa6a44690ef52354e976990292cf9c5cd36ad59": { + "balance": "1000000000000000000000000000000" + }, + "0x0fbbe17a0e5a61ee3e8661f442d7f6b177c49820": { + "balance": "1000000000000000000000000000000" + }, + "0x1239fe658b410dbbac5bbd572035f5041542f9e5": { + "balance": "1000000000000000000000000000000" + }, + "0x12d5d7340a93be7be28ea7a3ae198242f8e1282c": { + "balance": "1000000000000000000000000000000" + }, + "0x137048b9fa4f1234d6519271b2c5ec64f480db0f": { + "balance": "1000000000000000000000000000000" + }, + "0x13867af77a63048e17380e39248ada90521e97e4": { + "balance": "1000000000000000000000000000000" + }, + "0x138ea4bdf0382c2deffd5b0bff0afe59f471467f": { + "balance": "1000000000000000000000000000000" + }, + "0x13d19c55ee0a212249d26b9d741ff6d7f416db01": { + "balance": "1000000000000000000000000000000" + }, + "0x157d38b52196b248e9fe6a2172e32ce2b8c078e6": { + "balance": "1000000000000000000000000000000" + }, + "0x16e8c390f8e576161cfe966f2c3e5dd303eb9039": { + "balance": "1000000000000000000000000000000" + }, + "0x194cb9991d3d94c43e400becf21dfea45e7b3b4c": { + "balance": "1000000000000000000000000000000" + }, + "0x1C9abe4ff0CcECa40fc404c74AB7d4923fEF8901": { + "balance": "100000000000000000000000" + }, + "0x1a66fc89809112c20aa76a993db712fa9e003e4e": { + "balance": "1000000000000000000000000000000" + }, + "0x1f1d6041e12a18cf1202019f146f2fc150915e8d": { + "balance": "1000000000000000000000000000000" + }, + "0x1feaf1671c1f0faf0d44c152f72dc755db932569": { + "balance": "1000000000000000000000000000000" + }, + "0x236bf02dfafaf03851a4e6f5d69052f4884cec32": { + "balance": "1000000000000000000000000000000" + }, + "0x26d88f6a8b659be4165ee53774a057e41b5201c9": { + "balance": "1000000000000000000000000000000" + }, + "0x28353685b0b986a724b92113debb3d8cd9a6b263": { + "balance": "1000000000000000000000000000000" + }, + "0x29d83322219fdfb821459d5fdf796360faf3166a": { + "balance": "1000000000000000000000000000000" + }, + "0x2bee474be207bdbeac83d6672da5ed2fd417eac9": { + "balance": "1000000000000000000000000000000" + }, + "0x2d93455b07bccf38e8d019f7f43a2c2d70b46b4e": { + "balance": "1000000000000000000000000000000" + }, + "0x2f971bd38806c3ca45ae0a125d1267118bf5619c": { + "balance": "1000000000000000000000000000000" + }, + "0x30aaab366dfac8331f3e827495c789cde9b437c0": { + "balance": "1000000000000000000000000000000" + }, + "0x32ea0400dc2d20664cc4744b2fab04ecb709445c": { + "balance": "1000000000000000000000000000000" + }, + "0x3760dc9594ccac0f33ade5cc5371402131696341": { + "balance": "1000000000000000000000000000000" + }, + "0x38855e430611bc179cd777a8704679ffc43921de": { + "balance": "1000000000000000000000000000000" + }, + "0x3a921471a2397644c37c88ef9572c421ab37145d": { + "balance": "1000000000000000000000000000000" + }, + "0x3bcca8a8471d55a1a668bc163c0336e4a57e5c99": { + "balance": "1000000000000000000000000000000" + }, + "0x3d46ee560227c1d73cd6042b47fc8fddd8a06ecb": { + "balance": "1000000000000000000000000000000" + }, + "0x3f5bdf5d4c274c82b8d17aa2810b00d2cf050f24": { + "balance": "1000000000000000000000000000000" + }, + "0x3ffe1c9183e0f97f52a816405a7d2350624ec88b": { + "balance": "1000000000000000000000000000000" + }, + "0x426ec5f07847674aada3856609d8baaa16805d88": { + "balance": "1000000000000000000000000000000" + }, + "0x482d7f53cba6ae73a354533673c48e2dfd560949": { + "balance": "1000000000000000000000000000000" + }, + "0x48acbd6a2724eadcc2a11144ab84b6a617d1a241": { + "balance": "1000000000000000000000000000000" + }, + "0x49ef89840e400026eb5c8d79bd1b0adc152fe86d": { + "balance": "1000000000000000000000000000000" + }, + "0x4bf989fa6572af36b190032505506f1db888357f": { + "balance": "1000000000000000000000000000000" + }, + "0x4cf9b195f7cb5f86694d9b399fe21a5f34616fd3": { + "balance": "1000000000000000000000000000000" + }, + "0x4e9b85904bca60aeb5b916ca86ac622096908427": { + "balance": "1000000000000000000000000000000" + }, + "0x50120c17d7b59200e9b76e89e4e3de2f0cd00090": { + "balance": "1000000000000000000000000000000" + }, + "0x54db355342c35085a1a53184162b2fddd0a43b0f": { + "balance": "1000000000000000000000000000000" + }, + "0x54e228d8fea148cfe2b109b3b152ff21321d09a2": { + "balance": "1000000000000000000000000000000" + }, + "0x5667601b7dcde6f24d06bccc4f291cb06976f4ee": { + "balance": "1000000000000000000000000000000" + }, + "0x57829f2ecca390cd9d1c41f92328bad4d1073bbb": { + "balance": "1000000000000000000000000000000" + }, + "0x5EF25557E2ed6AFfF321B266C93e95A0B4B05AbC": { + "balance": "1000000000000000000000000" + }, + "0x5a3adad4382b3eb1e0c65f2de2845901081039b5": { + "balance": "1000000000000000000000000000000" + }, + "0x5cdb7392efdce502ccc6fba5c3c1dd1653967b4d": { + "balance": "1000000000000000000000000000000" + }, + "0x5d012c13b2854bda8b7b6580e97e52751884f827": { + "balance": "1000000000000000000000000000000" + }, + "0x5d9326c6504833d84f8a0d65ded59b1a6e768ca2": { + "balance": "1000000000000000000000000000000" + }, + "0x60268f799d8f1808e4a32c2eb898e73a8881f6f0": { + "balance": "1000000000000000000000000000000" + }, + "0x605ba4a05d779f9869bd9a10234c22f516766cfe": { + "balance": "1000000000000000000000000000000" + }, + "0x6093f0f2a7b5148b71603ac439adbc4c0e5aa5da": { + "balance": "1000000000000000000000000000000" + }, + "0x6196d135CdDb9d73A0756C1E44b5b02B11acf594": { + "balance": "2000000000000000000000", + "code": "", + "nonce": "5076", + "storage": {} + }, + "0x62712ceccb50f62ca4c5402fff6da9c819c866cf": { + "balance": "1000000000000000000000000000000" + }, + "0x62971de462ea1ec0d3b43a6a85b6fb975e6c6f64": { + "balance": "1000000000000000000000000000000" + }, + "0x62cf32dfb9eb6358dc5deb006aef1d75fb153e5f": { + "balance": "1000000000000000000000000000000" + }, + "0x62d8b22c1d71577829b2fee20a5c3fff43aed0ec": { + "balance": "100000000000000000000000" + }, + "0x6314956b78bb2eaed1c49b3ae71d4d0ec501cfab": { + "balance": "1000000000000000000000000000000" + }, + "0x661bda4daeba3ce9ac2aa30b80d463580f90d31a": { + "balance": "1000000000000000000000000000000" + }, + "0x66c5a87f4a49DD75e970055A265E8dd5C3F8f852": { + "balance": "1000000000000000000000" + }, + "0x66cd465ddcd85504c0d2cfb1728acee994d55a3f": { + "balance": "1000000000000000000000000000000" + }, + "0x68bca79ae7aae796027ff843d2303444da5cf5d8": { + "balance": "1000000000000000000000000000000" + }, + "0x6923877b65e24966efa9efd1207822fa2eaf601a": { + "balance": "1000000000000000000000000000000" + }, + "0x69362535ec535F0643cBf62D16aDeDCAf32Ee6F7": { + "balance": "0", + "code": "0x608060405234801561001057600080fd5b50600436106100b45760003560e01c806379210e8e1161007157806379210e8e1461017757806381a8235a146101a757806385aeeb17146101c35780639a9a5593146101f3578063a99100541461020f578063b57321221461022b576100b4565b806307c6e7d3146100b9578063122f4fba146100d55780631c6ec7a9146101055780631cfe4e3b14610121578063373dedb41461013d57806361e46db51461015b575b600080fd5b6100d360048036036100ce9190810190613cff565b61025b565b005b6100ef60048036036100ea9190810190613cff565b610804565b6040516100fc9190614963565b60405180910390f35b61011f600480360361011a9190810190613cff565b610b43565b005b61013b60048036036101369190810190613cc3565b610f72565b005b610145611190565b6040516101529190614cbe565b60405180910390f35b61017560048036036101709190810190613d94565b611199565b005b610191600480360361018c9190810190613e13565b6113f9565b60405161019e9190614924565b60405180910390f35b6101c160048036036101bc9190810190613cff565b6116f9565b005b6101dd60048036036101d89190810190613cff565b61189e565b6040516101ea9190614941565b60405180910390f35b61020d60048036036102089190810190613d40565b611b9d565b005b61022960048036036102249190810190613cff565b61202c565b005b61024560048036036102409190810190613cff565b612682565b6040516102529190614cbe565b60405180910390f35b6000339050606061026b83612902565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b825181101561037c576000826001018460018403815181106102d557fe5b60200260200101516040516102ea91906148cc565b90815260200160405180910390205411610339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161033090614ade565b60405180910390fd5b8160020183600183038151811061034c57fe5b602002602001015160405161036191906148cc565b908152602001604051809103902091508060010190506102b7565b506060600183511161038e57846103a7565b8260018451038151811061039e57fe5b60200260200101515b9050600082600101826040516103bd91906148e3565b9081526020016040518091039020541161040c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161040390614ade565b60405180910390fd5b6000826002018260405161042091906148e3565b90815260200160405180910390206000018054905014610475576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161046c90614b5e565b60405180910390fd5b60006104818587612b02565b9050806104c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ba90614a7e565b60405180910390fd5b6104cb613888565b836000016001856000018054905003815481106104e457fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156105965780601f1061056b57610100808354040283529160200191610596565b820191906000526020600020905b81548152906001019060200180831161057957829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff1660028111156105e257fe5b60028111156105ed57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561066557602002820191906000526020600020906000905b82829054906101000a900460ff1615158152602001906001019060208260000104928301926001038202915080841161062f5790505b505050505081525050905080846000016001866001018660405161068991906148e3565b90815260200160405180910390205403815481106106a357fe5b906000526020600020906005020160008201518160000190805190602001906106cd9291906138c4565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561071c57fe5b0217905550608082015181600401908051906020019061073d929190613944565b50905050836001018360405161075391906148e3565b90815260200160405180910390205484600101826000015160405161077891906148cc565b9081526020016040518091039020819055506000846001018460405161079e91906148e3565b908152602001604051809103902081905550836000018054809190600190036107c791906139ea565b5083600201836040516107da91906148e3565b9081526020016040518091039020600080820160006107f99190613a1c565b505050505050505050565b600080606061081284612b66565b91509150606061082182612902565b90506000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b82518110156109065760008260010184600184038151811061088b57fe5b60200260200101516040516108a091906148cc565b90815260200160405180910390205414156108c357600095505050505050610b3e565b816002018360018303815181106108d657fe5b60200260200101516040516108eb91906148cc565b9081526020016040518091039020915080600101905061086d565b50606060018351116109185783610931565b8260018451038151811061092857fe5b60200260200101515b90506000826001018260405161094791906148e3565b908152602001604051809103902054141561096a57600095505050505050610b3e565b610972613888565b826000016001846001018460405161098a91906148e3565b90815260200160405180910390205403815481106109a457fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610a565780601f10610a2b57610100808354040283529160200191610a56565b820191906000526020600020905b815481529060010190602001808311610a3957829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115610aa257fe5b6002811115610aad57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015610b2557602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411610aef5790505b5050505050815250509050806060015196505050505050505b919050565b600160009054906101000a900460ff16610b85576120006002819055506210000060038190555060018060006101000a81548160ff0219169083151502179055505b6000815111610bc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc090614ade565b60405180910390fd5b60003390506060610bd983612902565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015610cea57600082600101846001840381518110610c4357fe5b6020026020010151604051610c5891906148cc565b90815260200160405180910390205411610ca7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9e90614ade565b60405180910390fd5b81600201836001830381518110610cba57fe5b6020026020010151604051610ccf91906148cc565b90815260200160405180910390209150806001019050610c25565b50600254816000018054905010610d36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2d90614bfe565b60405180910390fd5b60606001835111610d475784610d60565b82600184510381518110610d5757fe5b60200260200101515b905060008260010182604051610d7691906148e3565b90815260200160405180910390205414610dc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbc90614c3e565b60405180910390fd5b610dce81612ee8565b610e0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0490614afe565b60405180910390fd5b6000610e198587612fc9565b905080610e5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e529061499e565b60405180910390fd5b610e63613888565b82816000018190525060008160200190151590811515815250508360000181908060018154018082558091505090600182039060005260206000209060050201600090919290919091506000820151816000019080519060200190610ec99291906138c4565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff02191690836002811115610f1857fe5b02179055506080820151816004019080519060200190610f39929190613944565b5050505083600001805490508460010184604051610f5791906148e3565b90815260200160405180910390208190555050505050505050565b610f7a61302d565b73ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161480610fdf57503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614155b61101e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101590614a5e565b60405180910390fd5b80600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411156110a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109790614b3e565b60405180910390fd5b600054600754820111156110e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e0906149be565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460076000828254039250508190555080600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550806007600082825401925050819055505050565b60008054905090565b600033905060006111aa82866130c6565b9050600160028111156111b957fe5b8160030160009054906101000a900460ff1660028111156111d657fe5b14611216576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120d90614c1e565b60405180910390fd5b6000600354858161122357fe5b061480156112345750806002015484105b611273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126a9061497e565b60405180910390fd5b600354848260020154031080156112905750838160020154038351145b8061129d57506003548351145b6112dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d390614a1e565b60405180910390fd5b600015158160040160035486816112ef57fe5b04815481106112fa57fe5b90600052602060002090602091828204019190069054906101000a900460ff1615151461135c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611353906149fe565b60405180910390fd5b600061136a838787876132c5565b9050806113ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a390614b1e565b60405180910390fd5b60018260040160035487816113bd57fe5b04815481106113c857fe5b90600052602060002090602091828204019190066101000a81548160ff021916908315150217905550505050505050565b611401613a40565b6000606061140e86612b66565b9150915061141a613888565b61142483836130c6565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156114c85780601f1061149d576101008083540402835291602001916114c8565b820191906000526020600020905b8154815290600101906020018083116114ab57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561151457fe5b600281111561151f57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561159757602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116115615790505b50505050508152505090506002808111156115ae57fe5b816060015160028111156115be57fe5b146115fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f590614c9e565b60405180910390fd5b60035485111580156116105750600085115b61164f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164690614a1e565b60405180910390fd5b80604001518587011115611698576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168f9061497e565b60405180910390fd5b60006116a684848989613376565b8096508192505050806116ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e590614b9e565b60405180910390fd5b505050509392505050565b6000339050600061170a82846130c6565b90506001600281111561171957fe5b8160030160009054906101000a900460ff16600281111561173657fe5b14611776576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176d90614c1e565b60405180910390fd5b60006001905060008260040180549050905060008090505b818110156117e157600015158460040182815481106117a957fe5b90600052602060002090602091828204019190069054906101000a900460ff16151514156117d657600092505b80600101905061178e565b5081611822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181990614b7e565b60405180910390fd5b60028360030160006101000a81548160ff0219169083600281111561184357fe5b021790555060006118548587613409565b905080611896576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188d906149de565b60405180910390fd5b505050505050565b6060600060606118ad84612b66565b9150915060606118bc82612902565b90506000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008090505b82518110156119c65760008260010184838151811061192257fe5b602002602001015160405161193791906148cc565b90815260200160405180910390205411611986576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197d90614ade565b60405180910390fd5b8160020183828151811061199657fe5b60200260200101516040516119ab91906148cc565b90815260200160405180910390209150806001019050611907565b5080600001805480602002602001604051908101604052809291908181526020016000905b82821015611b8e57838290600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611aa75780601f10611a7c57610100808354040283529160200191611aa7565b820191906000526020600020905b815481529060010190602001808311611a8a57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115611af357fe5b6002811115611afe57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015611b7657602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411611b405790505b505050505081525050815260200190600101906119eb565b50505050945050505050919050565b600160009054906101000a900460ff16611bdf576120006002819055506210000060038190555060018060006101000a81548160ff0219169083151502179055505b60003390506305f5e100821115611c2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2290614bde565b60405180910390fd5b6060611c3684612902565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015611d4757600082600101846001840381518110611ca057fe5b6020026020010151604051611cb591906148cc565b90815260200160405180910390205411611d04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cfb90614ade565b60405180910390fd5b81600201836001830381518110611d1757fe5b6020026020010151604051611d2c91906148cc565b90815260200160405180910390209150806001019050611c82565b5060606001835111611d595785611d72565b82600184510381518110611d6957fe5b60200260200101515b905060008260010182604051611d8891906148e3565b90815260200160405180910390205414611dd7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dce90614c3e565b60405180910390fd5b611de081612ee8565b611e1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1690614bbe565b60405180910390fd5b6000611e2c85888861346d565b905080611e6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6590614c7e565b60405180910390fd5b6060600354600160035489010381611e8257fe5b04604051908082528060200260200182016040528015611eb15781602001602082028038833980820191505090505b509050836000016040518060a0016040528085815260200160011515815260200189815260200160016002811115611ee557fe5b815260200183815250908060018154018082558091505090600182039060005260206000209060050201600090919290919091506000820151816000019080519060200190611f359291906138c4565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff02191690836002811115611f8457fe5b02179055506080820151816004019080519060200190611fa5929190613944565b5050505083600001805490508460010184604051611fc391906148e3565b90815260200160405180910390208190555086600560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505050505050505050565b6000339050612039613888565b61204382846130c6565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156120e75780601f106120bc576101008083540402835291602001916120e7565b820191906000526020600020905b8154815290600101906020018083116120ca57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561213357fe5b600281111561213e57fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156121b657602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116121805790505b5050505050815250509050600060028111156121ce57fe5b816060015160028111156121de57fe5b141561221f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221690614a3e565b60405180910390fd5b600061222b83856134da565b90508061226d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226490614a9e565b60405180910390fd5b606061227885612902565b90506000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b825181101561231057816002018360018303815181106122e057fe5b60200260200101516040516122f591906148cc565b908152602001604051809103902091508060010190506122c4565b506000600182600101866000015160405161232b91906148cc565b908152602001604051809103902054039050612345613888565b8260000160018460000180549050038154811061235e57fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156124105780601f106123e557610100808354040283529160200191612410565b820191906000526020600020905b8154815290600101906020018083116123f357829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561245c57fe5b600281111561246757fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156124df57602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116124a95790505b5050505050815250509050808360000183815481106124fa57fe5b906000526020600020906005020160008201518160000190805190602001906125249291906138c4565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561257357fe5b02179055506080820151816004019080519060200190612594929190613944565b50905050826000018054809190600190036125af91906139ea565b508260010186600001516040516125c691906148cc565b9081526020016040518091039020548360010182600001516040516125eb91906148cc565b908152602001604051809103902081905550600083600101876000015160405161261591906148cc565b9081526020016040518091039020819055508560400151600560008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505050505050505050565b600080606061269084612b66565b9150915061269c613888565b6126a683836130c6565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561274a5780601f1061271f5761010080835404028352916020019161274a565b820191906000526020600020905b81548152906001019060200180831161272d57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561279657fe5b60028111156127a157fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561281957602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116127e35790505b50505050508152505090506001600281111561283157fe5b8160600151600281111561284157fe5b1480612866575060028081111561285457fe5b8160600151600281111561286457fe5b145b6128a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161289c90614c1e565b60405180910390fd5b60006128b1848461353e565b8096508192505050806128f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128f090614c5e565b60405180910390fd5b50505050919050565b606061290c613a65565b612915836135a7565b905061291f613a65565b61295d6040518060400160405280600181526020017f2f000000000000000000000000000000000000000000000000000000000000008152506135a7565b90506060600161297683856135d590919063ffffffff16565b016040519080825280602002602001820160405280156129aa57816020015b60608152602001906001900390816129955790505b50905060008090505b81518110156129fb576129d76129d2848661364a90919063ffffffff16565b613664565b8282815181106129e357fe5b602002602001018190525080806001019150506129b3565b50600081600183510381518110612a0e57fe5b6020026020010151511415612a795780600182510381518110612a2d57fe5b6020026020010160608152506001815103604051908082528060200260200182016040528015612a7157816020015b6060815260200190600190039081612a5c5790505b509350612ab2565b8051604051908082528060200260200182016040528015612aae57816020015b6060815260200190600190039081612a995790505b5093505b60008090505b8451811015612af957818181518110612acd57fe5b6020026020010151858281518110612ae157fe5b60200260200101819052508080600101915050612ab8565b50505050919050565b60008060016020601f85510181612b1557fe5b040190506040518481526020810160005b83811015612b47578060200286015181602002830152806001019050612b26565b50602082602085026040018460006010600019f1935050505092915050565b6000606060006028905080845111612bb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612baa90614abe565b60405180910390fd5b6060816040519080825280601f01601f191660200182016040528015612be85781602001600182028038833980820191505090505b50905060008090505b82811015612c5857858181518110612c0557fe5b602001015160f81c60f81b828281518110612c1c57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050612bf1565b50600080905060008090505b83811015612d87576000838281518110612c7a57fe5b602001015160f81c60f81b60f81c60ff16905060308110158015612c9f575060398111155b80612cb8575060418110158015612cb75750605a8111155b5b80612cd1575060618110158015612cd0575060668111155b5b612d10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d0790614abe565b60405180910390fd5b60308110158015612d22575060398111155b15612d335760308103601084020192505b60418110158015612d455750605a8111155b15612d565760378103601084020192505b60618110158015612d68575060668111155b15612d795760578103601084020192505b508080600101915050612c64565b508094507f2f00000000000000000000000000000000000000000000000000000000000000868481518110612db857fe5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612e25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e1c90614abe565b60405180910390fd5b6000600184885103039050806040519080825280601f01601f191660200182016040528015612e635781602001600182028038833980820191505090505b50945060008090505b81811015612ede5760008860018784010181518110612e8757fe5b602001015160f81c60f81b905080878381518110612ea157fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350508080600101915050612e6c565b5050505050915091565b6000604051602001612ef99061490f565b6040516020818303038152906040528051906020012082604051602001612f2091906148e3565b604051602081830303815290604052805190602001201480612f8b5750604051602001612f4c906148fa565b6040516020818303038152906040528051906020012082604051602001612f7391906148e3565b60405160208183030381529060405280519060200120145b80612f97575060008251145b15612fa55760009050612fc4565b60008251905060ff811115612fbe576000915050612fc4565b60019150505b919050565b60008060016020601f85510181612fdc57fe5b040190506040518481526020810160005b8381101561300e578060200286015181602002830152806001019050612fed565b5060208260208502604001846000600f600019f1935050505092915050565b600073d2001000000000000000000000000000000000d273ffffffffffffffffffffffffffffffffffffffff166383e781fe6040518163ffffffff1660e01b815260040160206040518083038186803b15801561308957600080fd5b505afa15801561309d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506130c19190810190613c9a565b905090565b600060606130d383612902565b90506000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b82518110156131e45760008260010184600184038151811061313d57fe5b602002602001015160405161315291906148cc565b908152602001604051809103902054116131a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161319890614ade565b60405180910390fd5b816002018360018303815181106131b457fe5b60200260200101516040516131c991906148cc565b9081526020016040518091039020915080600101905061311f565b50606060018351116131f6578461320f565b8260018451038151811061320657fe5b60200260200101515b90506000826001018260405161322591906148e3565b90815260200160405180910390205411613274576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161326b90614ade565b60405180910390fd5b6000826000016001846001018460405161328e91906148e3565b90815260200160405180910390205403815481106132a857fe5b906000526020600020906005020190508094505050505092915050565b60008060016020601f855101816132d857fe5b04019050600060016020601f885101816132ee57fe5b040190506040518781526020810160005b838110156133205780602002890151816020028301528060010190506132ff565b50868360200282015260005b84811015613352578060200287015181856001010160200283015280600101905061332c565b50602082848601602002606001846000600c600019f1945050505050949350505050565b6000613380613a40565b600060016020601f8851018161339257fe5b0401905060006020601f8601816133a557fe5b0490506040518881526020810160005b848110156133d657806020028a0151816020028301528060010190506133b5565b5083602002810188815287816020015283602002868660030160200285600a600019fa9650505050505094509492505050565b60008060016020601f8551018161341c57fe5b040190506040518481526020810160005b8381101561344e57806020028601518160200283015280600101905061342d565b50602082602085026040018460006011600019f1935050505092915050565b60008060016020601f8651018161348057fe5b040190506040518581526020810160005b838110156134b2578060200287015181602002830152806001019050613491565b50846020840282015260208260208502604001846000600b600019f193505050509392505050565b60008060016020601f855101816134ed57fe5b040190506040518481526020810160005b8381101561351f5780602002860151816020028301528060010190506134fe565b5060208260208502604001846000600e600019f1935050505092915050565b600080600060016020601f8651018161355357fe5b040190506040518581526020810160005b83811015613585578060200287015181602002830152806001019050613564565b506020826020850260200184600d600019fa9450815193505050509250929050565b6135af613a65565b600060208301905060405180604001604052808451815260200182815250915050919050565b60008082600001516135f985600001518660200151866000015187602001516136c6565b0190505b83600001518460200151018111613643578180600101925050826000015161363b8560200151830386600001510383866000015187602001516136c6565b0190506135fd565b5092915050565b613652613a65565b61365d8383836137a1565b5092915050565b60608082600001516040519080825280601f01601f19166020018201604052801561369e5781602001600182028038833980820191505090505b50905060006020820190506136bc818560200151866000015161383f565b8192505050919050565b6000808490506000868511613791576020851161374b57600060018660200360080260020a031960001b905060008186511690506000878a8a0103905060008386511690505b82811461373d5781861061372a578a8a019650505050505050613799565b858060010196505083865116905061370c565b859650505050505050613799565b60008585209050600091505b858803821161378f57600086842090508082141561377b5783945050505050613799565b600184019350508180600101925050613757565b505b868601925050505b949350505050565b6137a9613a65565b60006137c785600001518660200151866000015187602001516136c6565b90508460200151836020018181525050846020015181038360000181815250508460000151856020015101811415613809576000856000018181525050613834565b8360000151836000015101856000018181510391508181525050836000015181018560200181815250505b829150509392505050565b5b602081106138635781518352602083019250602082019150602081039050613840565b60006001826020036101000a0390508019835116818551168181178652505050505050565b6040518060a001604052806060815260200160001515815260200160008152602001600060028111156138b757fe5b8152602001606081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061390557805160ff1916838001178555613933565b82800160010185558215613933579182015b82811115613932578251825591602001919060010190613917565b5b5090506139409190613a7f565b5090565b82805482825590600052602060002090601f016020900481019282156139d95791602002820160005b838211156139aa57835183826101000a81548160ff021916908315150217905550926020019260010160208160000104928301926001030261396d565b80156139d75782816101000a81549060ff02191690556001016020816000010492830192600103026139aa565b505b5090506139e69190613aa4565b5090565b815481835581811115613a1757600502816005028360005260206000209182019101613a169190613ad4565b5b505050565b5080546000825560050290600052602060002090810190613a3d9190613ad4565b50565b6040518062100000016040528061800090602082028038833980820191505090505090565b604051806040016040528060008152602001600081525090565b613aa191905b80821115613a9d576000816000905550600101613a85565b5090565b90565b613ad191905b80821115613acd57600081816101000a81549060ff021916905550600101613aaa565b5090565b90565b613b4091905b80821115613b3c5760008082016000613af39190613b43565b6001820160006101000a81549060ff021916905560028201600090556003820160006101000a81549060ff0219169055600482016000613b339190613b8b565b50600501613ada565b5090565b90565b50805460018160011615610100020316600290046000825580601f10613b695750613b88565b601f016020900490600052602060002090810190613b879190613a7f565b5b50565b50805460008255601f016020900490600052602060002090810190613bb09190613a7f565b50565b600081359050613bc281614f18565b92915050565b600081519050613bd781614f18565b92915050565b600082601f830112613bee57600080fd5b8135613c01613bfc82614d06565b614cd9565b91508082526020830160208301858383011115613c1d57600080fd5b613c28838284614eb8565b50505092915050565b600082601f830112613c4257600080fd5b8135613c55613c5082614d32565b614cd9565b91508082526020830160208301858383011115613c7157600080fd5b613c7c838284614eb8565b50505092915050565b600081359050613c9481614f2f565b92915050565b600060208284031215613cac57600080fd5b6000613cba84828501613bc8565b91505092915050565b60008060408385031215613cd657600080fd5b6000613ce485828601613bb3565b9250506020613cf585828601613c85565b9150509250929050565b600060208284031215613d1157600080fd5b600082013567ffffffffffffffff811115613d2b57600080fd5b613d3784828501613c31565b91505092915050565b60008060408385031215613d5357600080fd5b600083013567ffffffffffffffff811115613d6d57600080fd5b613d7985828601613c31565b9250506020613d8a85828601613c85565b9150509250929050565b600080600060608486031215613da957600080fd5b600084013567ffffffffffffffff811115613dc357600080fd5b613dcf86828701613c31565b9350506020613de086828701613c85565b925050604084013567ffffffffffffffff811115613dfd57600080fd5b613e0986828701613bdd565b9150509250925092565b600080600060608486031215613e2857600080fd5b600084013567ffffffffffffffff811115613e4257600080fd5b613e4e86828701613c31565b9350506020613e5f86828701613c85565b9250506040613e7086828701613c85565b9150509250925092565b6000613e868383613fe8565b60208301905092915050565b6000613e9e8383613ff7565b60208301905092915050565b6000613eb68383614831565b905092915050565b6000613ec982614d88565b613ed38185614de7565b9350613ede83614d5e565b8060005b83811015613f0f578151613ef68882613e7a565b9750613f0183614dc0565b925050600181019050613ee2565b5085935050505092915050565b613f2581614d93565b613f2f8184614df8565b9250613f3a82614d6e565b8060005b83811015613f6b578151613f528782613e92565b9650613f5d83614dcd565b925050600181019050613f3e565b505050505050565b6000613f7e82614d9f565b613f888185614e03565b935083602082028501613f9a85614d78565b8060005b85811015613fd65784840389528151613fb78582613eaa565b9450613fc283614dda565b925060208a01995050600181019050613f9e565b50829750879550505050505092915050565b613ff181614e53565b82525050565b61400081614e5f565b82525050565b61400f81614ea6565b82525050565b61401e81614ea6565b82525050565b600061402f82614db5565b6140398185614e36565b9350614049818560208601614ec7565b80840191505092915050565b600061406082614daa565b61406a8185614e14565b935061407a818560208601614ec7565b61408381614efa565b840191505092915050565b600061409982614daa565b6140a38185614e36565b93506140b3818560208601614ec7565b80840191505092915050565b60006140cc601883614e25565b91507f496e636f7272656374206368756e6b20706f736974696f6e00000000000000006000830152602082019050919050565b600061410c601583614e25565b91507f4469726563746f7279206e6f74206372656174656400000000000000000000006000830152602082019050919050565b600061414c602483614e25565b91507f4e6f7420656e6f756768206d656d6f727920696e207468652046696c6573746f60008301527f72616765000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006141b2601b83614e25565b91507f48617368206861736e2774206265656e2063616c63756c6174656400000000006000830152602082019050919050565b60006141f2601983614e25565b91507f4368756e6b20697320616c72656164792075706c6f61646564000000000000006000830152602082019050919050565b6000614232601683614e25565b91507f496e636f7272656374206368756e6b206c656e677468000000000000000000006000830152602082019050919050565b6000614272600f83614e25565b91507f46696c65206e6f742065786973747300000000000000000000000000000000006000830152602082019050919050565b60006142b2600e83614e25565b91507f496e76616c69642073656e6465720000000000000000000000000000000000006000830152602082019050919050565b60006142f2601883614e25565b91507f4469726563746f7279206973206e6f742064656c6574656400000000000000006000830152602082019050919050565b6000614332601083614e25565b91507f46696c65206e6f742064656c65746564000000000000000000000000000000006000830152602082019050919050565b6000614372601383614e25565b91507f496e76616c69642073746f7261676550617468000000000000000000000000006000830152602082019050919050565b60006143b2600c83614e25565b91507f496e76616c6964207061746800000000000000000000000000000000000000006000830152602082019050919050565b60006143f2600183614e36565b91507f2e000000000000000000000000000000000000000000000000000000000000006000830152600182019050919050565b6000614432601683614e25565b91507f496e76616c6964206469726563746f7279206e616d65000000000000000000006000830152602082019050919050565b6000614472601583614e25565b91507f4368756e6b207761736e27742075706c6f6164656400000000000000000000006000830152602082019050919050565b60006144b2602683614e25565b91507f436f756c64206e6f742072657365727665206c657373207468616e207573656460008301527f20737061636500000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614518601683614e25565b91507f4469726563746f7279206973206e6f7420656d707479000000000000000000006000830152602082019050919050565b6000614558602383614e25565b91507f46696c65206861736e2774206265656e2075706c6f6164656420636f7272656360008301527f746c7900000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006145be601183614e25565b91507f4368756e6b207761736e277420726561640000000000000000000000000000006000830152602082019050919050565b60006145fe601883614e25565b91507f46696c656e616d652073686f756c64206265203c2032353600000000000000006000830152602082019050919050565b600061463e601f83614e25565b91507f46696c652073686f756c64206265206c657373207468616e20313030204d42006000830152602082019050919050565b600061467e600283614e36565b91507f2e2e0000000000000000000000000000000000000000000000000000000000006000830152600282019050919050565b60006146be601183614e25565b91507f4469726563746f72792069732066756c6c0000000000000000000000000000006000830152602082019050919050565b60006146fe600e83614e25565b91507f46696c65206e6f7420666f756e640000000000000000000000000000000000006000830152602082019050919050565b600061473e601883614e25565b91507f46696c65206f72206469726563746f72792065786973747300000000000000006000830152602082019050919050565b600061477e601883614e25565b91507f45564d206572726f7220696e2067657446696c6553697a6500000000000000006000830152602082019050919050565b60006147be601083614e25565b91507f46696c65206e6f742063726561746564000000000000000000000000000000006000830152602082019050919050565b60006147fe601983614e25565b91507f46696c65206861736e2774206265656e2075706c6f61646564000000000000006000830152602082019050919050565b600060a083016000830151848203600086015261484e8282614055565b91505060208301516148636020860182613fe8565b50604083015161487660408601826148ae565b5060608301516148896060860182614006565b50608083015184820360808601526148a18282613ebe565b9150508091505092915050565b6148b781614e9c565b82525050565b6148c681614e9c565b82525050565b60006148d8828461408e565b915081905092915050565b60006148ef8284614024565b915081905092915050565b6000614905826143e5565b9150819050919050565b600061491a82614671565b9150819050919050565b6000621000008201905061493b6000830184613f1c565b92915050565b6000602082019050818103600083015261495b8184613f73565b905092915050565b60006020820190506149786000830184614015565b92915050565b60006020820190508181036000830152614997816140bf565b9050919050565b600060208201905081810360008301526149b7816140ff565b9050919050565b600060208201905081810360008301526149d78161413f565b9050919050565b600060208201905081810360008301526149f7816141a5565b9050919050565b60006020820190508181036000830152614a17816141e5565b9050919050565b60006020820190508181036000830152614a3781614225565b9050919050565b60006020820190508181036000830152614a5781614265565b9050919050565b60006020820190508181036000830152614a77816142a5565b9050919050565b60006020820190508181036000830152614a97816142e5565b9050919050565b60006020820190508181036000830152614ab781614325565b9050919050565b60006020820190508181036000830152614ad781614365565b9050919050565b60006020820190508181036000830152614af7816143a5565b9050919050565b60006020820190508181036000830152614b1781614425565b9050919050565b60006020820190508181036000830152614b3781614465565b9050919050565b60006020820190508181036000830152614b57816144a5565b9050919050565b60006020820190508181036000830152614b778161450b565b9050919050565b60006020820190508181036000830152614b978161454b565b9050919050565b60006020820190508181036000830152614bb7816145b1565b9050919050565b60006020820190508181036000830152614bd7816145f1565b9050919050565b60006020820190508181036000830152614bf781614631565b9050919050565b60006020820190508181036000830152614c17816146b1565b9050919050565b60006020820190508181036000830152614c37816146f1565b9050919050565b60006020820190508181036000830152614c5781614731565b9050919050565b60006020820190508181036000830152614c7781614771565b9050919050565b60006020820190508181036000830152614c97816147b1565b9050919050565b60006020820190508181036000830152614cb7816147f1565b9050919050565b6000602082019050614cd360008301846148bd565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614cfc57600080fd5b8060405250919050565b600067ffffffffffffffff821115614d1d57600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614d4957600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050919050565b6000819050602082019050919050565b600081519050919050565b60006180009050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614e4c82614e7c565b9050919050565b60008115159050919050565b6000819050919050565b6000819050614e7782614f0b565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000614eb182614e69565b9050919050565b82818337600083830152505050565b60005b83811015614ee5578082015181840152602081019050614eca565b83811115614ef4576000848401525b50505050565b6000601f19601f8301169050919050565b60038110614f1557fe5b50565b614f2181614e41565b8114614f2c57600080fd5b50565b614f3881614e9c565b8114614f4357600080fd5b5056fea365627a7a723158202ae226b25ad72f9cff2d74c6dc7bcfb78530ab1d2438f48a8dab67499b37a8e56c6578706572696d656e74616cf564736f6c634300050d0040", + "nonce": "0", + "storage": { + "0x0": "2868903936" + } + }, + "0x69362535ec535F0643cBf62D16aDeDCAf32Ee6F8": { + "balance": "0", + "code": "0x608060405234801561001057600080fd5b50600436106100b45760003560e01c806379210e8e1161007157806379210e8e1461017757806381a8235a146101a757806385aeeb17146101c35780639a9a5593146101f3578063a99100541461020f578063b57321221461022b576100b4565b806307c6e7d3146100b9578063122f4fba146100d55780631c6ec7a9146101055780631cfe4e3b14610121578063373dedb41461013d57806361e46db51461015b575b600080fd5b6100d360048036036100ce9190810190613e0d565b61025b565b005b6100ef60048036036100ea9190810190613e0d565b610804565b6040516100fc9190614ab1565b60405180910390f35b61011f600480360361011a9190810190613e0d565b610b43565b005b61013b60048036036101369190810190613dd1565b610f72565b005b610145611190565b6040516101529190614e2c565b60405180910390f35b61017560048036036101709190810190613ea2565b611199565b005b610191600480360361018c9190810190613f21565b6113f9565b60405161019e9190614a72565b60405180910390f35b6101c160048036036101bc9190810190613e0d565b6116f9565b005b6101dd60048036036101d89190810190613e0d565b61189e565b6040516101ea9190614a8f565b60405180910390f35b61020d60048036036102089190810190613e4e565b611b9d565b005b61022960048036036102249190810190613e0d565b61213a565b005b61024560048036036102409190810190613e0d565b612790565b6040516102529190614e2c565b60405180910390f35b6000339050606061026b83612a10565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b825181101561037c576000826001018460018403815181106102d557fe5b60200260200101516040516102ea9190614a1a565b90815260200160405180910390205411610339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161033090614c2c565b60405180910390fd5b8160020183600183038151811061034c57fe5b60200260200101516040516103619190614a1a565b908152602001604051809103902091508060010190506102b7565b506060600183511161038e57846103a7565b8260018451038151811061039e57fe5b60200260200101515b9050600082600101826040516103bd9190614a31565b9081526020016040518091039020541161040c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161040390614c2c565b60405180910390fd5b600082600201826040516104209190614a31565b90815260200160405180910390206000018054905014610475576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161046c90614cac565b60405180910390fd5b60006104818587612c10565b9050806104c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ba90614bcc565b60405180910390fd5b6104cb613996565b836000016001856000018054905003815481106104e457fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156105965780601f1061056b57610100808354040283529160200191610596565b820191906000526020600020905b81548152906001019060200180831161057957829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff1660028111156105e257fe5b60028111156105ed57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561066557602002820191906000526020600020906000905b82829054906101000a900460ff1615158152602001906001019060208260000104928301926001038202915080841161062f5790505b50505050508152505090508084600001600186600101866040516106899190614a31565b90815260200160405180910390205403815481106106a357fe5b906000526020600020906005020160008201518160000190805190602001906106cd9291906139d2565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561071c57fe5b0217905550608082015181600401908051906020019061073d929190613a52565b5090505083600101836040516107539190614a31565b9081526020016040518091039020548460010182600001516040516107789190614a1a565b9081526020016040518091039020819055506000846001018460405161079e9190614a31565b908152602001604051809103902081905550836000018054809190600190036107c79190613af8565b5083600201836040516107da9190614a31565b9081526020016040518091039020600080820160006107f99190613b2a565b505050505050505050565b600080606061081284612c74565b91509150606061082182612a10565b90506000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b82518110156109065760008260010184600184038151811061088b57fe5b60200260200101516040516108a09190614a1a565b90815260200160405180910390205414156108c357600095505050505050610b3e565b816002018360018303815181106108d657fe5b60200260200101516040516108eb9190614a1a565b9081526020016040518091039020915080600101905061086d565b50606060018351116109185783610931565b8260018451038151811061092857fe5b60200260200101515b9050600082600101826040516109479190614a31565b908152602001604051809103902054141561096a57600095505050505050610b3e565b610972613996565b826000016001846001018460405161098a9190614a31565b90815260200160405180910390205403815481106109a457fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610a565780601f10610a2b57610100808354040283529160200191610a56565b820191906000526020600020905b815481529060010190602001808311610a3957829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115610aa257fe5b6002811115610aad57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015610b2557602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411610aef5790505b5050505050815250509050806060015196505050505050505b919050565b600160009054906101000a900460ff16610b85576120006002819055506210000060038190555060018060006101000a81548160ff0219169083151502179055505b6000815111610bc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc090614c2c565b60405180910390fd5b60003390506060610bd983612a10565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015610cea57600082600101846001840381518110610c4357fe5b6020026020010151604051610c589190614a1a565b90815260200160405180910390205411610ca7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9e90614c2c565b60405180910390fd5b81600201836001830381518110610cba57fe5b6020026020010151604051610ccf9190614a1a565b90815260200160405180910390209150806001019050610c25565b50600254816000018054905010610d36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2d90614d4c565b60405180910390fd5b60606001835111610d475784610d60565b82600184510381518110610d5757fe5b60200260200101515b905060008260010182604051610d769190614a31565b90815260200160405180910390205414610dc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbc90614d8c565b60405180910390fd5b610dce81612ff6565b610e0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0490614c4c565b60405180910390fd5b6000610e1985876130d7565b905080610e5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5290614aec565b60405180910390fd5b610e63613996565b82816000018190525060008160200190151590811515815250508360000181908060018154018082558091505090600182039060005260206000209060050201600090919290919091506000820151816000019080519060200190610ec99291906139d2565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff02191690836002811115610f1857fe5b02179055506080820151816004019080519060200190610f39929190613a52565b5050505083600001805490508460010184604051610f579190614a31565b90815260200160405180910390208190555050505050505050565b610f7a61313b565b73ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161480610fdf57503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614155b61101e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101590614bac565b60405180910390fd5b80600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411156110a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109790614c8c565b60405180910390fd5b600054600754820111156110e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e090614b0c565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460076000828254039250508190555080600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550806007600082825401925050819055505050565b60008054905090565b600033905060006111aa82866131d4565b9050600160028111156111b957fe5b8160030160009054906101000a900460ff1660028111156111d657fe5b14611216576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120d90614d6c565b60405180910390fd5b6000600354858161122357fe5b061480156112345750806002015484105b611273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126a90614acc565b60405180910390fd5b600354848260020154031080156112905750838160020154038351145b8061129d57506003548351145b6112dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d390614b6c565b60405180910390fd5b600015158160040160035486816112ef57fe5b04815481106112fa57fe5b90600052602060002090602091828204019190069054906101000a900460ff1615151461135c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135390614b4c565b60405180910390fd5b600061136a838787876133d3565b9050806113ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a390614c6c565b60405180910390fd5b60018260040160035487816113bd57fe5b04815481106113c857fe5b90600052602060002090602091828204019190066101000a81548160ff021916908315150217905550505050505050565b611401613b4e565b6000606061140e86612c74565b9150915061141a613996565b61142483836131d4565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156114c85780601f1061149d576101008083540402835291602001916114c8565b820191906000526020600020905b8154815290600101906020018083116114ab57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561151457fe5b600281111561151f57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561159757602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116115615790505b50505050508152505090506002808111156115ae57fe5b816060015160028111156115be57fe5b146115fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f590614e0c565b60405180910390fd5b60035485111580156116105750600085115b61164f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164690614b6c565b60405180910390fd5b80604001518587011115611698576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168f90614acc565b60405180910390fd5b60006116a684848989613484565b8096508192505050806116ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e590614cec565b60405180910390fd5b505050509392505050565b6000339050600061170a82846131d4565b90506001600281111561171957fe5b8160030160009054906101000a900460ff16600281111561173657fe5b14611776576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176d90614d6c565b60405180910390fd5b60006001905060008260040180549050905060008090505b818110156117e157600015158460040182815481106117a957fe5b90600052602060002090602091828204019190069054906101000a900460ff16151514156117d657600092505b80600101905061178e565b5081611822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181990614ccc565b60405180910390fd5b60028360030160006101000a81548160ff0219169083600281111561184357fe5b021790555060006118548587613517565b905080611896576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188d90614b2c565b60405180910390fd5b505050505050565b6060600060606118ad84612c74565b9150915060606118bc82612a10565b90506000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008090505b82518110156119c65760008260010184838151811061192257fe5b60200260200101516040516119379190614a1a565b90815260200160405180910390205411611986576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197d90614c2c565b60405180910390fd5b8160020183828151811061199657fe5b60200260200101516040516119ab9190614a1a565b90815260200160405180910390209150806001019050611907565b5080600001805480602002602001604051908101604052809291908181526020016000905b82821015611b8e57838290600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611aa75780601f10611a7c57610100808354040283529160200191611aa7565b820191906000526020600020905b815481529060010190602001808311611a8a57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115611af357fe5b6002811115611afe57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015611b7657602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411611b405790505b505050505081525050815260200190600101906119eb565b50505050945050505050919050565b600160009054906101000a900460ff16611bdf576120006002819055506210000060038190555060018060006101000a81548160ff0219169083151502179055505b60003390506305f5e100821115611c2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2290614d2c565b60405180910390fd5b600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205483011115611cee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce590614dac565b60405180910390fd5b6060611cf984612a10565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015611e0a57600082600101846001840381518110611d6357fe5b6020026020010151604051611d789190614a1a565b90815260200160405180910390205411611dc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dbe90614c2c565b60405180910390fd5b81600201836001830381518110611dda57fe5b6020026020010151604051611def9190614a1a565b90815260200160405180910390209150806001019050611d45565b50600254816000018054905010611e56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4d90614d4c565b60405180910390fd5b60606001835111611e675785611e80565b82600184510381518110611e7757fe5b60200260200101515b905060008260010182604051611e969190614a31565b90815260200160405180910390205414611ee5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611edc90614d8c565b60405180910390fd5b611eee81612ff6565b611f2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2490614d0c565b60405180910390fd5b6000611f3a85888861357b565b905080611f7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7390614dec565b60405180910390fd5b6060600354600160035489010381611f9057fe5b04604051908082528060200260200182016040528015611fbf5781602001602082028038833980820191505090505b509050836000016040518060a0016040528085815260200160011515815260200189815260200160016002811115611ff357fe5b8152602001838152509080600181540180825580915050906001820390600052602060002090600502016000909192909190915060008201518160000190805190602001906120439291906139d2565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561209257fe5b021790555060808201518160040190805190602001906120b3929190613a52565b50505050836000018054905084600101846040516120d19190614a31565b90815260200160405180910390208190555086600560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505050505050505050565b6000339050612147613996565b61215182846131d4565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156121f55780601f106121ca576101008083540402835291602001916121f5565b820191906000526020600020905b8154815290600101906020018083116121d857829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561224157fe5b600281111561224c57fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156122c457602002820191906000526020600020906000905b82829054906101000a900460ff1615158152602001906001019060208260000104928301926001038202915080841161228e5790505b5050505050815250509050600060028111156122dc57fe5b816060015160028111156122ec57fe5b141561232d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232490614b8c565b60405180910390fd5b600061233983856135e8565b90508061237b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161237290614bec565b60405180910390fd5b606061238685612a10565b90506000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b825181101561241e57816002018360018303815181106123ee57fe5b60200260200101516040516124039190614a1a565b908152602001604051809103902091508060010190506123d2565b50600060018260010186600001516040516124399190614a1a565b908152602001604051809103902054039050612453613996565b8260000160018460000180549050038154811061246c57fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561251e5780601f106124f35761010080835404028352916020019161251e565b820191906000526020600020905b81548152906001019060200180831161250157829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561256a57fe5b600281111561257557fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156125ed57602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116125b75790505b50505050508152505090508083600001838154811061260857fe5b906000526020600020906005020160008201518160000190805190602001906126329291906139d2565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561268157fe5b021790555060808201518160040190805190602001906126a2929190613a52565b50905050826000018054809190600190036126bd9190613af8565b508260010186600001516040516126d49190614a1a565b9081526020016040518091039020548360010182600001516040516126f99190614a1a565b90815260200160405180910390208190555060008360010187600001516040516127239190614a1a565b9081526020016040518091039020819055508560400151600560008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505050505050505050565b600080606061279e84612c74565b915091506127aa613996565b6127b483836131d4565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156128585780601f1061282d57610100808354040283529160200191612858565b820191906000526020600020905b81548152906001019060200180831161283b57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff1660028111156128a457fe5b60028111156128af57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561292757602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116128f15790505b50505050508152505090506001600281111561293f57fe5b8160600151600281111561294f57fe5b1480612974575060028081111561296257fe5b8160600151600281111561297257fe5b145b6129b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129aa90614d6c565b60405180910390fd5b60006129bf848461364c565b809650819250505080612a07576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129fe90614dcc565b60405180910390fd5b50505050919050565b6060612a1a613b73565b612a23836136b5565b9050612a2d613b73565b612a6b6040518060400160405280600181526020017f2f000000000000000000000000000000000000000000000000000000000000008152506136b5565b905060606001612a8483856136e390919063ffffffff16565b01604051908082528060200260200182016040528015612ab857816020015b6060815260200190600190039081612aa35790505b50905060008090505b8151811015612b0957612ae5612ae0848661375890919063ffffffff16565b613772565b828281518110612af157fe5b60200260200101819052508080600101915050612ac1565b50600081600183510381518110612b1c57fe5b6020026020010151511415612b875780600182510381518110612b3b57fe5b6020026020010160608152506001815103604051908082528060200260200182016040528015612b7f57816020015b6060815260200190600190039081612b6a5790505b509350612bc0565b8051604051908082528060200260200182016040528015612bbc57816020015b6060815260200190600190039081612ba75790505b5093505b60008090505b8451811015612c0757818181518110612bdb57fe5b6020026020010151858281518110612bef57fe5b60200260200101819052508080600101915050612bc6565b50505050919050565b60008060016020601f85510181612c2357fe5b040190506040518481526020810160005b83811015612c55578060200286015181602002830152806001019050612c34565b50602082602085026040018460006010600019f1935050505092915050565b6000606060006028905080845111612cc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cb890614c0c565b60405180910390fd5b6060816040519080825280601f01601f191660200182016040528015612cf65781602001600182028038833980820191505090505b50905060008090505b82811015612d6657858181518110612d1357fe5b602001015160f81c60f81b828281518110612d2a57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050612cff565b50600080905060008090505b83811015612e95576000838281518110612d8857fe5b602001015160f81c60f81b60f81c60ff16905060308110158015612dad575060398111155b80612dc6575060418110158015612dc55750605a8111155b5b80612ddf575060618110158015612dde575060668111155b5b612e1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e1590614c0c565b60405180910390fd5b60308110158015612e30575060398111155b15612e415760308103601084020192505b60418110158015612e535750605a8111155b15612e645760378103601084020192505b60618110158015612e76575060668111155b15612e875760578103601084020192505b508080600101915050612d72565b508094507f2f00000000000000000000000000000000000000000000000000000000000000868481518110612ec657fe5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612f33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f2a90614c0c565b60405180910390fd5b6000600184885103039050806040519080825280601f01601f191660200182016040528015612f715781602001600182028038833980820191505090505b50945060008090505b81811015612fec5760008860018784010181518110612f9557fe5b602001015160f81c60f81b905080878381518110612faf57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350508080600101915050612f7a565b5050505050915091565b600060405160200161300790614a5d565b604051602081830303815290604052805190602001208260405160200161302e9190614a31565b604051602081830303815290604052805190602001201480613099575060405160200161305a90614a48565b60405160208183030381529060405280519060200120826040516020016130819190614a31565b60405160208183030381529060405280519060200120145b806130a5575060008251145b156130b357600090506130d2565b60008251905060ff8111156130cc5760009150506130d2565b60019150505b919050565b60008060016020601f855101816130ea57fe5b040190506040518481526020810160005b8381101561311c5780602002860151816020028301528060010190506130fb565b5060208260208502604001846000600f600019f1935050505092915050565b600073d2001000000000000000000000000000000000d273ffffffffffffffffffffffffffffffffffffffff166383e781fe6040518163ffffffff1660e01b815260040160206040518083038186803b15801561319757600080fd5b505afa1580156131ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506131cf9190810190613da8565b905090565b600060606131e183612a10565b90506000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b82518110156132f25760008260010184600184038151811061324b57fe5b60200260200101516040516132609190614a1a565b908152602001604051809103902054116132af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132a690614c2c565b60405180910390fd5b816002018360018303815181106132c257fe5b60200260200101516040516132d79190614a1a565b9081526020016040518091039020915080600101905061322d565b5060606001835111613304578461331d565b8260018451038151811061331457fe5b60200260200101515b9050600082600101826040516133339190614a31565b90815260200160405180910390205411613382576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161337990614c2c565b60405180910390fd5b6000826000016001846001018460405161339c9190614a31565b90815260200160405180910390205403815481106133b657fe5b906000526020600020906005020190508094505050505092915050565b60008060016020601f855101816133e657fe5b04019050600060016020601f885101816133fc57fe5b040190506040518781526020810160005b8381101561342e57806020028901518160200283015280600101905061340d565b50868360200282015260005b84811015613460578060200287015181856001010160200283015280600101905061343a565b50602082848601602002606001846000600c600019f1945050505050949350505050565b600061348e613b4e565b600060016020601f885101816134a057fe5b0401905060006020601f8601816134b357fe5b0490506040518881526020810160005b848110156134e457806020028a0151816020028301528060010190506134c3565b5083602002810188815287816020015283602002868660030160200285600a600019fa9650505050505094509492505050565b60008060016020601f8551018161352a57fe5b040190506040518481526020810160005b8381101561355c57806020028601518160200283015280600101905061353b565b50602082602085026040018460006011600019f1935050505092915050565b60008060016020601f8651018161358e57fe5b040190506040518581526020810160005b838110156135c057806020028701518160200283015280600101905061359f565b50846020840282015260208260208502604001846000600b600019f193505050509392505050565b60008060016020601f855101816135fb57fe5b040190506040518481526020810160005b8381101561362d57806020028601518160200283015280600101905061360c565b5060208260208502604001846000600e600019f1935050505092915050565b600080600060016020601f8651018161366157fe5b040190506040518581526020810160005b83811015613693578060200287015181602002830152806001019050613672565b506020826020850260200184600d600019fa9450815193505050509250929050565b6136bd613b73565b600060208301905060405180604001604052808451815260200182815250915050919050565b600080826000015161370785600001518660200151866000015187602001516137d4565b0190505b8360000151846020015101811161375157818060010192505082600001516137498560200151830386600001510383866000015187602001516137d4565b01905061370b565b5092915050565b613760613b73565b61376b8383836138af565b5092915050565b60608082600001516040519080825280601f01601f1916602001820160405280156137ac5781602001600182028038833980820191505090505b50905060006020820190506137ca818560200151866000015161394d565b8192505050919050565b600080849050600086851161389f576020851161385957600060018660200360080260020a031960001b905060008186511690506000878a8a0103905060008386511690505b82811461384b57818610613838578a8a0196505050505050506138a7565b858060010196505083865116905061381a565b8596505050505050506138a7565b60008585209050600091505b858803821161389d57600086842090508082141561388957839450505050506138a7565b600184019350508180600101925050613865565b505b868601925050505b949350505050565b6138b7613b73565b60006138d585600001518660200151866000015187602001516137d4565b90508460200151836020018181525050846020015181038360000181815250508460000151856020015101811415613917576000856000018181525050613942565b8360000151836000015101856000018181510391508181525050836000015181018560200181815250505b829150509392505050565b5b60208110613971578151835260208301925060208201915060208103905061394e565b60006001826020036101000a0390508019835116818551168181178652505050505050565b6040518060a001604052806060815260200160001515815260200160008152602001600060028111156139c557fe5b8152602001606081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613a1357805160ff1916838001178555613a41565b82800160010185558215613a41579182015b82811115613a40578251825591602001919060010190613a25565b5b509050613a4e9190613b8d565b5090565b82805482825590600052602060002090601f01602090048101928215613ae75791602002820160005b83821115613ab857835183826101000a81548160ff0219169083151502179055509260200192600101602081600001049283019260010302613a7b565b8015613ae55782816101000a81549060ff0219169055600101602081600001049283019260010302613ab8565b505b509050613af49190613bb2565b5090565b815481835581811115613b2557600502816005028360005260206000209182019101613b249190613be2565b5b505050565b5080546000825560050290600052602060002090810190613b4b9190613be2565b50565b6040518062100000016040528061800090602082028038833980820191505090505090565b604051806040016040528060008152602001600081525090565b613baf91905b80821115613bab576000816000905550600101613b93565b5090565b90565b613bdf91905b80821115613bdb57600081816101000a81549060ff021916905550600101613bb8565b5090565b90565b613c4e91905b80821115613c4a5760008082016000613c019190613c51565b6001820160006101000a81549060ff021916905560028201600090556003820160006101000a81549060ff0219169055600482016000613c419190613c99565b50600501613be8565b5090565b90565b50805460018160011615610100020316600290046000825580601f10613c775750613c96565b601f016020900490600052602060002090810190613c959190613b8d565b5b50565b50805460008255601f016020900490600052602060002090810190613cbe9190613b8d565b50565b600081359050613cd081615086565b92915050565b600081519050613ce581615086565b92915050565b600082601f830112613cfc57600080fd5b8135613d0f613d0a82614e74565b614e47565b91508082526020830160208301858383011115613d2b57600080fd5b613d36838284615026565b50505092915050565b600082601f830112613d5057600080fd5b8135613d63613d5e82614ea0565b614e47565b91508082526020830160208301858383011115613d7f57600080fd5b613d8a838284615026565b50505092915050565b600081359050613da28161509d565b92915050565b600060208284031215613dba57600080fd5b6000613dc884828501613cd6565b91505092915050565b60008060408385031215613de457600080fd5b6000613df285828601613cc1565b9250506020613e0385828601613d93565b9150509250929050565b600060208284031215613e1f57600080fd5b600082013567ffffffffffffffff811115613e3957600080fd5b613e4584828501613d3f565b91505092915050565b60008060408385031215613e6157600080fd5b600083013567ffffffffffffffff811115613e7b57600080fd5b613e8785828601613d3f565b9250506020613e9885828601613d93565b9150509250929050565b600080600060608486031215613eb757600080fd5b600084013567ffffffffffffffff811115613ed157600080fd5b613edd86828701613d3f565b9350506020613eee86828701613d93565b925050604084013567ffffffffffffffff811115613f0b57600080fd5b613f1786828701613ceb565b9150509250925092565b600080600060608486031215613f3657600080fd5b600084013567ffffffffffffffff811115613f5057600080fd5b613f5c86828701613d3f565b9350506020613f6d86828701613d93565b9250506040613f7e86828701613d93565b9150509250925092565b6000613f9483836140f6565b60208301905092915050565b6000613fac8383614105565b60208301905092915050565b6000613fc4838361497f565b905092915050565b6000613fd782614ef6565b613fe18185614f55565b9350613fec83614ecc565b8060005b8381101561401d5781516140048882613f88565b975061400f83614f2e565b925050600181019050613ff0565b5085935050505092915050565b61403381614f01565b61403d8184614f66565b925061404882614edc565b8060005b838110156140795781516140608782613fa0565b965061406b83614f3b565b92505060018101905061404c565b505050505050565b600061408c82614f0d565b6140968185614f71565b9350836020820285016140a885614ee6565b8060005b858110156140e457848403895281516140c58582613fb8565b94506140d083614f48565b925060208a019950506001810190506140ac565b50829750879550505050505092915050565b6140ff81614fc1565b82525050565b61410e81614fcd565b82525050565b61411d81615014565b82525050565b61412c81615014565b82525050565b600061413d82614f23565b6141478185614fa4565b9350614157818560208601615035565b80840191505092915050565b600061416e82614f18565b6141788185614f82565b9350614188818560208601615035565b61419181615068565b840191505092915050565b60006141a782614f18565b6141b18185614fa4565b93506141c1818560208601615035565b80840191505092915050565b60006141da601883614f93565b91507f496e636f7272656374206368756e6b20706f736974696f6e00000000000000006000830152602082019050919050565b600061421a601583614f93565b91507f4469726563746f7279206e6f74206372656174656400000000000000000000006000830152602082019050919050565b600061425a602483614f93565b91507f4e6f7420656e6f756768206d656d6f727920696e207468652046696c6573746f60008301527f72616765000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006142c0601b83614f93565b91507f48617368206861736e2774206265656e2063616c63756c6174656400000000006000830152602082019050919050565b6000614300601983614f93565b91507f4368756e6b20697320616c72656164792075706c6f61646564000000000000006000830152602082019050919050565b6000614340601683614f93565b91507f496e636f7272656374206368756e6b206c656e677468000000000000000000006000830152602082019050919050565b6000614380600f83614f93565b91507f46696c65206e6f742065786973747300000000000000000000000000000000006000830152602082019050919050565b60006143c0600e83614f93565b91507f496e76616c69642073656e6465720000000000000000000000000000000000006000830152602082019050919050565b6000614400601883614f93565b91507f4469726563746f7279206973206e6f742064656c6574656400000000000000006000830152602082019050919050565b6000614440601083614f93565b91507f46696c65206e6f742064656c65746564000000000000000000000000000000006000830152602082019050919050565b6000614480601383614f93565b91507f496e76616c69642073746f7261676550617468000000000000000000000000006000830152602082019050919050565b60006144c0600c83614f93565b91507f496e76616c6964207061746800000000000000000000000000000000000000006000830152602082019050919050565b6000614500600183614fa4565b91507f2e000000000000000000000000000000000000000000000000000000000000006000830152600182019050919050565b6000614540601683614f93565b91507f496e76616c6964206469726563746f7279206e616d65000000000000000000006000830152602082019050919050565b6000614580601583614f93565b91507f4368756e6b207761736e27742075706c6f6164656400000000000000000000006000830152602082019050919050565b60006145c0602683614f93565b91507f436f756c64206e6f742072657365727665206c657373207468616e207573656460008301527f20737061636500000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614626601683614f93565b91507f4469726563746f7279206973206e6f7420656d707479000000000000000000006000830152602082019050919050565b6000614666602383614f93565b91507f46696c65206861736e2774206265656e2075706c6f6164656420636f7272656360008301527f746c7900000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006146cc601183614f93565b91507f4368756e6b207761736e277420726561640000000000000000000000000000006000830152602082019050919050565b600061470c601883614f93565b91507f46696c656e616d652073686f756c64206265203c2032353600000000000000006000830152602082019050919050565b600061474c601f83614f93565b91507f46696c652073686f756c64206265206c657373207468616e20313030204d42006000830152602082019050919050565b600061478c600283614fa4565b91507f2e2e0000000000000000000000000000000000000000000000000000000000006000830152600282019050919050565b60006147cc601183614f93565b91507f4469726563746f72792069732066756c6c0000000000000000000000000000006000830152602082019050919050565b600061480c600e83614f93565b91507f46696c65206e6f7420666f756e640000000000000000000000000000000000006000830152602082019050919050565b600061484c601883614f93565b91507f46696c65206f72206469726563746f72792065786973747300000000000000006000830152602082019050919050565b600061488c601983614f93565b91507f4e6f7420656e6f756768207265736572766564207370616365000000000000006000830152602082019050919050565b60006148cc601883614f93565b91507f45564d206572726f7220696e2067657446696c6553697a6500000000000000006000830152602082019050919050565b600061490c601083614f93565b91507f46696c65206e6f742063726561746564000000000000000000000000000000006000830152602082019050919050565b600061494c601983614f93565b91507f46696c65206861736e2774206265656e2075706c6f61646564000000000000006000830152602082019050919050565b600060a083016000830151848203600086015261499c8282614163565b91505060208301516149b160208601826140f6565b5060408301516149c460408601826149fc565b5060608301516149d76060860182614114565b50608083015184820360808601526149ef8282613fcc565b9150508091505092915050565b614a058161500a565b82525050565b614a148161500a565b82525050565b6000614a26828461419c565b915081905092915050565b6000614a3d8284614132565b915081905092915050565b6000614a53826144f3565b9150819050919050565b6000614a688261477f565b9150819050919050565b60006210000082019050614a89600083018461402a565b92915050565b60006020820190508181036000830152614aa98184614081565b905092915050565b6000602082019050614ac66000830184614123565b92915050565b60006020820190508181036000830152614ae5816141cd565b9050919050565b60006020820190508181036000830152614b058161420d565b9050919050565b60006020820190508181036000830152614b258161424d565b9050919050565b60006020820190508181036000830152614b45816142b3565b9050919050565b60006020820190508181036000830152614b65816142f3565b9050919050565b60006020820190508181036000830152614b8581614333565b9050919050565b60006020820190508181036000830152614ba581614373565b9050919050565b60006020820190508181036000830152614bc5816143b3565b9050919050565b60006020820190508181036000830152614be5816143f3565b9050919050565b60006020820190508181036000830152614c0581614433565b9050919050565b60006020820190508181036000830152614c2581614473565b9050919050565b60006020820190508181036000830152614c45816144b3565b9050919050565b60006020820190508181036000830152614c6581614533565b9050919050565b60006020820190508181036000830152614c8581614573565b9050919050565b60006020820190508181036000830152614ca5816145b3565b9050919050565b60006020820190508181036000830152614cc581614619565b9050919050565b60006020820190508181036000830152614ce581614659565b9050919050565b60006020820190508181036000830152614d05816146bf565b9050919050565b60006020820190508181036000830152614d25816146ff565b9050919050565b60006020820190508181036000830152614d458161473f565b9050919050565b60006020820190508181036000830152614d65816147bf565b9050919050565b60006020820190508181036000830152614d85816147ff565b9050919050565b60006020820190508181036000830152614da58161483f565b9050919050565b60006020820190508181036000830152614dc58161487f565b9050919050565b60006020820190508181036000830152614de5816148bf565b9050919050565b60006020820190508181036000830152614e05816148ff565b9050919050565b60006020820190508181036000830152614e258161493f565b9050919050565b6000602082019050614e416000830184614a0b565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614e6a57600080fd5b8060405250919050565b600067ffffffffffffffff821115614e8b57600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614eb757600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050919050565b6000819050602082019050919050565b600081519050919050565b60006180009050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614fba82614fea565b9050919050565b60008115159050919050565b6000819050919050565b6000819050614fe582615079565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061501f82614fd7565b9050919050565b82818337600083830152505050565b60005b83811015615053578082015181840152602081019050615038565b83811115615062576000848401525b50505050565b6000601f19601f8301169050919050565b6003811061508357fe5b50565b61508f81614faf565b811461509a57600080fd5b50565b6150a68161500a565b81146150b157600080fd5b5056fea365627a7a72315820314a90e541327f2678eaf7815f54348c3702e4fa45cdf1d5595b378d08af86896c6578706572696d656e74616cf564736f6c634300050d0040", + "nonce": "0", + "storage": { + "0x0": "2868903936" + } + }, + "0x69bfcdcb98c9562e0a2faee3ecdfd65e8a0adb19": { + "balance": "1000000000000000000000000000000" + }, + "0x6a37ad7dceec4595eea9f03b82d2710e738343ac": { + "balance": "1000000000000000000000000000000" + }, + "0x6b806862a977a0e22ed1752f858e5332647121c8": { + "balance": "1000000000000000000000000000000" + }, + "0x6c0ef9084a57df13c175afea32ea47a510c5506e": { + "balance": "1000000000000000000000000000000" + }, + "0x6cd5e637266e18d3e888ee99451eb828c6b491f4": { + "balance": "1000000000000000000000000000000" + }, + "0x6d0d7f0ff51917bd84a5f7270d31a894282aaf4b": { + "balance": "1000000000000000000000000000000" + }, + "0x6d8092cb926daf29236f866cd31c327ff73323d1": { + "balance": "1000000000000000000000000000000" + }, + "0x6d80aAC61F6d92c7F4A3c412850474ba963B698E": { + "balance": "1000000000000000000000" + }, + "0x6fec280c0ab320715b17d70e8b02c2d4141c1372": { + "balance": "1000000000000000000000000000000" + }, + "0x733ad609ef2e742334d96266fbc13733f1cf5e4a": { + "balance": "1000000000000000000000000000000" + }, + "0x7525198d8cd1121d57358a0b0ed037e924581a76": { + "balance": "1000000000000000000000000000000" + }, + "0x765708943c3b791563d1e3f0533b6d7e7d769e4d": { + "balance": "1000000000000000000000000000000" + }, + "0x7685d04f0b7657017b77efa004a14ff9f022acab": { + "balance": "1000000000000000000000000000000" + }, + "0x76b545cb6a2fc671f741950eeb27627e69a1e69b": { + "balance": "1000000000000000000000000000000" + }, + "0x77a0bc73442d3d9cb993e8d9752f95babf0ccaa6": { + "balance": "1000000000000000000000000000000" + }, + "0x7a89A6c323FaCfF0ADeF7EEF3e491aD4044d0592": { + "balance": "100000000000000000000000" + }, + "0x7e7E68F04D1799Fa25C8cff57314c8a5d3942e69": { + "balance": "1000000000000000000000000" + }, + "0x811d701d14539d190a8593fe901eafe8eff511f5": { + "balance": "1000000000000000000000000000000" + }, + "0x81dcbd71da28fafb9ca99ff5a22bfcebba84fecc": { + "balance": "100000000000000000000000" + }, + "0x83c1479d2a32d9ed9fa699289b6c2db56b7cd045": { + "balance": "1000000000000000000000000000000" + }, + "0x85b33f0853ab8eaa4e602bdfd724d44bc2731e90": { + "balance": "1000000000000000000000000000000" + }, + "0x863f816036e3cbba90855196c9d1e339fcff1650": { + "balance": "1000000000000000000000000000000" + }, + "0x87ea381878572d63b3453033d7540abddd191186": { + "balance": "1000000000000000000000000000000" + }, + "0x88fd5e01078629cc194c933d9631b9448fe10b1d": { + "balance": "1000000000000000000000000000000" + }, + "0x8945e48bd056f45c8b57f9025d2674bb03a24035": { + "balance": "1000000000000000000000000000000" + }, + "0x8a920edc1021ce76c22774e0e83723a6e51c2439": { + "balance": "1000000000000000000000000000000" + }, + "0x8e6081e272c8f4d49f5b29157b52f68cbd6307ad": { + "balance": "1000000000000000000000000000000" + }, + "0x8fe24dbbf9884bd458d8cfac528b4ad70e82497d": { + "balance": "1000000000000000000000000000000" + }, + "0x90431f3f75b26657f74abbb5c759b12e78f916cc": { + "balance": "1000000000000000000000000000000" + }, + "0x907cd0881E50d359bb9Fd120B1A5A143b1C97De6": { + "balance": "1000000000000000000000000000000000000000000000000000000000" + }, + "0x94c6e5746971d6aebeaa42cbbe2feca0f6b5b24f": { + "balance": "1000000000000000000000000000000" + }, + "0x96672f9e982936e1904b15c948cc81bf18027db6": { + "balance": "1000000000000000000000000000000" + }, + "0x97b921ba45e0aa8830701aa62050a83ee00a1bb8": { + "balance": "1000000000000000000000000000000" + }, + "0x98e50c97baf98dc6a81bdb95067339a269a36fc1": { + "balance": "1000000000000000000000000000000" + }, + "0x9b77f28285a49601169a33332f08aa309d97edd0": { + "balance": "1000000000000000000000000000000" + }, + "0x9f62f4215cd277ca40dede101b4ccb29290de6bb": { + "balance": "1000000000000000000000000000000" + }, + "0xD1001000000000000000000000000000000000D1": { + "balance": "0", + "code": "0x608060405260043610603f576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680636d4ce63c146044575b600080fd5b348015604f57600080fd5b506056606c565b6040518082815260200191505060405180910390f35b60006001600060048152602001908152602001600020600060098152602001908152602001600020600101549050905600a165627a7a723058208fe64219becc0bcab1c8f854f05804ebb6bb555da5dbc49e8f7021c31d77636a0029", + "nonce": "0", + "storage": { + "0x3b4da637a1b0e6dbfc6795f2b7f0cb29eebb91b3af4dcc335e1633f6b4af810b": "1111" + } + }, + "0xD3001000000000000000000000000000000000D3": { + "balance": "0", + "code": "0x60806040526004361061007b5760003560e01c80639623609d1161004e5780639623609d1461013657806399a88ec4146101f5578063f2fde38b14610230578063f3b7dead146102635761007b565b8063204e1c7a14610080578063715018a6146100cf5780637eff275e146100e65780638da5cb5b14610121575b600080fd5b34801561008c57600080fd5b506100b3600480360360208110156100a357600080fd5b50356001600160a01b0316610296565b604080516001600160a01b039092168252519081900360200190f35b3480156100db57600080fd5b506100e4610328565b005b3480156100f257600080fd5b506100e46004803603604081101561010957600080fd5b506001600160a01b03813581169160200135166103ca565b34801561012d57600080fd5b506100b3610496565b6100e46004803603606081101561014c57600080fd5b6001600160a01b03823581169260208101359091169181019060608101604082013564010000000081111561018057600080fd5b82018360208201111561019257600080fd5b803590602001918460018302840111640100000000831117156101b457600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506104a5945050505050565b34801561020157600080fd5b506100e46004803603604081101561021857600080fd5b506001600160a01b03813581169160200135166105dd565b34801561023c57600080fd5b506100e46004803603602081101561025357600080fd5b50356001600160a01b031661068d565b34801561026f57600080fd5b506100b36004803603602081101561028657600080fd5b50356001600160a01b0316610785565b6000806060836001600160a01b03166040518080635c60da1b60e01b8152506004019050600060405180830381855afa9150503d80600081146102f5576040519150601f19603f3d011682016040523d82523d6000602084013e6102fa565b606091505b50915091508161030957600080fd5b80806020019051602081101561031e57600080fd5b5051949350505050565b6103306107e4565b6000546001600160a01b03908116911614610380576040805162461bcd60e51b8152602060048201819052602482015260008051602061080f833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6103d26107e4565b6000546001600160a01b03908116911614610422576040805162461bcd60e51b8152602060048201819052602482015260008051602061080f833981519152604482015290519081900360640190fd5b816001600160a01b0316638f283970826040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050600060405180830381600087803b15801561047a57600080fd5b505af115801561048e573d6000803e3d6000fd5b505050505050565b6000546001600160a01b031690565b6104ad6107e4565b6000546001600160a01b039081169116146104fd576040805162461bcd60e51b8152602060048201819052602482015260008051602061080f833981519152604482015290519081900360640190fd5b826001600160a01b0316634f1ef2863484846040518463ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561057357818101518382015260200161055b565b50505050905090810190601f1680156105a05780820380516001836020036101000a031916815260200191505b5093505050506000604051808303818588803b1580156105bf57600080fd5b505af11580156105d3573d6000803e3d6000fd5b5050505050505050565b6105e56107e4565b6000546001600160a01b03908116911614610635576040805162461bcd60e51b8152602060048201819052602482015260008051602061080f833981519152604482015290519081900360640190fd5b816001600160a01b0316633659cfe6826040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050600060405180830381600087803b15801561047a57600080fd5b6106956107e4565b6000546001600160a01b039081169116146106e5576040805162461bcd60e51b8152602060048201819052602482015260008051602061080f833981519152604482015290519081900360640190fd5b6001600160a01b03811661072a5760405162461bcd60e51b81526004018080602001828103825260268152602001806107e96026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000806060836001600160a01b031660405180806303e1469160e61b8152506004019050600060405180830381855afa9150503d80600081146102f5576040519150601f19603f3d011682016040523d82523d6000602084013e6102fa565b339056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a26469706673582212201d968ac32bef5562c6b4f1bd5d2f2a74c14d07ce008ca6fdc5a3bd0f5fc265f564736f6c63430006080033", + "nonce": "0", + "storage": { + "0x0": "0x907cd0881E50d359bb9Fd120B1A5A143b1C97De6" + } + }, + "0xD3002000000000000000000000000000000000D3": { + "balance": "0", + "code": "0x60806040526004361061004e5760003560e01c80633659cfe6146100655780634f1ef286146100985780635c60da1b146101185780638f28397014610149578063f851a4401461017c5761005d565b3661005d5761005b610191565b005b61005b610191565b34801561007157600080fd5b5061005b6004803603602081101561008857600080fd5b50356001600160a01b03166101ab565b61005b600480360360408110156100ae57600080fd5b6001600160a01b0382351691908101906040810160208201356401000000008111156100d957600080fd5b8201836020820111156100eb57600080fd5b8035906020019184600183028401116401000000008311171561010d57600080fd5b5090925090506101e5565b34801561012457600080fd5b5061012d610292565b604080516001600160a01b039092168252519081900360200190f35b34801561015557600080fd5b5061005b6004803603602081101561016c57600080fd5b50356001600160a01b03166102cf565b34801561018857600080fd5b5061012d610389565b6101996103ba565b6101a96101a461041a565b61043f565b565b6101b3610463565b6001600160a01b0316336001600160a01b031614156101da576101d581610488565b6101e2565b6101e2610191565b50565b6101ed610463565b6001600160a01b0316336001600160a01b031614156102855761020f83610488565b6000836001600160a01b031683836040518083838082843760405192019450600093509091505080830381855af49150503d806000811461026c576040519150601f19603f3d011682016040523d82523d6000602084013e610271565b606091505b505090508061027f57600080fd5b5061028d565b61028d610191565b505050565b600061029c610463565b6001600160a01b0316336001600160a01b031614156102c4576102bd61041a565b90506102cc565b6102cc610191565b90565b6102d7610463565b6001600160a01b0316336001600160a01b031614156101da576001600160a01b0381166103355760405162461bcd60e51b81526004018080602001828103825260368152602001806105876036913960400191505060405180910390fd5b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f61035e610463565b604080516001600160a01b03928316815291841660208301528051918290030190a16101d5816104c8565b6000610393610463565b6001600160a01b0316336001600160a01b031614156102c4576102bd610463565b3b151590565b6103c2610463565b6001600160a01b0316336001600160a01b031614156104125760405162461bcd60e51b81526004018080602001828103825260328152602001806105556032913960400191505060405180910390fd5b6101a96101a9565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b3660008037600080366000845af43d6000803e80801561045e573d6000f35b3d6000fd5b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b610491816104ec565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610355565b6104f5816103b4565b6105305760405162461bcd60e51b815260040180806020018281038252603b8152602001806105bd603b913960400191505060405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5556fe43616e6e6f742063616c6c2066616c6c6261636b2066756e6374696f6e2066726f6d207468652070726f78792061646d696e43616e6e6f74206368616e6765207468652061646d696e206f6620612070726f787920746f20746865207a65726f206164647265737343616e6e6f742073657420612070726f787920696d706c656d656e746174696f6e20746f2061206e6f6e2d636f6e74726163742061646472657373a26469706673582212206e221e2a3547bd97244b05ed46430b1b078ba097cb2a4e25ec3d79cf9ac9f02c64736f6c63430006080033", + "nonce": "0", + "storage": { + "0x0": "1000000", + "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0xD3003000000000000000000000000000000000D3", + "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "0xD3001000000000000000000000000000000000D3" + } + }, + "0xD3003000000000000000000000000000000000D3": { + "balance": "0", + "code": "0x608060405234801561001057600080fd5b50600436106100b45760003560e01c806379210e8e1161007157806379210e8e1461017757806381a8235a146101a757806385aeeb17146101c35780639a9a5593146101f3578063a99100541461020f578063b57321221461022b576100b4565b806307c6e7d3146100b9578063122f4fba146100d55780631c6ec7a9146101055780631cfe4e3b14610121578063373dedb41461013d57806361e46db51461015b575b600080fd5b6100d360048036036100ce9190810190613e94565b61025b565b005b6100ef60048036036100ea9190810190613e94565b610862565b6040516100fc9190614b38565b60405180910390f35b61011f600480360361011a9190810190613e94565b610ba1565b005b61013b60048036036101369190810190613e58565b610fce565b005b6101456111ec565b6040516101529190614eb3565b60405180910390f35b61017560048036036101709190810190613f29565b6111f6565b005b610191600480360361018c9190810190613fa8565b611456565b60405161019e9190614af9565b60405180910390f35b6101c160048036036101bc9190810190613e94565b611756565b005b6101dd60048036036101d89190810190613e94565b6118fb565b6040516101ea9190614b16565b60405180910390f35b61020d60048036036102089190810190613ed5565b611bfa565b005b61022960048036036102249190810190613e94565b612195565b005b61024560048036036102409190810190613e94565b612849565b6040516102529190614eb3565b60405180910390f35b6000339050606061026b83612ac9565b90506000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b825181101561037c576000826001018460018403815181106102d557fe5b60200260200101516040516102ea9190614aa1565b90815260200160405180910390205411610339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161033090614cb3565b60405180910390fd5b8160020183600183038151811061034c57fe5b60200260200101516040516103619190614aa1565b908152602001604051809103902091508060010190506102b7565b506060600183511161038e57846103a7565b8260018451038151811061039e57fe5b60200260200101515b9050600082600101826040516103bd9190614ab8565b9081526020016040518091039020541161040c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161040390614cb3565b60405180910390fd5b600082600201826040516104209190614ab8565b90815260200160405180910390206000018054905014610475576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161046c90614d33565b60405180910390fd5b60006104818587612cc9565b9050806104c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ba90614c53565b60405180910390fd5b6104cb613a4f565b836000016001856000018054905003815481106104e457fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156105965780601f1061056b57610100808354040283529160200191610596565b820191906000526020600020905b81548152906001019060200180831161057957829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff1660028111156105e257fe5b60028111156105ed57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561066557602002820191906000526020600020906000905b82829054906101000a900460ff1615158152602001906001019060208260000104928301926001038202915080841161062f5790505b50505050508152505090508084600001600186600101866040516106899190614ab8565b90815260200160405180910390205403815481106106a357fe5b906000526020600020906005020160008201518160000190805190602001906106cd929190613a8b565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561071c57fe5b0217905550608082015181600401908051906020019061073d929190613b0b565b5090505083600101836040516107539190614ab8565b9081526020016040518091039020548460010182600001516040516107789190614aa1565b9081526020016040518091039020819055506000846001018460405161079e9190614ab8565b908152602001604051809103902081905550836000018054806107bd57fe5b6001900381819060005260206000209060050201600080820160006107e29190613bb1565b6001820160006101000a81549060ff021916905560028201600090556003820160006101000a81549060ff02191690556004820160006108229190613bf9565b5050905583600201836040516108389190614ab8565b9081526020016040518091039020600080820160006108579190613c21565b505050505050505050565b600080606061087084612d2d565b91509150606061087f82612ac9565b90506000600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015610964576000826001018460018403815181106108e957fe5b60200260200101516040516108fe9190614aa1565b908152602001604051809103902054141561092157600095505050505050610b9c565b8160020183600183038151811061093457fe5b60200260200101516040516109499190614aa1565b908152602001604051809103902091508060010190506108cb565b5060606001835111610976578361098f565b8260018451038151811061098657fe5b60200260200101515b9050600082600101826040516109a59190614ab8565b90815260200160405180910390205414156109c857600095505050505050610b9c565b6109d0613a4f565b82600001600184600101846040516109e89190614ab8565b9081526020016040518091039020540381548110610a0257fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610ab45780601f10610a8957610100808354040283529160200191610ab4565b820191906000526020600020905b815481529060010190602001808311610a9757829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115610b0057fe5b6002811115610b0b57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015610b8357602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411610b4d5790505b5050505050815250509050806060015196505050505050505b919050565b600360009054906101000a900460ff16610be457612000600481905550621000006005819055506001600360006101000a81548160ff0219169083151502179055505b6000815111610c28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1f90614cb3565b60405180910390fd5b60003390506060610c3883612ac9565b90506000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015610d4957600082600101846001840381518110610ca257fe5b6020026020010151604051610cb79190614aa1565b90815260200160405180910390205411610d06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cfd90614cb3565b60405180910390fd5b81600201836001830381518110610d1957fe5b6020026020010151604051610d2e9190614aa1565b90815260200160405180910390209150806001019050610c84565b50600454816000018054905010610d95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8c90614dd3565b60405180910390fd5b60606001835111610da65784610dbf565b82600184510381518110610db657fe5b60200260200101515b905060008260010182604051610dd59190614ab8565b90815260200160405180910390205414610e24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1b90614e13565b60405180910390fd5b610e2d816130af565b610e6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6390614cd3565b60405180910390fd5b6000610e788587613190565b905080610eba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb190614b73565b60405180910390fd5b610ec2613a4f565b8281600001819052506000816020019015159081151581525050836000018190806001815401808255809150506001900390600052602060002090600502016000909190919091506000820151816000019080519060200190610f26929190613a8b565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff02191690836002811115610f7557fe5b02179055506080820151816004019080519060200190610f96929190613b0b565b50505083600001805490508460010184604051610fb39190614ab8565b90815260200160405180910390208190555050505050505050565b610fd66131f4565b73ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16148061103b57503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614155b61107a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107190614c33565b60405180910390fd5b80600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411156110fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f390614d13565b60405180910390fd5b60025460095482011115611145576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113c90614b93565b60405180910390fd5b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460096000828254039250508190555080600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550806009600082825401925050819055505050565b6000600254905090565b60003390506000611207828661328d565b90506001600281111561121657fe5b8160030160009054906101000a900460ff16600281111561123357fe5b14611273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126a90614df3565b60405180910390fd5b6000600554858161128057fe5b061480156112915750806002015484105b6112d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c790614b53565b60405180910390fd5b600554848260020154031080156112ed5750838160020154038351145b806112fa57506005548351145b611339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133090614bf3565b60405180910390fd5b6000151581600401600554868161134c57fe5b048154811061135757fe5b90600052602060002090602091828204019190069054906101000a900460ff161515146113b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b090614bd3565b60405180910390fd5b60006113c78387878761348c565b905080611409576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140090614cf3565b60405180910390fd5b600182600401600554878161141a57fe5b048154811061142557fe5b90600052602060002090602091828204019190066101000a81548160ff021916908315150217905550505050505050565b61145e613c45565b6000606061146b86612d2d565b91509150611477613a4f565b611481838361328d565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156115255780601f106114fa57610100808354040283529160200191611525565b820191906000526020600020905b81548152906001019060200180831161150857829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561157157fe5b600281111561157c57fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156115f457602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116115be5790505b505050505081525050905060028081111561160b57fe5b8160600151600281111561161b57fe5b1461165b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165290614e93565b60405180910390fd5b600554851115801561166d5750600085115b6116ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a390614bf3565b60405180910390fd5b806040015185870111156116f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ec90614b53565b60405180910390fd5b60006117038484898961353d565b80965081925050508061174b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174290614d73565b60405180910390fd5b505050509392505050565b60003390506000611767828461328d565b90506001600281111561177657fe5b8160030160009054906101000a900460ff16600281111561179357fe5b146117d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ca90614df3565b60405180910390fd5b60006001905060008260040180549050905060008090505b8181101561183e576000151584600401828154811061180657fe5b90600052602060002090602091828204019190069054906101000a900460ff161515141561183357600092505b8060010190506117eb565b508161187f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187690614d53565b60405180910390fd5b60028360030160006101000a81548160ff021916908360028111156118a057fe5b021790555060006118b185876135d0565b9050806118f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ea90614bb3565b60405180910390fd5b505050505050565b60606000606061190a84612d2d565b91509150606061191982612ac9565b90506000600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008090505b8251811015611a235760008260010184838151811061197f57fe5b60200260200101516040516119949190614aa1565b908152602001604051809103902054116119e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119da90614cb3565b60405180910390fd5b816002018382815181106119f357fe5b6020026020010151604051611a089190614aa1565b90815260200160405180910390209150806001019050611964565b5080600001805480602002602001604051908101604052809291908181526020016000905b82821015611beb57838290600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611b045780601f10611ad957610100808354040283529160200191611b04565b820191906000526020600020905b815481529060010190602001808311611ae757829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115611b5057fe5b6002811115611b5b57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015611bd357602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411611b9d5790505b50505050508152505081526020019060010190611a48565b50505050945050505050919050565b600360009054906101000a900460ff16611c3d57612000600481905550621000006005819055506001600360006101000a81548160ff0219169083151502179055505b60003390506305f5e100821115611c89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8090614db3565b60405180910390fd5b600660008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205483011115611d4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4390614e33565b60405180910390fd5b6060611d5784612ac9565b90506000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015611e6857600082600101846001840381518110611dc157fe5b6020026020010151604051611dd69190614aa1565b90815260200160405180910390205411611e25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1c90614cb3565b60405180910390fd5b81600201836001830381518110611e3857fe5b6020026020010151604051611e4d9190614aa1565b90815260200160405180910390209150806001019050611da3565b50600454816000018054905010611eb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eab90614dd3565b60405180910390fd5b60606001835111611ec55785611ede565b82600184510381518110611ed557fe5b60200260200101515b905060008260010182604051611ef49190614ab8565b90815260200160405180910390205414611f43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3a90614e13565b60405180910390fd5b611f4c816130af565b611f8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8290614d93565b60405180910390fd5b6000611f98858888613634565b905080611fda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd190614e73565b60405180910390fd5b6060600554600160055489010381611fee57fe5b0460405190808252806020026020018201604052801561201d5781602001602082028038833980820191505090505b509050836000016040518060a001604052808581526020016001151581526020018981526020016001600281111561205157fe5b8152602001838152509080600181540180825580915050600190039060005260206000209060050201600090919091909150600082015181600001908051906020019061209f929190613a8b565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff021916908360028111156120ee57fe5b0217905550608082015181600401908051906020019061210f929190613b0b565b5050508360000180549050846001018460405161212c9190614ab8565b90815260200160405180910390208190555086600760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505050505050505050565b60003390506121a2613a4f565b6121ac828461328d565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156122505780601f1061222557610100808354040283529160200191612250565b820191906000526020600020905b81548152906001019060200180831161223357829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561229c57fe5b60028111156122a757fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561231f57602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116122e95790505b50505050508152505090506000600281111561233757fe5b8160600151600281111561234757fe5b1415612388576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161237f90614c13565b60405180910390fd5b600061239483856136a1565b9050806123d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123cd90614c73565b60405180910390fd5b60606123e185612ac9565b90506000600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015612479578160020183600183038151811061244957fe5b602002602001015160405161245e9190614aa1565b9081526020016040518091039020915080600101905061242d565b50600060018260010186600001516040516124949190614aa1565b9081526020016040518091039020540390506124ae613a4f565b826000016001846000018054905003815481106124c757fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156125795780601f1061254e57610100808354040283529160200191612579565b820191906000526020600020905b81548152906001019060200180831161255c57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff1660028111156125c557fe5b60028111156125d057fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561264857602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116126125790505b50505050508152505090508083600001838154811061266357fe5b9060005260206000209060050201600082015181600001908051906020019061268d929190613a8b565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff021916908360028111156126dc57fe5b021790555060808201518160040190805190602001906126fd929190613b0b565b509050508260000180548061270e57fe5b6001900381819060005260206000209060050201600080820160006127339190613bb1565b6001820160006101000a81549060ff021916905560028201600090556003820160006101000a81549060ff02191690556004820160006127739190613bf9565b5050905582600101866000015160405161278d9190614aa1565b9081526020016040518091039020548360010182600001516040516127b29190614aa1565b90815260200160405180910390208190555060008360010187600001516040516127dc9190614aa1565b9081526020016040518091039020819055508560400151600760008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505050505050505050565b600080606061285784612d2d565b91509150612863613a4f565b61286d838361328d565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156129115780601f106128e657610100808354040283529160200191612911565b820191906000526020600020905b8154815290600101906020018083116128f457829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561295d57fe5b600281111561296857fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156129e057602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116129aa5790505b5050505050815250509050600160028111156129f857fe5b81606001516002811115612a0857fe5b1480612a2d5750600280811115612a1b57fe5b81606001516002811115612a2b57fe5b145b612a6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a6390614df3565b60405180910390fd5b6000612a788484613705565b809650819250505080612ac0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ab790614e53565b60405180910390fd5b50505050919050565b6060612ad3613c6a565b612adc8361376e565b9050612ae6613c6a565b612b246040518060400160405280600181526020017f2f0000000000000000000000000000000000000000000000000000000000000081525061376e565b905060606001612b3d838561379c90919063ffffffff16565b01604051908082528060200260200182016040528015612b7157816020015b6060815260200190600190039081612b5c5790505b50905060008090505b8151811015612bc257612b9e612b99848661381190919063ffffffff16565b61382b565b828281518110612baa57fe5b60200260200101819052508080600101915050612b7a565b50600081600183510381518110612bd557fe5b6020026020010151511415612c405780600182510381518110612bf457fe5b6020026020010160608152506001815103604051908082528060200260200182016040528015612c3857816020015b6060815260200190600190039081612c235790505b509350612c79565b8051604051908082528060200260200182016040528015612c7557816020015b6060815260200190600190039081612c605790505b5093505b60008090505b8451811015612cc057818181518110612c9457fe5b6020026020010151858281518110612ca857fe5b60200260200101819052508080600101915050612c7f565b50505050919050565b60008060016020601f85510181612cdc57fe5b040190506040518481526020810160005b83811015612d0e578060200286015181602002830152806001019050612ced565b50602082602085026040018460006010600019f1935050505092915050565b6000606060006028905080845111612d7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d7190614c93565b60405180910390fd5b6060816040519080825280601f01601f191660200182016040528015612daf5781602001600182028038833980820191505090505b50905060008090505b82811015612e1f57858181518110612dcc57fe5b602001015160f81c60f81b828281518110612de357fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050612db8565b50600080905060008090505b83811015612f4e576000838281518110612e4157fe5b602001015160f81c60f81b60f81c60ff16905060308110158015612e66575060398111155b80612e7f575060418110158015612e7e5750605a8111155b5b80612e98575060618110158015612e97575060668111155b5b612ed7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ece90614c93565b60405180910390fd5b60308110158015612ee9575060398111155b15612efa5760308103601084020192505b60418110158015612f0c5750605a8111155b15612f1d5760378103601084020192505b60618110158015612f2f575060668111155b15612f405760578103601084020192505b508080600101915050612e2b565b508094507f2f00000000000000000000000000000000000000000000000000000000000000868481518110612f7f57fe5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612fec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fe390614c93565b60405180910390fd5b6000600184885103039050806040519080825280601f01601f19166020018201604052801561302a5781602001600182028038833980820191505090505b50945060008090505b818110156130a5576000886001878401018151811061304e57fe5b602001015160f81c60f81b90508087838151811061306857fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350508080600101915050613033565b5050505050915091565b60006040516020016130c090614ae4565b60405160208183030381529060405280519060200120826040516020016130e79190614ab8565b604051602081830303815290604052805190602001201480613152575060405160200161311390614acf565b604051602081830303815290604052805190602001208260405160200161313a9190614ab8565b60405160208183030381529060405280519060200120145b8061315e575060008251145b1561316c576000905061318b565b60008251905060ff81111561318557600091505061318b565b60019150505b919050565b60008060016020601f855101816131a357fe5b040190506040518481526020810160005b838110156131d55780602002860151816020028301528060010190506131b4565b5060208260208502604001846000600f600019f1935050505092915050565b600073d2001000000000000000000000000000000000d273ffffffffffffffffffffffffffffffffffffffff166383e781fe6040518163ffffffff1660e01b815260040160206040518083038186803b15801561325057600080fd5b505afa158015613264573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506132889190810190613e2f565b905090565b6000606061329a83612ac9565b90506000600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b82518110156133ab5760008260010184600184038151811061330457fe5b60200260200101516040516133199190614aa1565b90815260200160405180910390205411613368576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161335f90614cb3565b60405180910390fd5b8160020183600183038151811061337b57fe5b60200260200101516040516133909190614aa1565b908152602001604051809103902091508060010190506132e6565b50606060018351116133bd57846133d6565b826001845103815181106133cd57fe5b60200260200101515b9050600082600101826040516133ec9190614ab8565b9081526020016040518091039020541161343b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161343290614cb3565b60405180910390fd5b600082600001600184600101846040516134559190614ab8565b908152602001604051809103902054038154811061346f57fe5b906000526020600020906005020190508094505050505092915050565b60008060016020601f8551018161349f57fe5b04019050600060016020601f885101816134b557fe5b040190506040518781526020810160005b838110156134e75780602002890151816020028301528060010190506134c6565b50868360200282015260005b8481101561351957806020028701518185600101016020028301528060010190506134f3565b50602082848601602002606001846000600c600019f1945050505050949350505050565b6000613547613c45565b600060016020601f8851018161355957fe5b0401905060006020601f86018161356c57fe5b0490506040518881526020810160005b8481101561359d57806020028a01518160200283015280600101905061357c565b5083602002810188815287816020015283602002868660030160200285600a600019fa9650505050505094509492505050565b60008060016020601f855101816135e357fe5b040190506040518481526020810160005b838110156136155780602002860151816020028301528060010190506135f4565b50602082602085026040018460006011600019f1935050505092915050565b60008060016020601f8651018161364757fe5b040190506040518581526020810160005b83811015613679578060200287015181602002830152806001019050613658565b50846020840282015260208260208502604001846000600b600019f193505050509392505050565b60008060016020601f855101816136b457fe5b040190506040518481526020810160005b838110156136e65780602002860151816020028301528060010190506136c5565b5060208260208502604001846000600e600019f1935050505092915050565b600080600060016020601f8651018161371a57fe5b040190506040518581526020810160005b8381101561374c57806020028701518160200283015280600101905061372b565b506020826020850260200184600d600019fa9450815193505050509250929050565b613776613c6a565b600060208301905060405180604001604052808451815260200182815250915050919050565b60008082600001516137c0856000015186602001518660000151876020015161388d565b0190505b8360000151846020015101811161380a578180600101925050826000015161380285602001518303866000015103838660000151876020015161388d565b0190506137c4565b5092915050565b613819613c6a565b613824838383613968565b5092915050565b60608082600001516040519080825280601f01601f1916602001820160405280156138655781602001600182028038833980820191505090505b50905060006020820190506138838185602001518660000151613a06565b8192505050919050565b6000808490506000868511613958576020851161391257600060018660200360080260020a031960001b905060008186511690506000878a8a0103905060008386511690505b828114613904578186106138f1578a8a019650505050505050613960565b85806001019650508386511690506138d3565b859650505050505050613960565b60008585209050600091505b85880382116139565760008684209050808214156139425783945050505050613960565b60018401935050818060010192505061391e565b505b868601925050505b949350505050565b613970613c6a565b600061398e856000015186602001518660000151876020015161388d565b905084602001518360200181815250508460200151810383600001818152505084600001518560200151018114156139d05760008560000181815250506139fb565b8360000151836000015101856000018181510391508181525050836000015181018560200181815250505b829150509392505050565b5b60208110613a2a5781518352602083019250602082019150602081039050613a07565b60006001826020036101000a0390508019835116818551168181178652505050505050565b6040518060a00160405280606081526020016000151581526020016000815260200160006002811115613a7e57fe5b8152602001606081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613acc57805160ff1916838001178555613afa565b82800160010185558215613afa579182015b82811115613af9578251825591602001919060010190613ade565b5b509050613b079190613c84565b5090565b82805482825590600052602060002090601f01602090048101928215613ba05791602002820160005b83821115613b7157835183826101000a81548160ff0219169083151502179055509260200192600101602081600001049283019260010302613b34565b8015613b9e5782816101000a81549060ff0219169055600101602081600001049283019260010302613b71565b505b509050613bad9190613ca9565b5090565b50805460018160011615610100020316600290046000825580601f10613bd75750613bf6565b601f016020900490600052602060002090810190613bf59190613c84565b5b50565b50805460008255601f016020900490600052602060002090810190613c1e9190613c84565b50565b5080546000825560050290600052602060002090810190613c429190613cd9565b50565b6040518062100000016040528061800090602082028038833980820191505090505090565b604051806040016040528060008152602001600081525090565b613ca691905b80821115613ca2576000816000905550600101613c8a565b5090565b90565b613cd691905b80821115613cd257600081816101000a81549060ff021916905550600101613caf565b5090565b90565b613d4591905b80821115613d415760008082016000613cf89190613bb1565b6001820160006101000a81549060ff021916905560028201600090556003820160006101000a81549060ff0219169055600482016000613d389190613bf9565b50600501613cdf565b5090565b90565b600081359050613d578161510d565b92915050565b600081519050613d6c8161510d565b92915050565b600082601f830112613d8357600080fd5b8135613d96613d9182614efb565b614ece565b91508082526020830160208301858383011115613db257600080fd5b613dbd8382846150ad565b50505092915050565b600082601f830112613dd757600080fd5b8135613dea613de582614f27565b614ece565b91508082526020830160208301858383011115613e0657600080fd5b613e118382846150ad565b50505092915050565b600081359050613e2981615124565b92915050565b600060208284031215613e4157600080fd5b6000613e4f84828501613d5d565b91505092915050565b60008060408385031215613e6b57600080fd5b6000613e7985828601613d48565b9250506020613e8a85828601613e1a565b9150509250929050565b600060208284031215613ea657600080fd5b600082013567ffffffffffffffff811115613ec057600080fd5b613ecc84828501613dc6565b91505092915050565b60008060408385031215613ee857600080fd5b600083013567ffffffffffffffff811115613f0257600080fd5b613f0e85828601613dc6565b9250506020613f1f85828601613e1a565b9150509250929050565b600080600060608486031215613f3e57600080fd5b600084013567ffffffffffffffff811115613f5857600080fd5b613f6486828701613dc6565b9350506020613f7586828701613e1a565b925050604084013567ffffffffffffffff811115613f9257600080fd5b613f9e86828701613d72565b9150509250925092565b600080600060608486031215613fbd57600080fd5b600084013567ffffffffffffffff811115613fd757600080fd5b613fe386828701613dc6565b9350506020613ff486828701613e1a565b925050604061400586828701613e1a565b9150509250925092565b600061401b838361417d565b60208301905092915050565b6000614033838361418c565b60208301905092915050565b600061404b8383614a06565b905092915050565b600061405e82614f7d565b6140688185614fdc565b935061407383614f53565b8060005b838110156140a457815161408b888261400f565b975061409683614fb5565b925050600181019050614077565b5085935050505092915050565b6140ba81614f88565b6140c48184614fed565b92506140cf82614f63565b8060005b838110156141005781516140e78782614027565b96506140f283614fc2565b9250506001810190506140d3565b505050505050565b600061411382614f94565b61411d8185614ff8565b93508360208202850161412f85614f6d565b8060005b8581101561416b578484038952815161414c858261403f565b945061415783614fcf565b925060208a01995050600181019050614133565b50829750879550505050505092915050565b61418681615048565b82525050565b61419581615054565b82525050565b6141a48161509b565b82525050565b6141b38161509b565b82525050565b60006141c482614faa565b6141ce818561502b565b93506141de8185602086016150bc565b80840191505092915050565b60006141f582614f9f565b6141ff8185615009565b935061420f8185602086016150bc565b614218816150ef565b840191505092915050565b600061422e82614f9f565b614238818561502b565b93506142488185602086016150bc565b80840191505092915050565b600061426160188361501a565b91507f496e636f7272656374206368756e6b20706f736974696f6e00000000000000006000830152602082019050919050565b60006142a160158361501a565b91507f4469726563746f7279206e6f74206372656174656400000000000000000000006000830152602082019050919050565b60006142e160248361501a565b91507f4e6f7420656e6f756768206d656d6f727920696e207468652046696c6573746f60008301527f72616765000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614347601b8361501a565b91507f48617368206861736e2774206265656e2063616c63756c6174656400000000006000830152602082019050919050565b600061438760198361501a565b91507f4368756e6b20697320616c72656164792075706c6f61646564000000000000006000830152602082019050919050565b60006143c760168361501a565b91507f496e636f7272656374206368756e6b206c656e677468000000000000000000006000830152602082019050919050565b6000614407600f8361501a565b91507f46696c65206e6f742065786973747300000000000000000000000000000000006000830152602082019050919050565b6000614447600e8361501a565b91507f496e76616c69642073656e6465720000000000000000000000000000000000006000830152602082019050919050565b600061448760188361501a565b91507f4469726563746f7279206973206e6f742064656c6574656400000000000000006000830152602082019050919050565b60006144c760108361501a565b91507f46696c65206e6f742064656c65746564000000000000000000000000000000006000830152602082019050919050565b600061450760138361501a565b91507f496e76616c69642073746f7261676550617468000000000000000000000000006000830152602082019050919050565b6000614547600c8361501a565b91507f496e76616c6964207061746800000000000000000000000000000000000000006000830152602082019050919050565b600061458760018361502b565b91507f2e000000000000000000000000000000000000000000000000000000000000006000830152600182019050919050565b60006145c760168361501a565b91507f496e76616c6964206469726563746f7279206e616d65000000000000000000006000830152602082019050919050565b600061460760158361501a565b91507f4368756e6b207761736e27742075706c6f6164656400000000000000000000006000830152602082019050919050565b600061464760268361501a565b91507f436f756c64206e6f742072657365727665206c657373207468616e207573656460008301527f20737061636500000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006146ad60168361501a565b91507f4469726563746f7279206973206e6f7420656d707479000000000000000000006000830152602082019050919050565b60006146ed60238361501a565b91507f46696c65206861736e2774206265656e2075706c6f6164656420636f7272656360008301527f746c7900000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061475360118361501a565b91507f4368756e6b207761736e277420726561640000000000000000000000000000006000830152602082019050919050565b600061479360188361501a565b91507f46696c656e616d652073686f756c64206265203c2032353600000000000000006000830152602082019050919050565b60006147d3601f8361501a565b91507f46696c652073686f756c64206265206c657373207468616e20313030204d42006000830152602082019050919050565b600061481360028361502b565b91507f2e2e0000000000000000000000000000000000000000000000000000000000006000830152600282019050919050565b600061485360118361501a565b91507f4469726563746f72792069732066756c6c0000000000000000000000000000006000830152602082019050919050565b6000614893600e8361501a565b91507f46696c65206e6f7420666f756e640000000000000000000000000000000000006000830152602082019050919050565b60006148d360188361501a565b91507f46696c65206f72206469726563746f72792065786973747300000000000000006000830152602082019050919050565b600061491360198361501a565b91507f4e6f7420656e6f756768207265736572766564207370616365000000000000006000830152602082019050919050565b600061495360188361501a565b91507f45564d206572726f7220696e2067657446696c6553697a6500000000000000006000830152602082019050919050565b600061499360108361501a565b91507f46696c65206e6f742063726561746564000000000000000000000000000000006000830152602082019050919050565b60006149d360198361501a565b91507f46696c65206861736e2774206265656e2075706c6f61646564000000000000006000830152602082019050919050565b600060a0830160008301518482036000860152614a2382826141ea565b9150506020830151614a38602086018261417d565b506040830151614a4b6040860182614a83565b506060830151614a5e606086018261419b565b5060808301518482036080860152614a768282614053565b9150508091505092915050565b614a8c81615091565b82525050565b614a9b81615091565b82525050565b6000614aad8284614223565b915081905092915050565b6000614ac482846141b9565b915081905092915050565b6000614ada8261457a565b9150819050919050565b6000614aef82614806565b9150819050919050565b60006210000082019050614b1060008301846140b1565b92915050565b60006020820190508181036000830152614b308184614108565b905092915050565b6000602082019050614b4d60008301846141aa565b92915050565b60006020820190508181036000830152614b6c81614254565b9050919050565b60006020820190508181036000830152614b8c81614294565b9050919050565b60006020820190508181036000830152614bac816142d4565b9050919050565b60006020820190508181036000830152614bcc8161433a565b9050919050565b60006020820190508181036000830152614bec8161437a565b9050919050565b60006020820190508181036000830152614c0c816143ba565b9050919050565b60006020820190508181036000830152614c2c816143fa565b9050919050565b60006020820190508181036000830152614c4c8161443a565b9050919050565b60006020820190508181036000830152614c6c8161447a565b9050919050565b60006020820190508181036000830152614c8c816144ba565b9050919050565b60006020820190508181036000830152614cac816144fa565b9050919050565b60006020820190508181036000830152614ccc8161453a565b9050919050565b60006020820190508181036000830152614cec816145ba565b9050919050565b60006020820190508181036000830152614d0c816145fa565b9050919050565b60006020820190508181036000830152614d2c8161463a565b9050919050565b60006020820190508181036000830152614d4c816146a0565b9050919050565b60006020820190508181036000830152614d6c816146e0565b9050919050565b60006020820190508181036000830152614d8c81614746565b9050919050565b60006020820190508181036000830152614dac81614786565b9050919050565b60006020820190508181036000830152614dcc816147c6565b9050919050565b60006020820190508181036000830152614dec81614846565b9050919050565b60006020820190508181036000830152614e0c81614886565b9050919050565b60006020820190508181036000830152614e2c816148c6565b9050919050565b60006020820190508181036000830152614e4c81614906565b9050919050565b60006020820190508181036000830152614e6c81614946565b9050919050565b60006020820190508181036000830152614e8c81614986565b9050919050565b60006020820190508181036000830152614eac816149c6565b9050919050565b6000602082019050614ec86000830184614a92565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614ef157600080fd5b8060405250919050565b600067ffffffffffffffff821115614f1257600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614f3e57600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050919050565b6000819050602082019050919050565b600081519050919050565b60006180009050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061504182615071565b9050919050565b60008115159050919050565b6000819050919050565b600081905061506c82615100565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006150a68261505e565b9050919050565b82818337600083830152505050565b60005b838110156150da5780820151818401526020810190506150bf565b838111156150e9576000848401525b50505050565b6000601f19601f8301169050919050565b6003811061510a57fe5b50565b61511681615036565b811461512157600080fd5b50565b61512d81615091565b811461513857600080fd5b5056fea2646970667358221220a549ad9e778ae8bb3048c0a1805e77745871cc1560637ae1c3ebccb76638d9c464736f6c63430006020033", + "nonce": "0", + "storage": {} + }, + "0xa096b05a489831db893fc53aacc7ed20efb36382": { + "balance": "1000000000000000000000000000000" + }, + "0xa1cd651d99283be60e2a9d2e3bc8a90aedb8244f": { + "balance": "1000000000000000000000000000000" + }, + "0xa2969e82619021ea407338f8bdf7c6f2bd679673": { + "balance": "1000000000000000000000000000000" + }, + "0xa3597b1162b6559cb5e966904b63e762ece756a4": { + "balance": "1000000000000000000000000000000" + }, + "0xa68f946090c600eda6f139783077ee802afeb990": { + "balance": "1000000000000000000000000000000" + }, + "0xa6d50055592cecb795bc1ed3b9ea57ed426b0b7c": { + "balance": "1000000000000000000000000000000" + }, + "0xa7c0789bdeee38c6b59111a789dfb6b815489847": { + "balance": "1000000000000000000000000000000" + }, + "0xa8c813ee806b4c8537ff5f16084d44db18ea9ab1": { + "balance": "1000000000000000000000000000000" + }, + "0xaa6a87bbb74bc1f3cb40c1efb7fc171ee6407560": { + "balance": "1000000000000000000000000000000" + }, + "0xabf920b89f5a2487fdb70be17fd01a99a0602e62": { + "balance": "1000000000000000000000000000000" + }, + "0xac5df92da5171ba24a9618018b4f79494040334b": { + "balance": "1000000000000000000000000000000" + }, + "0xaf97a8318a1a51d5daeeb9650024b63ee44f45bd": { + "balance": "1000000000000000000000000000000" + }, + "0xb28c45b98ae43a5e9ee5509c97ea037b5de5d6d9": { + "balance": "1000000000000000000000000000000" + }, + "0xb64989ab32b089da3da103b93e6781d6d5dd10b4": { + "balance": "1000000000000000000000000000000" + }, + "0xb67e6f4a21f93c250fa6ff0cb142bd14dd4ca8eb": { + "balance": "1000000000000000000000000000000" + }, + "0xb70603c505f85130b5b2e73cd82d196dfd7d8b5e": { + "balance": "1000000000000000000000000000000" + }, + "0xb942414cae2a1ab1056657b905845c0ab6b6280a": { + "balance": "1000000000000000000000000000000" + }, + "0xbee0e5c1961d51be9bd670876caa9c90ba7d9016": { + "balance": "1000000000000000000000000000000" + }, + "0xbf2d8cebdeeb8ad8fed7b2a75f35922106f8d75c": { + "balance": "1000000000000000000000000000000" + }, + "0xbf5aa678b969c0871e2fbcf09c3dbb5d5865ac1e": { + "balance": "1000000000000000000000000000000" + }, + "0xc12bcedd9bcad9120150122cd50f39576ecccc08": { + "balance": "1000000000000000000000000000000" + }, + "0xc2d3852f3292acb81bd164dbae5f1e2a87535150": { + "balance": "1000000000000000000000000000000" + }, + "0xc3820490201e94d76b44655d2df713fec29d9795": { + "balance": "1000000000000000000000000000000" + }, + "0xc58744e2eceefd45cc5469f0e0a708ad24ddbbdb": { + "balance": "1000000000000000000000000000000" + }, + "0xc7865200e8e51ba1c8d695f327deed432930f2cc": { + "balance": "1000000000000000000000000000000" + }, + "0xc8e4d709eb3eb335dc69c9fbf2d24d447cb86105": { + "balance": "1000000000000000000000000000000" + }, + "0xc98af661e44c5bf31d2f8bdff4bbf2808ed4e991": { + "balance": "1000000000000000000000000000000" + }, + "0xca4409573a5129a72edf85d6c51e26760fc9c903": { + "balance": "100000000000000000000000" + }, + "0xcc33e23b04b74f7ba8fbe315083182224af973fa": { + "balance": "1000000000000000000000000000000" + }, + "0xce1c62d0a77600fb2f959b4da76fcb9b3b9430a3": { + "balance": "1000000000000000000000000000000" + }, + "0xd1b6c947fb14060b38945584714491592e84875d": { + "balance": "1000000000000000000000000000000" + }, + "0xd23cd6a9ddcc3470300003621bbac1e06a7919d5": { + "balance": "1000000000000000000000000000000" + }, + "0xd2c5b39B4e735C17612Bb5a08FD024ccc5dBCb23": { + "balance": "100000000000000000000000" + }, + "0xd2cd302eb060e375a65d65946692a3ac2d838d35": { + "balance": "1000000000000000000000000000000" + }, + "0xd2e75c41ced8699e3176f6e335355701a2568b7b": { + "balance": "1000000000000000000000000000000" + }, + "0xd3d38f4cb0aeb4c7c2527ddaeec2ab3b910c8528": { + "balance": "1000000000000000000000000000000" + }, + "0xd5b561a27cca5049650a14ab93dbf1a20c0cefc1": { + "balance": "1000000000000000000000000000000" + }, + "0xd90045420b8abc37b3f9304ed2b385fc1b7fa8c5": { + "balance": "1000000000000000000000000000000" + }, + "0xd951bf4cff429062702a7d8699a5f0bf14845d9b": { + "balance": "1000000000000000000000000000000" + }, + "0xdc6a269c58e58a93a22b5df8cdf1af630c47481f": { + "balance": "1000000000000000000000000000000" + }, + "0xdc6d02ef4003a4f2d0ccff65ae1a2d8157fbb23e": { + "balance": "1000000000000000000000000000000" + }, + "0xde14aca36acc62c305a7ee571da37840a408e600": { + "balance": "1000000000000000000000000000000" + }, + "0xdee32ae508cf783f53ab8bc39d878fe323cdfae3": { + "balance": "1000000000000000000000000000000" + }, + "0xe083a100d51fc4f38aae4a3a68404c36ad96c612": { + "balance": "1000000000000000000000000000000" + }, + "0xe1607990ce800407e3c206e58de4917977181d4d": { + "balance": "1000000000000000000000000000000" + }, + "0xe25e5b63dfd4cf59b81eddf64f1195858634b8a6": { + "balance": "1000000000000000000000000000000" + }, + "0xe372377decb3bdc0c7f5272d38ce0ba2a54934fe": { + "balance": "1000000000000000000000000000000" + }, + "0xe3cc6ec63b5652d1594bc63bb293f4e80f76dbdd": { + "balance": "1000000000000000000000000000000" + }, + "0xe3da7c014286258944ab20a31e4d861b4c9262f1": { + "balance": "1000000000000000000000000000000" + }, + "0xe8b57f330d56081c856e618210fbedb414925ff0": { + "balance": "1000000000000000000000000000000" + }, + "0xe91ac72a568e752eb7c9f5235100586ce97c8cc1": { + "balance": "1000000000000000000000000000000" + }, + "0xf184c8c243a178c1748a0af45caedeca476105b4": { + "balance": "1000000000000000000000000000000" + }, + "0xf1a5912ff318aebf312cdb54c75642a9e632703c": { + "balance": "1000000000000000000000000000000" + }, + "0xf2197b153b4c9086fc5410431fbf7960d284c65e": { + "balance": "1000000000000000000000000000000" + }, + "0xf36620e71327f4a55d550d46e030ccf0c728f154": { + "balance": "1000000000000000000000000000000" + }, + "0xf9817fB82fc767aA9A4A97a1901676244b88ce0E": { + "balance": "100000000000000000000000" + }, + "0xfa723938fa8da1a8a2114ad409a11581761ee40d": { + "balance": "1000000000000000000000000000000" + }, + "0xfa7a8c69810eaf16a395d2a93b3ab51efeed2a1c": { + "balance": "1000000000000000000000000000000" + }, + "0xfaa1038074941571524934ba52d312e88b3577f5": { + "balance": "1000000000000000000000000000000" + }, + "0xfe14077c26a507496b7208384d459e21c49c4212": { + "balance": "1000000000000000000000000000000" + }, + "0xfe275c9b5ac792327da509b27eb9614196dfb07d": { + "balance": "1000000000000000000000000000000" + }, + "0xfe2c5aa110fff89361806ea7ee080bfffba0d3dd": { + "balance": "1000000000000000000000000000000" + }, + "0xfe3d4f1fc038f4f756ba44995129cd45c9e0e861": { + "balance": "1000000000000000000000000000000" + }, + "0xfee314cdc84ecfaa675e41b3559c0101e1eba6b8": { + "balance": "1000000000000000000000000000000" + } + }, + "genesis": { + "author": "0x0000000000000000000000000000000000000001", + "difficulty": "0x0", + "extraData": "0x11bbe8db4e347b4e8c937c1c8370e4b5ed33adb3db69cbdb7a38e1e50b1b82fa", + "gasLimit": "0xFFFFFFFFF", + "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000abc", + "nonce": "0x0000000000000042", + "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "timestamp": "0x00" + }, + "params": { + "EIP150ForkBlock": "0x00", + "EIP158ForkBlock": "0x00", + "accountStartNonce": "0x00", + "blockReward": "0x4563918244F40000", + "byzantiumForkBlock": "0x0", + "chainID": "0x12345", + "constantinopleForkBlock": "0x0", + "daoHardforkBlock": "0x0", + "difficultyBoundDivisor": "0x0800", + "durationLimit": "0x0d", + "externalGasDifficulty": "0x01", + "gasLimitBoundDivisor": "0x0400", + "homesteadForkBlock": "0x0", + "maxGasLimit": "0xFFFFFFFFF", + "maximumExtraDataSize": "0x20", + "minGasLimit": "0xFFFFFFFFF", + "minimumDifficulty": "0x0", + "networkID": "12313219", + "tieBreakingGas": false + }, + "sealEngine": "Ethash", + "skaleConfig": { + "nodeInfo": { + "basePort": 2631, + "bindIP": "0.0.0.0", + "collectionDuration": 10, + "collectionQueueSize": 2, + "db-path": "/tmp/test_eth_15_of_16", + "ecdsaKeyName": "", + "httpRpcPort": 2634, + "httpsRpcPort": 1239, + "logLevel": "info", + "logLevelProposal": "info", + "maxCacheSize": 2000, + "maxOpenLeveldbFiles": 25, + "minCacheSize": 1000, + "nodeID": 1615, + "nodeName": "Node1", + "rotateAfterBlock": 0, + "testSignatures": true, + "transactionQueueSize": 10000, + "wsRpcPort": 2633, + "wssRpcPort": 2638 + }, + "sChain": { + "EIP1559TransactionsPatchTimestamp": 1, + "contractStorageLimit": 10000000000, + "contractStoragePatchTimestamp": 1, + "contractStorageZeroValuePatchTimestamp": 1, + "correctForkInPowPatchTimestamp": 1, + "emptyBlockIntervalMs": 10000, + "fastConsensusPatchTimestamp": 1, + "flexibleDeploymentPatchTimestamp": 1, + "levelDBReopenIntervalMs": 1, + "multiTransactionMode": false, + "nodes": [ + { + "basePort": 1231, + "ip": "127.0.0.1", + "nodeID": 1601, + "publicKey": "", + "schainIndex": 1 + }, + { + "basePort": 1331, + "ip": "127.0.0.1", + "nodeID": 1602, + "publicKey": "", + "schainIndex": 2 + }, + { + "basePort": 1431, + "ip": "127.0.0.1", + "nodeID": 1603, + "publicKey": "", + "schainIndex": 3 + }, + { + "basePort": 1531, + "ip": "127.0.0.1", + "nodeID": 1604, + "publicKey": "", + "schainIndex": 4 + }, + { + "basePort": 1631, + "ip": "127.0.0.1", + "nodeID": 1605, + "publicKey": "", + "schainIndex": 5 + }, + { + "basePort": 1731, + "ip": "127.0.0.1", + "nodeID": 1606, + "publicKey": "", + "schainIndex": 6 + }, + { + "basePort": 1831, + "ip": "127.0.0.1", + "nodeID": 1607, + "publicKey": "", + "schainIndex": 7 + }, + { + "basePort": 1931, + "ip": "127.0.0.1", + "nodeID": 1608, + "publicKey": "", + "schainIndex": 8 + }, + { + "basePort": 2031, + "ip": "127.0.0.1", + "nodeID": 1609, + "publicKey": "", + "schainIndex": 9 + }, + { + "basePort": 2131, + "ip": "127.0.0.1", + "nodeID": 1610, + "publicKey": "", + "schainIndex": 10 + }, + { + "basePort": 2231, + "ip": "127.0.0.1", + "nodeID": 1611, + "publicKey": "", + "schainIndex": 11 + }, + { + "basePort": 2331, + "ip": "127.0.0.1", + "nodeID": 1612, + "publicKey": "", + "schainIndex": 12 + }, + { + "basePort": 2431, + "ip": "127.0.0.1", + "nodeID": 1613, + "publicKey": "", + "schainIndex": 13 + }, + { + "basePort": 2531, + "ip": "127.0.0.1", + "nodeID": 1614, + "publicKey": "", + "schainIndex": 14 + }, + { + "basePort": 2631, + "ip": "127.0.0.1", + "nodeID": 1615, + "publicKey": "", + "schainIndex": 15 + }, + { + "basePort": 2731, + "ip": "127.0.0.1", + "nodeID": 1616, + "publicKey": "", + "schainIndex": 16 + } + ], + "powCheckPatchTimestamp": 1, + "precompiledConfigPatchTimestamp": 1, + "pushZeroPatchTimestamp": 1, + "revertableFSPatchTimestamp": 1, + "schainID": 5, + "schainName": "TestChain", + "schainOwner": "0x907cd0881E50d359bb9Fd120B1A5A143b1C97De6", + "skipInvalidTransactionsPatchTimestamp": 1, + "storageDestructionPatchTimestamp": 1, + "verifyBlsSyncPatchTimestamp": 1, + "verifyDaSigsPatchTimestamp": 1 + } + }, + "unddos": { + "origins": [ + { + "ban_lengthy": 0, + "ban_peak": 0, + "max_calls_per_minute": 1000000000, + "max_calls_per_second": 1000000000, + "max_ws_conn": 65535, + "origin": [ + "*" + ] + } + ] + } +} \ No newline at end of file diff --git a/test/historicstate/configs/test_16_of_16.json b/test/historicstate/configs/test_16_of_16.json new file mode 100644 index 000000000..23b600412 --- /dev/null +++ b/test/historicstate/configs/test_16_of_16.json @@ -0,0 +1,910 @@ +{ + "accounts": { + "0000000000000000000000000000000000000001": { + "precompiled": { + "linear": { + "base": 3000, + "word": 0 + }, + "name": "ecrecover" + } + }, + "0000000000000000000000000000000000000002": { + "precompiled": { + "linear": { + "base": 60, + "word": 12 + }, + "name": "sha256" + } + }, + "0000000000000000000000000000000000000003": { + "precompiled": { + "linear": { + "base": 600, + "word": 120 + }, + "name": "ripemd160" + } + }, + "0000000000000000000000000000000000000004": { + "precompiled": { + "linear": { + "base": 15, + "word": 3 + }, + "name": "identity" + } + }, + "0000000000000000000000000000000000000005": { + "precompiled": { + "name": "modexp", + "startingBlock": "0x2dc6c0" + } + }, + "0000000000000000000000000000000000000006": { + "precompiled": { + "linear": { + "base": 500, + "word": 0 + }, + "name": "alt_bn128_G1_add", + "startingBlock": "0x2dc6c0" + } + }, + "0000000000000000000000000000000000000007": { + "precompiled": { + "linear": { + "base": 40000, + "word": 0 + }, + "name": "alt_bn128_G1_mul", + "startingBlock": "0x2dc6c0" + } + }, + "0000000000000000000000000000000000000008": { + "precompiled": { + "name": "alt_bn128_pairing_product", + "startingBlock": "0x2dc6c0" + } + }, + "000000000000000000000000000000000000000A": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "readChunk", + "startingBlock": "0x0" + } + }, + "000000000000000000000000000000000000000B": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "createFile", + "restrictAccess": [ + "69362535ec535F0643cBf62D16aDeDCAf32Ee6F7" + ], + "startingBlock": "0x0" + } + }, + "000000000000000000000000000000000000000C": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "uploadChunk", + "startingBlock": "0x0" + } + }, + "000000000000000000000000000000000000000D": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "getFileSize", + "startingBlock": "0x0" + } + }, + "000000000000000000000000000000000000000E": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "deleteFile", + "startingBlock": "0x0" + } + }, + "000000000000000000000000000000000000000F": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "createDirectory", + "startingBlock": "0x0" + } + }, + "0000000000000000000000000000000000000010": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "deleteDirectory", + "startingBlock": "0x0" + } + }, + "0x006d8e49ce0b9eb5646e34a4d91934801b9044fd": { + "balance": "1000000000000000000000000000000" + }, + "0x0150b461b06922a5030784ba888962c28bb1f188": { + "balance": "1000000000000000000000000000000" + }, + "0x03309956988ae70152ae4469daf99b0cac2306c5": { + "balance": "1000000000000000000000000000000" + }, + "0x06104a85a380895b6dd4030113806df2b044905e": { + "balance": "1000000000000000000000000000000" + }, + "0x079cf317ef40b16141784b6fabff812d64f7c0fd": { + "balance": "1000000000000000000000000000000" + }, + "0x0966454f51166c68b73b2865473c8fb2fcdefdd5": { + "balance": "1000000000000000000000000000000" + }, + "0x099452fedc71897880f584b1bc1706efc4e76e36": { + "balance": "1000000000000000000000000000000" + }, + "0x0aa6a44690ef52354e976990292cf9c5cd36ad59": { + "balance": "1000000000000000000000000000000" + }, + "0x0fbbe17a0e5a61ee3e8661f442d7f6b177c49820": { + "balance": "1000000000000000000000000000000" + }, + "0x1239fe658b410dbbac5bbd572035f5041542f9e5": { + "balance": "1000000000000000000000000000000" + }, + "0x12d5d7340a93be7be28ea7a3ae198242f8e1282c": { + "balance": "1000000000000000000000000000000" + }, + "0x137048b9fa4f1234d6519271b2c5ec64f480db0f": { + "balance": "1000000000000000000000000000000" + }, + "0x13867af77a63048e17380e39248ada90521e97e4": { + "balance": "1000000000000000000000000000000" + }, + "0x138ea4bdf0382c2deffd5b0bff0afe59f471467f": { + "balance": "1000000000000000000000000000000" + }, + "0x13d19c55ee0a212249d26b9d741ff6d7f416db01": { + "balance": "1000000000000000000000000000000" + }, + "0x157d38b52196b248e9fe6a2172e32ce2b8c078e6": { + "balance": "1000000000000000000000000000000" + }, + "0x16e8c390f8e576161cfe966f2c3e5dd303eb9039": { + "balance": "1000000000000000000000000000000" + }, + "0x194cb9991d3d94c43e400becf21dfea45e7b3b4c": { + "balance": "1000000000000000000000000000000" + }, + "0x1C9abe4ff0CcECa40fc404c74AB7d4923fEF8901": { + "balance": "100000000000000000000000" + }, + "0x1a66fc89809112c20aa76a993db712fa9e003e4e": { + "balance": "1000000000000000000000000000000" + }, + "0x1f1d6041e12a18cf1202019f146f2fc150915e8d": { + "balance": "1000000000000000000000000000000" + }, + "0x1feaf1671c1f0faf0d44c152f72dc755db932569": { + "balance": "1000000000000000000000000000000" + }, + "0x236bf02dfafaf03851a4e6f5d69052f4884cec32": { + "balance": "1000000000000000000000000000000" + }, + "0x26d88f6a8b659be4165ee53774a057e41b5201c9": { + "balance": "1000000000000000000000000000000" + }, + "0x28353685b0b986a724b92113debb3d8cd9a6b263": { + "balance": "1000000000000000000000000000000" + }, + "0x29d83322219fdfb821459d5fdf796360faf3166a": { + "balance": "1000000000000000000000000000000" + }, + "0x2bee474be207bdbeac83d6672da5ed2fd417eac9": { + "balance": "1000000000000000000000000000000" + }, + "0x2d93455b07bccf38e8d019f7f43a2c2d70b46b4e": { + "balance": "1000000000000000000000000000000" + }, + "0x2f971bd38806c3ca45ae0a125d1267118bf5619c": { + "balance": "1000000000000000000000000000000" + }, + "0x30aaab366dfac8331f3e827495c789cde9b437c0": { + "balance": "1000000000000000000000000000000" + }, + "0x32ea0400dc2d20664cc4744b2fab04ecb709445c": { + "balance": "1000000000000000000000000000000" + }, + "0x3760dc9594ccac0f33ade5cc5371402131696341": { + "balance": "1000000000000000000000000000000" + }, + "0x38855e430611bc179cd777a8704679ffc43921de": { + "balance": "1000000000000000000000000000000" + }, + "0x3a921471a2397644c37c88ef9572c421ab37145d": { + "balance": "1000000000000000000000000000000" + }, + "0x3bcca8a8471d55a1a668bc163c0336e4a57e5c99": { + "balance": "1000000000000000000000000000000" + }, + "0x3d46ee560227c1d73cd6042b47fc8fddd8a06ecb": { + "balance": "1000000000000000000000000000000" + }, + "0x3f5bdf5d4c274c82b8d17aa2810b00d2cf050f24": { + "balance": "1000000000000000000000000000000" + }, + "0x3ffe1c9183e0f97f52a816405a7d2350624ec88b": { + "balance": "1000000000000000000000000000000" + }, + "0x426ec5f07847674aada3856609d8baaa16805d88": { + "balance": "1000000000000000000000000000000" + }, + "0x482d7f53cba6ae73a354533673c48e2dfd560949": { + "balance": "1000000000000000000000000000000" + }, + "0x48acbd6a2724eadcc2a11144ab84b6a617d1a241": { + "balance": "1000000000000000000000000000000" + }, + "0x49ef89840e400026eb5c8d79bd1b0adc152fe86d": { + "balance": "1000000000000000000000000000000" + }, + "0x4bf989fa6572af36b190032505506f1db888357f": { + "balance": "1000000000000000000000000000000" + }, + "0x4cf9b195f7cb5f86694d9b399fe21a5f34616fd3": { + "balance": "1000000000000000000000000000000" + }, + "0x4e9b85904bca60aeb5b916ca86ac622096908427": { + "balance": "1000000000000000000000000000000" + }, + "0x50120c17d7b59200e9b76e89e4e3de2f0cd00090": { + "balance": "1000000000000000000000000000000" + }, + "0x54db355342c35085a1a53184162b2fddd0a43b0f": { + "balance": "1000000000000000000000000000000" + }, + "0x54e228d8fea148cfe2b109b3b152ff21321d09a2": { + "balance": "1000000000000000000000000000000" + }, + "0x5667601b7dcde6f24d06bccc4f291cb06976f4ee": { + "balance": "1000000000000000000000000000000" + }, + "0x57829f2ecca390cd9d1c41f92328bad4d1073bbb": { + "balance": "1000000000000000000000000000000" + }, + "0x5EF25557E2ed6AFfF321B266C93e95A0B4B05AbC": { + "balance": "1000000000000000000000000" + }, + "0x5a3adad4382b3eb1e0c65f2de2845901081039b5": { + "balance": "1000000000000000000000000000000" + }, + "0x5cdb7392efdce502ccc6fba5c3c1dd1653967b4d": { + "balance": "1000000000000000000000000000000" + }, + "0x5d012c13b2854bda8b7b6580e97e52751884f827": { + "balance": "1000000000000000000000000000000" + }, + "0x5d9326c6504833d84f8a0d65ded59b1a6e768ca2": { + "balance": "1000000000000000000000000000000" + }, + "0x60268f799d8f1808e4a32c2eb898e73a8881f6f0": { + "balance": "1000000000000000000000000000000" + }, + "0x605ba4a05d779f9869bd9a10234c22f516766cfe": { + "balance": "1000000000000000000000000000000" + }, + "0x6093f0f2a7b5148b71603ac439adbc4c0e5aa5da": { + "balance": "1000000000000000000000000000000" + }, + "0x6196d135CdDb9d73A0756C1E44b5b02B11acf594": { + "balance": "2000000000000000000000", + "code": "", + "nonce": "5076", + "storage": {} + }, + "0x62712ceccb50f62ca4c5402fff6da9c819c866cf": { + "balance": "1000000000000000000000000000000" + }, + "0x62971de462ea1ec0d3b43a6a85b6fb975e6c6f64": { + "balance": "1000000000000000000000000000000" + }, + "0x62cf32dfb9eb6358dc5deb006aef1d75fb153e5f": { + "balance": "1000000000000000000000000000000" + }, + "0x62d8b22c1d71577829b2fee20a5c3fff43aed0ec": { + "balance": "100000000000000000000000" + }, + "0x6314956b78bb2eaed1c49b3ae71d4d0ec501cfab": { + "balance": "1000000000000000000000000000000" + }, + "0x661bda4daeba3ce9ac2aa30b80d463580f90d31a": { + "balance": "1000000000000000000000000000000" + }, + "0x66c5a87f4a49DD75e970055A265E8dd5C3F8f852": { + "balance": "1000000000000000000000" + }, + "0x66cd465ddcd85504c0d2cfb1728acee994d55a3f": { + "balance": "1000000000000000000000000000000" + }, + "0x68bca79ae7aae796027ff843d2303444da5cf5d8": { + "balance": "1000000000000000000000000000000" + }, + "0x6923877b65e24966efa9efd1207822fa2eaf601a": { + "balance": "1000000000000000000000000000000" + }, + "0x69362535ec535F0643cBf62D16aDeDCAf32Ee6F7": { + "balance": "0", + "code": "0x608060405234801561001057600080fd5b50600436106100b45760003560e01c806379210e8e1161007157806379210e8e1461017757806381a8235a146101a757806385aeeb17146101c35780639a9a5593146101f3578063a99100541461020f578063b57321221461022b576100b4565b806307c6e7d3146100b9578063122f4fba146100d55780631c6ec7a9146101055780631cfe4e3b14610121578063373dedb41461013d57806361e46db51461015b575b600080fd5b6100d360048036036100ce9190810190613cff565b61025b565b005b6100ef60048036036100ea9190810190613cff565b610804565b6040516100fc9190614963565b60405180910390f35b61011f600480360361011a9190810190613cff565b610b43565b005b61013b60048036036101369190810190613cc3565b610f72565b005b610145611190565b6040516101529190614cbe565b60405180910390f35b61017560048036036101709190810190613d94565b611199565b005b610191600480360361018c9190810190613e13565b6113f9565b60405161019e9190614924565b60405180910390f35b6101c160048036036101bc9190810190613cff565b6116f9565b005b6101dd60048036036101d89190810190613cff565b61189e565b6040516101ea9190614941565b60405180910390f35b61020d60048036036102089190810190613d40565b611b9d565b005b61022960048036036102249190810190613cff565b61202c565b005b61024560048036036102409190810190613cff565b612682565b6040516102529190614cbe565b60405180910390f35b6000339050606061026b83612902565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b825181101561037c576000826001018460018403815181106102d557fe5b60200260200101516040516102ea91906148cc565b90815260200160405180910390205411610339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161033090614ade565b60405180910390fd5b8160020183600183038151811061034c57fe5b602002602001015160405161036191906148cc565b908152602001604051809103902091508060010190506102b7565b506060600183511161038e57846103a7565b8260018451038151811061039e57fe5b60200260200101515b9050600082600101826040516103bd91906148e3565b9081526020016040518091039020541161040c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161040390614ade565b60405180910390fd5b6000826002018260405161042091906148e3565b90815260200160405180910390206000018054905014610475576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161046c90614b5e565b60405180910390fd5b60006104818587612b02565b9050806104c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ba90614a7e565b60405180910390fd5b6104cb613888565b836000016001856000018054905003815481106104e457fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156105965780601f1061056b57610100808354040283529160200191610596565b820191906000526020600020905b81548152906001019060200180831161057957829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff1660028111156105e257fe5b60028111156105ed57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561066557602002820191906000526020600020906000905b82829054906101000a900460ff1615158152602001906001019060208260000104928301926001038202915080841161062f5790505b505050505081525050905080846000016001866001018660405161068991906148e3565b90815260200160405180910390205403815481106106a357fe5b906000526020600020906005020160008201518160000190805190602001906106cd9291906138c4565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561071c57fe5b0217905550608082015181600401908051906020019061073d929190613944565b50905050836001018360405161075391906148e3565b90815260200160405180910390205484600101826000015160405161077891906148cc565b9081526020016040518091039020819055506000846001018460405161079e91906148e3565b908152602001604051809103902081905550836000018054809190600190036107c791906139ea565b5083600201836040516107da91906148e3565b9081526020016040518091039020600080820160006107f99190613a1c565b505050505050505050565b600080606061081284612b66565b91509150606061082182612902565b90506000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b82518110156109065760008260010184600184038151811061088b57fe5b60200260200101516040516108a091906148cc565b90815260200160405180910390205414156108c357600095505050505050610b3e565b816002018360018303815181106108d657fe5b60200260200101516040516108eb91906148cc565b9081526020016040518091039020915080600101905061086d565b50606060018351116109185783610931565b8260018451038151811061092857fe5b60200260200101515b90506000826001018260405161094791906148e3565b908152602001604051809103902054141561096a57600095505050505050610b3e565b610972613888565b826000016001846001018460405161098a91906148e3565b90815260200160405180910390205403815481106109a457fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610a565780601f10610a2b57610100808354040283529160200191610a56565b820191906000526020600020905b815481529060010190602001808311610a3957829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115610aa257fe5b6002811115610aad57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015610b2557602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411610aef5790505b5050505050815250509050806060015196505050505050505b919050565b600160009054906101000a900460ff16610b85576120006002819055506210000060038190555060018060006101000a81548160ff0219169083151502179055505b6000815111610bc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc090614ade565b60405180910390fd5b60003390506060610bd983612902565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015610cea57600082600101846001840381518110610c4357fe5b6020026020010151604051610c5891906148cc565b90815260200160405180910390205411610ca7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9e90614ade565b60405180910390fd5b81600201836001830381518110610cba57fe5b6020026020010151604051610ccf91906148cc565b90815260200160405180910390209150806001019050610c25565b50600254816000018054905010610d36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2d90614bfe565b60405180910390fd5b60606001835111610d475784610d60565b82600184510381518110610d5757fe5b60200260200101515b905060008260010182604051610d7691906148e3565b90815260200160405180910390205414610dc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbc90614c3e565b60405180910390fd5b610dce81612ee8565b610e0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0490614afe565b60405180910390fd5b6000610e198587612fc9565b905080610e5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e529061499e565b60405180910390fd5b610e63613888565b82816000018190525060008160200190151590811515815250508360000181908060018154018082558091505090600182039060005260206000209060050201600090919290919091506000820151816000019080519060200190610ec99291906138c4565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff02191690836002811115610f1857fe5b02179055506080820151816004019080519060200190610f39929190613944565b5050505083600001805490508460010184604051610f5791906148e3565b90815260200160405180910390208190555050505050505050565b610f7a61302d565b73ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161480610fdf57503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614155b61101e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101590614a5e565b60405180910390fd5b80600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411156110a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109790614b3e565b60405180910390fd5b600054600754820111156110e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e0906149be565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460076000828254039250508190555080600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550806007600082825401925050819055505050565b60008054905090565b600033905060006111aa82866130c6565b9050600160028111156111b957fe5b8160030160009054906101000a900460ff1660028111156111d657fe5b14611216576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120d90614c1e565b60405180910390fd5b6000600354858161122357fe5b061480156112345750806002015484105b611273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126a9061497e565b60405180910390fd5b600354848260020154031080156112905750838160020154038351145b8061129d57506003548351145b6112dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d390614a1e565b60405180910390fd5b600015158160040160035486816112ef57fe5b04815481106112fa57fe5b90600052602060002090602091828204019190069054906101000a900460ff1615151461135c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611353906149fe565b60405180910390fd5b600061136a838787876132c5565b9050806113ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a390614b1e565b60405180910390fd5b60018260040160035487816113bd57fe5b04815481106113c857fe5b90600052602060002090602091828204019190066101000a81548160ff021916908315150217905550505050505050565b611401613a40565b6000606061140e86612b66565b9150915061141a613888565b61142483836130c6565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156114c85780601f1061149d576101008083540402835291602001916114c8565b820191906000526020600020905b8154815290600101906020018083116114ab57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561151457fe5b600281111561151f57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561159757602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116115615790505b50505050508152505090506002808111156115ae57fe5b816060015160028111156115be57fe5b146115fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f590614c9e565b60405180910390fd5b60035485111580156116105750600085115b61164f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164690614a1e565b60405180910390fd5b80604001518587011115611698576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168f9061497e565b60405180910390fd5b60006116a684848989613376565b8096508192505050806116ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e590614b9e565b60405180910390fd5b505050509392505050565b6000339050600061170a82846130c6565b90506001600281111561171957fe5b8160030160009054906101000a900460ff16600281111561173657fe5b14611776576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176d90614c1e565b60405180910390fd5b60006001905060008260040180549050905060008090505b818110156117e157600015158460040182815481106117a957fe5b90600052602060002090602091828204019190069054906101000a900460ff16151514156117d657600092505b80600101905061178e565b5081611822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181990614b7e565b60405180910390fd5b60028360030160006101000a81548160ff0219169083600281111561184357fe5b021790555060006118548587613409565b905080611896576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188d906149de565b60405180910390fd5b505050505050565b6060600060606118ad84612b66565b9150915060606118bc82612902565b90506000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008090505b82518110156119c65760008260010184838151811061192257fe5b602002602001015160405161193791906148cc565b90815260200160405180910390205411611986576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197d90614ade565b60405180910390fd5b8160020183828151811061199657fe5b60200260200101516040516119ab91906148cc565b90815260200160405180910390209150806001019050611907565b5080600001805480602002602001604051908101604052809291908181526020016000905b82821015611b8e57838290600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611aa75780601f10611a7c57610100808354040283529160200191611aa7565b820191906000526020600020905b815481529060010190602001808311611a8a57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115611af357fe5b6002811115611afe57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015611b7657602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411611b405790505b505050505081525050815260200190600101906119eb565b50505050945050505050919050565b600160009054906101000a900460ff16611bdf576120006002819055506210000060038190555060018060006101000a81548160ff0219169083151502179055505b60003390506305f5e100821115611c2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2290614bde565b60405180910390fd5b6060611c3684612902565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015611d4757600082600101846001840381518110611ca057fe5b6020026020010151604051611cb591906148cc565b90815260200160405180910390205411611d04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cfb90614ade565b60405180910390fd5b81600201836001830381518110611d1757fe5b6020026020010151604051611d2c91906148cc565b90815260200160405180910390209150806001019050611c82565b5060606001835111611d595785611d72565b82600184510381518110611d6957fe5b60200260200101515b905060008260010182604051611d8891906148e3565b90815260200160405180910390205414611dd7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dce90614c3e565b60405180910390fd5b611de081612ee8565b611e1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1690614bbe565b60405180910390fd5b6000611e2c85888861346d565b905080611e6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6590614c7e565b60405180910390fd5b6060600354600160035489010381611e8257fe5b04604051908082528060200260200182016040528015611eb15781602001602082028038833980820191505090505b509050836000016040518060a0016040528085815260200160011515815260200189815260200160016002811115611ee557fe5b815260200183815250908060018154018082558091505090600182039060005260206000209060050201600090919290919091506000820151816000019080519060200190611f359291906138c4565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff02191690836002811115611f8457fe5b02179055506080820151816004019080519060200190611fa5929190613944565b5050505083600001805490508460010184604051611fc391906148e3565b90815260200160405180910390208190555086600560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505050505050505050565b6000339050612039613888565b61204382846130c6565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156120e75780601f106120bc576101008083540402835291602001916120e7565b820191906000526020600020905b8154815290600101906020018083116120ca57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561213357fe5b600281111561213e57fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156121b657602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116121805790505b5050505050815250509050600060028111156121ce57fe5b816060015160028111156121de57fe5b141561221f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221690614a3e565b60405180910390fd5b600061222b83856134da565b90508061226d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226490614a9e565b60405180910390fd5b606061227885612902565b90506000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b825181101561231057816002018360018303815181106122e057fe5b60200260200101516040516122f591906148cc565b908152602001604051809103902091508060010190506122c4565b506000600182600101866000015160405161232b91906148cc565b908152602001604051809103902054039050612345613888565b8260000160018460000180549050038154811061235e57fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156124105780601f106123e557610100808354040283529160200191612410565b820191906000526020600020905b8154815290600101906020018083116123f357829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561245c57fe5b600281111561246757fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156124df57602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116124a95790505b5050505050815250509050808360000183815481106124fa57fe5b906000526020600020906005020160008201518160000190805190602001906125249291906138c4565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561257357fe5b02179055506080820151816004019080519060200190612594929190613944565b50905050826000018054809190600190036125af91906139ea565b508260010186600001516040516125c691906148cc565b9081526020016040518091039020548360010182600001516040516125eb91906148cc565b908152602001604051809103902081905550600083600101876000015160405161261591906148cc565b9081526020016040518091039020819055508560400151600560008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505050505050505050565b600080606061269084612b66565b9150915061269c613888565b6126a683836130c6565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561274a5780601f1061271f5761010080835404028352916020019161274a565b820191906000526020600020905b81548152906001019060200180831161272d57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561279657fe5b60028111156127a157fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561281957602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116127e35790505b50505050508152505090506001600281111561283157fe5b8160600151600281111561284157fe5b1480612866575060028081111561285457fe5b8160600151600281111561286457fe5b145b6128a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161289c90614c1e565b60405180910390fd5b60006128b1848461353e565b8096508192505050806128f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128f090614c5e565b60405180910390fd5b50505050919050565b606061290c613a65565b612915836135a7565b905061291f613a65565b61295d6040518060400160405280600181526020017f2f000000000000000000000000000000000000000000000000000000000000008152506135a7565b90506060600161297683856135d590919063ffffffff16565b016040519080825280602002602001820160405280156129aa57816020015b60608152602001906001900390816129955790505b50905060008090505b81518110156129fb576129d76129d2848661364a90919063ffffffff16565b613664565b8282815181106129e357fe5b602002602001018190525080806001019150506129b3565b50600081600183510381518110612a0e57fe5b6020026020010151511415612a795780600182510381518110612a2d57fe5b6020026020010160608152506001815103604051908082528060200260200182016040528015612a7157816020015b6060815260200190600190039081612a5c5790505b509350612ab2565b8051604051908082528060200260200182016040528015612aae57816020015b6060815260200190600190039081612a995790505b5093505b60008090505b8451811015612af957818181518110612acd57fe5b6020026020010151858281518110612ae157fe5b60200260200101819052508080600101915050612ab8565b50505050919050565b60008060016020601f85510181612b1557fe5b040190506040518481526020810160005b83811015612b47578060200286015181602002830152806001019050612b26565b50602082602085026040018460006010600019f1935050505092915050565b6000606060006028905080845111612bb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612baa90614abe565b60405180910390fd5b6060816040519080825280601f01601f191660200182016040528015612be85781602001600182028038833980820191505090505b50905060008090505b82811015612c5857858181518110612c0557fe5b602001015160f81c60f81b828281518110612c1c57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050612bf1565b50600080905060008090505b83811015612d87576000838281518110612c7a57fe5b602001015160f81c60f81b60f81c60ff16905060308110158015612c9f575060398111155b80612cb8575060418110158015612cb75750605a8111155b5b80612cd1575060618110158015612cd0575060668111155b5b612d10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d0790614abe565b60405180910390fd5b60308110158015612d22575060398111155b15612d335760308103601084020192505b60418110158015612d455750605a8111155b15612d565760378103601084020192505b60618110158015612d68575060668111155b15612d795760578103601084020192505b508080600101915050612c64565b508094507f2f00000000000000000000000000000000000000000000000000000000000000868481518110612db857fe5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612e25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e1c90614abe565b60405180910390fd5b6000600184885103039050806040519080825280601f01601f191660200182016040528015612e635781602001600182028038833980820191505090505b50945060008090505b81811015612ede5760008860018784010181518110612e8757fe5b602001015160f81c60f81b905080878381518110612ea157fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350508080600101915050612e6c565b5050505050915091565b6000604051602001612ef99061490f565b6040516020818303038152906040528051906020012082604051602001612f2091906148e3565b604051602081830303815290604052805190602001201480612f8b5750604051602001612f4c906148fa565b6040516020818303038152906040528051906020012082604051602001612f7391906148e3565b60405160208183030381529060405280519060200120145b80612f97575060008251145b15612fa55760009050612fc4565b60008251905060ff811115612fbe576000915050612fc4565b60019150505b919050565b60008060016020601f85510181612fdc57fe5b040190506040518481526020810160005b8381101561300e578060200286015181602002830152806001019050612fed565b5060208260208502604001846000600f600019f1935050505092915050565b600073d2001000000000000000000000000000000000d273ffffffffffffffffffffffffffffffffffffffff166383e781fe6040518163ffffffff1660e01b815260040160206040518083038186803b15801561308957600080fd5b505afa15801561309d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506130c19190810190613c9a565b905090565b600060606130d383612902565b90506000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b82518110156131e45760008260010184600184038151811061313d57fe5b602002602001015160405161315291906148cc565b908152602001604051809103902054116131a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161319890614ade565b60405180910390fd5b816002018360018303815181106131b457fe5b60200260200101516040516131c991906148cc565b9081526020016040518091039020915080600101905061311f565b50606060018351116131f6578461320f565b8260018451038151811061320657fe5b60200260200101515b90506000826001018260405161322591906148e3565b90815260200160405180910390205411613274576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161326b90614ade565b60405180910390fd5b6000826000016001846001018460405161328e91906148e3565b90815260200160405180910390205403815481106132a857fe5b906000526020600020906005020190508094505050505092915050565b60008060016020601f855101816132d857fe5b04019050600060016020601f885101816132ee57fe5b040190506040518781526020810160005b838110156133205780602002890151816020028301528060010190506132ff565b50868360200282015260005b84811015613352578060200287015181856001010160200283015280600101905061332c565b50602082848601602002606001846000600c600019f1945050505050949350505050565b6000613380613a40565b600060016020601f8851018161339257fe5b0401905060006020601f8601816133a557fe5b0490506040518881526020810160005b848110156133d657806020028a0151816020028301528060010190506133b5565b5083602002810188815287816020015283602002868660030160200285600a600019fa9650505050505094509492505050565b60008060016020601f8551018161341c57fe5b040190506040518481526020810160005b8381101561344e57806020028601518160200283015280600101905061342d565b50602082602085026040018460006011600019f1935050505092915050565b60008060016020601f8651018161348057fe5b040190506040518581526020810160005b838110156134b2578060200287015181602002830152806001019050613491565b50846020840282015260208260208502604001846000600b600019f193505050509392505050565b60008060016020601f855101816134ed57fe5b040190506040518481526020810160005b8381101561351f5780602002860151816020028301528060010190506134fe565b5060208260208502604001846000600e600019f1935050505092915050565b600080600060016020601f8651018161355357fe5b040190506040518581526020810160005b83811015613585578060200287015181602002830152806001019050613564565b506020826020850260200184600d600019fa9450815193505050509250929050565b6135af613a65565b600060208301905060405180604001604052808451815260200182815250915050919050565b60008082600001516135f985600001518660200151866000015187602001516136c6565b0190505b83600001518460200151018111613643578180600101925050826000015161363b8560200151830386600001510383866000015187602001516136c6565b0190506135fd565b5092915050565b613652613a65565b61365d8383836137a1565b5092915050565b60608082600001516040519080825280601f01601f19166020018201604052801561369e5781602001600182028038833980820191505090505b50905060006020820190506136bc818560200151866000015161383f565b8192505050919050565b6000808490506000868511613791576020851161374b57600060018660200360080260020a031960001b905060008186511690506000878a8a0103905060008386511690505b82811461373d5781861061372a578a8a019650505050505050613799565b858060010196505083865116905061370c565b859650505050505050613799565b60008585209050600091505b858803821161378f57600086842090508082141561377b5783945050505050613799565b600184019350508180600101925050613757565b505b868601925050505b949350505050565b6137a9613a65565b60006137c785600001518660200151866000015187602001516136c6565b90508460200151836020018181525050846020015181038360000181815250508460000151856020015101811415613809576000856000018181525050613834565b8360000151836000015101856000018181510391508181525050836000015181018560200181815250505b829150509392505050565b5b602081106138635781518352602083019250602082019150602081039050613840565b60006001826020036101000a0390508019835116818551168181178652505050505050565b6040518060a001604052806060815260200160001515815260200160008152602001600060028111156138b757fe5b8152602001606081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061390557805160ff1916838001178555613933565b82800160010185558215613933579182015b82811115613932578251825591602001919060010190613917565b5b5090506139409190613a7f565b5090565b82805482825590600052602060002090601f016020900481019282156139d95791602002820160005b838211156139aa57835183826101000a81548160ff021916908315150217905550926020019260010160208160000104928301926001030261396d565b80156139d75782816101000a81549060ff02191690556001016020816000010492830192600103026139aa565b505b5090506139e69190613aa4565b5090565b815481835581811115613a1757600502816005028360005260206000209182019101613a169190613ad4565b5b505050565b5080546000825560050290600052602060002090810190613a3d9190613ad4565b50565b6040518062100000016040528061800090602082028038833980820191505090505090565b604051806040016040528060008152602001600081525090565b613aa191905b80821115613a9d576000816000905550600101613a85565b5090565b90565b613ad191905b80821115613acd57600081816101000a81549060ff021916905550600101613aaa565b5090565b90565b613b4091905b80821115613b3c5760008082016000613af39190613b43565b6001820160006101000a81549060ff021916905560028201600090556003820160006101000a81549060ff0219169055600482016000613b339190613b8b565b50600501613ada565b5090565b90565b50805460018160011615610100020316600290046000825580601f10613b695750613b88565b601f016020900490600052602060002090810190613b879190613a7f565b5b50565b50805460008255601f016020900490600052602060002090810190613bb09190613a7f565b50565b600081359050613bc281614f18565b92915050565b600081519050613bd781614f18565b92915050565b600082601f830112613bee57600080fd5b8135613c01613bfc82614d06565b614cd9565b91508082526020830160208301858383011115613c1d57600080fd5b613c28838284614eb8565b50505092915050565b600082601f830112613c4257600080fd5b8135613c55613c5082614d32565b614cd9565b91508082526020830160208301858383011115613c7157600080fd5b613c7c838284614eb8565b50505092915050565b600081359050613c9481614f2f565b92915050565b600060208284031215613cac57600080fd5b6000613cba84828501613bc8565b91505092915050565b60008060408385031215613cd657600080fd5b6000613ce485828601613bb3565b9250506020613cf585828601613c85565b9150509250929050565b600060208284031215613d1157600080fd5b600082013567ffffffffffffffff811115613d2b57600080fd5b613d3784828501613c31565b91505092915050565b60008060408385031215613d5357600080fd5b600083013567ffffffffffffffff811115613d6d57600080fd5b613d7985828601613c31565b9250506020613d8a85828601613c85565b9150509250929050565b600080600060608486031215613da957600080fd5b600084013567ffffffffffffffff811115613dc357600080fd5b613dcf86828701613c31565b9350506020613de086828701613c85565b925050604084013567ffffffffffffffff811115613dfd57600080fd5b613e0986828701613bdd565b9150509250925092565b600080600060608486031215613e2857600080fd5b600084013567ffffffffffffffff811115613e4257600080fd5b613e4e86828701613c31565b9350506020613e5f86828701613c85565b9250506040613e7086828701613c85565b9150509250925092565b6000613e868383613fe8565b60208301905092915050565b6000613e9e8383613ff7565b60208301905092915050565b6000613eb68383614831565b905092915050565b6000613ec982614d88565b613ed38185614de7565b9350613ede83614d5e565b8060005b83811015613f0f578151613ef68882613e7a565b9750613f0183614dc0565b925050600181019050613ee2565b5085935050505092915050565b613f2581614d93565b613f2f8184614df8565b9250613f3a82614d6e565b8060005b83811015613f6b578151613f528782613e92565b9650613f5d83614dcd565b925050600181019050613f3e565b505050505050565b6000613f7e82614d9f565b613f888185614e03565b935083602082028501613f9a85614d78565b8060005b85811015613fd65784840389528151613fb78582613eaa565b9450613fc283614dda565b925060208a01995050600181019050613f9e565b50829750879550505050505092915050565b613ff181614e53565b82525050565b61400081614e5f565b82525050565b61400f81614ea6565b82525050565b61401e81614ea6565b82525050565b600061402f82614db5565b6140398185614e36565b9350614049818560208601614ec7565b80840191505092915050565b600061406082614daa565b61406a8185614e14565b935061407a818560208601614ec7565b61408381614efa565b840191505092915050565b600061409982614daa565b6140a38185614e36565b93506140b3818560208601614ec7565b80840191505092915050565b60006140cc601883614e25565b91507f496e636f7272656374206368756e6b20706f736974696f6e00000000000000006000830152602082019050919050565b600061410c601583614e25565b91507f4469726563746f7279206e6f74206372656174656400000000000000000000006000830152602082019050919050565b600061414c602483614e25565b91507f4e6f7420656e6f756768206d656d6f727920696e207468652046696c6573746f60008301527f72616765000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006141b2601b83614e25565b91507f48617368206861736e2774206265656e2063616c63756c6174656400000000006000830152602082019050919050565b60006141f2601983614e25565b91507f4368756e6b20697320616c72656164792075706c6f61646564000000000000006000830152602082019050919050565b6000614232601683614e25565b91507f496e636f7272656374206368756e6b206c656e677468000000000000000000006000830152602082019050919050565b6000614272600f83614e25565b91507f46696c65206e6f742065786973747300000000000000000000000000000000006000830152602082019050919050565b60006142b2600e83614e25565b91507f496e76616c69642073656e6465720000000000000000000000000000000000006000830152602082019050919050565b60006142f2601883614e25565b91507f4469726563746f7279206973206e6f742064656c6574656400000000000000006000830152602082019050919050565b6000614332601083614e25565b91507f46696c65206e6f742064656c65746564000000000000000000000000000000006000830152602082019050919050565b6000614372601383614e25565b91507f496e76616c69642073746f7261676550617468000000000000000000000000006000830152602082019050919050565b60006143b2600c83614e25565b91507f496e76616c6964207061746800000000000000000000000000000000000000006000830152602082019050919050565b60006143f2600183614e36565b91507f2e000000000000000000000000000000000000000000000000000000000000006000830152600182019050919050565b6000614432601683614e25565b91507f496e76616c6964206469726563746f7279206e616d65000000000000000000006000830152602082019050919050565b6000614472601583614e25565b91507f4368756e6b207761736e27742075706c6f6164656400000000000000000000006000830152602082019050919050565b60006144b2602683614e25565b91507f436f756c64206e6f742072657365727665206c657373207468616e207573656460008301527f20737061636500000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614518601683614e25565b91507f4469726563746f7279206973206e6f7420656d707479000000000000000000006000830152602082019050919050565b6000614558602383614e25565b91507f46696c65206861736e2774206265656e2075706c6f6164656420636f7272656360008301527f746c7900000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006145be601183614e25565b91507f4368756e6b207761736e277420726561640000000000000000000000000000006000830152602082019050919050565b60006145fe601883614e25565b91507f46696c656e616d652073686f756c64206265203c2032353600000000000000006000830152602082019050919050565b600061463e601f83614e25565b91507f46696c652073686f756c64206265206c657373207468616e20313030204d42006000830152602082019050919050565b600061467e600283614e36565b91507f2e2e0000000000000000000000000000000000000000000000000000000000006000830152600282019050919050565b60006146be601183614e25565b91507f4469726563746f72792069732066756c6c0000000000000000000000000000006000830152602082019050919050565b60006146fe600e83614e25565b91507f46696c65206e6f7420666f756e640000000000000000000000000000000000006000830152602082019050919050565b600061473e601883614e25565b91507f46696c65206f72206469726563746f72792065786973747300000000000000006000830152602082019050919050565b600061477e601883614e25565b91507f45564d206572726f7220696e2067657446696c6553697a6500000000000000006000830152602082019050919050565b60006147be601083614e25565b91507f46696c65206e6f742063726561746564000000000000000000000000000000006000830152602082019050919050565b60006147fe601983614e25565b91507f46696c65206861736e2774206265656e2075706c6f61646564000000000000006000830152602082019050919050565b600060a083016000830151848203600086015261484e8282614055565b91505060208301516148636020860182613fe8565b50604083015161487660408601826148ae565b5060608301516148896060860182614006565b50608083015184820360808601526148a18282613ebe565b9150508091505092915050565b6148b781614e9c565b82525050565b6148c681614e9c565b82525050565b60006148d8828461408e565b915081905092915050565b60006148ef8284614024565b915081905092915050565b6000614905826143e5565b9150819050919050565b600061491a82614671565b9150819050919050565b6000621000008201905061493b6000830184613f1c565b92915050565b6000602082019050818103600083015261495b8184613f73565b905092915050565b60006020820190506149786000830184614015565b92915050565b60006020820190508181036000830152614997816140bf565b9050919050565b600060208201905081810360008301526149b7816140ff565b9050919050565b600060208201905081810360008301526149d78161413f565b9050919050565b600060208201905081810360008301526149f7816141a5565b9050919050565b60006020820190508181036000830152614a17816141e5565b9050919050565b60006020820190508181036000830152614a3781614225565b9050919050565b60006020820190508181036000830152614a5781614265565b9050919050565b60006020820190508181036000830152614a77816142a5565b9050919050565b60006020820190508181036000830152614a97816142e5565b9050919050565b60006020820190508181036000830152614ab781614325565b9050919050565b60006020820190508181036000830152614ad781614365565b9050919050565b60006020820190508181036000830152614af7816143a5565b9050919050565b60006020820190508181036000830152614b1781614425565b9050919050565b60006020820190508181036000830152614b3781614465565b9050919050565b60006020820190508181036000830152614b57816144a5565b9050919050565b60006020820190508181036000830152614b778161450b565b9050919050565b60006020820190508181036000830152614b978161454b565b9050919050565b60006020820190508181036000830152614bb7816145b1565b9050919050565b60006020820190508181036000830152614bd7816145f1565b9050919050565b60006020820190508181036000830152614bf781614631565b9050919050565b60006020820190508181036000830152614c17816146b1565b9050919050565b60006020820190508181036000830152614c37816146f1565b9050919050565b60006020820190508181036000830152614c5781614731565b9050919050565b60006020820190508181036000830152614c7781614771565b9050919050565b60006020820190508181036000830152614c97816147b1565b9050919050565b60006020820190508181036000830152614cb7816147f1565b9050919050565b6000602082019050614cd360008301846148bd565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614cfc57600080fd5b8060405250919050565b600067ffffffffffffffff821115614d1d57600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614d4957600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050919050565b6000819050602082019050919050565b600081519050919050565b60006180009050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614e4c82614e7c565b9050919050565b60008115159050919050565b6000819050919050565b6000819050614e7782614f0b565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000614eb182614e69565b9050919050565b82818337600083830152505050565b60005b83811015614ee5578082015181840152602081019050614eca565b83811115614ef4576000848401525b50505050565b6000601f19601f8301169050919050565b60038110614f1557fe5b50565b614f2181614e41565b8114614f2c57600080fd5b50565b614f3881614e9c565b8114614f4357600080fd5b5056fea365627a7a723158202ae226b25ad72f9cff2d74c6dc7bcfb78530ab1d2438f48a8dab67499b37a8e56c6578706572696d656e74616cf564736f6c634300050d0040", + "nonce": "0", + "storage": { + "0x0": "2868903936" + } + }, + "0x69362535ec535F0643cBf62D16aDeDCAf32Ee6F8": { + "balance": "0", + "code": "0x608060405234801561001057600080fd5b50600436106100b45760003560e01c806379210e8e1161007157806379210e8e1461017757806381a8235a146101a757806385aeeb17146101c35780639a9a5593146101f3578063a99100541461020f578063b57321221461022b576100b4565b806307c6e7d3146100b9578063122f4fba146100d55780631c6ec7a9146101055780631cfe4e3b14610121578063373dedb41461013d57806361e46db51461015b575b600080fd5b6100d360048036036100ce9190810190613e0d565b61025b565b005b6100ef60048036036100ea9190810190613e0d565b610804565b6040516100fc9190614ab1565b60405180910390f35b61011f600480360361011a9190810190613e0d565b610b43565b005b61013b60048036036101369190810190613dd1565b610f72565b005b610145611190565b6040516101529190614e2c565b60405180910390f35b61017560048036036101709190810190613ea2565b611199565b005b610191600480360361018c9190810190613f21565b6113f9565b60405161019e9190614a72565b60405180910390f35b6101c160048036036101bc9190810190613e0d565b6116f9565b005b6101dd60048036036101d89190810190613e0d565b61189e565b6040516101ea9190614a8f565b60405180910390f35b61020d60048036036102089190810190613e4e565b611b9d565b005b61022960048036036102249190810190613e0d565b61213a565b005b61024560048036036102409190810190613e0d565b612790565b6040516102529190614e2c565b60405180910390f35b6000339050606061026b83612a10565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b825181101561037c576000826001018460018403815181106102d557fe5b60200260200101516040516102ea9190614a1a565b90815260200160405180910390205411610339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161033090614c2c565b60405180910390fd5b8160020183600183038151811061034c57fe5b60200260200101516040516103619190614a1a565b908152602001604051809103902091508060010190506102b7565b506060600183511161038e57846103a7565b8260018451038151811061039e57fe5b60200260200101515b9050600082600101826040516103bd9190614a31565b9081526020016040518091039020541161040c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161040390614c2c565b60405180910390fd5b600082600201826040516104209190614a31565b90815260200160405180910390206000018054905014610475576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161046c90614cac565b60405180910390fd5b60006104818587612c10565b9050806104c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ba90614bcc565b60405180910390fd5b6104cb613996565b836000016001856000018054905003815481106104e457fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156105965780601f1061056b57610100808354040283529160200191610596565b820191906000526020600020905b81548152906001019060200180831161057957829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff1660028111156105e257fe5b60028111156105ed57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561066557602002820191906000526020600020906000905b82829054906101000a900460ff1615158152602001906001019060208260000104928301926001038202915080841161062f5790505b50505050508152505090508084600001600186600101866040516106899190614a31565b90815260200160405180910390205403815481106106a357fe5b906000526020600020906005020160008201518160000190805190602001906106cd9291906139d2565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561071c57fe5b0217905550608082015181600401908051906020019061073d929190613a52565b5090505083600101836040516107539190614a31565b9081526020016040518091039020548460010182600001516040516107789190614a1a565b9081526020016040518091039020819055506000846001018460405161079e9190614a31565b908152602001604051809103902081905550836000018054809190600190036107c79190613af8565b5083600201836040516107da9190614a31565b9081526020016040518091039020600080820160006107f99190613b2a565b505050505050505050565b600080606061081284612c74565b91509150606061082182612a10565b90506000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b82518110156109065760008260010184600184038151811061088b57fe5b60200260200101516040516108a09190614a1a565b90815260200160405180910390205414156108c357600095505050505050610b3e565b816002018360018303815181106108d657fe5b60200260200101516040516108eb9190614a1a565b9081526020016040518091039020915080600101905061086d565b50606060018351116109185783610931565b8260018451038151811061092857fe5b60200260200101515b9050600082600101826040516109479190614a31565b908152602001604051809103902054141561096a57600095505050505050610b3e565b610972613996565b826000016001846001018460405161098a9190614a31565b90815260200160405180910390205403815481106109a457fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610a565780601f10610a2b57610100808354040283529160200191610a56565b820191906000526020600020905b815481529060010190602001808311610a3957829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115610aa257fe5b6002811115610aad57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015610b2557602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411610aef5790505b5050505050815250509050806060015196505050505050505b919050565b600160009054906101000a900460ff16610b85576120006002819055506210000060038190555060018060006101000a81548160ff0219169083151502179055505b6000815111610bc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc090614c2c565b60405180910390fd5b60003390506060610bd983612a10565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015610cea57600082600101846001840381518110610c4357fe5b6020026020010151604051610c589190614a1a565b90815260200160405180910390205411610ca7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9e90614c2c565b60405180910390fd5b81600201836001830381518110610cba57fe5b6020026020010151604051610ccf9190614a1a565b90815260200160405180910390209150806001019050610c25565b50600254816000018054905010610d36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2d90614d4c565b60405180910390fd5b60606001835111610d475784610d60565b82600184510381518110610d5757fe5b60200260200101515b905060008260010182604051610d769190614a31565b90815260200160405180910390205414610dc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbc90614d8c565b60405180910390fd5b610dce81612ff6565b610e0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0490614c4c565b60405180910390fd5b6000610e1985876130d7565b905080610e5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5290614aec565b60405180910390fd5b610e63613996565b82816000018190525060008160200190151590811515815250508360000181908060018154018082558091505090600182039060005260206000209060050201600090919290919091506000820151816000019080519060200190610ec99291906139d2565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff02191690836002811115610f1857fe5b02179055506080820151816004019080519060200190610f39929190613a52565b5050505083600001805490508460010184604051610f579190614a31565b90815260200160405180910390208190555050505050505050565b610f7a61313b565b73ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161480610fdf57503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614155b61101e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101590614bac565b60405180910390fd5b80600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411156110a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109790614c8c565b60405180910390fd5b600054600754820111156110e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e090614b0c565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460076000828254039250508190555080600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550806007600082825401925050819055505050565b60008054905090565b600033905060006111aa82866131d4565b9050600160028111156111b957fe5b8160030160009054906101000a900460ff1660028111156111d657fe5b14611216576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120d90614d6c565b60405180910390fd5b6000600354858161122357fe5b061480156112345750806002015484105b611273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126a90614acc565b60405180910390fd5b600354848260020154031080156112905750838160020154038351145b8061129d57506003548351145b6112dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d390614b6c565b60405180910390fd5b600015158160040160035486816112ef57fe5b04815481106112fa57fe5b90600052602060002090602091828204019190069054906101000a900460ff1615151461135c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135390614b4c565b60405180910390fd5b600061136a838787876133d3565b9050806113ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a390614c6c565b60405180910390fd5b60018260040160035487816113bd57fe5b04815481106113c857fe5b90600052602060002090602091828204019190066101000a81548160ff021916908315150217905550505050505050565b611401613b4e565b6000606061140e86612c74565b9150915061141a613996565b61142483836131d4565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156114c85780601f1061149d576101008083540402835291602001916114c8565b820191906000526020600020905b8154815290600101906020018083116114ab57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561151457fe5b600281111561151f57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561159757602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116115615790505b50505050508152505090506002808111156115ae57fe5b816060015160028111156115be57fe5b146115fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f590614e0c565b60405180910390fd5b60035485111580156116105750600085115b61164f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164690614b6c565b60405180910390fd5b80604001518587011115611698576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168f90614acc565b60405180910390fd5b60006116a684848989613484565b8096508192505050806116ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e590614cec565b60405180910390fd5b505050509392505050565b6000339050600061170a82846131d4565b90506001600281111561171957fe5b8160030160009054906101000a900460ff16600281111561173657fe5b14611776576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176d90614d6c565b60405180910390fd5b60006001905060008260040180549050905060008090505b818110156117e157600015158460040182815481106117a957fe5b90600052602060002090602091828204019190069054906101000a900460ff16151514156117d657600092505b80600101905061178e565b5081611822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181990614ccc565b60405180910390fd5b60028360030160006101000a81548160ff0219169083600281111561184357fe5b021790555060006118548587613517565b905080611896576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188d90614b2c565b60405180910390fd5b505050505050565b6060600060606118ad84612c74565b9150915060606118bc82612a10565b90506000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008090505b82518110156119c65760008260010184838151811061192257fe5b60200260200101516040516119379190614a1a565b90815260200160405180910390205411611986576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197d90614c2c565b60405180910390fd5b8160020183828151811061199657fe5b60200260200101516040516119ab9190614a1a565b90815260200160405180910390209150806001019050611907565b5080600001805480602002602001604051908101604052809291908181526020016000905b82821015611b8e57838290600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611aa75780601f10611a7c57610100808354040283529160200191611aa7565b820191906000526020600020905b815481529060010190602001808311611a8a57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115611af357fe5b6002811115611afe57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015611b7657602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411611b405790505b505050505081525050815260200190600101906119eb565b50505050945050505050919050565b600160009054906101000a900460ff16611bdf576120006002819055506210000060038190555060018060006101000a81548160ff0219169083151502179055505b60003390506305f5e100821115611c2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2290614d2c565b60405180910390fd5b600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205483011115611cee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce590614dac565b60405180910390fd5b6060611cf984612a10565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015611e0a57600082600101846001840381518110611d6357fe5b6020026020010151604051611d789190614a1a565b90815260200160405180910390205411611dc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dbe90614c2c565b60405180910390fd5b81600201836001830381518110611dda57fe5b6020026020010151604051611def9190614a1a565b90815260200160405180910390209150806001019050611d45565b50600254816000018054905010611e56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4d90614d4c565b60405180910390fd5b60606001835111611e675785611e80565b82600184510381518110611e7757fe5b60200260200101515b905060008260010182604051611e969190614a31565b90815260200160405180910390205414611ee5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611edc90614d8c565b60405180910390fd5b611eee81612ff6565b611f2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2490614d0c565b60405180910390fd5b6000611f3a85888861357b565b905080611f7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7390614dec565b60405180910390fd5b6060600354600160035489010381611f9057fe5b04604051908082528060200260200182016040528015611fbf5781602001602082028038833980820191505090505b509050836000016040518060a0016040528085815260200160011515815260200189815260200160016002811115611ff357fe5b8152602001838152509080600181540180825580915050906001820390600052602060002090600502016000909192909190915060008201518160000190805190602001906120439291906139d2565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561209257fe5b021790555060808201518160040190805190602001906120b3929190613a52565b50505050836000018054905084600101846040516120d19190614a31565b90815260200160405180910390208190555086600560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505050505050505050565b6000339050612147613996565b61215182846131d4565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156121f55780601f106121ca576101008083540402835291602001916121f5565b820191906000526020600020905b8154815290600101906020018083116121d857829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561224157fe5b600281111561224c57fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156122c457602002820191906000526020600020906000905b82829054906101000a900460ff1615158152602001906001019060208260000104928301926001038202915080841161228e5790505b5050505050815250509050600060028111156122dc57fe5b816060015160028111156122ec57fe5b141561232d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232490614b8c565b60405180910390fd5b600061233983856135e8565b90508061237b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161237290614bec565b60405180910390fd5b606061238685612a10565b90506000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b825181101561241e57816002018360018303815181106123ee57fe5b60200260200101516040516124039190614a1a565b908152602001604051809103902091508060010190506123d2565b50600060018260010186600001516040516124399190614a1a565b908152602001604051809103902054039050612453613996565b8260000160018460000180549050038154811061246c57fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561251e5780601f106124f35761010080835404028352916020019161251e565b820191906000526020600020905b81548152906001019060200180831161250157829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561256a57fe5b600281111561257557fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156125ed57602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116125b75790505b50505050508152505090508083600001838154811061260857fe5b906000526020600020906005020160008201518160000190805190602001906126329291906139d2565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561268157fe5b021790555060808201518160040190805190602001906126a2929190613a52565b50905050826000018054809190600190036126bd9190613af8565b508260010186600001516040516126d49190614a1a565b9081526020016040518091039020548360010182600001516040516126f99190614a1a565b90815260200160405180910390208190555060008360010187600001516040516127239190614a1a565b9081526020016040518091039020819055508560400151600560008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505050505050505050565b600080606061279e84612c74565b915091506127aa613996565b6127b483836131d4565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156128585780601f1061282d57610100808354040283529160200191612858565b820191906000526020600020905b81548152906001019060200180831161283b57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff1660028111156128a457fe5b60028111156128af57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561292757602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116128f15790505b50505050508152505090506001600281111561293f57fe5b8160600151600281111561294f57fe5b1480612974575060028081111561296257fe5b8160600151600281111561297257fe5b145b6129b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129aa90614d6c565b60405180910390fd5b60006129bf848461364c565b809650819250505080612a07576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129fe90614dcc565b60405180910390fd5b50505050919050565b6060612a1a613b73565b612a23836136b5565b9050612a2d613b73565b612a6b6040518060400160405280600181526020017f2f000000000000000000000000000000000000000000000000000000000000008152506136b5565b905060606001612a8483856136e390919063ffffffff16565b01604051908082528060200260200182016040528015612ab857816020015b6060815260200190600190039081612aa35790505b50905060008090505b8151811015612b0957612ae5612ae0848661375890919063ffffffff16565b613772565b828281518110612af157fe5b60200260200101819052508080600101915050612ac1565b50600081600183510381518110612b1c57fe5b6020026020010151511415612b875780600182510381518110612b3b57fe5b6020026020010160608152506001815103604051908082528060200260200182016040528015612b7f57816020015b6060815260200190600190039081612b6a5790505b509350612bc0565b8051604051908082528060200260200182016040528015612bbc57816020015b6060815260200190600190039081612ba75790505b5093505b60008090505b8451811015612c0757818181518110612bdb57fe5b6020026020010151858281518110612bef57fe5b60200260200101819052508080600101915050612bc6565b50505050919050565b60008060016020601f85510181612c2357fe5b040190506040518481526020810160005b83811015612c55578060200286015181602002830152806001019050612c34565b50602082602085026040018460006010600019f1935050505092915050565b6000606060006028905080845111612cc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cb890614c0c565b60405180910390fd5b6060816040519080825280601f01601f191660200182016040528015612cf65781602001600182028038833980820191505090505b50905060008090505b82811015612d6657858181518110612d1357fe5b602001015160f81c60f81b828281518110612d2a57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050612cff565b50600080905060008090505b83811015612e95576000838281518110612d8857fe5b602001015160f81c60f81b60f81c60ff16905060308110158015612dad575060398111155b80612dc6575060418110158015612dc55750605a8111155b5b80612ddf575060618110158015612dde575060668111155b5b612e1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e1590614c0c565b60405180910390fd5b60308110158015612e30575060398111155b15612e415760308103601084020192505b60418110158015612e535750605a8111155b15612e645760378103601084020192505b60618110158015612e76575060668111155b15612e875760578103601084020192505b508080600101915050612d72565b508094507f2f00000000000000000000000000000000000000000000000000000000000000868481518110612ec657fe5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612f33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f2a90614c0c565b60405180910390fd5b6000600184885103039050806040519080825280601f01601f191660200182016040528015612f715781602001600182028038833980820191505090505b50945060008090505b81811015612fec5760008860018784010181518110612f9557fe5b602001015160f81c60f81b905080878381518110612faf57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350508080600101915050612f7a565b5050505050915091565b600060405160200161300790614a5d565b604051602081830303815290604052805190602001208260405160200161302e9190614a31565b604051602081830303815290604052805190602001201480613099575060405160200161305a90614a48565b60405160208183030381529060405280519060200120826040516020016130819190614a31565b60405160208183030381529060405280519060200120145b806130a5575060008251145b156130b357600090506130d2565b60008251905060ff8111156130cc5760009150506130d2565b60019150505b919050565b60008060016020601f855101816130ea57fe5b040190506040518481526020810160005b8381101561311c5780602002860151816020028301528060010190506130fb565b5060208260208502604001846000600f600019f1935050505092915050565b600073d2001000000000000000000000000000000000d273ffffffffffffffffffffffffffffffffffffffff166383e781fe6040518163ffffffff1660e01b815260040160206040518083038186803b15801561319757600080fd5b505afa1580156131ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506131cf9190810190613da8565b905090565b600060606131e183612a10565b90506000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b82518110156132f25760008260010184600184038151811061324b57fe5b60200260200101516040516132609190614a1a565b908152602001604051809103902054116132af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132a690614c2c565b60405180910390fd5b816002018360018303815181106132c257fe5b60200260200101516040516132d79190614a1a565b9081526020016040518091039020915080600101905061322d565b5060606001835111613304578461331d565b8260018451038151811061331457fe5b60200260200101515b9050600082600101826040516133339190614a31565b90815260200160405180910390205411613382576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161337990614c2c565b60405180910390fd5b6000826000016001846001018460405161339c9190614a31565b90815260200160405180910390205403815481106133b657fe5b906000526020600020906005020190508094505050505092915050565b60008060016020601f855101816133e657fe5b04019050600060016020601f885101816133fc57fe5b040190506040518781526020810160005b8381101561342e57806020028901518160200283015280600101905061340d565b50868360200282015260005b84811015613460578060200287015181856001010160200283015280600101905061343a565b50602082848601602002606001846000600c600019f1945050505050949350505050565b600061348e613b4e565b600060016020601f885101816134a057fe5b0401905060006020601f8601816134b357fe5b0490506040518881526020810160005b848110156134e457806020028a0151816020028301528060010190506134c3565b5083602002810188815287816020015283602002868660030160200285600a600019fa9650505050505094509492505050565b60008060016020601f8551018161352a57fe5b040190506040518481526020810160005b8381101561355c57806020028601518160200283015280600101905061353b565b50602082602085026040018460006011600019f1935050505092915050565b60008060016020601f8651018161358e57fe5b040190506040518581526020810160005b838110156135c057806020028701518160200283015280600101905061359f565b50846020840282015260208260208502604001846000600b600019f193505050509392505050565b60008060016020601f855101816135fb57fe5b040190506040518481526020810160005b8381101561362d57806020028601518160200283015280600101905061360c565b5060208260208502604001846000600e600019f1935050505092915050565b600080600060016020601f8651018161366157fe5b040190506040518581526020810160005b83811015613693578060200287015181602002830152806001019050613672565b506020826020850260200184600d600019fa9450815193505050509250929050565b6136bd613b73565b600060208301905060405180604001604052808451815260200182815250915050919050565b600080826000015161370785600001518660200151866000015187602001516137d4565b0190505b8360000151846020015101811161375157818060010192505082600001516137498560200151830386600001510383866000015187602001516137d4565b01905061370b565b5092915050565b613760613b73565b61376b8383836138af565b5092915050565b60608082600001516040519080825280601f01601f1916602001820160405280156137ac5781602001600182028038833980820191505090505b50905060006020820190506137ca818560200151866000015161394d565b8192505050919050565b600080849050600086851161389f576020851161385957600060018660200360080260020a031960001b905060008186511690506000878a8a0103905060008386511690505b82811461384b57818610613838578a8a0196505050505050506138a7565b858060010196505083865116905061381a565b8596505050505050506138a7565b60008585209050600091505b858803821161389d57600086842090508082141561388957839450505050506138a7565b600184019350508180600101925050613865565b505b868601925050505b949350505050565b6138b7613b73565b60006138d585600001518660200151866000015187602001516137d4565b90508460200151836020018181525050846020015181038360000181815250508460000151856020015101811415613917576000856000018181525050613942565b8360000151836000015101856000018181510391508181525050836000015181018560200181815250505b829150509392505050565b5b60208110613971578151835260208301925060208201915060208103905061394e565b60006001826020036101000a0390508019835116818551168181178652505050505050565b6040518060a001604052806060815260200160001515815260200160008152602001600060028111156139c557fe5b8152602001606081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613a1357805160ff1916838001178555613a41565b82800160010185558215613a41579182015b82811115613a40578251825591602001919060010190613a25565b5b509050613a4e9190613b8d565b5090565b82805482825590600052602060002090601f01602090048101928215613ae75791602002820160005b83821115613ab857835183826101000a81548160ff0219169083151502179055509260200192600101602081600001049283019260010302613a7b565b8015613ae55782816101000a81549060ff0219169055600101602081600001049283019260010302613ab8565b505b509050613af49190613bb2565b5090565b815481835581811115613b2557600502816005028360005260206000209182019101613b249190613be2565b5b505050565b5080546000825560050290600052602060002090810190613b4b9190613be2565b50565b6040518062100000016040528061800090602082028038833980820191505090505090565b604051806040016040528060008152602001600081525090565b613baf91905b80821115613bab576000816000905550600101613b93565b5090565b90565b613bdf91905b80821115613bdb57600081816101000a81549060ff021916905550600101613bb8565b5090565b90565b613c4e91905b80821115613c4a5760008082016000613c019190613c51565b6001820160006101000a81549060ff021916905560028201600090556003820160006101000a81549060ff0219169055600482016000613c419190613c99565b50600501613be8565b5090565b90565b50805460018160011615610100020316600290046000825580601f10613c775750613c96565b601f016020900490600052602060002090810190613c959190613b8d565b5b50565b50805460008255601f016020900490600052602060002090810190613cbe9190613b8d565b50565b600081359050613cd081615086565b92915050565b600081519050613ce581615086565b92915050565b600082601f830112613cfc57600080fd5b8135613d0f613d0a82614e74565b614e47565b91508082526020830160208301858383011115613d2b57600080fd5b613d36838284615026565b50505092915050565b600082601f830112613d5057600080fd5b8135613d63613d5e82614ea0565b614e47565b91508082526020830160208301858383011115613d7f57600080fd5b613d8a838284615026565b50505092915050565b600081359050613da28161509d565b92915050565b600060208284031215613dba57600080fd5b6000613dc884828501613cd6565b91505092915050565b60008060408385031215613de457600080fd5b6000613df285828601613cc1565b9250506020613e0385828601613d93565b9150509250929050565b600060208284031215613e1f57600080fd5b600082013567ffffffffffffffff811115613e3957600080fd5b613e4584828501613d3f565b91505092915050565b60008060408385031215613e6157600080fd5b600083013567ffffffffffffffff811115613e7b57600080fd5b613e8785828601613d3f565b9250506020613e9885828601613d93565b9150509250929050565b600080600060608486031215613eb757600080fd5b600084013567ffffffffffffffff811115613ed157600080fd5b613edd86828701613d3f565b9350506020613eee86828701613d93565b925050604084013567ffffffffffffffff811115613f0b57600080fd5b613f1786828701613ceb565b9150509250925092565b600080600060608486031215613f3657600080fd5b600084013567ffffffffffffffff811115613f5057600080fd5b613f5c86828701613d3f565b9350506020613f6d86828701613d93565b9250506040613f7e86828701613d93565b9150509250925092565b6000613f9483836140f6565b60208301905092915050565b6000613fac8383614105565b60208301905092915050565b6000613fc4838361497f565b905092915050565b6000613fd782614ef6565b613fe18185614f55565b9350613fec83614ecc565b8060005b8381101561401d5781516140048882613f88565b975061400f83614f2e565b925050600181019050613ff0565b5085935050505092915050565b61403381614f01565b61403d8184614f66565b925061404882614edc565b8060005b838110156140795781516140608782613fa0565b965061406b83614f3b565b92505060018101905061404c565b505050505050565b600061408c82614f0d565b6140968185614f71565b9350836020820285016140a885614ee6565b8060005b858110156140e457848403895281516140c58582613fb8565b94506140d083614f48565b925060208a019950506001810190506140ac565b50829750879550505050505092915050565b6140ff81614fc1565b82525050565b61410e81614fcd565b82525050565b61411d81615014565b82525050565b61412c81615014565b82525050565b600061413d82614f23565b6141478185614fa4565b9350614157818560208601615035565b80840191505092915050565b600061416e82614f18565b6141788185614f82565b9350614188818560208601615035565b61419181615068565b840191505092915050565b60006141a782614f18565b6141b18185614fa4565b93506141c1818560208601615035565b80840191505092915050565b60006141da601883614f93565b91507f496e636f7272656374206368756e6b20706f736974696f6e00000000000000006000830152602082019050919050565b600061421a601583614f93565b91507f4469726563746f7279206e6f74206372656174656400000000000000000000006000830152602082019050919050565b600061425a602483614f93565b91507f4e6f7420656e6f756768206d656d6f727920696e207468652046696c6573746f60008301527f72616765000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006142c0601b83614f93565b91507f48617368206861736e2774206265656e2063616c63756c6174656400000000006000830152602082019050919050565b6000614300601983614f93565b91507f4368756e6b20697320616c72656164792075706c6f61646564000000000000006000830152602082019050919050565b6000614340601683614f93565b91507f496e636f7272656374206368756e6b206c656e677468000000000000000000006000830152602082019050919050565b6000614380600f83614f93565b91507f46696c65206e6f742065786973747300000000000000000000000000000000006000830152602082019050919050565b60006143c0600e83614f93565b91507f496e76616c69642073656e6465720000000000000000000000000000000000006000830152602082019050919050565b6000614400601883614f93565b91507f4469726563746f7279206973206e6f742064656c6574656400000000000000006000830152602082019050919050565b6000614440601083614f93565b91507f46696c65206e6f742064656c65746564000000000000000000000000000000006000830152602082019050919050565b6000614480601383614f93565b91507f496e76616c69642073746f7261676550617468000000000000000000000000006000830152602082019050919050565b60006144c0600c83614f93565b91507f496e76616c6964207061746800000000000000000000000000000000000000006000830152602082019050919050565b6000614500600183614fa4565b91507f2e000000000000000000000000000000000000000000000000000000000000006000830152600182019050919050565b6000614540601683614f93565b91507f496e76616c6964206469726563746f7279206e616d65000000000000000000006000830152602082019050919050565b6000614580601583614f93565b91507f4368756e6b207761736e27742075706c6f6164656400000000000000000000006000830152602082019050919050565b60006145c0602683614f93565b91507f436f756c64206e6f742072657365727665206c657373207468616e207573656460008301527f20737061636500000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614626601683614f93565b91507f4469726563746f7279206973206e6f7420656d707479000000000000000000006000830152602082019050919050565b6000614666602383614f93565b91507f46696c65206861736e2774206265656e2075706c6f6164656420636f7272656360008301527f746c7900000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006146cc601183614f93565b91507f4368756e6b207761736e277420726561640000000000000000000000000000006000830152602082019050919050565b600061470c601883614f93565b91507f46696c656e616d652073686f756c64206265203c2032353600000000000000006000830152602082019050919050565b600061474c601f83614f93565b91507f46696c652073686f756c64206265206c657373207468616e20313030204d42006000830152602082019050919050565b600061478c600283614fa4565b91507f2e2e0000000000000000000000000000000000000000000000000000000000006000830152600282019050919050565b60006147cc601183614f93565b91507f4469726563746f72792069732066756c6c0000000000000000000000000000006000830152602082019050919050565b600061480c600e83614f93565b91507f46696c65206e6f7420666f756e640000000000000000000000000000000000006000830152602082019050919050565b600061484c601883614f93565b91507f46696c65206f72206469726563746f72792065786973747300000000000000006000830152602082019050919050565b600061488c601983614f93565b91507f4e6f7420656e6f756768207265736572766564207370616365000000000000006000830152602082019050919050565b60006148cc601883614f93565b91507f45564d206572726f7220696e2067657446696c6553697a6500000000000000006000830152602082019050919050565b600061490c601083614f93565b91507f46696c65206e6f742063726561746564000000000000000000000000000000006000830152602082019050919050565b600061494c601983614f93565b91507f46696c65206861736e2774206265656e2075706c6f61646564000000000000006000830152602082019050919050565b600060a083016000830151848203600086015261499c8282614163565b91505060208301516149b160208601826140f6565b5060408301516149c460408601826149fc565b5060608301516149d76060860182614114565b50608083015184820360808601526149ef8282613fcc565b9150508091505092915050565b614a058161500a565b82525050565b614a148161500a565b82525050565b6000614a26828461419c565b915081905092915050565b6000614a3d8284614132565b915081905092915050565b6000614a53826144f3565b9150819050919050565b6000614a688261477f565b9150819050919050565b60006210000082019050614a89600083018461402a565b92915050565b60006020820190508181036000830152614aa98184614081565b905092915050565b6000602082019050614ac66000830184614123565b92915050565b60006020820190508181036000830152614ae5816141cd565b9050919050565b60006020820190508181036000830152614b058161420d565b9050919050565b60006020820190508181036000830152614b258161424d565b9050919050565b60006020820190508181036000830152614b45816142b3565b9050919050565b60006020820190508181036000830152614b65816142f3565b9050919050565b60006020820190508181036000830152614b8581614333565b9050919050565b60006020820190508181036000830152614ba581614373565b9050919050565b60006020820190508181036000830152614bc5816143b3565b9050919050565b60006020820190508181036000830152614be5816143f3565b9050919050565b60006020820190508181036000830152614c0581614433565b9050919050565b60006020820190508181036000830152614c2581614473565b9050919050565b60006020820190508181036000830152614c45816144b3565b9050919050565b60006020820190508181036000830152614c6581614533565b9050919050565b60006020820190508181036000830152614c8581614573565b9050919050565b60006020820190508181036000830152614ca5816145b3565b9050919050565b60006020820190508181036000830152614cc581614619565b9050919050565b60006020820190508181036000830152614ce581614659565b9050919050565b60006020820190508181036000830152614d05816146bf565b9050919050565b60006020820190508181036000830152614d25816146ff565b9050919050565b60006020820190508181036000830152614d458161473f565b9050919050565b60006020820190508181036000830152614d65816147bf565b9050919050565b60006020820190508181036000830152614d85816147ff565b9050919050565b60006020820190508181036000830152614da58161483f565b9050919050565b60006020820190508181036000830152614dc58161487f565b9050919050565b60006020820190508181036000830152614de5816148bf565b9050919050565b60006020820190508181036000830152614e05816148ff565b9050919050565b60006020820190508181036000830152614e258161493f565b9050919050565b6000602082019050614e416000830184614a0b565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614e6a57600080fd5b8060405250919050565b600067ffffffffffffffff821115614e8b57600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614eb757600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050919050565b6000819050602082019050919050565b600081519050919050565b60006180009050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614fba82614fea565b9050919050565b60008115159050919050565b6000819050919050565b6000819050614fe582615079565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061501f82614fd7565b9050919050565b82818337600083830152505050565b60005b83811015615053578082015181840152602081019050615038565b83811115615062576000848401525b50505050565b6000601f19601f8301169050919050565b6003811061508357fe5b50565b61508f81614faf565b811461509a57600080fd5b50565b6150a68161500a565b81146150b157600080fd5b5056fea365627a7a72315820314a90e541327f2678eaf7815f54348c3702e4fa45cdf1d5595b378d08af86896c6578706572696d656e74616cf564736f6c634300050d0040", + "nonce": "0", + "storage": { + "0x0": "2868903936" + } + }, + "0x69bfcdcb98c9562e0a2faee3ecdfd65e8a0adb19": { + "balance": "1000000000000000000000000000000" + }, + "0x6a37ad7dceec4595eea9f03b82d2710e738343ac": { + "balance": "1000000000000000000000000000000" + }, + "0x6b806862a977a0e22ed1752f858e5332647121c8": { + "balance": "1000000000000000000000000000000" + }, + "0x6c0ef9084a57df13c175afea32ea47a510c5506e": { + "balance": "1000000000000000000000000000000" + }, + "0x6cd5e637266e18d3e888ee99451eb828c6b491f4": { + "balance": "1000000000000000000000000000000" + }, + "0x6d0d7f0ff51917bd84a5f7270d31a894282aaf4b": { + "balance": "1000000000000000000000000000000" + }, + "0x6d8092cb926daf29236f866cd31c327ff73323d1": { + "balance": "1000000000000000000000000000000" + }, + "0x6d80aAC61F6d92c7F4A3c412850474ba963B698E": { + "balance": "1000000000000000000000" + }, + "0x6fec280c0ab320715b17d70e8b02c2d4141c1372": { + "balance": "1000000000000000000000000000000" + }, + "0x733ad609ef2e742334d96266fbc13733f1cf5e4a": { + "balance": "1000000000000000000000000000000" + }, + "0x7525198d8cd1121d57358a0b0ed037e924581a76": { + "balance": "1000000000000000000000000000000" + }, + "0x765708943c3b791563d1e3f0533b6d7e7d769e4d": { + "balance": "1000000000000000000000000000000" + }, + "0x7685d04f0b7657017b77efa004a14ff9f022acab": { + "balance": "1000000000000000000000000000000" + }, + "0x76b545cb6a2fc671f741950eeb27627e69a1e69b": { + "balance": "1000000000000000000000000000000" + }, + "0x77a0bc73442d3d9cb993e8d9752f95babf0ccaa6": { + "balance": "1000000000000000000000000000000" + }, + "0x7a89A6c323FaCfF0ADeF7EEF3e491aD4044d0592": { + "balance": "100000000000000000000000" + }, + "0x7e7E68F04D1799Fa25C8cff57314c8a5d3942e69": { + "balance": "1000000000000000000000000" + }, + "0x811d701d14539d190a8593fe901eafe8eff511f5": { + "balance": "1000000000000000000000000000000" + }, + "0x81dcbd71da28fafb9ca99ff5a22bfcebba84fecc": { + "balance": "100000000000000000000000" + }, + "0x83c1479d2a32d9ed9fa699289b6c2db56b7cd045": { + "balance": "1000000000000000000000000000000" + }, + "0x85b33f0853ab8eaa4e602bdfd724d44bc2731e90": { + "balance": "1000000000000000000000000000000" + }, + "0x863f816036e3cbba90855196c9d1e339fcff1650": { + "balance": "1000000000000000000000000000000" + }, + "0x87ea381878572d63b3453033d7540abddd191186": { + "balance": "1000000000000000000000000000000" + }, + "0x88fd5e01078629cc194c933d9631b9448fe10b1d": { + "balance": "1000000000000000000000000000000" + }, + "0x8945e48bd056f45c8b57f9025d2674bb03a24035": { + "balance": "1000000000000000000000000000000" + }, + "0x8a920edc1021ce76c22774e0e83723a6e51c2439": { + "balance": "1000000000000000000000000000000" + }, + "0x8e6081e272c8f4d49f5b29157b52f68cbd6307ad": { + "balance": "1000000000000000000000000000000" + }, + "0x8fe24dbbf9884bd458d8cfac528b4ad70e82497d": { + "balance": "1000000000000000000000000000000" + }, + "0x90431f3f75b26657f74abbb5c759b12e78f916cc": { + "balance": "1000000000000000000000000000000" + }, + "0x907cd0881E50d359bb9Fd120B1A5A143b1C97De6": { + "balance": "1000000000000000000000000000000000000000000000000000000000" + }, + "0x94c6e5746971d6aebeaa42cbbe2feca0f6b5b24f": { + "balance": "1000000000000000000000000000000" + }, + "0x96672f9e982936e1904b15c948cc81bf18027db6": { + "balance": "1000000000000000000000000000000" + }, + "0x97b921ba45e0aa8830701aa62050a83ee00a1bb8": { + "balance": "1000000000000000000000000000000" + }, + "0x98e50c97baf98dc6a81bdb95067339a269a36fc1": { + "balance": "1000000000000000000000000000000" + }, + "0x9b77f28285a49601169a33332f08aa309d97edd0": { + "balance": "1000000000000000000000000000000" + }, + "0x9f62f4215cd277ca40dede101b4ccb29290de6bb": { + "balance": "1000000000000000000000000000000" + }, + "0xD1001000000000000000000000000000000000D1": { + "balance": "0", + "code": "0x608060405260043610603f576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680636d4ce63c146044575b600080fd5b348015604f57600080fd5b506056606c565b6040518082815260200191505060405180910390f35b60006001600060048152602001908152602001600020600060098152602001908152602001600020600101549050905600a165627a7a723058208fe64219becc0bcab1c8f854f05804ebb6bb555da5dbc49e8f7021c31d77636a0029", + "nonce": "0", + "storage": { + "0x3b4da637a1b0e6dbfc6795f2b7f0cb29eebb91b3af4dcc335e1633f6b4af810b": "1111" + } + }, + "0xD3001000000000000000000000000000000000D3": { + "balance": "0", + "code": "0x60806040526004361061007b5760003560e01c80639623609d1161004e5780639623609d1461013657806399a88ec4146101f5578063f2fde38b14610230578063f3b7dead146102635761007b565b8063204e1c7a14610080578063715018a6146100cf5780637eff275e146100e65780638da5cb5b14610121575b600080fd5b34801561008c57600080fd5b506100b3600480360360208110156100a357600080fd5b50356001600160a01b0316610296565b604080516001600160a01b039092168252519081900360200190f35b3480156100db57600080fd5b506100e4610328565b005b3480156100f257600080fd5b506100e46004803603604081101561010957600080fd5b506001600160a01b03813581169160200135166103ca565b34801561012d57600080fd5b506100b3610496565b6100e46004803603606081101561014c57600080fd5b6001600160a01b03823581169260208101359091169181019060608101604082013564010000000081111561018057600080fd5b82018360208201111561019257600080fd5b803590602001918460018302840111640100000000831117156101b457600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506104a5945050505050565b34801561020157600080fd5b506100e46004803603604081101561021857600080fd5b506001600160a01b03813581169160200135166105dd565b34801561023c57600080fd5b506100e46004803603602081101561025357600080fd5b50356001600160a01b031661068d565b34801561026f57600080fd5b506100b36004803603602081101561028657600080fd5b50356001600160a01b0316610785565b6000806060836001600160a01b03166040518080635c60da1b60e01b8152506004019050600060405180830381855afa9150503d80600081146102f5576040519150601f19603f3d011682016040523d82523d6000602084013e6102fa565b606091505b50915091508161030957600080fd5b80806020019051602081101561031e57600080fd5b5051949350505050565b6103306107e4565b6000546001600160a01b03908116911614610380576040805162461bcd60e51b8152602060048201819052602482015260008051602061080f833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6103d26107e4565b6000546001600160a01b03908116911614610422576040805162461bcd60e51b8152602060048201819052602482015260008051602061080f833981519152604482015290519081900360640190fd5b816001600160a01b0316638f283970826040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050600060405180830381600087803b15801561047a57600080fd5b505af115801561048e573d6000803e3d6000fd5b505050505050565b6000546001600160a01b031690565b6104ad6107e4565b6000546001600160a01b039081169116146104fd576040805162461bcd60e51b8152602060048201819052602482015260008051602061080f833981519152604482015290519081900360640190fd5b826001600160a01b0316634f1ef2863484846040518463ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561057357818101518382015260200161055b565b50505050905090810190601f1680156105a05780820380516001836020036101000a031916815260200191505b5093505050506000604051808303818588803b1580156105bf57600080fd5b505af11580156105d3573d6000803e3d6000fd5b5050505050505050565b6105e56107e4565b6000546001600160a01b03908116911614610635576040805162461bcd60e51b8152602060048201819052602482015260008051602061080f833981519152604482015290519081900360640190fd5b816001600160a01b0316633659cfe6826040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050600060405180830381600087803b15801561047a57600080fd5b6106956107e4565b6000546001600160a01b039081169116146106e5576040805162461bcd60e51b8152602060048201819052602482015260008051602061080f833981519152604482015290519081900360640190fd5b6001600160a01b03811661072a5760405162461bcd60e51b81526004018080602001828103825260268152602001806107e96026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000806060836001600160a01b031660405180806303e1469160e61b8152506004019050600060405180830381855afa9150503d80600081146102f5576040519150601f19603f3d011682016040523d82523d6000602084013e6102fa565b339056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a26469706673582212201d968ac32bef5562c6b4f1bd5d2f2a74c14d07ce008ca6fdc5a3bd0f5fc265f564736f6c63430006080033", + "nonce": "0", + "storage": { + "0x0": "0x907cd0881E50d359bb9Fd120B1A5A143b1C97De6" + } + }, + "0xD3002000000000000000000000000000000000D3": { + "balance": "0", + "code": "0x60806040526004361061004e5760003560e01c80633659cfe6146100655780634f1ef286146100985780635c60da1b146101185780638f28397014610149578063f851a4401461017c5761005d565b3661005d5761005b610191565b005b61005b610191565b34801561007157600080fd5b5061005b6004803603602081101561008857600080fd5b50356001600160a01b03166101ab565b61005b600480360360408110156100ae57600080fd5b6001600160a01b0382351691908101906040810160208201356401000000008111156100d957600080fd5b8201836020820111156100eb57600080fd5b8035906020019184600183028401116401000000008311171561010d57600080fd5b5090925090506101e5565b34801561012457600080fd5b5061012d610292565b604080516001600160a01b039092168252519081900360200190f35b34801561015557600080fd5b5061005b6004803603602081101561016c57600080fd5b50356001600160a01b03166102cf565b34801561018857600080fd5b5061012d610389565b6101996103ba565b6101a96101a461041a565b61043f565b565b6101b3610463565b6001600160a01b0316336001600160a01b031614156101da576101d581610488565b6101e2565b6101e2610191565b50565b6101ed610463565b6001600160a01b0316336001600160a01b031614156102855761020f83610488565b6000836001600160a01b031683836040518083838082843760405192019450600093509091505080830381855af49150503d806000811461026c576040519150601f19603f3d011682016040523d82523d6000602084013e610271565b606091505b505090508061027f57600080fd5b5061028d565b61028d610191565b505050565b600061029c610463565b6001600160a01b0316336001600160a01b031614156102c4576102bd61041a565b90506102cc565b6102cc610191565b90565b6102d7610463565b6001600160a01b0316336001600160a01b031614156101da576001600160a01b0381166103355760405162461bcd60e51b81526004018080602001828103825260368152602001806105876036913960400191505060405180910390fd5b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f61035e610463565b604080516001600160a01b03928316815291841660208301528051918290030190a16101d5816104c8565b6000610393610463565b6001600160a01b0316336001600160a01b031614156102c4576102bd610463565b3b151590565b6103c2610463565b6001600160a01b0316336001600160a01b031614156104125760405162461bcd60e51b81526004018080602001828103825260328152602001806105556032913960400191505060405180910390fd5b6101a96101a9565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b3660008037600080366000845af43d6000803e80801561045e573d6000f35b3d6000fd5b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b610491816104ec565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610355565b6104f5816103b4565b6105305760405162461bcd60e51b815260040180806020018281038252603b8152602001806105bd603b913960400191505060405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5556fe43616e6e6f742063616c6c2066616c6c6261636b2066756e6374696f6e2066726f6d207468652070726f78792061646d696e43616e6e6f74206368616e6765207468652061646d696e206f6620612070726f787920746f20746865207a65726f206164647265737343616e6e6f742073657420612070726f787920696d706c656d656e746174696f6e20746f2061206e6f6e2d636f6e74726163742061646472657373a26469706673582212206e221e2a3547bd97244b05ed46430b1b078ba097cb2a4e25ec3d79cf9ac9f02c64736f6c63430006080033", + "nonce": "0", + "storage": { + "0x0": "1000000", + "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0xD3003000000000000000000000000000000000D3", + "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "0xD3001000000000000000000000000000000000D3" + } + }, + "0xD3003000000000000000000000000000000000D3": { + "balance": "0", + "code": "0x608060405234801561001057600080fd5b50600436106100b45760003560e01c806379210e8e1161007157806379210e8e1461017757806381a8235a146101a757806385aeeb17146101c35780639a9a5593146101f3578063a99100541461020f578063b57321221461022b576100b4565b806307c6e7d3146100b9578063122f4fba146100d55780631c6ec7a9146101055780631cfe4e3b14610121578063373dedb41461013d57806361e46db51461015b575b600080fd5b6100d360048036036100ce9190810190613e94565b61025b565b005b6100ef60048036036100ea9190810190613e94565b610862565b6040516100fc9190614b38565b60405180910390f35b61011f600480360361011a9190810190613e94565b610ba1565b005b61013b60048036036101369190810190613e58565b610fce565b005b6101456111ec565b6040516101529190614eb3565b60405180910390f35b61017560048036036101709190810190613f29565b6111f6565b005b610191600480360361018c9190810190613fa8565b611456565b60405161019e9190614af9565b60405180910390f35b6101c160048036036101bc9190810190613e94565b611756565b005b6101dd60048036036101d89190810190613e94565b6118fb565b6040516101ea9190614b16565b60405180910390f35b61020d60048036036102089190810190613ed5565b611bfa565b005b61022960048036036102249190810190613e94565b612195565b005b61024560048036036102409190810190613e94565b612849565b6040516102529190614eb3565b60405180910390f35b6000339050606061026b83612ac9565b90506000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b825181101561037c576000826001018460018403815181106102d557fe5b60200260200101516040516102ea9190614aa1565b90815260200160405180910390205411610339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161033090614cb3565b60405180910390fd5b8160020183600183038151811061034c57fe5b60200260200101516040516103619190614aa1565b908152602001604051809103902091508060010190506102b7565b506060600183511161038e57846103a7565b8260018451038151811061039e57fe5b60200260200101515b9050600082600101826040516103bd9190614ab8565b9081526020016040518091039020541161040c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161040390614cb3565b60405180910390fd5b600082600201826040516104209190614ab8565b90815260200160405180910390206000018054905014610475576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161046c90614d33565b60405180910390fd5b60006104818587612cc9565b9050806104c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ba90614c53565b60405180910390fd5b6104cb613a4f565b836000016001856000018054905003815481106104e457fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156105965780601f1061056b57610100808354040283529160200191610596565b820191906000526020600020905b81548152906001019060200180831161057957829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff1660028111156105e257fe5b60028111156105ed57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561066557602002820191906000526020600020906000905b82829054906101000a900460ff1615158152602001906001019060208260000104928301926001038202915080841161062f5790505b50505050508152505090508084600001600186600101866040516106899190614ab8565b90815260200160405180910390205403815481106106a357fe5b906000526020600020906005020160008201518160000190805190602001906106cd929190613a8b565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561071c57fe5b0217905550608082015181600401908051906020019061073d929190613b0b565b5090505083600101836040516107539190614ab8565b9081526020016040518091039020548460010182600001516040516107789190614aa1565b9081526020016040518091039020819055506000846001018460405161079e9190614ab8565b908152602001604051809103902081905550836000018054806107bd57fe5b6001900381819060005260206000209060050201600080820160006107e29190613bb1565b6001820160006101000a81549060ff021916905560028201600090556003820160006101000a81549060ff02191690556004820160006108229190613bf9565b5050905583600201836040516108389190614ab8565b9081526020016040518091039020600080820160006108579190613c21565b505050505050505050565b600080606061087084612d2d565b91509150606061087f82612ac9565b90506000600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015610964576000826001018460018403815181106108e957fe5b60200260200101516040516108fe9190614aa1565b908152602001604051809103902054141561092157600095505050505050610b9c565b8160020183600183038151811061093457fe5b60200260200101516040516109499190614aa1565b908152602001604051809103902091508060010190506108cb565b5060606001835111610976578361098f565b8260018451038151811061098657fe5b60200260200101515b9050600082600101826040516109a59190614ab8565b90815260200160405180910390205414156109c857600095505050505050610b9c565b6109d0613a4f565b82600001600184600101846040516109e89190614ab8565b9081526020016040518091039020540381548110610a0257fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610ab45780601f10610a8957610100808354040283529160200191610ab4565b820191906000526020600020905b815481529060010190602001808311610a9757829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115610b0057fe5b6002811115610b0b57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015610b8357602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411610b4d5790505b5050505050815250509050806060015196505050505050505b919050565b600360009054906101000a900460ff16610be457612000600481905550621000006005819055506001600360006101000a81548160ff0219169083151502179055505b6000815111610c28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1f90614cb3565b60405180910390fd5b60003390506060610c3883612ac9565b90506000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015610d4957600082600101846001840381518110610ca257fe5b6020026020010151604051610cb79190614aa1565b90815260200160405180910390205411610d06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cfd90614cb3565b60405180910390fd5b81600201836001830381518110610d1957fe5b6020026020010151604051610d2e9190614aa1565b90815260200160405180910390209150806001019050610c84565b50600454816000018054905010610d95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8c90614dd3565b60405180910390fd5b60606001835111610da65784610dbf565b82600184510381518110610db657fe5b60200260200101515b905060008260010182604051610dd59190614ab8565b90815260200160405180910390205414610e24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1b90614e13565b60405180910390fd5b610e2d816130af565b610e6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6390614cd3565b60405180910390fd5b6000610e788587613190565b905080610eba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb190614b73565b60405180910390fd5b610ec2613a4f565b8281600001819052506000816020019015159081151581525050836000018190806001815401808255809150506001900390600052602060002090600502016000909190919091506000820151816000019080519060200190610f26929190613a8b565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff02191690836002811115610f7557fe5b02179055506080820151816004019080519060200190610f96929190613b0b565b50505083600001805490508460010184604051610fb39190614ab8565b90815260200160405180910390208190555050505050505050565b610fd66131f4565b73ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16148061103b57503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614155b61107a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107190614c33565b60405180910390fd5b80600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411156110fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f390614d13565b60405180910390fd5b60025460095482011115611145576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113c90614b93565b60405180910390fd5b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460096000828254039250508190555080600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550806009600082825401925050819055505050565b6000600254905090565b60003390506000611207828661328d565b90506001600281111561121657fe5b8160030160009054906101000a900460ff16600281111561123357fe5b14611273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126a90614df3565b60405180910390fd5b6000600554858161128057fe5b061480156112915750806002015484105b6112d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c790614b53565b60405180910390fd5b600554848260020154031080156112ed5750838160020154038351145b806112fa57506005548351145b611339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133090614bf3565b60405180910390fd5b6000151581600401600554868161134c57fe5b048154811061135757fe5b90600052602060002090602091828204019190069054906101000a900460ff161515146113b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b090614bd3565b60405180910390fd5b60006113c78387878761348c565b905080611409576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140090614cf3565b60405180910390fd5b600182600401600554878161141a57fe5b048154811061142557fe5b90600052602060002090602091828204019190066101000a81548160ff021916908315150217905550505050505050565b61145e613c45565b6000606061146b86612d2d565b91509150611477613a4f565b611481838361328d565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156115255780601f106114fa57610100808354040283529160200191611525565b820191906000526020600020905b81548152906001019060200180831161150857829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561157157fe5b600281111561157c57fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156115f457602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116115be5790505b505050505081525050905060028081111561160b57fe5b8160600151600281111561161b57fe5b1461165b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165290614e93565b60405180910390fd5b600554851115801561166d5750600085115b6116ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a390614bf3565b60405180910390fd5b806040015185870111156116f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ec90614b53565b60405180910390fd5b60006117038484898961353d565b80965081925050508061174b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174290614d73565b60405180910390fd5b505050509392505050565b60003390506000611767828461328d565b90506001600281111561177657fe5b8160030160009054906101000a900460ff16600281111561179357fe5b146117d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ca90614df3565b60405180910390fd5b60006001905060008260040180549050905060008090505b8181101561183e576000151584600401828154811061180657fe5b90600052602060002090602091828204019190069054906101000a900460ff161515141561183357600092505b8060010190506117eb565b508161187f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187690614d53565b60405180910390fd5b60028360030160006101000a81548160ff021916908360028111156118a057fe5b021790555060006118b185876135d0565b9050806118f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ea90614bb3565b60405180910390fd5b505050505050565b60606000606061190a84612d2d565b91509150606061191982612ac9565b90506000600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008090505b8251811015611a235760008260010184838151811061197f57fe5b60200260200101516040516119949190614aa1565b908152602001604051809103902054116119e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119da90614cb3565b60405180910390fd5b816002018382815181106119f357fe5b6020026020010151604051611a089190614aa1565b90815260200160405180910390209150806001019050611964565b5080600001805480602002602001604051908101604052809291908181526020016000905b82821015611beb57838290600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611b045780601f10611ad957610100808354040283529160200191611b04565b820191906000526020600020905b815481529060010190602001808311611ae757829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115611b5057fe5b6002811115611b5b57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015611bd357602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411611b9d5790505b50505050508152505081526020019060010190611a48565b50505050945050505050919050565b600360009054906101000a900460ff16611c3d57612000600481905550621000006005819055506001600360006101000a81548160ff0219169083151502179055505b60003390506305f5e100821115611c89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8090614db3565b60405180910390fd5b600660008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205483011115611d4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4390614e33565b60405180910390fd5b6060611d5784612ac9565b90506000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015611e6857600082600101846001840381518110611dc157fe5b6020026020010151604051611dd69190614aa1565b90815260200160405180910390205411611e25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1c90614cb3565b60405180910390fd5b81600201836001830381518110611e3857fe5b6020026020010151604051611e4d9190614aa1565b90815260200160405180910390209150806001019050611da3565b50600454816000018054905010611eb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eab90614dd3565b60405180910390fd5b60606001835111611ec55785611ede565b82600184510381518110611ed557fe5b60200260200101515b905060008260010182604051611ef49190614ab8565b90815260200160405180910390205414611f43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3a90614e13565b60405180910390fd5b611f4c816130af565b611f8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8290614d93565b60405180910390fd5b6000611f98858888613634565b905080611fda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd190614e73565b60405180910390fd5b6060600554600160055489010381611fee57fe5b0460405190808252806020026020018201604052801561201d5781602001602082028038833980820191505090505b509050836000016040518060a001604052808581526020016001151581526020018981526020016001600281111561205157fe5b8152602001838152509080600181540180825580915050600190039060005260206000209060050201600090919091909150600082015181600001908051906020019061209f929190613a8b565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff021916908360028111156120ee57fe5b0217905550608082015181600401908051906020019061210f929190613b0b565b5050508360000180549050846001018460405161212c9190614ab8565b90815260200160405180910390208190555086600760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505050505050505050565b60003390506121a2613a4f565b6121ac828461328d565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156122505780601f1061222557610100808354040283529160200191612250565b820191906000526020600020905b81548152906001019060200180831161223357829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561229c57fe5b60028111156122a757fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561231f57602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116122e95790505b50505050508152505090506000600281111561233757fe5b8160600151600281111561234757fe5b1415612388576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161237f90614c13565b60405180910390fd5b600061239483856136a1565b9050806123d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123cd90614c73565b60405180910390fd5b60606123e185612ac9565b90506000600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015612479578160020183600183038151811061244957fe5b602002602001015160405161245e9190614aa1565b9081526020016040518091039020915080600101905061242d565b50600060018260010186600001516040516124949190614aa1565b9081526020016040518091039020540390506124ae613a4f565b826000016001846000018054905003815481106124c757fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156125795780601f1061254e57610100808354040283529160200191612579565b820191906000526020600020905b81548152906001019060200180831161255c57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff1660028111156125c557fe5b60028111156125d057fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561264857602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116126125790505b50505050508152505090508083600001838154811061266357fe5b9060005260206000209060050201600082015181600001908051906020019061268d929190613a8b565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff021916908360028111156126dc57fe5b021790555060808201518160040190805190602001906126fd929190613b0b565b509050508260000180548061270e57fe5b6001900381819060005260206000209060050201600080820160006127339190613bb1565b6001820160006101000a81549060ff021916905560028201600090556003820160006101000a81549060ff02191690556004820160006127739190613bf9565b5050905582600101866000015160405161278d9190614aa1565b9081526020016040518091039020548360010182600001516040516127b29190614aa1565b90815260200160405180910390208190555060008360010187600001516040516127dc9190614aa1565b9081526020016040518091039020819055508560400151600760008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505050505050505050565b600080606061285784612d2d565b91509150612863613a4f565b61286d838361328d565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156129115780601f106128e657610100808354040283529160200191612911565b820191906000526020600020905b8154815290600101906020018083116128f457829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561295d57fe5b600281111561296857fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156129e057602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116129aa5790505b5050505050815250509050600160028111156129f857fe5b81606001516002811115612a0857fe5b1480612a2d5750600280811115612a1b57fe5b81606001516002811115612a2b57fe5b145b612a6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a6390614df3565b60405180910390fd5b6000612a788484613705565b809650819250505080612ac0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ab790614e53565b60405180910390fd5b50505050919050565b6060612ad3613c6a565b612adc8361376e565b9050612ae6613c6a565b612b246040518060400160405280600181526020017f2f0000000000000000000000000000000000000000000000000000000000000081525061376e565b905060606001612b3d838561379c90919063ffffffff16565b01604051908082528060200260200182016040528015612b7157816020015b6060815260200190600190039081612b5c5790505b50905060008090505b8151811015612bc257612b9e612b99848661381190919063ffffffff16565b61382b565b828281518110612baa57fe5b60200260200101819052508080600101915050612b7a565b50600081600183510381518110612bd557fe5b6020026020010151511415612c405780600182510381518110612bf457fe5b6020026020010160608152506001815103604051908082528060200260200182016040528015612c3857816020015b6060815260200190600190039081612c235790505b509350612c79565b8051604051908082528060200260200182016040528015612c7557816020015b6060815260200190600190039081612c605790505b5093505b60008090505b8451811015612cc057818181518110612c9457fe5b6020026020010151858281518110612ca857fe5b60200260200101819052508080600101915050612c7f565b50505050919050565b60008060016020601f85510181612cdc57fe5b040190506040518481526020810160005b83811015612d0e578060200286015181602002830152806001019050612ced565b50602082602085026040018460006010600019f1935050505092915050565b6000606060006028905080845111612d7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d7190614c93565b60405180910390fd5b6060816040519080825280601f01601f191660200182016040528015612daf5781602001600182028038833980820191505090505b50905060008090505b82811015612e1f57858181518110612dcc57fe5b602001015160f81c60f81b828281518110612de357fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050612db8565b50600080905060008090505b83811015612f4e576000838281518110612e4157fe5b602001015160f81c60f81b60f81c60ff16905060308110158015612e66575060398111155b80612e7f575060418110158015612e7e5750605a8111155b5b80612e98575060618110158015612e97575060668111155b5b612ed7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ece90614c93565b60405180910390fd5b60308110158015612ee9575060398111155b15612efa5760308103601084020192505b60418110158015612f0c5750605a8111155b15612f1d5760378103601084020192505b60618110158015612f2f575060668111155b15612f405760578103601084020192505b508080600101915050612e2b565b508094507f2f00000000000000000000000000000000000000000000000000000000000000868481518110612f7f57fe5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612fec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fe390614c93565b60405180910390fd5b6000600184885103039050806040519080825280601f01601f19166020018201604052801561302a5781602001600182028038833980820191505090505b50945060008090505b818110156130a5576000886001878401018151811061304e57fe5b602001015160f81c60f81b90508087838151811061306857fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350508080600101915050613033565b5050505050915091565b60006040516020016130c090614ae4565b60405160208183030381529060405280519060200120826040516020016130e79190614ab8565b604051602081830303815290604052805190602001201480613152575060405160200161311390614acf565b604051602081830303815290604052805190602001208260405160200161313a9190614ab8565b60405160208183030381529060405280519060200120145b8061315e575060008251145b1561316c576000905061318b565b60008251905060ff81111561318557600091505061318b565b60019150505b919050565b60008060016020601f855101816131a357fe5b040190506040518481526020810160005b838110156131d55780602002860151816020028301528060010190506131b4565b5060208260208502604001846000600f600019f1935050505092915050565b600073d2001000000000000000000000000000000000d273ffffffffffffffffffffffffffffffffffffffff166383e781fe6040518163ffffffff1660e01b815260040160206040518083038186803b15801561325057600080fd5b505afa158015613264573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506132889190810190613e2f565b905090565b6000606061329a83612ac9565b90506000600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b82518110156133ab5760008260010184600184038151811061330457fe5b60200260200101516040516133199190614aa1565b90815260200160405180910390205411613368576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161335f90614cb3565b60405180910390fd5b8160020183600183038151811061337b57fe5b60200260200101516040516133909190614aa1565b908152602001604051809103902091508060010190506132e6565b50606060018351116133bd57846133d6565b826001845103815181106133cd57fe5b60200260200101515b9050600082600101826040516133ec9190614ab8565b9081526020016040518091039020541161343b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161343290614cb3565b60405180910390fd5b600082600001600184600101846040516134559190614ab8565b908152602001604051809103902054038154811061346f57fe5b906000526020600020906005020190508094505050505092915050565b60008060016020601f8551018161349f57fe5b04019050600060016020601f885101816134b557fe5b040190506040518781526020810160005b838110156134e75780602002890151816020028301528060010190506134c6565b50868360200282015260005b8481101561351957806020028701518185600101016020028301528060010190506134f3565b50602082848601602002606001846000600c600019f1945050505050949350505050565b6000613547613c45565b600060016020601f8851018161355957fe5b0401905060006020601f86018161356c57fe5b0490506040518881526020810160005b8481101561359d57806020028a01518160200283015280600101905061357c565b5083602002810188815287816020015283602002868660030160200285600a600019fa9650505050505094509492505050565b60008060016020601f855101816135e357fe5b040190506040518481526020810160005b838110156136155780602002860151816020028301528060010190506135f4565b50602082602085026040018460006011600019f1935050505092915050565b60008060016020601f8651018161364757fe5b040190506040518581526020810160005b83811015613679578060200287015181602002830152806001019050613658565b50846020840282015260208260208502604001846000600b600019f193505050509392505050565b60008060016020601f855101816136b457fe5b040190506040518481526020810160005b838110156136e65780602002860151816020028301528060010190506136c5565b5060208260208502604001846000600e600019f1935050505092915050565b600080600060016020601f8651018161371a57fe5b040190506040518581526020810160005b8381101561374c57806020028701518160200283015280600101905061372b565b506020826020850260200184600d600019fa9450815193505050509250929050565b613776613c6a565b600060208301905060405180604001604052808451815260200182815250915050919050565b60008082600001516137c0856000015186602001518660000151876020015161388d565b0190505b8360000151846020015101811161380a578180600101925050826000015161380285602001518303866000015103838660000151876020015161388d565b0190506137c4565b5092915050565b613819613c6a565b613824838383613968565b5092915050565b60608082600001516040519080825280601f01601f1916602001820160405280156138655781602001600182028038833980820191505090505b50905060006020820190506138838185602001518660000151613a06565b8192505050919050565b6000808490506000868511613958576020851161391257600060018660200360080260020a031960001b905060008186511690506000878a8a0103905060008386511690505b828114613904578186106138f1578a8a019650505050505050613960565b85806001019650508386511690506138d3565b859650505050505050613960565b60008585209050600091505b85880382116139565760008684209050808214156139425783945050505050613960565b60018401935050818060010192505061391e565b505b868601925050505b949350505050565b613970613c6a565b600061398e856000015186602001518660000151876020015161388d565b905084602001518360200181815250508460200151810383600001818152505084600001518560200151018114156139d05760008560000181815250506139fb565b8360000151836000015101856000018181510391508181525050836000015181018560200181815250505b829150509392505050565b5b60208110613a2a5781518352602083019250602082019150602081039050613a07565b60006001826020036101000a0390508019835116818551168181178652505050505050565b6040518060a00160405280606081526020016000151581526020016000815260200160006002811115613a7e57fe5b8152602001606081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613acc57805160ff1916838001178555613afa565b82800160010185558215613afa579182015b82811115613af9578251825591602001919060010190613ade565b5b509050613b079190613c84565b5090565b82805482825590600052602060002090601f01602090048101928215613ba05791602002820160005b83821115613b7157835183826101000a81548160ff0219169083151502179055509260200192600101602081600001049283019260010302613b34565b8015613b9e5782816101000a81549060ff0219169055600101602081600001049283019260010302613b71565b505b509050613bad9190613ca9565b5090565b50805460018160011615610100020316600290046000825580601f10613bd75750613bf6565b601f016020900490600052602060002090810190613bf59190613c84565b5b50565b50805460008255601f016020900490600052602060002090810190613c1e9190613c84565b50565b5080546000825560050290600052602060002090810190613c429190613cd9565b50565b6040518062100000016040528061800090602082028038833980820191505090505090565b604051806040016040528060008152602001600081525090565b613ca691905b80821115613ca2576000816000905550600101613c8a565b5090565b90565b613cd691905b80821115613cd257600081816101000a81549060ff021916905550600101613caf565b5090565b90565b613d4591905b80821115613d415760008082016000613cf89190613bb1565b6001820160006101000a81549060ff021916905560028201600090556003820160006101000a81549060ff0219169055600482016000613d389190613bf9565b50600501613cdf565b5090565b90565b600081359050613d578161510d565b92915050565b600081519050613d6c8161510d565b92915050565b600082601f830112613d8357600080fd5b8135613d96613d9182614efb565b614ece565b91508082526020830160208301858383011115613db257600080fd5b613dbd8382846150ad565b50505092915050565b600082601f830112613dd757600080fd5b8135613dea613de582614f27565b614ece565b91508082526020830160208301858383011115613e0657600080fd5b613e118382846150ad565b50505092915050565b600081359050613e2981615124565b92915050565b600060208284031215613e4157600080fd5b6000613e4f84828501613d5d565b91505092915050565b60008060408385031215613e6b57600080fd5b6000613e7985828601613d48565b9250506020613e8a85828601613e1a565b9150509250929050565b600060208284031215613ea657600080fd5b600082013567ffffffffffffffff811115613ec057600080fd5b613ecc84828501613dc6565b91505092915050565b60008060408385031215613ee857600080fd5b600083013567ffffffffffffffff811115613f0257600080fd5b613f0e85828601613dc6565b9250506020613f1f85828601613e1a565b9150509250929050565b600080600060608486031215613f3e57600080fd5b600084013567ffffffffffffffff811115613f5857600080fd5b613f6486828701613dc6565b9350506020613f7586828701613e1a565b925050604084013567ffffffffffffffff811115613f9257600080fd5b613f9e86828701613d72565b9150509250925092565b600080600060608486031215613fbd57600080fd5b600084013567ffffffffffffffff811115613fd757600080fd5b613fe386828701613dc6565b9350506020613ff486828701613e1a565b925050604061400586828701613e1a565b9150509250925092565b600061401b838361417d565b60208301905092915050565b6000614033838361418c565b60208301905092915050565b600061404b8383614a06565b905092915050565b600061405e82614f7d565b6140688185614fdc565b935061407383614f53565b8060005b838110156140a457815161408b888261400f565b975061409683614fb5565b925050600181019050614077565b5085935050505092915050565b6140ba81614f88565b6140c48184614fed565b92506140cf82614f63565b8060005b838110156141005781516140e78782614027565b96506140f283614fc2565b9250506001810190506140d3565b505050505050565b600061411382614f94565b61411d8185614ff8565b93508360208202850161412f85614f6d565b8060005b8581101561416b578484038952815161414c858261403f565b945061415783614fcf565b925060208a01995050600181019050614133565b50829750879550505050505092915050565b61418681615048565b82525050565b61419581615054565b82525050565b6141a48161509b565b82525050565b6141b38161509b565b82525050565b60006141c482614faa565b6141ce818561502b565b93506141de8185602086016150bc565b80840191505092915050565b60006141f582614f9f565b6141ff8185615009565b935061420f8185602086016150bc565b614218816150ef565b840191505092915050565b600061422e82614f9f565b614238818561502b565b93506142488185602086016150bc565b80840191505092915050565b600061426160188361501a565b91507f496e636f7272656374206368756e6b20706f736974696f6e00000000000000006000830152602082019050919050565b60006142a160158361501a565b91507f4469726563746f7279206e6f74206372656174656400000000000000000000006000830152602082019050919050565b60006142e160248361501a565b91507f4e6f7420656e6f756768206d656d6f727920696e207468652046696c6573746f60008301527f72616765000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614347601b8361501a565b91507f48617368206861736e2774206265656e2063616c63756c6174656400000000006000830152602082019050919050565b600061438760198361501a565b91507f4368756e6b20697320616c72656164792075706c6f61646564000000000000006000830152602082019050919050565b60006143c760168361501a565b91507f496e636f7272656374206368756e6b206c656e677468000000000000000000006000830152602082019050919050565b6000614407600f8361501a565b91507f46696c65206e6f742065786973747300000000000000000000000000000000006000830152602082019050919050565b6000614447600e8361501a565b91507f496e76616c69642073656e6465720000000000000000000000000000000000006000830152602082019050919050565b600061448760188361501a565b91507f4469726563746f7279206973206e6f742064656c6574656400000000000000006000830152602082019050919050565b60006144c760108361501a565b91507f46696c65206e6f742064656c65746564000000000000000000000000000000006000830152602082019050919050565b600061450760138361501a565b91507f496e76616c69642073746f7261676550617468000000000000000000000000006000830152602082019050919050565b6000614547600c8361501a565b91507f496e76616c6964207061746800000000000000000000000000000000000000006000830152602082019050919050565b600061458760018361502b565b91507f2e000000000000000000000000000000000000000000000000000000000000006000830152600182019050919050565b60006145c760168361501a565b91507f496e76616c6964206469726563746f7279206e616d65000000000000000000006000830152602082019050919050565b600061460760158361501a565b91507f4368756e6b207761736e27742075706c6f6164656400000000000000000000006000830152602082019050919050565b600061464760268361501a565b91507f436f756c64206e6f742072657365727665206c657373207468616e207573656460008301527f20737061636500000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006146ad60168361501a565b91507f4469726563746f7279206973206e6f7420656d707479000000000000000000006000830152602082019050919050565b60006146ed60238361501a565b91507f46696c65206861736e2774206265656e2075706c6f6164656420636f7272656360008301527f746c7900000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061475360118361501a565b91507f4368756e6b207761736e277420726561640000000000000000000000000000006000830152602082019050919050565b600061479360188361501a565b91507f46696c656e616d652073686f756c64206265203c2032353600000000000000006000830152602082019050919050565b60006147d3601f8361501a565b91507f46696c652073686f756c64206265206c657373207468616e20313030204d42006000830152602082019050919050565b600061481360028361502b565b91507f2e2e0000000000000000000000000000000000000000000000000000000000006000830152600282019050919050565b600061485360118361501a565b91507f4469726563746f72792069732066756c6c0000000000000000000000000000006000830152602082019050919050565b6000614893600e8361501a565b91507f46696c65206e6f7420666f756e640000000000000000000000000000000000006000830152602082019050919050565b60006148d360188361501a565b91507f46696c65206f72206469726563746f72792065786973747300000000000000006000830152602082019050919050565b600061491360198361501a565b91507f4e6f7420656e6f756768207265736572766564207370616365000000000000006000830152602082019050919050565b600061495360188361501a565b91507f45564d206572726f7220696e2067657446696c6553697a6500000000000000006000830152602082019050919050565b600061499360108361501a565b91507f46696c65206e6f742063726561746564000000000000000000000000000000006000830152602082019050919050565b60006149d360198361501a565b91507f46696c65206861736e2774206265656e2075706c6f61646564000000000000006000830152602082019050919050565b600060a0830160008301518482036000860152614a2382826141ea565b9150506020830151614a38602086018261417d565b506040830151614a4b6040860182614a83565b506060830151614a5e606086018261419b565b5060808301518482036080860152614a768282614053565b9150508091505092915050565b614a8c81615091565b82525050565b614a9b81615091565b82525050565b6000614aad8284614223565b915081905092915050565b6000614ac482846141b9565b915081905092915050565b6000614ada8261457a565b9150819050919050565b6000614aef82614806565b9150819050919050565b60006210000082019050614b1060008301846140b1565b92915050565b60006020820190508181036000830152614b308184614108565b905092915050565b6000602082019050614b4d60008301846141aa565b92915050565b60006020820190508181036000830152614b6c81614254565b9050919050565b60006020820190508181036000830152614b8c81614294565b9050919050565b60006020820190508181036000830152614bac816142d4565b9050919050565b60006020820190508181036000830152614bcc8161433a565b9050919050565b60006020820190508181036000830152614bec8161437a565b9050919050565b60006020820190508181036000830152614c0c816143ba565b9050919050565b60006020820190508181036000830152614c2c816143fa565b9050919050565b60006020820190508181036000830152614c4c8161443a565b9050919050565b60006020820190508181036000830152614c6c8161447a565b9050919050565b60006020820190508181036000830152614c8c816144ba565b9050919050565b60006020820190508181036000830152614cac816144fa565b9050919050565b60006020820190508181036000830152614ccc8161453a565b9050919050565b60006020820190508181036000830152614cec816145ba565b9050919050565b60006020820190508181036000830152614d0c816145fa565b9050919050565b60006020820190508181036000830152614d2c8161463a565b9050919050565b60006020820190508181036000830152614d4c816146a0565b9050919050565b60006020820190508181036000830152614d6c816146e0565b9050919050565b60006020820190508181036000830152614d8c81614746565b9050919050565b60006020820190508181036000830152614dac81614786565b9050919050565b60006020820190508181036000830152614dcc816147c6565b9050919050565b60006020820190508181036000830152614dec81614846565b9050919050565b60006020820190508181036000830152614e0c81614886565b9050919050565b60006020820190508181036000830152614e2c816148c6565b9050919050565b60006020820190508181036000830152614e4c81614906565b9050919050565b60006020820190508181036000830152614e6c81614946565b9050919050565b60006020820190508181036000830152614e8c81614986565b9050919050565b60006020820190508181036000830152614eac816149c6565b9050919050565b6000602082019050614ec86000830184614a92565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614ef157600080fd5b8060405250919050565b600067ffffffffffffffff821115614f1257600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614f3e57600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050919050565b6000819050602082019050919050565b600081519050919050565b60006180009050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061504182615071565b9050919050565b60008115159050919050565b6000819050919050565b600081905061506c82615100565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006150a68261505e565b9050919050565b82818337600083830152505050565b60005b838110156150da5780820151818401526020810190506150bf565b838111156150e9576000848401525b50505050565b6000601f19601f8301169050919050565b6003811061510a57fe5b50565b61511681615036565b811461512157600080fd5b50565b61512d81615091565b811461513857600080fd5b5056fea2646970667358221220a549ad9e778ae8bb3048c0a1805e77745871cc1560637ae1c3ebccb76638d9c464736f6c63430006020033", + "nonce": "0", + "storage": {} + }, + "0xa096b05a489831db893fc53aacc7ed20efb36382": { + "balance": "1000000000000000000000000000000" + }, + "0xa1cd651d99283be60e2a9d2e3bc8a90aedb8244f": { + "balance": "1000000000000000000000000000000" + }, + "0xa2969e82619021ea407338f8bdf7c6f2bd679673": { + "balance": "1000000000000000000000000000000" + }, + "0xa3597b1162b6559cb5e966904b63e762ece756a4": { + "balance": "1000000000000000000000000000000" + }, + "0xa68f946090c600eda6f139783077ee802afeb990": { + "balance": "1000000000000000000000000000000" + }, + "0xa6d50055592cecb795bc1ed3b9ea57ed426b0b7c": { + "balance": "1000000000000000000000000000000" + }, + "0xa7c0789bdeee38c6b59111a789dfb6b815489847": { + "balance": "1000000000000000000000000000000" + }, + "0xa8c813ee806b4c8537ff5f16084d44db18ea9ab1": { + "balance": "1000000000000000000000000000000" + }, + "0xaa6a87bbb74bc1f3cb40c1efb7fc171ee6407560": { + "balance": "1000000000000000000000000000000" + }, + "0xabf920b89f5a2487fdb70be17fd01a99a0602e62": { + "balance": "1000000000000000000000000000000" + }, + "0xac5df92da5171ba24a9618018b4f79494040334b": { + "balance": "1000000000000000000000000000000" + }, + "0xaf97a8318a1a51d5daeeb9650024b63ee44f45bd": { + "balance": "1000000000000000000000000000000" + }, + "0xb28c45b98ae43a5e9ee5509c97ea037b5de5d6d9": { + "balance": "1000000000000000000000000000000" + }, + "0xb64989ab32b089da3da103b93e6781d6d5dd10b4": { + "balance": "1000000000000000000000000000000" + }, + "0xb67e6f4a21f93c250fa6ff0cb142bd14dd4ca8eb": { + "balance": "1000000000000000000000000000000" + }, + "0xb70603c505f85130b5b2e73cd82d196dfd7d8b5e": { + "balance": "1000000000000000000000000000000" + }, + "0xb942414cae2a1ab1056657b905845c0ab6b6280a": { + "balance": "1000000000000000000000000000000" + }, + "0xbee0e5c1961d51be9bd670876caa9c90ba7d9016": { + "balance": "1000000000000000000000000000000" + }, + "0xbf2d8cebdeeb8ad8fed7b2a75f35922106f8d75c": { + "balance": "1000000000000000000000000000000" + }, + "0xbf5aa678b969c0871e2fbcf09c3dbb5d5865ac1e": { + "balance": "1000000000000000000000000000000" + }, + "0xc12bcedd9bcad9120150122cd50f39576ecccc08": { + "balance": "1000000000000000000000000000000" + }, + "0xc2d3852f3292acb81bd164dbae5f1e2a87535150": { + "balance": "1000000000000000000000000000000" + }, + "0xc3820490201e94d76b44655d2df713fec29d9795": { + "balance": "1000000000000000000000000000000" + }, + "0xc58744e2eceefd45cc5469f0e0a708ad24ddbbdb": { + "balance": "1000000000000000000000000000000" + }, + "0xc7865200e8e51ba1c8d695f327deed432930f2cc": { + "balance": "1000000000000000000000000000000" + }, + "0xc8e4d709eb3eb335dc69c9fbf2d24d447cb86105": { + "balance": "1000000000000000000000000000000" + }, + "0xc98af661e44c5bf31d2f8bdff4bbf2808ed4e991": { + "balance": "1000000000000000000000000000000" + }, + "0xca4409573a5129a72edf85d6c51e26760fc9c903": { + "balance": "100000000000000000000000" + }, + "0xcc33e23b04b74f7ba8fbe315083182224af973fa": { + "balance": "1000000000000000000000000000000" + }, + "0xce1c62d0a77600fb2f959b4da76fcb9b3b9430a3": { + "balance": "1000000000000000000000000000000" + }, + "0xd1b6c947fb14060b38945584714491592e84875d": { + "balance": "1000000000000000000000000000000" + }, + "0xd23cd6a9ddcc3470300003621bbac1e06a7919d5": { + "balance": "1000000000000000000000000000000" + }, + "0xd2c5b39B4e735C17612Bb5a08FD024ccc5dBCb23": { + "balance": "100000000000000000000000" + }, + "0xd2cd302eb060e375a65d65946692a3ac2d838d35": { + "balance": "1000000000000000000000000000000" + }, + "0xd2e75c41ced8699e3176f6e335355701a2568b7b": { + "balance": "1000000000000000000000000000000" + }, + "0xd3d38f4cb0aeb4c7c2527ddaeec2ab3b910c8528": { + "balance": "1000000000000000000000000000000" + }, + "0xd5b561a27cca5049650a14ab93dbf1a20c0cefc1": { + "balance": "1000000000000000000000000000000" + }, + "0xd90045420b8abc37b3f9304ed2b385fc1b7fa8c5": { + "balance": "1000000000000000000000000000000" + }, + "0xd951bf4cff429062702a7d8699a5f0bf14845d9b": { + "balance": "1000000000000000000000000000000" + }, + "0xdc6a269c58e58a93a22b5df8cdf1af630c47481f": { + "balance": "1000000000000000000000000000000" + }, + "0xdc6d02ef4003a4f2d0ccff65ae1a2d8157fbb23e": { + "balance": "1000000000000000000000000000000" + }, + "0xde14aca36acc62c305a7ee571da37840a408e600": { + "balance": "1000000000000000000000000000000" + }, + "0xdee32ae508cf783f53ab8bc39d878fe323cdfae3": { + "balance": "1000000000000000000000000000000" + }, + "0xe083a100d51fc4f38aae4a3a68404c36ad96c612": { + "balance": "1000000000000000000000000000000" + }, + "0xe1607990ce800407e3c206e58de4917977181d4d": { + "balance": "1000000000000000000000000000000" + }, + "0xe25e5b63dfd4cf59b81eddf64f1195858634b8a6": { + "balance": "1000000000000000000000000000000" + }, + "0xe372377decb3bdc0c7f5272d38ce0ba2a54934fe": { + "balance": "1000000000000000000000000000000" + }, + "0xe3cc6ec63b5652d1594bc63bb293f4e80f76dbdd": { + "balance": "1000000000000000000000000000000" + }, + "0xe3da7c014286258944ab20a31e4d861b4c9262f1": { + "balance": "1000000000000000000000000000000" + }, + "0xe8b57f330d56081c856e618210fbedb414925ff0": { + "balance": "1000000000000000000000000000000" + }, + "0xe91ac72a568e752eb7c9f5235100586ce97c8cc1": { + "balance": "1000000000000000000000000000000" + }, + "0xf184c8c243a178c1748a0af45caedeca476105b4": { + "balance": "1000000000000000000000000000000" + }, + "0xf1a5912ff318aebf312cdb54c75642a9e632703c": { + "balance": "1000000000000000000000000000000" + }, + "0xf2197b153b4c9086fc5410431fbf7960d284c65e": { + "balance": "1000000000000000000000000000000" + }, + "0xf36620e71327f4a55d550d46e030ccf0c728f154": { + "balance": "1000000000000000000000000000000" + }, + "0xf9817fB82fc767aA9A4A97a1901676244b88ce0E": { + "balance": "100000000000000000000000" + }, + "0xfa723938fa8da1a8a2114ad409a11581761ee40d": { + "balance": "1000000000000000000000000000000" + }, + "0xfa7a8c69810eaf16a395d2a93b3ab51efeed2a1c": { + "balance": "1000000000000000000000000000000" + }, + "0xfaa1038074941571524934ba52d312e88b3577f5": { + "balance": "1000000000000000000000000000000" + }, + "0xfe14077c26a507496b7208384d459e21c49c4212": { + "balance": "1000000000000000000000000000000" + }, + "0xfe275c9b5ac792327da509b27eb9614196dfb07d": { + "balance": "1000000000000000000000000000000" + }, + "0xfe2c5aa110fff89361806ea7ee080bfffba0d3dd": { + "balance": "1000000000000000000000000000000" + }, + "0xfe3d4f1fc038f4f756ba44995129cd45c9e0e861": { + "balance": "1000000000000000000000000000000" + }, + "0xfee314cdc84ecfaa675e41b3559c0101e1eba6b8": { + "balance": "1000000000000000000000000000000" + } + }, + "genesis": { + "author": "0x0000000000000000000000000000000000000001", + "difficulty": "0x0", + "extraData": "0x11bbe8db4e347b4e8c937c1c8370e4b5ed33adb3db69cbdb7a38e1e50b1b82fa", + "gasLimit": "0xFFFFFFFFF", + "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000abc", + "nonce": "0x0000000000000042", + "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "timestamp": "0x00" + }, + "params": { + "EIP150ForkBlock": "0x00", + "EIP158ForkBlock": "0x00", + "accountStartNonce": "0x00", + "blockReward": "0x4563918244F40000", + "byzantiumForkBlock": "0x0", + "chainID": "0x12345", + "constantinopleForkBlock": "0x0", + "daoHardforkBlock": "0x0", + "difficultyBoundDivisor": "0x0800", + "durationLimit": "0x0d", + "externalGasDifficulty": "0x01", + "gasLimitBoundDivisor": "0x0400", + "homesteadForkBlock": "0x0", + "maxGasLimit": "0xFFFFFFFFF", + "maximumExtraDataSize": "0x20", + "minGasLimit": "0xFFFFFFFFF", + "minimumDifficulty": "0x0", + "networkID": "12313219", + "tieBreakingGas": false + }, + "sealEngine": "Ethash", + "skaleConfig": { + "nodeInfo": { + "basePort": 2731, + "bindIP": "0.0.0.0", + "collectionDuration": 10, + "collectionQueueSize": 2, + "db-path": "/tmp/test_eth_16_of_16", + "ecdsaKeyName": "", + "httpRpcPort": 2734, + "httpsRpcPort": 1239, + "logLevel": "info", + "logLevelProposal": "info", + "maxCacheSize": 2000, + "maxOpenLeveldbFiles": 25, + "minCacheSize": 1000, + "nodeID": 1616, + "nodeName": "Node1", + "rotateAfterBlock": 0, + "testSignatures": true, + "transactionQueueSize": 10000, + "wsRpcPort": 2733, + "wssRpcPort": 2738 + }, + "sChain": { + "EIP1559TransactionsPatchTimestamp": 1, + "contractStorageLimit": 10000000000, + "contractStoragePatchTimestamp": 1, + "contractStorageZeroValuePatchTimestamp": 1, + "correctForkInPowPatchTimestamp": 1, + "emptyBlockIntervalMs": 10000, + "fastConsensusPatchTimestamp": 1, + "flexibleDeploymentPatchTimestamp": 1, + "levelDBReopenIntervalMs": 1, + "multiTransactionMode": false, + "nodes": [ + { + "basePort": 1231, + "ip": "127.0.0.1", + "nodeID": 1601, + "publicKey": "", + "schainIndex": 1 + }, + { + "basePort": 1331, + "ip": "127.0.0.1", + "nodeID": 1602, + "publicKey": "", + "schainIndex": 2 + }, + { + "basePort": 1431, + "ip": "127.0.0.1", + "nodeID": 1603, + "publicKey": "", + "schainIndex": 3 + }, + { + "basePort": 1531, + "ip": "127.0.0.1", + "nodeID": 1604, + "publicKey": "", + "schainIndex": 4 + }, + { + "basePort": 1631, + "ip": "127.0.0.1", + "nodeID": 1605, + "publicKey": "", + "schainIndex": 5 + }, + { + "basePort": 1731, + "ip": "127.0.0.1", + "nodeID": 1606, + "publicKey": "", + "schainIndex": 6 + }, + { + "basePort": 1831, + "ip": "127.0.0.1", + "nodeID": 1607, + "publicKey": "", + "schainIndex": 7 + }, + { + "basePort": 1931, + "ip": "127.0.0.1", + "nodeID": 1608, + "publicKey": "", + "schainIndex": 8 + }, + { + "basePort": 2031, + "ip": "127.0.0.1", + "nodeID": 1609, + "publicKey": "", + "schainIndex": 9 + }, + { + "basePort": 2131, + "ip": "127.0.0.1", + "nodeID": 1610, + "publicKey": "", + "schainIndex": 10 + }, + { + "basePort": 2231, + "ip": "127.0.0.1", + "nodeID": 1611, + "publicKey": "", + "schainIndex": 11 + }, + { + "basePort": 2331, + "ip": "127.0.0.1", + "nodeID": 1612, + "publicKey": "", + "schainIndex": 12 + }, + { + "basePort": 2431, + "ip": "127.0.0.1", + "nodeID": 1613, + "publicKey": "", + "schainIndex": 13 + }, + { + "basePort": 2531, + "ip": "127.0.0.1", + "nodeID": 1614, + "publicKey": "", + "schainIndex": 14 + }, + { + "basePort": 2631, + "ip": "127.0.0.1", + "nodeID": 1615, + "publicKey": "", + "schainIndex": 15 + }, + { + "basePort": 2731, + "ip": "127.0.0.1", + "nodeID": 1616, + "publicKey": "", + "schainIndex": 16 + } + ], + "powCheckPatchTimestamp": 1, + "precompiledConfigPatchTimestamp": 1, + "pushZeroPatchTimestamp": 1, + "revertableFSPatchTimestamp": 1, + "schainID": 5, + "schainName": "TestChain", + "schainOwner": "0x907cd0881E50d359bb9Fd120B1A5A143b1C97De6", + "skipInvalidTransactionsPatchTimestamp": 1, + "storageDestructionPatchTimestamp": 1, + "verifyBlsSyncPatchTimestamp": 1, + "verifyDaSigsPatchTimestamp": 1 + } + }, + "unddos": { + "origins": [ + { + "ban_lengthy": 0, + "ban_peak": 0, + "max_calls_per_minute": 1000000000, + "max_calls_per_second": 1000000000, + "max_ws_conn": 65535, + "origin": [ + "*" + ] + } + ] + } +} \ No newline at end of file diff --git a/test/historicstate/configs/test_1_of_1.json b/test/historicstate/configs/test_1_of_1.json new file mode 100644 index 000000000..a31c98d61 --- /dev/null +++ b/test/historicstate/configs/test_1_of_1.json @@ -0,0 +1,806 @@ +{ + "accounts": { + "0000000000000000000000000000000000000001": { + "precompiled": { + "linear": { + "base": 3000, + "word": 0 + }, + "name": "ecrecover" + } + }, + "0000000000000000000000000000000000000002": { + "precompiled": { + "linear": { + "base": 60, + "word": 12 + }, + "name": "sha256" + } + }, + "0000000000000000000000000000000000000003": { + "precompiled": { + "linear": { + "base": 600, + "word": 120 + }, + "name": "ripemd160" + } + }, + "0000000000000000000000000000000000000004": { + "precompiled": { + "linear": { + "base": 15, + "word": 3 + }, + "name": "identity" + } + }, + "0000000000000000000000000000000000000005": { + "precompiled": { + "name": "modexp", + "startingBlock": "0x2dc6c0" + } + }, + "0000000000000000000000000000000000000006": { + "precompiled": { + "linear": { + "base": 500, + "word": 0 + }, + "name": "alt_bn128_G1_add", + "startingBlock": "0x2dc6c0" + } + }, + "0000000000000000000000000000000000000007": { + "precompiled": { + "linear": { + "base": 40000, + "word": 0 + }, + "name": "alt_bn128_G1_mul", + "startingBlock": "0x2dc6c0" + } + }, + "0000000000000000000000000000000000000008": { + "precompiled": { + "name": "alt_bn128_pairing_product", + "startingBlock": "0x2dc6c0" + } + }, + "000000000000000000000000000000000000000A": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "readChunk", + "startingBlock": "0x0" + } + }, + "000000000000000000000000000000000000000B": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "createFile", + "restrictAccess": [ + "69362535ec535F0643cBf62D16aDeDCAf32Ee6F7" + ], + "startingBlock": "0x0" + } + }, + "000000000000000000000000000000000000000C": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "uploadChunk", + "startingBlock": "0x0" + } + }, + "000000000000000000000000000000000000000D": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "getFileSize", + "startingBlock": "0x0" + } + }, + "000000000000000000000000000000000000000E": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "deleteFile", + "startingBlock": "0x0" + } + }, + "000000000000000000000000000000000000000F": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "createDirectory", + "startingBlock": "0x0" + } + }, + "0000000000000000000000000000000000000010": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "deleteDirectory", + "startingBlock": "0x0" + } + }, + "0x006d8e49ce0b9eb5646e34a4d91934801b9044fd": { + "balance": "1000000000000000000000000000000" + }, + "0x0150b461b06922a5030784ba888962c28bb1f188": { + "balance": "1000000000000000000000000000000" + }, + "0x03309956988ae70152ae4469daf99b0cac2306c5": { + "balance": "1000000000000000000000000000000" + }, + "0x06104a85a380895b6dd4030113806df2b044905e": { + "balance": "1000000000000000000000000000000" + }, + "0x079cf317ef40b16141784b6fabff812d64f7c0fd": { + "balance": "1000000000000000000000000000000" + }, + "0x0966454f51166c68b73b2865473c8fb2fcdefdd5": { + "balance": "1000000000000000000000000000000" + }, + "0x099452fedc71897880f584b1bc1706efc4e76e36": { + "balance": "1000000000000000000000000000000" + }, + "0x0aa6a44690ef52354e976990292cf9c5cd36ad59": { + "balance": "1000000000000000000000000000000" + }, + "0x0fbbe17a0e5a61ee3e8661f442d7f6b177c49820": { + "balance": "1000000000000000000000000000000" + }, + "0x1239fe658b410dbbac5bbd572035f5041542f9e5": { + "balance": "1000000000000000000000000000000" + }, + "0x12d5d7340a93be7be28ea7a3ae198242f8e1282c": { + "balance": "1000000000000000000000000000000" + }, + "0x137048b9fa4f1234d6519271b2c5ec64f480db0f": { + "balance": "1000000000000000000000000000000" + }, + "0x13867af77a63048e17380e39248ada90521e97e4": { + "balance": "1000000000000000000000000000000" + }, + "0x138ea4bdf0382c2deffd5b0bff0afe59f471467f": { + "balance": "1000000000000000000000000000000" + }, + "0x13d19c55ee0a212249d26b9d741ff6d7f416db01": { + "balance": "1000000000000000000000000000000" + }, + "0x157d38b52196b248e9fe6a2172e32ce2b8c078e6": { + "balance": "1000000000000000000000000000000" + }, + "0x16e8c390f8e576161cfe966f2c3e5dd303eb9039": { + "balance": "1000000000000000000000000000000" + }, + "0x194cb9991d3d94c43e400becf21dfea45e7b3b4c": { + "balance": "1000000000000000000000000000000" + }, + "0x1C9abe4ff0CcECa40fc404c74AB7d4923fEF8901": { + "balance": "100000000000000000000000" + }, + "0x1a66fc89809112c20aa76a993db712fa9e003e4e": { + "balance": "1000000000000000000000000000000" + }, + "0x1f1d6041e12a18cf1202019f146f2fc150915e8d": { + "balance": "1000000000000000000000000000000" + }, + "0x1feaf1671c1f0faf0d44c152f72dc755db932569": { + "balance": "1000000000000000000000000000000" + }, + "0x236bf02dfafaf03851a4e6f5d69052f4884cec32": { + "balance": "1000000000000000000000000000000" + }, + "0x26d88f6a8b659be4165ee53774a057e41b5201c9": { + "balance": "1000000000000000000000000000000" + }, + "0x28353685b0b986a724b92113debb3d8cd9a6b263": { + "balance": "1000000000000000000000000000000" + }, + "0x29d83322219fdfb821459d5fdf796360faf3166a": { + "balance": "1000000000000000000000000000000" + }, + "0x2bee474be207bdbeac83d6672da5ed2fd417eac9": { + "balance": "1000000000000000000000000000000" + }, + "0x2d93455b07bccf38e8d019f7f43a2c2d70b46b4e": { + "balance": "1000000000000000000000000000000" + }, + "0x2f971bd38806c3ca45ae0a125d1267118bf5619c": { + "balance": "1000000000000000000000000000000" + }, + "0x30aaab366dfac8331f3e827495c789cde9b437c0": { + "balance": "1000000000000000000000000000000" + }, + "0x32ea0400dc2d20664cc4744b2fab04ecb709445c": { + "balance": "1000000000000000000000000000000" + }, + "0x3760dc9594ccac0f33ade5cc5371402131696341": { + "balance": "1000000000000000000000000000000" + }, + "0x38855e430611bc179cd777a8704679ffc43921de": { + "balance": "1000000000000000000000000000000" + }, + "0x3a921471a2397644c37c88ef9572c421ab37145d": { + "balance": "1000000000000000000000000000000" + }, + "0x3bcca8a8471d55a1a668bc163c0336e4a57e5c99": { + "balance": "1000000000000000000000000000000" + }, + "0x3d46ee560227c1d73cd6042b47fc8fddd8a06ecb": { + "balance": "1000000000000000000000000000000" + }, + "0x3f5bdf5d4c274c82b8d17aa2810b00d2cf050f24": { + "balance": "1000000000000000000000000000000" + }, + "0x3ffe1c9183e0f97f52a816405a7d2350624ec88b": { + "balance": "1000000000000000000000000000000" + }, + "0x426ec5f07847674aada3856609d8baaa16805d88": { + "balance": "1000000000000000000000000000000" + }, + "0x482d7f53cba6ae73a354533673c48e2dfd560949": { + "balance": "1000000000000000000000000000000" + }, + "0x48acbd6a2724eadcc2a11144ab84b6a617d1a241": { + "balance": "1000000000000000000000000000000" + }, + "0x49ef89840e400026eb5c8d79bd1b0adc152fe86d": { + "balance": "1000000000000000000000000000000" + }, + "0x4bf989fa6572af36b190032505506f1db888357f": { + "balance": "1000000000000000000000000000000" + }, + "0x4cf9b195f7cb5f86694d9b399fe21a5f34616fd3": { + "balance": "1000000000000000000000000000000" + }, + "0x4e9b85904bca60aeb5b916ca86ac622096908427": { + "balance": "1000000000000000000000000000000" + }, + "0x50120c17d7b59200e9b76e89e4e3de2f0cd00090": { + "balance": "1000000000000000000000000000000" + }, + "0x54db355342c35085a1a53184162b2fddd0a43b0f": { + "balance": "1000000000000000000000000000000" + }, + "0x54e228d8fea148cfe2b109b3b152ff21321d09a2": { + "balance": "1000000000000000000000000000000" + }, + "0x5667601b7dcde6f24d06bccc4f291cb06976f4ee": { + "balance": "1000000000000000000000000000000" + }, + "0x57829f2ecca390cd9d1c41f92328bad4d1073bbb": { + "balance": "1000000000000000000000000000000" + }, + "0x5EF25557E2ed6AFfF321B266C93e95A0B4B05AbC": { + "balance": "1000000000000000000000000" + }, + "0x5a3adad4382b3eb1e0c65f2de2845901081039b5": { + "balance": "1000000000000000000000000000000" + }, + "0x5cdb7392efdce502ccc6fba5c3c1dd1653967b4d": { + "balance": "1000000000000000000000000000000" + }, + "0x5d012c13b2854bda8b7b6580e97e52751884f827": { + "balance": "1000000000000000000000000000000" + }, + "0x5d9326c6504833d84f8a0d65ded59b1a6e768ca2": { + "balance": "1000000000000000000000000000000" + }, + "0x60268f799d8f1808e4a32c2eb898e73a8881f6f0": { + "balance": "1000000000000000000000000000000" + }, + "0x605ba4a05d779f9869bd9a10234c22f516766cfe": { + "balance": "1000000000000000000000000000000" + }, + "0x6093f0f2a7b5148b71603ac439adbc4c0e5aa5da": { + "balance": "1000000000000000000000000000000" + }, + "0x6196d135CdDb9d73A0756C1E44b5b02B11acf594": { + "balance": "2000000000000000000000", + "code": "", + "nonce": "5076", + "storage": {} + }, + "0x62712ceccb50f62ca4c5402fff6da9c819c866cf": { + "balance": "1000000000000000000000000000000" + }, + "0x62971de462ea1ec0d3b43a6a85b6fb975e6c6f64": { + "balance": "1000000000000000000000000000000" + }, + "0x62cf32dfb9eb6358dc5deb006aef1d75fb153e5f": { + "balance": "1000000000000000000000000000000" + }, + "0x62d8b22c1d71577829b2fee20a5c3fff43aed0ec": { + "balance": "100000000000000000000000" + }, + "0x6314956b78bb2eaed1c49b3ae71d4d0ec501cfab": { + "balance": "1000000000000000000000000000000" + }, + "0x661bda4daeba3ce9ac2aa30b80d463580f90d31a": { + "balance": "1000000000000000000000000000000" + }, + "0x66c5a87f4a49DD75e970055A265E8dd5C3F8f852": { + "balance": "1000000000000000000000" + }, + "0x66cd465ddcd85504c0d2cfb1728acee994d55a3f": { + "balance": "1000000000000000000000000000000" + }, + "0x68bca79ae7aae796027ff843d2303444da5cf5d8": { + "balance": "1000000000000000000000000000000" + }, + "0x6923877b65e24966efa9efd1207822fa2eaf601a": { + "balance": "1000000000000000000000000000000" + }, + "0x69362535ec535F0643cBf62D16aDeDCAf32Ee6F7": { + "balance": "0", + "code": "0x608060405234801561001057600080fd5b50600436106100b45760003560e01c806379210e8e1161007157806379210e8e1461017757806381a8235a146101a757806385aeeb17146101c35780639a9a5593146101f3578063a99100541461020f578063b57321221461022b576100b4565b806307c6e7d3146100b9578063122f4fba146100d55780631c6ec7a9146101055780631cfe4e3b14610121578063373dedb41461013d57806361e46db51461015b575b600080fd5b6100d360048036036100ce9190810190613cff565b61025b565b005b6100ef60048036036100ea9190810190613cff565b610804565b6040516100fc9190614963565b60405180910390f35b61011f600480360361011a9190810190613cff565b610b43565b005b61013b60048036036101369190810190613cc3565b610f72565b005b610145611190565b6040516101529190614cbe565b60405180910390f35b61017560048036036101709190810190613d94565b611199565b005b610191600480360361018c9190810190613e13565b6113f9565b60405161019e9190614924565b60405180910390f35b6101c160048036036101bc9190810190613cff565b6116f9565b005b6101dd60048036036101d89190810190613cff565b61189e565b6040516101ea9190614941565b60405180910390f35b61020d60048036036102089190810190613d40565b611b9d565b005b61022960048036036102249190810190613cff565b61202c565b005b61024560048036036102409190810190613cff565b612682565b6040516102529190614cbe565b60405180910390f35b6000339050606061026b83612902565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b825181101561037c576000826001018460018403815181106102d557fe5b60200260200101516040516102ea91906148cc565b90815260200160405180910390205411610339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161033090614ade565b60405180910390fd5b8160020183600183038151811061034c57fe5b602002602001015160405161036191906148cc565b908152602001604051809103902091508060010190506102b7565b506060600183511161038e57846103a7565b8260018451038151811061039e57fe5b60200260200101515b9050600082600101826040516103bd91906148e3565b9081526020016040518091039020541161040c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161040390614ade565b60405180910390fd5b6000826002018260405161042091906148e3565b90815260200160405180910390206000018054905014610475576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161046c90614b5e565b60405180910390fd5b60006104818587612b02565b9050806104c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ba90614a7e565b60405180910390fd5b6104cb613888565b836000016001856000018054905003815481106104e457fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156105965780601f1061056b57610100808354040283529160200191610596565b820191906000526020600020905b81548152906001019060200180831161057957829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff1660028111156105e257fe5b60028111156105ed57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561066557602002820191906000526020600020906000905b82829054906101000a900460ff1615158152602001906001019060208260000104928301926001038202915080841161062f5790505b505050505081525050905080846000016001866001018660405161068991906148e3565b90815260200160405180910390205403815481106106a357fe5b906000526020600020906005020160008201518160000190805190602001906106cd9291906138c4565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561071c57fe5b0217905550608082015181600401908051906020019061073d929190613944565b50905050836001018360405161075391906148e3565b90815260200160405180910390205484600101826000015160405161077891906148cc565b9081526020016040518091039020819055506000846001018460405161079e91906148e3565b908152602001604051809103902081905550836000018054809190600190036107c791906139ea565b5083600201836040516107da91906148e3565b9081526020016040518091039020600080820160006107f99190613a1c565b505050505050505050565b600080606061081284612b66565b91509150606061082182612902565b90506000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b82518110156109065760008260010184600184038151811061088b57fe5b60200260200101516040516108a091906148cc565b90815260200160405180910390205414156108c357600095505050505050610b3e565b816002018360018303815181106108d657fe5b60200260200101516040516108eb91906148cc565b9081526020016040518091039020915080600101905061086d565b50606060018351116109185783610931565b8260018451038151811061092857fe5b60200260200101515b90506000826001018260405161094791906148e3565b908152602001604051809103902054141561096a57600095505050505050610b3e565b610972613888565b826000016001846001018460405161098a91906148e3565b90815260200160405180910390205403815481106109a457fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610a565780601f10610a2b57610100808354040283529160200191610a56565b820191906000526020600020905b815481529060010190602001808311610a3957829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115610aa257fe5b6002811115610aad57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015610b2557602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411610aef5790505b5050505050815250509050806060015196505050505050505b919050565b600160009054906101000a900460ff16610b85576120006002819055506210000060038190555060018060006101000a81548160ff0219169083151502179055505b6000815111610bc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc090614ade565b60405180910390fd5b60003390506060610bd983612902565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015610cea57600082600101846001840381518110610c4357fe5b6020026020010151604051610c5891906148cc565b90815260200160405180910390205411610ca7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9e90614ade565b60405180910390fd5b81600201836001830381518110610cba57fe5b6020026020010151604051610ccf91906148cc565b90815260200160405180910390209150806001019050610c25565b50600254816000018054905010610d36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2d90614bfe565b60405180910390fd5b60606001835111610d475784610d60565b82600184510381518110610d5757fe5b60200260200101515b905060008260010182604051610d7691906148e3565b90815260200160405180910390205414610dc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbc90614c3e565b60405180910390fd5b610dce81612ee8565b610e0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0490614afe565b60405180910390fd5b6000610e198587612fc9565b905080610e5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e529061499e565b60405180910390fd5b610e63613888565b82816000018190525060008160200190151590811515815250508360000181908060018154018082558091505090600182039060005260206000209060050201600090919290919091506000820151816000019080519060200190610ec99291906138c4565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff02191690836002811115610f1857fe5b02179055506080820151816004019080519060200190610f39929190613944565b5050505083600001805490508460010184604051610f5791906148e3565b90815260200160405180910390208190555050505050505050565b610f7a61302d565b73ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161480610fdf57503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614155b61101e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101590614a5e565b60405180910390fd5b80600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411156110a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109790614b3e565b60405180910390fd5b600054600754820111156110e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e0906149be565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460076000828254039250508190555080600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550806007600082825401925050819055505050565b60008054905090565b600033905060006111aa82866130c6565b9050600160028111156111b957fe5b8160030160009054906101000a900460ff1660028111156111d657fe5b14611216576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120d90614c1e565b60405180910390fd5b6000600354858161122357fe5b061480156112345750806002015484105b611273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126a9061497e565b60405180910390fd5b600354848260020154031080156112905750838160020154038351145b8061129d57506003548351145b6112dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d390614a1e565b60405180910390fd5b600015158160040160035486816112ef57fe5b04815481106112fa57fe5b90600052602060002090602091828204019190069054906101000a900460ff1615151461135c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611353906149fe565b60405180910390fd5b600061136a838787876132c5565b9050806113ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a390614b1e565b60405180910390fd5b60018260040160035487816113bd57fe5b04815481106113c857fe5b90600052602060002090602091828204019190066101000a81548160ff021916908315150217905550505050505050565b611401613a40565b6000606061140e86612b66565b9150915061141a613888565b61142483836130c6565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156114c85780601f1061149d576101008083540402835291602001916114c8565b820191906000526020600020905b8154815290600101906020018083116114ab57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561151457fe5b600281111561151f57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561159757602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116115615790505b50505050508152505090506002808111156115ae57fe5b816060015160028111156115be57fe5b146115fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f590614c9e565b60405180910390fd5b60035485111580156116105750600085115b61164f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164690614a1e565b60405180910390fd5b80604001518587011115611698576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168f9061497e565b60405180910390fd5b60006116a684848989613376565b8096508192505050806116ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e590614b9e565b60405180910390fd5b505050509392505050565b6000339050600061170a82846130c6565b90506001600281111561171957fe5b8160030160009054906101000a900460ff16600281111561173657fe5b14611776576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176d90614c1e565b60405180910390fd5b60006001905060008260040180549050905060008090505b818110156117e157600015158460040182815481106117a957fe5b90600052602060002090602091828204019190069054906101000a900460ff16151514156117d657600092505b80600101905061178e565b5081611822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181990614b7e565b60405180910390fd5b60028360030160006101000a81548160ff0219169083600281111561184357fe5b021790555060006118548587613409565b905080611896576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188d906149de565b60405180910390fd5b505050505050565b6060600060606118ad84612b66565b9150915060606118bc82612902565b90506000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008090505b82518110156119c65760008260010184838151811061192257fe5b602002602001015160405161193791906148cc565b90815260200160405180910390205411611986576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197d90614ade565b60405180910390fd5b8160020183828151811061199657fe5b60200260200101516040516119ab91906148cc565b90815260200160405180910390209150806001019050611907565b5080600001805480602002602001604051908101604052809291908181526020016000905b82821015611b8e57838290600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611aa75780601f10611a7c57610100808354040283529160200191611aa7565b820191906000526020600020905b815481529060010190602001808311611a8a57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115611af357fe5b6002811115611afe57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015611b7657602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411611b405790505b505050505081525050815260200190600101906119eb565b50505050945050505050919050565b600160009054906101000a900460ff16611bdf576120006002819055506210000060038190555060018060006101000a81548160ff0219169083151502179055505b60003390506305f5e100821115611c2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2290614bde565b60405180910390fd5b6060611c3684612902565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015611d4757600082600101846001840381518110611ca057fe5b6020026020010151604051611cb591906148cc565b90815260200160405180910390205411611d04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cfb90614ade565b60405180910390fd5b81600201836001830381518110611d1757fe5b6020026020010151604051611d2c91906148cc565b90815260200160405180910390209150806001019050611c82565b5060606001835111611d595785611d72565b82600184510381518110611d6957fe5b60200260200101515b905060008260010182604051611d8891906148e3565b90815260200160405180910390205414611dd7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dce90614c3e565b60405180910390fd5b611de081612ee8565b611e1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1690614bbe565b60405180910390fd5b6000611e2c85888861346d565b905080611e6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6590614c7e565b60405180910390fd5b6060600354600160035489010381611e8257fe5b04604051908082528060200260200182016040528015611eb15781602001602082028038833980820191505090505b509050836000016040518060a0016040528085815260200160011515815260200189815260200160016002811115611ee557fe5b815260200183815250908060018154018082558091505090600182039060005260206000209060050201600090919290919091506000820151816000019080519060200190611f359291906138c4565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff02191690836002811115611f8457fe5b02179055506080820151816004019080519060200190611fa5929190613944565b5050505083600001805490508460010184604051611fc391906148e3565b90815260200160405180910390208190555086600560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505050505050505050565b6000339050612039613888565b61204382846130c6565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156120e75780601f106120bc576101008083540402835291602001916120e7565b820191906000526020600020905b8154815290600101906020018083116120ca57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561213357fe5b600281111561213e57fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156121b657602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116121805790505b5050505050815250509050600060028111156121ce57fe5b816060015160028111156121de57fe5b141561221f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221690614a3e565b60405180910390fd5b600061222b83856134da565b90508061226d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226490614a9e565b60405180910390fd5b606061227885612902565b90506000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b825181101561231057816002018360018303815181106122e057fe5b60200260200101516040516122f591906148cc565b908152602001604051809103902091508060010190506122c4565b506000600182600101866000015160405161232b91906148cc565b908152602001604051809103902054039050612345613888565b8260000160018460000180549050038154811061235e57fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156124105780601f106123e557610100808354040283529160200191612410565b820191906000526020600020905b8154815290600101906020018083116123f357829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561245c57fe5b600281111561246757fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156124df57602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116124a95790505b5050505050815250509050808360000183815481106124fa57fe5b906000526020600020906005020160008201518160000190805190602001906125249291906138c4565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561257357fe5b02179055506080820151816004019080519060200190612594929190613944565b50905050826000018054809190600190036125af91906139ea565b508260010186600001516040516125c691906148cc565b9081526020016040518091039020548360010182600001516040516125eb91906148cc565b908152602001604051809103902081905550600083600101876000015160405161261591906148cc565b9081526020016040518091039020819055508560400151600560008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505050505050505050565b600080606061269084612b66565b9150915061269c613888565b6126a683836130c6565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561274a5780601f1061271f5761010080835404028352916020019161274a565b820191906000526020600020905b81548152906001019060200180831161272d57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561279657fe5b60028111156127a157fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561281957602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116127e35790505b50505050508152505090506001600281111561283157fe5b8160600151600281111561284157fe5b1480612866575060028081111561285457fe5b8160600151600281111561286457fe5b145b6128a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161289c90614c1e565b60405180910390fd5b60006128b1848461353e565b8096508192505050806128f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128f090614c5e565b60405180910390fd5b50505050919050565b606061290c613a65565b612915836135a7565b905061291f613a65565b61295d6040518060400160405280600181526020017f2f000000000000000000000000000000000000000000000000000000000000008152506135a7565b90506060600161297683856135d590919063ffffffff16565b016040519080825280602002602001820160405280156129aa57816020015b60608152602001906001900390816129955790505b50905060008090505b81518110156129fb576129d76129d2848661364a90919063ffffffff16565b613664565b8282815181106129e357fe5b602002602001018190525080806001019150506129b3565b50600081600183510381518110612a0e57fe5b6020026020010151511415612a795780600182510381518110612a2d57fe5b6020026020010160608152506001815103604051908082528060200260200182016040528015612a7157816020015b6060815260200190600190039081612a5c5790505b509350612ab2565b8051604051908082528060200260200182016040528015612aae57816020015b6060815260200190600190039081612a995790505b5093505b60008090505b8451811015612af957818181518110612acd57fe5b6020026020010151858281518110612ae157fe5b60200260200101819052508080600101915050612ab8565b50505050919050565b60008060016020601f85510181612b1557fe5b040190506040518481526020810160005b83811015612b47578060200286015181602002830152806001019050612b26565b50602082602085026040018460006010600019f1935050505092915050565b6000606060006028905080845111612bb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612baa90614abe565b60405180910390fd5b6060816040519080825280601f01601f191660200182016040528015612be85781602001600182028038833980820191505090505b50905060008090505b82811015612c5857858181518110612c0557fe5b602001015160f81c60f81b828281518110612c1c57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050612bf1565b50600080905060008090505b83811015612d87576000838281518110612c7a57fe5b602001015160f81c60f81b60f81c60ff16905060308110158015612c9f575060398111155b80612cb8575060418110158015612cb75750605a8111155b5b80612cd1575060618110158015612cd0575060668111155b5b612d10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d0790614abe565b60405180910390fd5b60308110158015612d22575060398111155b15612d335760308103601084020192505b60418110158015612d455750605a8111155b15612d565760378103601084020192505b60618110158015612d68575060668111155b15612d795760578103601084020192505b508080600101915050612c64565b508094507f2f00000000000000000000000000000000000000000000000000000000000000868481518110612db857fe5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612e25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e1c90614abe565b60405180910390fd5b6000600184885103039050806040519080825280601f01601f191660200182016040528015612e635781602001600182028038833980820191505090505b50945060008090505b81811015612ede5760008860018784010181518110612e8757fe5b602001015160f81c60f81b905080878381518110612ea157fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350508080600101915050612e6c565b5050505050915091565b6000604051602001612ef99061490f565b6040516020818303038152906040528051906020012082604051602001612f2091906148e3565b604051602081830303815290604052805190602001201480612f8b5750604051602001612f4c906148fa565b6040516020818303038152906040528051906020012082604051602001612f7391906148e3565b60405160208183030381529060405280519060200120145b80612f97575060008251145b15612fa55760009050612fc4565b60008251905060ff811115612fbe576000915050612fc4565b60019150505b919050565b60008060016020601f85510181612fdc57fe5b040190506040518481526020810160005b8381101561300e578060200286015181602002830152806001019050612fed565b5060208260208502604001846000600f600019f1935050505092915050565b600073d2001000000000000000000000000000000000d273ffffffffffffffffffffffffffffffffffffffff166383e781fe6040518163ffffffff1660e01b815260040160206040518083038186803b15801561308957600080fd5b505afa15801561309d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506130c19190810190613c9a565b905090565b600060606130d383612902565b90506000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b82518110156131e45760008260010184600184038151811061313d57fe5b602002602001015160405161315291906148cc565b908152602001604051809103902054116131a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161319890614ade565b60405180910390fd5b816002018360018303815181106131b457fe5b60200260200101516040516131c991906148cc565b9081526020016040518091039020915080600101905061311f565b50606060018351116131f6578461320f565b8260018451038151811061320657fe5b60200260200101515b90506000826001018260405161322591906148e3565b90815260200160405180910390205411613274576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161326b90614ade565b60405180910390fd5b6000826000016001846001018460405161328e91906148e3565b90815260200160405180910390205403815481106132a857fe5b906000526020600020906005020190508094505050505092915050565b60008060016020601f855101816132d857fe5b04019050600060016020601f885101816132ee57fe5b040190506040518781526020810160005b838110156133205780602002890151816020028301528060010190506132ff565b50868360200282015260005b84811015613352578060200287015181856001010160200283015280600101905061332c565b50602082848601602002606001846000600c600019f1945050505050949350505050565b6000613380613a40565b600060016020601f8851018161339257fe5b0401905060006020601f8601816133a557fe5b0490506040518881526020810160005b848110156133d657806020028a0151816020028301528060010190506133b5565b5083602002810188815287816020015283602002868660030160200285600a600019fa9650505050505094509492505050565b60008060016020601f8551018161341c57fe5b040190506040518481526020810160005b8381101561344e57806020028601518160200283015280600101905061342d565b50602082602085026040018460006011600019f1935050505092915050565b60008060016020601f8651018161348057fe5b040190506040518581526020810160005b838110156134b2578060200287015181602002830152806001019050613491565b50846020840282015260208260208502604001846000600b600019f193505050509392505050565b60008060016020601f855101816134ed57fe5b040190506040518481526020810160005b8381101561351f5780602002860151816020028301528060010190506134fe565b5060208260208502604001846000600e600019f1935050505092915050565b600080600060016020601f8651018161355357fe5b040190506040518581526020810160005b83811015613585578060200287015181602002830152806001019050613564565b506020826020850260200184600d600019fa9450815193505050509250929050565b6135af613a65565b600060208301905060405180604001604052808451815260200182815250915050919050565b60008082600001516135f985600001518660200151866000015187602001516136c6565b0190505b83600001518460200151018111613643578180600101925050826000015161363b8560200151830386600001510383866000015187602001516136c6565b0190506135fd565b5092915050565b613652613a65565b61365d8383836137a1565b5092915050565b60608082600001516040519080825280601f01601f19166020018201604052801561369e5781602001600182028038833980820191505090505b50905060006020820190506136bc818560200151866000015161383f565b8192505050919050565b6000808490506000868511613791576020851161374b57600060018660200360080260020a031960001b905060008186511690506000878a8a0103905060008386511690505b82811461373d5781861061372a578a8a019650505050505050613799565b858060010196505083865116905061370c565b859650505050505050613799565b60008585209050600091505b858803821161378f57600086842090508082141561377b5783945050505050613799565b600184019350508180600101925050613757565b505b868601925050505b949350505050565b6137a9613a65565b60006137c785600001518660200151866000015187602001516136c6565b90508460200151836020018181525050846020015181038360000181815250508460000151856020015101811415613809576000856000018181525050613834565b8360000151836000015101856000018181510391508181525050836000015181018560200181815250505b829150509392505050565b5b602081106138635781518352602083019250602082019150602081039050613840565b60006001826020036101000a0390508019835116818551168181178652505050505050565b6040518060a001604052806060815260200160001515815260200160008152602001600060028111156138b757fe5b8152602001606081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061390557805160ff1916838001178555613933565b82800160010185558215613933579182015b82811115613932578251825591602001919060010190613917565b5b5090506139409190613a7f565b5090565b82805482825590600052602060002090601f016020900481019282156139d95791602002820160005b838211156139aa57835183826101000a81548160ff021916908315150217905550926020019260010160208160000104928301926001030261396d565b80156139d75782816101000a81549060ff02191690556001016020816000010492830192600103026139aa565b505b5090506139e69190613aa4565b5090565b815481835581811115613a1757600502816005028360005260206000209182019101613a169190613ad4565b5b505050565b5080546000825560050290600052602060002090810190613a3d9190613ad4565b50565b6040518062100000016040528061800090602082028038833980820191505090505090565b604051806040016040528060008152602001600081525090565b613aa191905b80821115613a9d576000816000905550600101613a85565b5090565b90565b613ad191905b80821115613acd57600081816101000a81549060ff021916905550600101613aaa565b5090565b90565b613b4091905b80821115613b3c5760008082016000613af39190613b43565b6001820160006101000a81549060ff021916905560028201600090556003820160006101000a81549060ff0219169055600482016000613b339190613b8b565b50600501613ada565b5090565b90565b50805460018160011615610100020316600290046000825580601f10613b695750613b88565b601f016020900490600052602060002090810190613b879190613a7f565b5b50565b50805460008255601f016020900490600052602060002090810190613bb09190613a7f565b50565b600081359050613bc281614f18565b92915050565b600081519050613bd781614f18565b92915050565b600082601f830112613bee57600080fd5b8135613c01613bfc82614d06565b614cd9565b91508082526020830160208301858383011115613c1d57600080fd5b613c28838284614eb8565b50505092915050565b600082601f830112613c4257600080fd5b8135613c55613c5082614d32565b614cd9565b91508082526020830160208301858383011115613c7157600080fd5b613c7c838284614eb8565b50505092915050565b600081359050613c9481614f2f565b92915050565b600060208284031215613cac57600080fd5b6000613cba84828501613bc8565b91505092915050565b60008060408385031215613cd657600080fd5b6000613ce485828601613bb3565b9250506020613cf585828601613c85565b9150509250929050565b600060208284031215613d1157600080fd5b600082013567ffffffffffffffff811115613d2b57600080fd5b613d3784828501613c31565b91505092915050565b60008060408385031215613d5357600080fd5b600083013567ffffffffffffffff811115613d6d57600080fd5b613d7985828601613c31565b9250506020613d8a85828601613c85565b9150509250929050565b600080600060608486031215613da957600080fd5b600084013567ffffffffffffffff811115613dc357600080fd5b613dcf86828701613c31565b9350506020613de086828701613c85565b925050604084013567ffffffffffffffff811115613dfd57600080fd5b613e0986828701613bdd565b9150509250925092565b600080600060608486031215613e2857600080fd5b600084013567ffffffffffffffff811115613e4257600080fd5b613e4e86828701613c31565b9350506020613e5f86828701613c85565b9250506040613e7086828701613c85565b9150509250925092565b6000613e868383613fe8565b60208301905092915050565b6000613e9e8383613ff7565b60208301905092915050565b6000613eb68383614831565b905092915050565b6000613ec982614d88565b613ed38185614de7565b9350613ede83614d5e565b8060005b83811015613f0f578151613ef68882613e7a565b9750613f0183614dc0565b925050600181019050613ee2565b5085935050505092915050565b613f2581614d93565b613f2f8184614df8565b9250613f3a82614d6e565b8060005b83811015613f6b578151613f528782613e92565b9650613f5d83614dcd565b925050600181019050613f3e565b505050505050565b6000613f7e82614d9f565b613f888185614e03565b935083602082028501613f9a85614d78565b8060005b85811015613fd65784840389528151613fb78582613eaa565b9450613fc283614dda565b925060208a01995050600181019050613f9e565b50829750879550505050505092915050565b613ff181614e53565b82525050565b61400081614e5f565b82525050565b61400f81614ea6565b82525050565b61401e81614ea6565b82525050565b600061402f82614db5565b6140398185614e36565b9350614049818560208601614ec7565b80840191505092915050565b600061406082614daa565b61406a8185614e14565b935061407a818560208601614ec7565b61408381614efa565b840191505092915050565b600061409982614daa565b6140a38185614e36565b93506140b3818560208601614ec7565b80840191505092915050565b60006140cc601883614e25565b91507f496e636f7272656374206368756e6b20706f736974696f6e00000000000000006000830152602082019050919050565b600061410c601583614e25565b91507f4469726563746f7279206e6f74206372656174656400000000000000000000006000830152602082019050919050565b600061414c602483614e25565b91507f4e6f7420656e6f756768206d656d6f727920696e207468652046696c6573746f60008301527f72616765000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006141b2601b83614e25565b91507f48617368206861736e2774206265656e2063616c63756c6174656400000000006000830152602082019050919050565b60006141f2601983614e25565b91507f4368756e6b20697320616c72656164792075706c6f61646564000000000000006000830152602082019050919050565b6000614232601683614e25565b91507f496e636f7272656374206368756e6b206c656e677468000000000000000000006000830152602082019050919050565b6000614272600f83614e25565b91507f46696c65206e6f742065786973747300000000000000000000000000000000006000830152602082019050919050565b60006142b2600e83614e25565b91507f496e76616c69642073656e6465720000000000000000000000000000000000006000830152602082019050919050565b60006142f2601883614e25565b91507f4469726563746f7279206973206e6f742064656c6574656400000000000000006000830152602082019050919050565b6000614332601083614e25565b91507f46696c65206e6f742064656c65746564000000000000000000000000000000006000830152602082019050919050565b6000614372601383614e25565b91507f496e76616c69642073746f7261676550617468000000000000000000000000006000830152602082019050919050565b60006143b2600c83614e25565b91507f496e76616c6964207061746800000000000000000000000000000000000000006000830152602082019050919050565b60006143f2600183614e36565b91507f2e000000000000000000000000000000000000000000000000000000000000006000830152600182019050919050565b6000614432601683614e25565b91507f496e76616c6964206469726563746f7279206e616d65000000000000000000006000830152602082019050919050565b6000614472601583614e25565b91507f4368756e6b207761736e27742075706c6f6164656400000000000000000000006000830152602082019050919050565b60006144b2602683614e25565b91507f436f756c64206e6f742072657365727665206c657373207468616e207573656460008301527f20737061636500000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614518601683614e25565b91507f4469726563746f7279206973206e6f7420656d707479000000000000000000006000830152602082019050919050565b6000614558602383614e25565b91507f46696c65206861736e2774206265656e2075706c6f6164656420636f7272656360008301527f746c7900000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006145be601183614e25565b91507f4368756e6b207761736e277420726561640000000000000000000000000000006000830152602082019050919050565b60006145fe601883614e25565b91507f46696c656e616d652073686f756c64206265203c2032353600000000000000006000830152602082019050919050565b600061463e601f83614e25565b91507f46696c652073686f756c64206265206c657373207468616e20313030204d42006000830152602082019050919050565b600061467e600283614e36565b91507f2e2e0000000000000000000000000000000000000000000000000000000000006000830152600282019050919050565b60006146be601183614e25565b91507f4469726563746f72792069732066756c6c0000000000000000000000000000006000830152602082019050919050565b60006146fe600e83614e25565b91507f46696c65206e6f7420666f756e640000000000000000000000000000000000006000830152602082019050919050565b600061473e601883614e25565b91507f46696c65206f72206469726563746f72792065786973747300000000000000006000830152602082019050919050565b600061477e601883614e25565b91507f45564d206572726f7220696e2067657446696c6553697a6500000000000000006000830152602082019050919050565b60006147be601083614e25565b91507f46696c65206e6f742063726561746564000000000000000000000000000000006000830152602082019050919050565b60006147fe601983614e25565b91507f46696c65206861736e2774206265656e2075706c6f61646564000000000000006000830152602082019050919050565b600060a083016000830151848203600086015261484e8282614055565b91505060208301516148636020860182613fe8565b50604083015161487660408601826148ae565b5060608301516148896060860182614006565b50608083015184820360808601526148a18282613ebe565b9150508091505092915050565b6148b781614e9c565b82525050565b6148c681614e9c565b82525050565b60006148d8828461408e565b915081905092915050565b60006148ef8284614024565b915081905092915050565b6000614905826143e5565b9150819050919050565b600061491a82614671565b9150819050919050565b6000621000008201905061493b6000830184613f1c565b92915050565b6000602082019050818103600083015261495b8184613f73565b905092915050565b60006020820190506149786000830184614015565b92915050565b60006020820190508181036000830152614997816140bf565b9050919050565b600060208201905081810360008301526149b7816140ff565b9050919050565b600060208201905081810360008301526149d78161413f565b9050919050565b600060208201905081810360008301526149f7816141a5565b9050919050565b60006020820190508181036000830152614a17816141e5565b9050919050565b60006020820190508181036000830152614a3781614225565b9050919050565b60006020820190508181036000830152614a5781614265565b9050919050565b60006020820190508181036000830152614a77816142a5565b9050919050565b60006020820190508181036000830152614a97816142e5565b9050919050565b60006020820190508181036000830152614ab781614325565b9050919050565b60006020820190508181036000830152614ad781614365565b9050919050565b60006020820190508181036000830152614af7816143a5565b9050919050565b60006020820190508181036000830152614b1781614425565b9050919050565b60006020820190508181036000830152614b3781614465565b9050919050565b60006020820190508181036000830152614b57816144a5565b9050919050565b60006020820190508181036000830152614b778161450b565b9050919050565b60006020820190508181036000830152614b978161454b565b9050919050565b60006020820190508181036000830152614bb7816145b1565b9050919050565b60006020820190508181036000830152614bd7816145f1565b9050919050565b60006020820190508181036000830152614bf781614631565b9050919050565b60006020820190508181036000830152614c17816146b1565b9050919050565b60006020820190508181036000830152614c37816146f1565b9050919050565b60006020820190508181036000830152614c5781614731565b9050919050565b60006020820190508181036000830152614c7781614771565b9050919050565b60006020820190508181036000830152614c97816147b1565b9050919050565b60006020820190508181036000830152614cb7816147f1565b9050919050565b6000602082019050614cd360008301846148bd565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614cfc57600080fd5b8060405250919050565b600067ffffffffffffffff821115614d1d57600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614d4957600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050919050565b6000819050602082019050919050565b600081519050919050565b60006180009050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614e4c82614e7c565b9050919050565b60008115159050919050565b6000819050919050565b6000819050614e7782614f0b565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000614eb182614e69565b9050919050565b82818337600083830152505050565b60005b83811015614ee5578082015181840152602081019050614eca565b83811115614ef4576000848401525b50505050565b6000601f19601f8301169050919050565b60038110614f1557fe5b50565b614f2181614e41565b8114614f2c57600080fd5b50565b614f3881614e9c565b8114614f4357600080fd5b5056fea365627a7a723158202ae226b25ad72f9cff2d74c6dc7bcfb78530ab1d2438f48a8dab67499b37a8e56c6578706572696d656e74616cf564736f6c634300050d0040", + "nonce": "0", + "storage": { + "0x0": "2868903936" + } + }, + "0x69362535ec535F0643cBf62D16aDeDCAf32Ee6F8": { + "balance": "0", + "code": "0x608060405234801561001057600080fd5b50600436106100b45760003560e01c806379210e8e1161007157806379210e8e1461017757806381a8235a146101a757806385aeeb17146101c35780639a9a5593146101f3578063a99100541461020f578063b57321221461022b576100b4565b806307c6e7d3146100b9578063122f4fba146100d55780631c6ec7a9146101055780631cfe4e3b14610121578063373dedb41461013d57806361e46db51461015b575b600080fd5b6100d360048036036100ce9190810190613e0d565b61025b565b005b6100ef60048036036100ea9190810190613e0d565b610804565b6040516100fc9190614ab1565b60405180910390f35b61011f600480360361011a9190810190613e0d565b610b43565b005b61013b60048036036101369190810190613dd1565b610f72565b005b610145611190565b6040516101529190614e2c565b60405180910390f35b61017560048036036101709190810190613ea2565b611199565b005b610191600480360361018c9190810190613f21565b6113f9565b60405161019e9190614a72565b60405180910390f35b6101c160048036036101bc9190810190613e0d565b6116f9565b005b6101dd60048036036101d89190810190613e0d565b61189e565b6040516101ea9190614a8f565b60405180910390f35b61020d60048036036102089190810190613e4e565b611b9d565b005b61022960048036036102249190810190613e0d565b61213a565b005b61024560048036036102409190810190613e0d565b612790565b6040516102529190614e2c565b60405180910390f35b6000339050606061026b83612a10565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b825181101561037c576000826001018460018403815181106102d557fe5b60200260200101516040516102ea9190614a1a565b90815260200160405180910390205411610339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161033090614c2c565b60405180910390fd5b8160020183600183038151811061034c57fe5b60200260200101516040516103619190614a1a565b908152602001604051809103902091508060010190506102b7565b506060600183511161038e57846103a7565b8260018451038151811061039e57fe5b60200260200101515b9050600082600101826040516103bd9190614a31565b9081526020016040518091039020541161040c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161040390614c2c565b60405180910390fd5b600082600201826040516104209190614a31565b90815260200160405180910390206000018054905014610475576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161046c90614cac565b60405180910390fd5b60006104818587612c10565b9050806104c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ba90614bcc565b60405180910390fd5b6104cb613996565b836000016001856000018054905003815481106104e457fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156105965780601f1061056b57610100808354040283529160200191610596565b820191906000526020600020905b81548152906001019060200180831161057957829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff1660028111156105e257fe5b60028111156105ed57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561066557602002820191906000526020600020906000905b82829054906101000a900460ff1615158152602001906001019060208260000104928301926001038202915080841161062f5790505b50505050508152505090508084600001600186600101866040516106899190614a31565b90815260200160405180910390205403815481106106a357fe5b906000526020600020906005020160008201518160000190805190602001906106cd9291906139d2565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561071c57fe5b0217905550608082015181600401908051906020019061073d929190613a52565b5090505083600101836040516107539190614a31565b9081526020016040518091039020548460010182600001516040516107789190614a1a565b9081526020016040518091039020819055506000846001018460405161079e9190614a31565b908152602001604051809103902081905550836000018054809190600190036107c79190613af8565b5083600201836040516107da9190614a31565b9081526020016040518091039020600080820160006107f99190613b2a565b505050505050505050565b600080606061081284612c74565b91509150606061082182612a10565b90506000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b82518110156109065760008260010184600184038151811061088b57fe5b60200260200101516040516108a09190614a1a565b90815260200160405180910390205414156108c357600095505050505050610b3e565b816002018360018303815181106108d657fe5b60200260200101516040516108eb9190614a1a565b9081526020016040518091039020915080600101905061086d565b50606060018351116109185783610931565b8260018451038151811061092857fe5b60200260200101515b9050600082600101826040516109479190614a31565b908152602001604051809103902054141561096a57600095505050505050610b3e565b610972613996565b826000016001846001018460405161098a9190614a31565b90815260200160405180910390205403815481106109a457fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610a565780601f10610a2b57610100808354040283529160200191610a56565b820191906000526020600020905b815481529060010190602001808311610a3957829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115610aa257fe5b6002811115610aad57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015610b2557602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411610aef5790505b5050505050815250509050806060015196505050505050505b919050565b600160009054906101000a900460ff16610b85576120006002819055506210000060038190555060018060006101000a81548160ff0219169083151502179055505b6000815111610bc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc090614c2c565b60405180910390fd5b60003390506060610bd983612a10565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015610cea57600082600101846001840381518110610c4357fe5b6020026020010151604051610c589190614a1a565b90815260200160405180910390205411610ca7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9e90614c2c565b60405180910390fd5b81600201836001830381518110610cba57fe5b6020026020010151604051610ccf9190614a1a565b90815260200160405180910390209150806001019050610c25565b50600254816000018054905010610d36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2d90614d4c565b60405180910390fd5b60606001835111610d475784610d60565b82600184510381518110610d5757fe5b60200260200101515b905060008260010182604051610d769190614a31565b90815260200160405180910390205414610dc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbc90614d8c565b60405180910390fd5b610dce81612ff6565b610e0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0490614c4c565b60405180910390fd5b6000610e1985876130d7565b905080610e5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5290614aec565b60405180910390fd5b610e63613996565b82816000018190525060008160200190151590811515815250508360000181908060018154018082558091505090600182039060005260206000209060050201600090919290919091506000820151816000019080519060200190610ec99291906139d2565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff02191690836002811115610f1857fe5b02179055506080820151816004019080519060200190610f39929190613a52565b5050505083600001805490508460010184604051610f579190614a31565b90815260200160405180910390208190555050505050505050565b610f7a61313b565b73ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161480610fdf57503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614155b61101e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101590614bac565b60405180910390fd5b80600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411156110a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109790614c8c565b60405180910390fd5b600054600754820111156110e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e090614b0c565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460076000828254039250508190555080600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550806007600082825401925050819055505050565b60008054905090565b600033905060006111aa82866131d4565b9050600160028111156111b957fe5b8160030160009054906101000a900460ff1660028111156111d657fe5b14611216576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120d90614d6c565b60405180910390fd5b6000600354858161122357fe5b061480156112345750806002015484105b611273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126a90614acc565b60405180910390fd5b600354848260020154031080156112905750838160020154038351145b8061129d57506003548351145b6112dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d390614b6c565b60405180910390fd5b600015158160040160035486816112ef57fe5b04815481106112fa57fe5b90600052602060002090602091828204019190069054906101000a900460ff1615151461135c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135390614b4c565b60405180910390fd5b600061136a838787876133d3565b9050806113ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a390614c6c565b60405180910390fd5b60018260040160035487816113bd57fe5b04815481106113c857fe5b90600052602060002090602091828204019190066101000a81548160ff021916908315150217905550505050505050565b611401613b4e565b6000606061140e86612c74565b9150915061141a613996565b61142483836131d4565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156114c85780601f1061149d576101008083540402835291602001916114c8565b820191906000526020600020905b8154815290600101906020018083116114ab57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561151457fe5b600281111561151f57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561159757602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116115615790505b50505050508152505090506002808111156115ae57fe5b816060015160028111156115be57fe5b146115fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f590614e0c565b60405180910390fd5b60035485111580156116105750600085115b61164f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164690614b6c565b60405180910390fd5b80604001518587011115611698576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168f90614acc565b60405180910390fd5b60006116a684848989613484565b8096508192505050806116ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e590614cec565b60405180910390fd5b505050509392505050565b6000339050600061170a82846131d4565b90506001600281111561171957fe5b8160030160009054906101000a900460ff16600281111561173657fe5b14611776576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176d90614d6c565b60405180910390fd5b60006001905060008260040180549050905060008090505b818110156117e157600015158460040182815481106117a957fe5b90600052602060002090602091828204019190069054906101000a900460ff16151514156117d657600092505b80600101905061178e565b5081611822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181990614ccc565b60405180910390fd5b60028360030160006101000a81548160ff0219169083600281111561184357fe5b021790555060006118548587613517565b905080611896576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188d90614b2c565b60405180910390fd5b505050505050565b6060600060606118ad84612c74565b9150915060606118bc82612a10565b90506000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008090505b82518110156119c65760008260010184838151811061192257fe5b60200260200101516040516119379190614a1a565b90815260200160405180910390205411611986576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197d90614c2c565b60405180910390fd5b8160020183828151811061199657fe5b60200260200101516040516119ab9190614a1a565b90815260200160405180910390209150806001019050611907565b5080600001805480602002602001604051908101604052809291908181526020016000905b82821015611b8e57838290600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611aa75780601f10611a7c57610100808354040283529160200191611aa7565b820191906000526020600020905b815481529060010190602001808311611a8a57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115611af357fe5b6002811115611afe57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015611b7657602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411611b405790505b505050505081525050815260200190600101906119eb565b50505050945050505050919050565b600160009054906101000a900460ff16611bdf576120006002819055506210000060038190555060018060006101000a81548160ff0219169083151502179055505b60003390506305f5e100821115611c2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2290614d2c565b60405180910390fd5b600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205483011115611cee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce590614dac565b60405180910390fd5b6060611cf984612a10565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015611e0a57600082600101846001840381518110611d6357fe5b6020026020010151604051611d789190614a1a565b90815260200160405180910390205411611dc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dbe90614c2c565b60405180910390fd5b81600201836001830381518110611dda57fe5b6020026020010151604051611def9190614a1a565b90815260200160405180910390209150806001019050611d45565b50600254816000018054905010611e56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4d90614d4c565b60405180910390fd5b60606001835111611e675785611e80565b82600184510381518110611e7757fe5b60200260200101515b905060008260010182604051611e969190614a31565b90815260200160405180910390205414611ee5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611edc90614d8c565b60405180910390fd5b611eee81612ff6565b611f2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2490614d0c565b60405180910390fd5b6000611f3a85888861357b565b905080611f7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7390614dec565b60405180910390fd5b6060600354600160035489010381611f9057fe5b04604051908082528060200260200182016040528015611fbf5781602001602082028038833980820191505090505b509050836000016040518060a0016040528085815260200160011515815260200189815260200160016002811115611ff357fe5b8152602001838152509080600181540180825580915050906001820390600052602060002090600502016000909192909190915060008201518160000190805190602001906120439291906139d2565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561209257fe5b021790555060808201518160040190805190602001906120b3929190613a52565b50505050836000018054905084600101846040516120d19190614a31565b90815260200160405180910390208190555086600560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505050505050505050565b6000339050612147613996565b61215182846131d4565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156121f55780601f106121ca576101008083540402835291602001916121f5565b820191906000526020600020905b8154815290600101906020018083116121d857829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561224157fe5b600281111561224c57fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156122c457602002820191906000526020600020906000905b82829054906101000a900460ff1615158152602001906001019060208260000104928301926001038202915080841161228e5790505b5050505050815250509050600060028111156122dc57fe5b816060015160028111156122ec57fe5b141561232d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232490614b8c565b60405180910390fd5b600061233983856135e8565b90508061237b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161237290614bec565b60405180910390fd5b606061238685612a10565b90506000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b825181101561241e57816002018360018303815181106123ee57fe5b60200260200101516040516124039190614a1a565b908152602001604051809103902091508060010190506123d2565b50600060018260010186600001516040516124399190614a1a565b908152602001604051809103902054039050612453613996565b8260000160018460000180549050038154811061246c57fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561251e5780601f106124f35761010080835404028352916020019161251e565b820191906000526020600020905b81548152906001019060200180831161250157829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561256a57fe5b600281111561257557fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156125ed57602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116125b75790505b50505050508152505090508083600001838154811061260857fe5b906000526020600020906005020160008201518160000190805190602001906126329291906139d2565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561268157fe5b021790555060808201518160040190805190602001906126a2929190613a52565b50905050826000018054809190600190036126bd9190613af8565b508260010186600001516040516126d49190614a1a565b9081526020016040518091039020548360010182600001516040516126f99190614a1a565b90815260200160405180910390208190555060008360010187600001516040516127239190614a1a565b9081526020016040518091039020819055508560400151600560008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505050505050505050565b600080606061279e84612c74565b915091506127aa613996565b6127b483836131d4565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156128585780601f1061282d57610100808354040283529160200191612858565b820191906000526020600020905b81548152906001019060200180831161283b57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff1660028111156128a457fe5b60028111156128af57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561292757602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116128f15790505b50505050508152505090506001600281111561293f57fe5b8160600151600281111561294f57fe5b1480612974575060028081111561296257fe5b8160600151600281111561297257fe5b145b6129b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129aa90614d6c565b60405180910390fd5b60006129bf848461364c565b809650819250505080612a07576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129fe90614dcc565b60405180910390fd5b50505050919050565b6060612a1a613b73565b612a23836136b5565b9050612a2d613b73565b612a6b6040518060400160405280600181526020017f2f000000000000000000000000000000000000000000000000000000000000008152506136b5565b905060606001612a8483856136e390919063ffffffff16565b01604051908082528060200260200182016040528015612ab857816020015b6060815260200190600190039081612aa35790505b50905060008090505b8151811015612b0957612ae5612ae0848661375890919063ffffffff16565b613772565b828281518110612af157fe5b60200260200101819052508080600101915050612ac1565b50600081600183510381518110612b1c57fe5b6020026020010151511415612b875780600182510381518110612b3b57fe5b6020026020010160608152506001815103604051908082528060200260200182016040528015612b7f57816020015b6060815260200190600190039081612b6a5790505b509350612bc0565b8051604051908082528060200260200182016040528015612bbc57816020015b6060815260200190600190039081612ba75790505b5093505b60008090505b8451811015612c0757818181518110612bdb57fe5b6020026020010151858281518110612bef57fe5b60200260200101819052508080600101915050612bc6565b50505050919050565b60008060016020601f85510181612c2357fe5b040190506040518481526020810160005b83811015612c55578060200286015181602002830152806001019050612c34565b50602082602085026040018460006010600019f1935050505092915050565b6000606060006028905080845111612cc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cb890614c0c565b60405180910390fd5b6060816040519080825280601f01601f191660200182016040528015612cf65781602001600182028038833980820191505090505b50905060008090505b82811015612d6657858181518110612d1357fe5b602001015160f81c60f81b828281518110612d2a57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050612cff565b50600080905060008090505b83811015612e95576000838281518110612d8857fe5b602001015160f81c60f81b60f81c60ff16905060308110158015612dad575060398111155b80612dc6575060418110158015612dc55750605a8111155b5b80612ddf575060618110158015612dde575060668111155b5b612e1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e1590614c0c565b60405180910390fd5b60308110158015612e30575060398111155b15612e415760308103601084020192505b60418110158015612e535750605a8111155b15612e645760378103601084020192505b60618110158015612e76575060668111155b15612e875760578103601084020192505b508080600101915050612d72565b508094507f2f00000000000000000000000000000000000000000000000000000000000000868481518110612ec657fe5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612f33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f2a90614c0c565b60405180910390fd5b6000600184885103039050806040519080825280601f01601f191660200182016040528015612f715781602001600182028038833980820191505090505b50945060008090505b81811015612fec5760008860018784010181518110612f9557fe5b602001015160f81c60f81b905080878381518110612faf57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350508080600101915050612f7a565b5050505050915091565b600060405160200161300790614a5d565b604051602081830303815290604052805190602001208260405160200161302e9190614a31565b604051602081830303815290604052805190602001201480613099575060405160200161305a90614a48565b60405160208183030381529060405280519060200120826040516020016130819190614a31565b60405160208183030381529060405280519060200120145b806130a5575060008251145b156130b357600090506130d2565b60008251905060ff8111156130cc5760009150506130d2565b60019150505b919050565b60008060016020601f855101816130ea57fe5b040190506040518481526020810160005b8381101561311c5780602002860151816020028301528060010190506130fb565b5060208260208502604001846000600f600019f1935050505092915050565b600073d2001000000000000000000000000000000000d273ffffffffffffffffffffffffffffffffffffffff166383e781fe6040518163ffffffff1660e01b815260040160206040518083038186803b15801561319757600080fd5b505afa1580156131ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506131cf9190810190613da8565b905090565b600060606131e183612a10565b90506000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b82518110156132f25760008260010184600184038151811061324b57fe5b60200260200101516040516132609190614a1a565b908152602001604051809103902054116132af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132a690614c2c565b60405180910390fd5b816002018360018303815181106132c257fe5b60200260200101516040516132d79190614a1a565b9081526020016040518091039020915080600101905061322d565b5060606001835111613304578461331d565b8260018451038151811061331457fe5b60200260200101515b9050600082600101826040516133339190614a31565b90815260200160405180910390205411613382576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161337990614c2c565b60405180910390fd5b6000826000016001846001018460405161339c9190614a31565b90815260200160405180910390205403815481106133b657fe5b906000526020600020906005020190508094505050505092915050565b60008060016020601f855101816133e657fe5b04019050600060016020601f885101816133fc57fe5b040190506040518781526020810160005b8381101561342e57806020028901518160200283015280600101905061340d565b50868360200282015260005b84811015613460578060200287015181856001010160200283015280600101905061343a565b50602082848601602002606001846000600c600019f1945050505050949350505050565b600061348e613b4e565b600060016020601f885101816134a057fe5b0401905060006020601f8601816134b357fe5b0490506040518881526020810160005b848110156134e457806020028a0151816020028301528060010190506134c3565b5083602002810188815287816020015283602002868660030160200285600a600019fa9650505050505094509492505050565b60008060016020601f8551018161352a57fe5b040190506040518481526020810160005b8381101561355c57806020028601518160200283015280600101905061353b565b50602082602085026040018460006011600019f1935050505092915050565b60008060016020601f8651018161358e57fe5b040190506040518581526020810160005b838110156135c057806020028701518160200283015280600101905061359f565b50846020840282015260208260208502604001846000600b600019f193505050509392505050565b60008060016020601f855101816135fb57fe5b040190506040518481526020810160005b8381101561362d57806020028601518160200283015280600101905061360c565b5060208260208502604001846000600e600019f1935050505092915050565b600080600060016020601f8651018161366157fe5b040190506040518581526020810160005b83811015613693578060200287015181602002830152806001019050613672565b506020826020850260200184600d600019fa9450815193505050509250929050565b6136bd613b73565b600060208301905060405180604001604052808451815260200182815250915050919050565b600080826000015161370785600001518660200151866000015187602001516137d4565b0190505b8360000151846020015101811161375157818060010192505082600001516137498560200151830386600001510383866000015187602001516137d4565b01905061370b565b5092915050565b613760613b73565b61376b8383836138af565b5092915050565b60608082600001516040519080825280601f01601f1916602001820160405280156137ac5781602001600182028038833980820191505090505b50905060006020820190506137ca818560200151866000015161394d565b8192505050919050565b600080849050600086851161389f576020851161385957600060018660200360080260020a031960001b905060008186511690506000878a8a0103905060008386511690505b82811461384b57818610613838578a8a0196505050505050506138a7565b858060010196505083865116905061381a565b8596505050505050506138a7565b60008585209050600091505b858803821161389d57600086842090508082141561388957839450505050506138a7565b600184019350508180600101925050613865565b505b868601925050505b949350505050565b6138b7613b73565b60006138d585600001518660200151866000015187602001516137d4565b90508460200151836020018181525050846020015181038360000181815250508460000151856020015101811415613917576000856000018181525050613942565b8360000151836000015101856000018181510391508181525050836000015181018560200181815250505b829150509392505050565b5b60208110613971578151835260208301925060208201915060208103905061394e565b60006001826020036101000a0390508019835116818551168181178652505050505050565b6040518060a001604052806060815260200160001515815260200160008152602001600060028111156139c557fe5b8152602001606081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613a1357805160ff1916838001178555613a41565b82800160010185558215613a41579182015b82811115613a40578251825591602001919060010190613a25565b5b509050613a4e9190613b8d565b5090565b82805482825590600052602060002090601f01602090048101928215613ae75791602002820160005b83821115613ab857835183826101000a81548160ff0219169083151502179055509260200192600101602081600001049283019260010302613a7b565b8015613ae55782816101000a81549060ff0219169055600101602081600001049283019260010302613ab8565b505b509050613af49190613bb2565b5090565b815481835581811115613b2557600502816005028360005260206000209182019101613b249190613be2565b5b505050565b5080546000825560050290600052602060002090810190613b4b9190613be2565b50565b6040518062100000016040528061800090602082028038833980820191505090505090565b604051806040016040528060008152602001600081525090565b613baf91905b80821115613bab576000816000905550600101613b93565b5090565b90565b613bdf91905b80821115613bdb57600081816101000a81549060ff021916905550600101613bb8565b5090565b90565b613c4e91905b80821115613c4a5760008082016000613c019190613c51565b6001820160006101000a81549060ff021916905560028201600090556003820160006101000a81549060ff0219169055600482016000613c419190613c99565b50600501613be8565b5090565b90565b50805460018160011615610100020316600290046000825580601f10613c775750613c96565b601f016020900490600052602060002090810190613c959190613b8d565b5b50565b50805460008255601f016020900490600052602060002090810190613cbe9190613b8d565b50565b600081359050613cd081615086565b92915050565b600081519050613ce581615086565b92915050565b600082601f830112613cfc57600080fd5b8135613d0f613d0a82614e74565b614e47565b91508082526020830160208301858383011115613d2b57600080fd5b613d36838284615026565b50505092915050565b600082601f830112613d5057600080fd5b8135613d63613d5e82614ea0565b614e47565b91508082526020830160208301858383011115613d7f57600080fd5b613d8a838284615026565b50505092915050565b600081359050613da28161509d565b92915050565b600060208284031215613dba57600080fd5b6000613dc884828501613cd6565b91505092915050565b60008060408385031215613de457600080fd5b6000613df285828601613cc1565b9250506020613e0385828601613d93565b9150509250929050565b600060208284031215613e1f57600080fd5b600082013567ffffffffffffffff811115613e3957600080fd5b613e4584828501613d3f565b91505092915050565b60008060408385031215613e6157600080fd5b600083013567ffffffffffffffff811115613e7b57600080fd5b613e8785828601613d3f565b9250506020613e9885828601613d93565b9150509250929050565b600080600060608486031215613eb757600080fd5b600084013567ffffffffffffffff811115613ed157600080fd5b613edd86828701613d3f565b9350506020613eee86828701613d93565b925050604084013567ffffffffffffffff811115613f0b57600080fd5b613f1786828701613ceb565b9150509250925092565b600080600060608486031215613f3657600080fd5b600084013567ffffffffffffffff811115613f5057600080fd5b613f5c86828701613d3f565b9350506020613f6d86828701613d93565b9250506040613f7e86828701613d93565b9150509250925092565b6000613f9483836140f6565b60208301905092915050565b6000613fac8383614105565b60208301905092915050565b6000613fc4838361497f565b905092915050565b6000613fd782614ef6565b613fe18185614f55565b9350613fec83614ecc565b8060005b8381101561401d5781516140048882613f88565b975061400f83614f2e565b925050600181019050613ff0565b5085935050505092915050565b61403381614f01565b61403d8184614f66565b925061404882614edc565b8060005b838110156140795781516140608782613fa0565b965061406b83614f3b565b92505060018101905061404c565b505050505050565b600061408c82614f0d565b6140968185614f71565b9350836020820285016140a885614ee6565b8060005b858110156140e457848403895281516140c58582613fb8565b94506140d083614f48565b925060208a019950506001810190506140ac565b50829750879550505050505092915050565b6140ff81614fc1565b82525050565b61410e81614fcd565b82525050565b61411d81615014565b82525050565b61412c81615014565b82525050565b600061413d82614f23565b6141478185614fa4565b9350614157818560208601615035565b80840191505092915050565b600061416e82614f18565b6141788185614f82565b9350614188818560208601615035565b61419181615068565b840191505092915050565b60006141a782614f18565b6141b18185614fa4565b93506141c1818560208601615035565b80840191505092915050565b60006141da601883614f93565b91507f496e636f7272656374206368756e6b20706f736974696f6e00000000000000006000830152602082019050919050565b600061421a601583614f93565b91507f4469726563746f7279206e6f74206372656174656400000000000000000000006000830152602082019050919050565b600061425a602483614f93565b91507f4e6f7420656e6f756768206d656d6f727920696e207468652046696c6573746f60008301527f72616765000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006142c0601b83614f93565b91507f48617368206861736e2774206265656e2063616c63756c6174656400000000006000830152602082019050919050565b6000614300601983614f93565b91507f4368756e6b20697320616c72656164792075706c6f61646564000000000000006000830152602082019050919050565b6000614340601683614f93565b91507f496e636f7272656374206368756e6b206c656e677468000000000000000000006000830152602082019050919050565b6000614380600f83614f93565b91507f46696c65206e6f742065786973747300000000000000000000000000000000006000830152602082019050919050565b60006143c0600e83614f93565b91507f496e76616c69642073656e6465720000000000000000000000000000000000006000830152602082019050919050565b6000614400601883614f93565b91507f4469726563746f7279206973206e6f742064656c6574656400000000000000006000830152602082019050919050565b6000614440601083614f93565b91507f46696c65206e6f742064656c65746564000000000000000000000000000000006000830152602082019050919050565b6000614480601383614f93565b91507f496e76616c69642073746f7261676550617468000000000000000000000000006000830152602082019050919050565b60006144c0600c83614f93565b91507f496e76616c6964207061746800000000000000000000000000000000000000006000830152602082019050919050565b6000614500600183614fa4565b91507f2e000000000000000000000000000000000000000000000000000000000000006000830152600182019050919050565b6000614540601683614f93565b91507f496e76616c6964206469726563746f7279206e616d65000000000000000000006000830152602082019050919050565b6000614580601583614f93565b91507f4368756e6b207761736e27742075706c6f6164656400000000000000000000006000830152602082019050919050565b60006145c0602683614f93565b91507f436f756c64206e6f742072657365727665206c657373207468616e207573656460008301527f20737061636500000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614626601683614f93565b91507f4469726563746f7279206973206e6f7420656d707479000000000000000000006000830152602082019050919050565b6000614666602383614f93565b91507f46696c65206861736e2774206265656e2075706c6f6164656420636f7272656360008301527f746c7900000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006146cc601183614f93565b91507f4368756e6b207761736e277420726561640000000000000000000000000000006000830152602082019050919050565b600061470c601883614f93565b91507f46696c656e616d652073686f756c64206265203c2032353600000000000000006000830152602082019050919050565b600061474c601f83614f93565b91507f46696c652073686f756c64206265206c657373207468616e20313030204d42006000830152602082019050919050565b600061478c600283614fa4565b91507f2e2e0000000000000000000000000000000000000000000000000000000000006000830152600282019050919050565b60006147cc601183614f93565b91507f4469726563746f72792069732066756c6c0000000000000000000000000000006000830152602082019050919050565b600061480c600e83614f93565b91507f46696c65206e6f7420666f756e640000000000000000000000000000000000006000830152602082019050919050565b600061484c601883614f93565b91507f46696c65206f72206469726563746f72792065786973747300000000000000006000830152602082019050919050565b600061488c601983614f93565b91507f4e6f7420656e6f756768207265736572766564207370616365000000000000006000830152602082019050919050565b60006148cc601883614f93565b91507f45564d206572726f7220696e2067657446696c6553697a6500000000000000006000830152602082019050919050565b600061490c601083614f93565b91507f46696c65206e6f742063726561746564000000000000000000000000000000006000830152602082019050919050565b600061494c601983614f93565b91507f46696c65206861736e2774206265656e2075706c6f61646564000000000000006000830152602082019050919050565b600060a083016000830151848203600086015261499c8282614163565b91505060208301516149b160208601826140f6565b5060408301516149c460408601826149fc565b5060608301516149d76060860182614114565b50608083015184820360808601526149ef8282613fcc565b9150508091505092915050565b614a058161500a565b82525050565b614a148161500a565b82525050565b6000614a26828461419c565b915081905092915050565b6000614a3d8284614132565b915081905092915050565b6000614a53826144f3565b9150819050919050565b6000614a688261477f565b9150819050919050565b60006210000082019050614a89600083018461402a565b92915050565b60006020820190508181036000830152614aa98184614081565b905092915050565b6000602082019050614ac66000830184614123565b92915050565b60006020820190508181036000830152614ae5816141cd565b9050919050565b60006020820190508181036000830152614b058161420d565b9050919050565b60006020820190508181036000830152614b258161424d565b9050919050565b60006020820190508181036000830152614b45816142b3565b9050919050565b60006020820190508181036000830152614b65816142f3565b9050919050565b60006020820190508181036000830152614b8581614333565b9050919050565b60006020820190508181036000830152614ba581614373565b9050919050565b60006020820190508181036000830152614bc5816143b3565b9050919050565b60006020820190508181036000830152614be5816143f3565b9050919050565b60006020820190508181036000830152614c0581614433565b9050919050565b60006020820190508181036000830152614c2581614473565b9050919050565b60006020820190508181036000830152614c45816144b3565b9050919050565b60006020820190508181036000830152614c6581614533565b9050919050565b60006020820190508181036000830152614c8581614573565b9050919050565b60006020820190508181036000830152614ca5816145b3565b9050919050565b60006020820190508181036000830152614cc581614619565b9050919050565b60006020820190508181036000830152614ce581614659565b9050919050565b60006020820190508181036000830152614d05816146bf565b9050919050565b60006020820190508181036000830152614d25816146ff565b9050919050565b60006020820190508181036000830152614d458161473f565b9050919050565b60006020820190508181036000830152614d65816147bf565b9050919050565b60006020820190508181036000830152614d85816147ff565b9050919050565b60006020820190508181036000830152614da58161483f565b9050919050565b60006020820190508181036000830152614dc58161487f565b9050919050565b60006020820190508181036000830152614de5816148bf565b9050919050565b60006020820190508181036000830152614e05816148ff565b9050919050565b60006020820190508181036000830152614e258161493f565b9050919050565b6000602082019050614e416000830184614a0b565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614e6a57600080fd5b8060405250919050565b600067ffffffffffffffff821115614e8b57600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614eb757600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050919050565b6000819050602082019050919050565b600081519050919050565b60006180009050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614fba82614fea565b9050919050565b60008115159050919050565b6000819050919050565b6000819050614fe582615079565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061501f82614fd7565b9050919050565b82818337600083830152505050565b60005b83811015615053578082015181840152602081019050615038565b83811115615062576000848401525b50505050565b6000601f19601f8301169050919050565b6003811061508357fe5b50565b61508f81614faf565b811461509a57600080fd5b50565b6150a68161500a565b81146150b157600080fd5b5056fea365627a7a72315820314a90e541327f2678eaf7815f54348c3702e4fa45cdf1d5595b378d08af86896c6578706572696d656e74616cf564736f6c634300050d0040", + "nonce": "0", + "storage": { + "0x0": "2868903936" + } + }, + "0x69bfcdcb98c9562e0a2faee3ecdfd65e8a0adb19": { + "balance": "1000000000000000000000000000000" + }, + "0x6a37ad7dceec4595eea9f03b82d2710e738343ac": { + "balance": "1000000000000000000000000000000" + }, + "0x6b806862a977a0e22ed1752f858e5332647121c8": { + "balance": "1000000000000000000000000000000" + }, + "0x6c0ef9084a57df13c175afea32ea47a510c5506e": { + "balance": "1000000000000000000000000000000" + }, + "0x6cd5e637266e18d3e888ee99451eb828c6b491f4": { + "balance": "1000000000000000000000000000000" + }, + "0x6d0d7f0ff51917bd84a5f7270d31a894282aaf4b": { + "balance": "1000000000000000000000000000000" + }, + "0x6d8092cb926daf29236f866cd31c327ff73323d1": { + "balance": "1000000000000000000000000000000" + }, + "0x6d80aAC61F6d92c7F4A3c412850474ba963B698E": { + "balance": "1000000000000000000000" + }, + "0x6fec280c0ab320715b17d70e8b02c2d4141c1372": { + "balance": "1000000000000000000000000000000" + }, + "0x733ad609ef2e742334d96266fbc13733f1cf5e4a": { + "balance": "1000000000000000000000000000000" + }, + "0x7525198d8cd1121d57358a0b0ed037e924581a76": { + "balance": "1000000000000000000000000000000" + }, + "0x765708943c3b791563d1e3f0533b6d7e7d769e4d": { + "balance": "1000000000000000000000000000000" + }, + "0x7685d04f0b7657017b77efa004a14ff9f022acab": { + "balance": "1000000000000000000000000000000" + }, + "0x76b545cb6a2fc671f741950eeb27627e69a1e69b": { + "balance": "1000000000000000000000000000000" + }, + "0x77a0bc73442d3d9cb993e8d9752f95babf0ccaa6": { + "balance": "1000000000000000000000000000000" + }, + "0x7a89A6c323FaCfF0ADeF7EEF3e491aD4044d0592": { + "balance": "100000000000000000000000" + }, + "0x7e7E68F04D1799Fa25C8cff57314c8a5d3942e69": { + "balance": "1000000000000000000000000" + }, + "0x811d701d14539d190a8593fe901eafe8eff511f5": { + "balance": "1000000000000000000000000000000" + }, + "0x81dcbd71da28fafb9ca99ff5a22bfcebba84fecc": { + "balance": "100000000000000000000000" + }, + "0x83c1479d2a32d9ed9fa699289b6c2db56b7cd045": { + "balance": "1000000000000000000000000000000" + }, + "0x85b33f0853ab8eaa4e602bdfd724d44bc2731e90": { + "balance": "1000000000000000000000000000000" + }, + "0x863f816036e3cbba90855196c9d1e339fcff1650": { + "balance": "1000000000000000000000000000000" + }, + "0x87ea381878572d63b3453033d7540abddd191186": { + "balance": "1000000000000000000000000000000" + }, + "0x88fd5e01078629cc194c933d9631b9448fe10b1d": { + "balance": "1000000000000000000000000000000" + }, + "0x8945e48bd056f45c8b57f9025d2674bb03a24035": { + "balance": "1000000000000000000000000000000" + }, + "0x8a920edc1021ce76c22774e0e83723a6e51c2439": { + "balance": "1000000000000000000000000000000" + }, + "0x8e6081e272c8f4d49f5b29157b52f68cbd6307ad": { + "balance": "1000000000000000000000000000000" + }, + "0x8fe24dbbf9884bd458d8cfac528b4ad70e82497d": { + "balance": "1000000000000000000000000000000" + }, + "0x90431f3f75b26657f74abbb5c759b12e78f916cc": { + "balance": "1000000000000000000000000000000" + }, + "0x907cd0881E50d359bb9Fd120B1A5A143b1C97De6": { + "balance": "1000000000000000000000000000000000000000000000000000000000" + }, + "0x94c6e5746971d6aebeaa42cbbe2feca0f6b5b24f": { + "balance": "1000000000000000000000000000000" + }, + "0x96672f9e982936e1904b15c948cc81bf18027db6": { + "balance": "1000000000000000000000000000000" + }, + "0x97b921ba45e0aa8830701aa62050a83ee00a1bb8": { + "balance": "1000000000000000000000000000000" + }, + "0x98e50c97baf98dc6a81bdb95067339a269a36fc1": { + "balance": "1000000000000000000000000000000" + }, + "0x9b77f28285a49601169a33332f08aa309d97edd0": { + "balance": "1000000000000000000000000000000" + }, + "0x9f62f4215cd277ca40dede101b4ccb29290de6bb": { + "balance": "1000000000000000000000000000000" + }, + "0xD1001000000000000000000000000000000000D1": { + "balance": "0", + "code": "0x608060405260043610603f576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680636d4ce63c146044575b600080fd5b348015604f57600080fd5b506056606c565b6040518082815260200191505060405180910390f35b60006001600060048152602001908152602001600020600060098152602001908152602001600020600101549050905600a165627a7a723058208fe64219becc0bcab1c8f854f05804ebb6bb555da5dbc49e8f7021c31d77636a0029", + "nonce": "0", + "storage": { + "0x3b4da637a1b0e6dbfc6795f2b7f0cb29eebb91b3af4dcc335e1633f6b4af810b": "1111" + } + }, + "0xD3001000000000000000000000000000000000D3": { + "balance": "0", + "code": "0x60806040526004361061007b5760003560e01c80639623609d1161004e5780639623609d1461013657806399a88ec4146101f5578063f2fde38b14610230578063f3b7dead146102635761007b565b8063204e1c7a14610080578063715018a6146100cf5780637eff275e146100e65780638da5cb5b14610121575b600080fd5b34801561008c57600080fd5b506100b3600480360360208110156100a357600080fd5b50356001600160a01b0316610296565b604080516001600160a01b039092168252519081900360200190f35b3480156100db57600080fd5b506100e4610328565b005b3480156100f257600080fd5b506100e46004803603604081101561010957600080fd5b506001600160a01b03813581169160200135166103ca565b34801561012d57600080fd5b506100b3610496565b6100e46004803603606081101561014c57600080fd5b6001600160a01b03823581169260208101359091169181019060608101604082013564010000000081111561018057600080fd5b82018360208201111561019257600080fd5b803590602001918460018302840111640100000000831117156101b457600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506104a5945050505050565b34801561020157600080fd5b506100e46004803603604081101561021857600080fd5b506001600160a01b03813581169160200135166105dd565b34801561023c57600080fd5b506100e46004803603602081101561025357600080fd5b50356001600160a01b031661068d565b34801561026f57600080fd5b506100b36004803603602081101561028657600080fd5b50356001600160a01b0316610785565b6000806060836001600160a01b03166040518080635c60da1b60e01b8152506004019050600060405180830381855afa9150503d80600081146102f5576040519150601f19603f3d011682016040523d82523d6000602084013e6102fa565b606091505b50915091508161030957600080fd5b80806020019051602081101561031e57600080fd5b5051949350505050565b6103306107e4565b6000546001600160a01b03908116911614610380576040805162461bcd60e51b8152602060048201819052602482015260008051602061080f833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6103d26107e4565b6000546001600160a01b03908116911614610422576040805162461bcd60e51b8152602060048201819052602482015260008051602061080f833981519152604482015290519081900360640190fd5b816001600160a01b0316638f283970826040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050600060405180830381600087803b15801561047a57600080fd5b505af115801561048e573d6000803e3d6000fd5b505050505050565b6000546001600160a01b031690565b6104ad6107e4565b6000546001600160a01b039081169116146104fd576040805162461bcd60e51b8152602060048201819052602482015260008051602061080f833981519152604482015290519081900360640190fd5b826001600160a01b0316634f1ef2863484846040518463ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561057357818101518382015260200161055b565b50505050905090810190601f1680156105a05780820380516001836020036101000a031916815260200191505b5093505050506000604051808303818588803b1580156105bf57600080fd5b505af11580156105d3573d6000803e3d6000fd5b5050505050505050565b6105e56107e4565b6000546001600160a01b03908116911614610635576040805162461bcd60e51b8152602060048201819052602482015260008051602061080f833981519152604482015290519081900360640190fd5b816001600160a01b0316633659cfe6826040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050600060405180830381600087803b15801561047a57600080fd5b6106956107e4565b6000546001600160a01b039081169116146106e5576040805162461bcd60e51b8152602060048201819052602482015260008051602061080f833981519152604482015290519081900360640190fd5b6001600160a01b03811661072a5760405162461bcd60e51b81526004018080602001828103825260268152602001806107e96026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000806060836001600160a01b031660405180806303e1469160e61b8152506004019050600060405180830381855afa9150503d80600081146102f5576040519150601f19603f3d011682016040523d82523d6000602084013e6102fa565b339056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a26469706673582212201d968ac32bef5562c6b4f1bd5d2f2a74c14d07ce008ca6fdc5a3bd0f5fc265f564736f6c63430006080033", + "nonce": "0", + "storage": { + "0x0": "0x907cd0881E50d359bb9Fd120B1A5A143b1C97De6" + } + }, + "0xD3002000000000000000000000000000000000D3": { + "balance": "0", + "code": "0x60806040526004361061004e5760003560e01c80633659cfe6146100655780634f1ef286146100985780635c60da1b146101185780638f28397014610149578063f851a4401461017c5761005d565b3661005d5761005b610191565b005b61005b610191565b34801561007157600080fd5b5061005b6004803603602081101561008857600080fd5b50356001600160a01b03166101ab565b61005b600480360360408110156100ae57600080fd5b6001600160a01b0382351691908101906040810160208201356401000000008111156100d957600080fd5b8201836020820111156100eb57600080fd5b8035906020019184600183028401116401000000008311171561010d57600080fd5b5090925090506101e5565b34801561012457600080fd5b5061012d610292565b604080516001600160a01b039092168252519081900360200190f35b34801561015557600080fd5b5061005b6004803603602081101561016c57600080fd5b50356001600160a01b03166102cf565b34801561018857600080fd5b5061012d610389565b6101996103ba565b6101a96101a461041a565b61043f565b565b6101b3610463565b6001600160a01b0316336001600160a01b031614156101da576101d581610488565b6101e2565b6101e2610191565b50565b6101ed610463565b6001600160a01b0316336001600160a01b031614156102855761020f83610488565b6000836001600160a01b031683836040518083838082843760405192019450600093509091505080830381855af49150503d806000811461026c576040519150601f19603f3d011682016040523d82523d6000602084013e610271565b606091505b505090508061027f57600080fd5b5061028d565b61028d610191565b505050565b600061029c610463565b6001600160a01b0316336001600160a01b031614156102c4576102bd61041a565b90506102cc565b6102cc610191565b90565b6102d7610463565b6001600160a01b0316336001600160a01b031614156101da576001600160a01b0381166103355760405162461bcd60e51b81526004018080602001828103825260368152602001806105876036913960400191505060405180910390fd5b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f61035e610463565b604080516001600160a01b03928316815291841660208301528051918290030190a16101d5816104c8565b6000610393610463565b6001600160a01b0316336001600160a01b031614156102c4576102bd610463565b3b151590565b6103c2610463565b6001600160a01b0316336001600160a01b031614156104125760405162461bcd60e51b81526004018080602001828103825260328152602001806105556032913960400191505060405180910390fd5b6101a96101a9565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b3660008037600080366000845af43d6000803e80801561045e573d6000f35b3d6000fd5b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b610491816104ec565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610355565b6104f5816103b4565b6105305760405162461bcd60e51b815260040180806020018281038252603b8152602001806105bd603b913960400191505060405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5556fe43616e6e6f742063616c6c2066616c6c6261636b2066756e6374696f6e2066726f6d207468652070726f78792061646d696e43616e6e6f74206368616e6765207468652061646d696e206f6620612070726f787920746f20746865207a65726f206164647265737343616e6e6f742073657420612070726f787920696d706c656d656e746174696f6e20746f2061206e6f6e2d636f6e74726163742061646472657373a26469706673582212206e221e2a3547bd97244b05ed46430b1b078ba097cb2a4e25ec3d79cf9ac9f02c64736f6c63430006080033", + "nonce": "0", + "storage": { + "0x0": "1000000", + "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0xD3003000000000000000000000000000000000D3", + "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "0xD3001000000000000000000000000000000000D3" + } + }, + "0xD3003000000000000000000000000000000000D3": { + "balance": "0", + "code": "0x608060405234801561001057600080fd5b50600436106100b45760003560e01c806379210e8e1161007157806379210e8e1461017757806381a8235a146101a757806385aeeb17146101c35780639a9a5593146101f3578063a99100541461020f578063b57321221461022b576100b4565b806307c6e7d3146100b9578063122f4fba146100d55780631c6ec7a9146101055780631cfe4e3b14610121578063373dedb41461013d57806361e46db51461015b575b600080fd5b6100d360048036036100ce9190810190613e94565b61025b565b005b6100ef60048036036100ea9190810190613e94565b610862565b6040516100fc9190614b38565b60405180910390f35b61011f600480360361011a9190810190613e94565b610ba1565b005b61013b60048036036101369190810190613e58565b610fce565b005b6101456111ec565b6040516101529190614eb3565b60405180910390f35b61017560048036036101709190810190613f29565b6111f6565b005b610191600480360361018c9190810190613fa8565b611456565b60405161019e9190614af9565b60405180910390f35b6101c160048036036101bc9190810190613e94565b611756565b005b6101dd60048036036101d89190810190613e94565b6118fb565b6040516101ea9190614b16565b60405180910390f35b61020d60048036036102089190810190613ed5565b611bfa565b005b61022960048036036102249190810190613e94565b612195565b005b61024560048036036102409190810190613e94565b612849565b6040516102529190614eb3565b60405180910390f35b6000339050606061026b83612ac9565b90506000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b825181101561037c576000826001018460018403815181106102d557fe5b60200260200101516040516102ea9190614aa1565b90815260200160405180910390205411610339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161033090614cb3565b60405180910390fd5b8160020183600183038151811061034c57fe5b60200260200101516040516103619190614aa1565b908152602001604051809103902091508060010190506102b7565b506060600183511161038e57846103a7565b8260018451038151811061039e57fe5b60200260200101515b9050600082600101826040516103bd9190614ab8565b9081526020016040518091039020541161040c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161040390614cb3565b60405180910390fd5b600082600201826040516104209190614ab8565b90815260200160405180910390206000018054905014610475576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161046c90614d33565b60405180910390fd5b60006104818587612cc9565b9050806104c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ba90614c53565b60405180910390fd5b6104cb613a4f565b836000016001856000018054905003815481106104e457fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156105965780601f1061056b57610100808354040283529160200191610596565b820191906000526020600020905b81548152906001019060200180831161057957829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff1660028111156105e257fe5b60028111156105ed57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561066557602002820191906000526020600020906000905b82829054906101000a900460ff1615158152602001906001019060208260000104928301926001038202915080841161062f5790505b50505050508152505090508084600001600186600101866040516106899190614ab8565b90815260200160405180910390205403815481106106a357fe5b906000526020600020906005020160008201518160000190805190602001906106cd929190613a8b565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561071c57fe5b0217905550608082015181600401908051906020019061073d929190613b0b565b5090505083600101836040516107539190614ab8565b9081526020016040518091039020548460010182600001516040516107789190614aa1565b9081526020016040518091039020819055506000846001018460405161079e9190614ab8565b908152602001604051809103902081905550836000018054806107bd57fe5b6001900381819060005260206000209060050201600080820160006107e29190613bb1565b6001820160006101000a81549060ff021916905560028201600090556003820160006101000a81549060ff02191690556004820160006108229190613bf9565b5050905583600201836040516108389190614ab8565b9081526020016040518091039020600080820160006108579190613c21565b505050505050505050565b600080606061087084612d2d565b91509150606061087f82612ac9565b90506000600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015610964576000826001018460018403815181106108e957fe5b60200260200101516040516108fe9190614aa1565b908152602001604051809103902054141561092157600095505050505050610b9c565b8160020183600183038151811061093457fe5b60200260200101516040516109499190614aa1565b908152602001604051809103902091508060010190506108cb565b5060606001835111610976578361098f565b8260018451038151811061098657fe5b60200260200101515b9050600082600101826040516109a59190614ab8565b90815260200160405180910390205414156109c857600095505050505050610b9c565b6109d0613a4f565b82600001600184600101846040516109e89190614ab8565b9081526020016040518091039020540381548110610a0257fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610ab45780601f10610a8957610100808354040283529160200191610ab4565b820191906000526020600020905b815481529060010190602001808311610a9757829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115610b0057fe5b6002811115610b0b57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015610b8357602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411610b4d5790505b5050505050815250509050806060015196505050505050505b919050565b600360009054906101000a900460ff16610be457612000600481905550621000006005819055506001600360006101000a81548160ff0219169083151502179055505b6000815111610c28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1f90614cb3565b60405180910390fd5b60003390506060610c3883612ac9565b90506000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015610d4957600082600101846001840381518110610ca257fe5b6020026020010151604051610cb79190614aa1565b90815260200160405180910390205411610d06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cfd90614cb3565b60405180910390fd5b81600201836001830381518110610d1957fe5b6020026020010151604051610d2e9190614aa1565b90815260200160405180910390209150806001019050610c84565b50600454816000018054905010610d95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8c90614dd3565b60405180910390fd5b60606001835111610da65784610dbf565b82600184510381518110610db657fe5b60200260200101515b905060008260010182604051610dd59190614ab8565b90815260200160405180910390205414610e24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1b90614e13565b60405180910390fd5b610e2d816130af565b610e6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6390614cd3565b60405180910390fd5b6000610e788587613190565b905080610eba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb190614b73565b60405180910390fd5b610ec2613a4f565b8281600001819052506000816020019015159081151581525050836000018190806001815401808255809150506001900390600052602060002090600502016000909190919091506000820151816000019080519060200190610f26929190613a8b565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff02191690836002811115610f7557fe5b02179055506080820151816004019080519060200190610f96929190613b0b565b50505083600001805490508460010184604051610fb39190614ab8565b90815260200160405180910390208190555050505050505050565b610fd66131f4565b73ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16148061103b57503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614155b61107a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107190614c33565b60405180910390fd5b80600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411156110fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f390614d13565b60405180910390fd5b60025460095482011115611145576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113c90614b93565b60405180910390fd5b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460096000828254039250508190555080600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550806009600082825401925050819055505050565b6000600254905090565b60003390506000611207828661328d565b90506001600281111561121657fe5b8160030160009054906101000a900460ff16600281111561123357fe5b14611273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126a90614df3565b60405180910390fd5b6000600554858161128057fe5b061480156112915750806002015484105b6112d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c790614b53565b60405180910390fd5b600554848260020154031080156112ed5750838160020154038351145b806112fa57506005548351145b611339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133090614bf3565b60405180910390fd5b6000151581600401600554868161134c57fe5b048154811061135757fe5b90600052602060002090602091828204019190069054906101000a900460ff161515146113b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b090614bd3565b60405180910390fd5b60006113c78387878761348c565b905080611409576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140090614cf3565b60405180910390fd5b600182600401600554878161141a57fe5b048154811061142557fe5b90600052602060002090602091828204019190066101000a81548160ff021916908315150217905550505050505050565b61145e613c45565b6000606061146b86612d2d565b91509150611477613a4f565b611481838361328d565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156115255780601f106114fa57610100808354040283529160200191611525565b820191906000526020600020905b81548152906001019060200180831161150857829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561157157fe5b600281111561157c57fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156115f457602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116115be5790505b505050505081525050905060028081111561160b57fe5b8160600151600281111561161b57fe5b1461165b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165290614e93565b60405180910390fd5b600554851115801561166d5750600085115b6116ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a390614bf3565b60405180910390fd5b806040015185870111156116f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ec90614b53565b60405180910390fd5b60006117038484898961353d565b80965081925050508061174b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174290614d73565b60405180910390fd5b505050509392505050565b60003390506000611767828461328d565b90506001600281111561177657fe5b8160030160009054906101000a900460ff16600281111561179357fe5b146117d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ca90614df3565b60405180910390fd5b60006001905060008260040180549050905060008090505b8181101561183e576000151584600401828154811061180657fe5b90600052602060002090602091828204019190069054906101000a900460ff161515141561183357600092505b8060010190506117eb565b508161187f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187690614d53565b60405180910390fd5b60028360030160006101000a81548160ff021916908360028111156118a057fe5b021790555060006118b185876135d0565b9050806118f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ea90614bb3565b60405180910390fd5b505050505050565b60606000606061190a84612d2d565b91509150606061191982612ac9565b90506000600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008090505b8251811015611a235760008260010184838151811061197f57fe5b60200260200101516040516119949190614aa1565b908152602001604051809103902054116119e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119da90614cb3565b60405180910390fd5b816002018382815181106119f357fe5b6020026020010151604051611a089190614aa1565b90815260200160405180910390209150806001019050611964565b5080600001805480602002602001604051908101604052809291908181526020016000905b82821015611beb57838290600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611b045780601f10611ad957610100808354040283529160200191611b04565b820191906000526020600020905b815481529060010190602001808311611ae757829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115611b5057fe5b6002811115611b5b57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015611bd357602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411611b9d5790505b50505050508152505081526020019060010190611a48565b50505050945050505050919050565b600360009054906101000a900460ff16611c3d57612000600481905550621000006005819055506001600360006101000a81548160ff0219169083151502179055505b60003390506305f5e100821115611c89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8090614db3565b60405180910390fd5b600660008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205483011115611d4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4390614e33565b60405180910390fd5b6060611d5784612ac9565b90506000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015611e6857600082600101846001840381518110611dc157fe5b6020026020010151604051611dd69190614aa1565b90815260200160405180910390205411611e25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1c90614cb3565b60405180910390fd5b81600201836001830381518110611e3857fe5b6020026020010151604051611e4d9190614aa1565b90815260200160405180910390209150806001019050611da3565b50600454816000018054905010611eb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eab90614dd3565b60405180910390fd5b60606001835111611ec55785611ede565b82600184510381518110611ed557fe5b60200260200101515b905060008260010182604051611ef49190614ab8565b90815260200160405180910390205414611f43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3a90614e13565b60405180910390fd5b611f4c816130af565b611f8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8290614d93565b60405180910390fd5b6000611f98858888613634565b905080611fda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd190614e73565b60405180910390fd5b6060600554600160055489010381611fee57fe5b0460405190808252806020026020018201604052801561201d5781602001602082028038833980820191505090505b509050836000016040518060a001604052808581526020016001151581526020018981526020016001600281111561205157fe5b8152602001838152509080600181540180825580915050600190039060005260206000209060050201600090919091909150600082015181600001908051906020019061209f929190613a8b565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff021916908360028111156120ee57fe5b0217905550608082015181600401908051906020019061210f929190613b0b565b5050508360000180549050846001018460405161212c9190614ab8565b90815260200160405180910390208190555086600760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505050505050505050565b60003390506121a2613a4f565b6121ac828461328d565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156122505780601f1061222557610100808354040283529160200191612250565b820191906000526020600020905b81548152906001019060200180831161223357829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561229c57fe5b60028111156122a757fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561231f57602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116122e95790505b50505050508152505090506000600281111561233757fe5b8160600151600281111561234757fe5b1415612388576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161237f90614c13565b60405180910390fd5b600061239483856136a1565b9050806123d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123cd90614c73565b60405180910390fd5b60606123e185612ac9565b90506000600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015612479578160020183600183038151811061244957fe5b602002602001015160405161245e9190614aa1565b9081526020016040518091039020915080600101905061242d565b50600060018260010186600001516040516124949190614aa1565b9081526020016040518091039020540390506124ae613a4f565b826000016001846000018054905003815481106124c757fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156125795780601f1061254e57610100808354040283529160200191612579565b820191906000526020600020905b81548152906001019060200180831161255c57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff1660028111156125c557fe5b60028111156125d057fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561264857602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116126125790505b50505050508152505090508083600001838154811061266357fe5b9060005260206000209060050201600082015181600001908051906020019061268d929190613a8b565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff021916908360028111156126dc57fe5b021790555060808201518160040190805190602001906126fd929190613b0b565b509050508260000180548061270e57fe5b6001900381819060005260206000209060050201600080820160006127339190613bb1565b6001820160006101000a81549060ff021916905560028201600090556003820160006101000a81549060ff02191690556004820160006127739190613bf9565b5050905582600101866000015160405161278d9190614aa1565b9081526020016040518091039020548360010182600001516040516127b29190614aa1565b90815260200160405180910390208190555060008360010187600001516040516127dc9190614aa1565b9081526020016040518091039020819055508560400151600760008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505050505050505050565b600080606061285784612d2d565b91509150612863613a4f565b61286d838361328d565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156129115780601f106128e657610100808354040283529160200191612911565b820191906000526020600020905b8154815290600101906020018083116128f457829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561295d57fe5b600281111561296857fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156129e057602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116129aa5790505b5050505050815250509050600160028111156129f857fe5b81606001516002811115612a0857fe5b1480612a2d5750600280811115612a1b57fe5b81606001516002811115612a2b57fe5b145b612a6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a6390614df3565b60405180910390fd5b6000612a788484613705565b809650819250505080612ac0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ab790614e53565b60405180910390fd5b50505050919050565b6060612ad3613c6a565b612adc8361376e565b9050612ae6613c6a565b612b246040518060400160405280600181526020017f2f0000000000000000000000000000000000000000000000000000000000000081525061376e565b905060606001612b3d838561379c90919063ffffffff16565b01604051908082528060200260200182016040528015612b7157816020015b6060815260200190600190039081612b5c5790505b50905060008090505b8151811015612bc257612b9e612b99848661381190919063ffffffff16565b61382b565b828281518110612baa57fe5b60200260200101819052508080600101915050612b7a565b50600081600183510381518110612bd557fe5b6020026020010151511415612c405780600182510381518110612bf457fe5b6020026020010160608152506001815103604051908082528060200260200182016040528015612c3857816020015b6060815260200190600190039081612c235790505b509350612c79565b8051604051908082528060200260200182016040528015612c7557816020015b6060815260200190600190039081612c605790505b5093505b60008090505b8451811015612cc057818181518110612c9457fe5b6020026020010151858281518110612ca857fe5b60200260200101819052508080600101915050612c7f565b50505050919050565b60008060016020601f85510181612cdc57fe5b040190506040518481526020810160005b83811015612d0e578060200286015181602002830152806001019050612ced565b50602082602085026040018460006010600019f1935050505092915050565b6000606060006028905080845111612d7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d7190614c93565b60405180910390fd5b6060816040519080825280601f01601f191660200182016040528015612daf5781602001600182028038833980820191505090505b50905060008090505b82811015612e1f57858181518110612dcc57fe5b602001015160f81c60f81b828281518110612de357fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050612db8565b50600080905060008090505b83811015612f4e576000838281518110612e4157fe5b602001015160f81c60f81b60f81c60ff16905060308110158015612e66575060398111155b80612e7f575060418110158015612e7e5750605a8111155b5b80612e98575060618110158015612e97575060668111155b5b612ed7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ece90614c93565b60405180910390fd5b60308110158015612ee9575060398111155b15612efa5760308103601084020192505b60418110158015612f0c5750605a8111155b15612f1d5760378103601084020192505b60618110158015612f2f575060668111155b15612f405760578103601084020192505b508080600101915050612e2b565b508094507f2f00000000000000000000000000000000000000000000000000000000000000868481518110612f7f57fe5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612fec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fe390614c93565b60405180910390fd5b6000600184885103039050806040519080825280601f01601f19166020018201604052801561302a5781602001600182028038833980820191505090505b50945060008090505b818110156130a5576000886001878401018151811061304e57fe5b602001015160f81c60f81b90508087838151811061306857fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350508080600101915050613033565b5050505050915091565b60006040516020016130c090614ae4565b60405160208183030381529060405280519060200120826040516020016130e79190614ab8565b604051602081830303815290604052805190602001201480613152575060405160200161311390614acf565b604051602081830303815290604052805190602001208260405160200161313a9190614ab8565b60405160208183030381529060405280519060200120145b8061315e575060008251145b1561316c576000905061318b565b60008251905060ff81111561318557600091505061318b565b60019150505b919050565b60008060016020601f855101816131a357fe5b040190506040518481526020810160005b838110156131d55780602002860151816020028301528060010190506131b4565b5060208260208502604001846000600f600019f1935050505092915050565b600073d2001000000000000000000000000000000000d273ffffffffffffffffffffffffffffffffffffffff166383e781fe6040518163ffffffff1660e01b815260040160206040518083038186803b15801561325057600080fd5b505afa158015613264573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506132889190810190613e2f565b905090565b6000606061329a83612ac9565b90506000600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b82518110156133ab5760008260010184600184038151811061330457fe5b60200260200101516040516133199190614aa1565b90815260200160405180910390205411613368576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161335f90614cb3565b60405180910390fd5b8160020183600183038151811061337b57fe5b60200260200101516040516133909190614aa1565b908152602001604051809103902091508060010190506132e6565b50606060018351116133bd57846133d6565b826001845103815181106133cd57fe5b60200260200101515b9050600082600101826040516133ec9190614ab8565b9081526020016040518091039020541161343b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161343290614cb3565b60405180910390fd5b600082600001600184600101846040516134559190614ab8565b908152602001604051809103902054038154811061346f57fe5b906000526020600020906005020190508094505050505092915050565b60008060016020601f8551018161349f57fe5b04019050600060016020601f885101816134b557fe5b040190506040518781526020810160005b838110156134e75780602002890151816020028301528060010190506134c6565b50868360200282015260005b8481101561351957806020028701518185600101016020028301528060010190506134f3565b50602082848601602002606001846000600c600019f1945050505050949350505050565b6000613547613c45565b600060016020601f8851018161355957fe5b0401905060006020601f86018161356c57fe5b0490506040518881526020810160005b8481101561359d57806020028a01518160200283015280600101905061357c565b5083602002810188815287816020015283602002868660030160200285600a600019fa9650505050505094509492505050565b60008060016020601f855101816135e357fe5b040190506040518481526020810160005b838110156136155780602002860151816020028301528060010190506135f4565b50602082602085026040018460006011600019f1935050505092915050565b60008060016020601f8651018161364757fe5b040190506040518581526020810160005b83811015613679578060200287015181602002830152806001019050613658565b50846020840282015260208260208502604001846000600b600019f193505050509392505050565b60008060016020601f855101816136b457fe5b040190506040518481526020810160005b838110156136e65780602002860151816020028301528060010190506136c5565b5060208260208502604001846000600e600019f1935050505092915050565b600080600060016020601f8651018161371a57fe5b040190506040518581526020810160005b8381101561374c57806020028701518160200283015280600101905061372b565b506020826020850260200184600d600019fa9450815193505050509250929050565b613776613c6a565b600060208301905060405180604001604052808451815260200182815250915050919050565b60008082600001516137c0856000015186602001518660000151876020015161388d565b0190505b8360000151846020015101811161380a578180600101925050826000015161380285602001518303866000015103838660000151876020015161388d565b0190506137c4565b5092915050565b613819613c6a565b613824838383613968565b5092915050565b60608082600001516040519080825280601f01601f1916602001820160405280156138655781602001600182028038833980820191505090505b50905060006020820190506138838185602001518660000151613a06565b8192505050919050565b6000808490506000868511613958576020851161391257600060018660200360080260020a031960001b905060008186511690506000878a8a0103905060008386511690505b828114613904578186106138f1578a8a019650505050505050613960565b85806001019650508386511690506138d3565b859650505050505050613960565b60008585209050600091505b85880382116139565760008684209050808214156139425783945050505050613960565b60018401935050818060010192505061391e565b505b868601925050505b949350505050565b613970613c6a565b600061398e856000015186602001518660000151876020015161388d565b905084602001518360200181815250508460200151810383600001818152505084600001518560200151018114156139d05760008560000181815250506139fb565b8360000151836000015101856000018181510391508181525050836000015181018560200181815250505b829150509392505050565b5b60208110613a2a5781518352602083019250602082019150602081039050613a07565b60006001826020036101000a0390508019835116818551168181178652505050505050565b6040518060a00160405280606081526020016000151581526020016000815260200160006002811115613a7e57fe5b8152602001606081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613acc57805160ff1916838001178555613afa565b82800160010185558215613afa579182015b82811115613af9578251825591602001919060010190613ade565b5b509050613b079190613c84565b5090565b82805482825590600052602060002090601f01602090048101928215613ba05791602002820160005b83821115613b7157835183826101000a81548160ff0219169083151502179055509260200192600101602081600001049283019260010302613b34565b8015613b9e5782816101000a81549060ff0219169055600101602081600001049283019260010302613b71565b505b509050613bad9190613ca9565b5090565b50805460018160011615610100020316600290046000825580601f10613bd75750613bf6565b601f016020900490600052602060002090810190613bf59190613c84565b5b50565b50805460008255601f016020900490600052602060002090810190613c1e9190613c84565b50565b5080546000825560050290600052602060002090810190613c429190613cd9565b50565b6040518062100000016040528061800090602082028038833980820191505090505090565b604051806040016040528060008152602001600081525090565b613ca691905b80821115613ca2576000816000905550600101613c8a565b5090565b90565b613cd691905b80821115613cd257600081816101000a81549060ff021916905550600101613caf565b5090565b90565b613d4591905b80821115613d415760008082016000613cf89190613bb1565b6001820160006101000a81549060ff021916905560028201600090556003820160006101000a81549060ff0219169055600482016000613d389190613bf9565b50600501613cdf565b5090565b90565b600081359050613d578161510d565b92915050565b600081519050613d6c8161510d565b92915050565b600082601f830112613d8357600080fd5b8135613d96613d9182614efb565b614ece565b91508082526020830160208301858383011115613db257600080fd5b613dbd8382846150ad565b50505092915050565b600082601f830112613dd757600080fd5b8135613dea613de582614f27565b614ece565b91508082526020830160208301858383011115613e0657600080fd5b613e118382846150ad565b50505092915050565b600081359050613e2981615124565b92915050565b600060208284031215613e4157600080fd5b6000613e4f84828501613d5d565b91505092915050565b60008060408385031215613e6b57600080fd5b6000613e7985828601613d48565b9250506020613e8a85828601613e1a565b9150509250929050565b600060208284031215613ea657600080fd5b600082013567ffffffffffffffff811115613ec057600080fd5b613ecc84828501613dc6565b91505092915050565b60008060408385031215613ee857600080fd5b600083013567ffffffffffffffff811115613f0257600080fd5b613f0e85828601613dc6565b9250506020613f1f85828601613e1a565b9150509250929050565b600080600060608486031215613f3e57600080fd5b600084013567ffffffffffffffff811115613f5857600080fd5b613f6486828701613dc6565b9350506020613f7586828701613e1a565b925050604084013567ffffffffffffffff811115613f9257600080fd5b613f9e86828701613d72565b9150509250925092565b600080600060608486031215613fbd57600080fd5b600084013567ffffffffffffffff811115613fd757600080fd5b613fe386828701613dc6565b9350506020613ff486828701613e1a565b925050604061400586828701613e1a565b9150509250925092565b600061401b838361417d565b60208301905092915050565b6000614033838361418c565b60208301905092915050565b600061404b8383614a06565b905092915050565b600061405e82614f7d565b6140688185614fdc565b935061407383614f53565b8060005b838110156140a457815161408b888261400f565b975061409683614fb5565b925050600181019050614077565b5085935050505092915050565b6140ba81614f88565b6140c48184614fed565b92506140cf82614f63565b8060005b838110156141005781516140e78782614027565b96506140f283614fc2565b9250506001810190506140d3565b505050505050565b600061411382614f94565b61411d8185614ff8565b93508360208202850161412f85614f6d565b8060005b8581101561416b578484038952815161414c858261403f565b945061415783614fcf565b925060208a01995050600181019050614133565b50829750879550505050505092915050565b61418681615048565b82525050565b61419581615054565b82525050565b6141a48161509b565b82525050565b6141b38161509b565b82525050565b60006141c482614faa565b6141ce818561502b565b93506141de8185602086016150bc565b80840191505092915050565b60006141f582614f9f565b6141ff8185615009565b935061420f8185602086016150bc565b614218816150ef565b840191505092915050565b600061422e82614f9f565b614238818561502b565b93506142488185602086016150bc565b80840191505092915050565b600061426160188361501a565b91507f496e636f7272656374206368756e6b20706f736974696f6e00000000000000006000830152602082019050919050565b60006142a160158361501a565b91507f4469726563746f7279206e6f74206372656174656400000000000000000000006000830152602082019050919050565b60006142e160248361501a565b91507f4e6f7420656e6f756768206d656d6f727920696e207468652046696c6573746f60008301527f72616765000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614347601b8361501a565b91507f48617368206861736e2774206265656e2063616c63756c6174656400000000006000830152602082019050919050565b600061438760198361501a565b91507f4368756e6b20697320616c72656164792075706c6f61646564000000000000006000830152602082019050919050565b60006143c760168361501a565b91507f496e636f7272656374206368756e6b206c656e677468000000000000000000006000830152602082019050919050565b6000614407600f8361501a565b91507f46696c65206e6f742065786973747300000000000000000000000000000000006000830152602082019050919050565b6000614447600e8361501a565b91507f496e76616c69642073656e6465720000000000000000000000000000000000006000830152602082019050919050565b600061448760188361501a565b91507f4469726563746f7279206973206e6f742064656c6574656400000000000000006000830152602082019050919050565b60006144c760108361501a565b91507f46696c65206e6f742064656c65746564000000000000000000000000000000006000830152602082019050919050565b600061450760138361501a565b91507f496e76616c69642073746f7261676550617468000000000000000000000000006000830152602082019050919050565b6000614547600c8361501a565b91507f496e76616c6964207061746800000000000000000000000000000000000000006000830152602082019050919050565b600061458760018361502b565b91507f2e000000000000000000000000000000000000000000000000000000000000006000830152600182019050919050565b60006145c760168361501a565b91507f496e76616c6964206469726563746f7279206e616d65000000000000000000006000830152602082019050919050565b600061460760158361501a565b91507f4368756e6b207761736e27742075706c6f6164656400000000000000000000006000830152602082019050919050565b600061464760268361501a565b91507f436f756c64206e6f742072657365727665206c657373207468616e207573656460008301527f20737061636500000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006146ad60168361501a565b91507f4469726563746f7279206973206e6f7420656d707479000000000000000000006000830152602082019050919050565b60006146ed60238361501a565b91507f46696c65206861736e2774206265656e2075706c6f6164656420636f7272656360008301527f746c7900000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061475360118361501a565b91507f4368756e6b207761736e277420726561640000000000000000000000000000006000830152602082019050919050565b600061479360188361501a565b91507f46696c656e616d652073686f756c64206265203c2032353600000000000000006000830152602082019050919050565b60006147d3601f8361501a565b91507f46696c652073686f756c64206265206c657373207468616e20313030204d42006000830152602082019050919050565b600061481360028361502b565b91507f2e2e0000000000000000000000000000000000000000000000000000000000006000830152600282019050919050565b600061485360118361501a565b91507f4469726563746f72792069732066756c6c0000000000000000000000000000006000830152602082019050919050565b6000614893600e8361501a565b91507f46696c65206e6f7420666f756e640000000000000000000000000000000000006000830152602082019050919050565b60006148d360188361501a565b91507f46696c65206f72206469726563746f72792065786973747300000000000000006000830152602082019050919050565b600061491360198361501a565b91507f4e6f7420656e6f756768207265736572766564207370616365000000000000006000830152602082019050919050565b600061495360188361501a565b91507f45564d206572726f7220696e2067657446696c6553697a6500000000000000006000830152602082019050919050565b600061499360108361501a565b91507f46696c65206e6f742063726561746564000000000000000000000000000000006000830152602082019050919050565b60006149d360198361501a565b91507f46696c65206861736e2774206265656e2075706c6f61646564000000000000006000830152602082019050919050565b600060a0830160008301518482036000860152614a2382826141ea565b9150506020830151614a38602086018261417d565b506040830151614a4b6040860182614a83565b506060830151614a5e606086018261419b565b5060808301518482036080860152614a768282614053565b9150508091505092915050565b614a8c81615091565b82525050565b614a9b81615091565b82525050565b6000614aad8284614223565b915081905092915050565b6000614ac482846141b9565b915081905092915050565b6000614ada8261457a565b9150819050919050565b6000614aef82614806565b9150819050919050565b60006210000082019050614b1060008301846140b1565b92915050565b60006020820190508181036000830152614b308184614108565b905092915050565b6000602082019050614b4d60008301846141aa565b92915050565b60006020820190508181036000830152614b6c81614254565b9050919050565b60006020820190508181036000830152614b8c81614294565b9050919050565b60006020820190508181036000830152614bac816142d4565b9050919050565b60006020820190508181036000830152614bcc8161433a565b9050919050565b60006020820190508181036000830152614bec8161437a565b9050919050565b60006020820190508181036000830152614c0c816143ba565b9050919050565b60006020820190508181036000830152614c2c816143fa565b9050919050565b60006020820190508181036000830152614c4c8161443a565b9050919050565b60006020820190508181036000830152614c6c8161447a565b9050919050565b60006020820190508181036000830152614c8c816144ba565b9050919050565b60006020820190508181036000830152614cac816144fa565b9050919050565b60006020820190508181036000830152614ccc8161453a565b9050919050565b60006020820190508181036000830152614cec816145ba565b9050919050565b60006020820190508181036000830152614d0c816145fa565b9050919050565b60006020820190508181036000830152614d2c8161463a565b9050919050565b60006020820190508181036000830152614d4c816146a0565b9050919050565b60006020820190508181036000830152614d6c816146e0565b9050919050565b60006020820190508181036000830152614d8c81614746565b9050919050565b60006020820190508181036000830152614dac81614786565b9050919050565b60006020820190508181036000830152614dcc816147c6565b9050919050565b60006020820190508181036000830152614dec81614846565b9050919050565b60006020820190508181036000830152614e0c81614886565b9050919050565b60006020820190508181036000830152614e2c816148c6565b9050919050565b60006020820190508181036000830152614e4c81614906565b9050919050565b60006020820190508181036000830152614e6c81614946565b9050919050565b60006020820190508181036000830152614e8c81614986565b9050919050565b60006020820190508181036000830152614eac816149c6565b9050919050565b6000602082019050614ec86000830184614a92565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614ef157600080fd5b8060405250919050565b600067ffffffffffffffff821115614f1257600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614f3e57600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050919050565b6000819050602082019050919050565b600081519050919050565b60006180009050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061504182615071565b9050919050565b60008115159050919050565b6000819050919050565b600081905061506c82615100565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006150a68261505e565b9050919050565b82818337600083830152505050565b60005b838110156150da5780820151818401526020810190506150bf565b838111156150e9576000848401525b50505050565b6000601f19601f8301169050919050565b6003811061510a57fe5b50565b61511681615036565b811461512157600080fd5b50565b61512d81615091565b811461513857600080fd5b5056fea2646970667358221220a549ad9e778ae8bb3048c0a1805e77745871cc1560637ae1c3ebccb76638d9c464736f6c63430006020033", + "nonce": "0", + "storage": {} + }, + "0xa096b05a489831db893fc53aacc7ed20efb36382": { + "balance": "1000000000000000000000000000000" + }, + "0xa1cd651d99283be60e2a9d2e3bc8a90aedb8244f": { + "balance": "1000000000000000000000000000000" + }, + "0xa2969e82619021ea407338f8bdf7c6f2bd679673": { + "balance": "1000000000000000000000000000000" + }, + "0xa3597b1162b6559cb5e966904b63e762ece756a4": { + "balance": "1000000000000000000000000000000" + }, + "0xa68f946090c600eda6f139783077ee802afeb990": { + "balance": "1000000000000000000000000000000" + }, + "0xa6d50055592cecb795bc1ed3b9ea57ed426b0b7c": { + "balance": "1000000000000000000000000000000" + }, + "0xa7c0789bdeee38c6b59111a789dfb6b815489847": { + "balance": "1000000000000000000000000000000" + }, + "0xa8c813ee806b4c8537ff5f16084d44db18ea9ab1": { + "balance": "1000000000000000000000000000000" + }, + "0xaa6a87bbb74bc1f3cb40c1efb7fc171ee6407560": { + "balance": "1000000000000000000000000000000" + }, + "0xabf920b89f5a2487fdb70be17fd01a99a0602e62": { + "balance": "1000000000000000000000000000000" + }, + "0xac5df92da5171ba24a9618018b4f79494040334b": { + "balance": "1000000000000000000000000000000" + }, + "0xaf97a8318a1a51d5daeeb9650024b63ee44f45bd": { + "balance": "1000000000000000000000000000000" + }, + "0xb28c45b98ae43a5e9ee5509c97ea037b5de5d6d9": { + "balance": "1000000000000000000000000000000" + }, + "0xb64989ab32b089da3da103b93e6781d6d5dd10b4": { + "balance": "1000000000000000000000000000000" + }, + "0xb67e6f4a21f93c250fa6ff0cb142bd14dd4ca8eb": { + "balance": "1000000000000000000000000000000" + }, + "0xb70603c505f85130b5b2e73cd82d196dfd7d8b5e": { + "balance": "1000000000000000000000000000000" + }, + "0xb942414cae2a1ab1056657b905845c0ab6b6280a": { + "balance": "1000000000000000000000000000000" + }, + "0xbee0e5c1961d51be9bd670876caa9c90ba7d9016": { + "balance": "1000000000000000000000000000000" + }, + "0xbf2d8cebdeeb8ad8fed7b2a75f35922106f8d75c": { + "balance": "1000000000000000000000000000000" + }, + "0xbf5aa678b969c0871e2fbcf09c3dbb5d5865ac1e": { + "balance": "1000000000000000000000000000000" + }, + "0xc12bcedd9bcad9120150122cd50f39576ecccc08": { + "balance": "1000000000000000000000000000000" + }, + "0xc2d3852f3292acb81bd164dbae5f1e2a87535150": { + "balance": "1000000000000000000000000000000" + }, + "0xc3820490201e94d76b44655d2df713fec29d9795": { + "balance": "1000000000000000000000000000000" + }, + "0xc58744e2eceefd45cc5469f0e0a708ad24ddbbdb": { + "balance": "1000000000000000000000000000000" + }, + "0xc7865200e8e51ba1c8d695f327deed432930f2cc": { + "balance": "1000000000000000000000000000000" + }, + "0xc8e4d709eb3eb335dc69c9fbf2d24d447cb86105": { + "balance": "1000000000000000000000000000000" + }, + "0xc98af661e44c5bf31d2f8bdff4bbf2808ed4e991": { + "balance": "1000000000000000000000000000000" + }, + "0xca4409573a5129a72edf85d6c51e26760fc9c903": { + "balance": "100000000000000000000000" + }, + "0xcc33e23b04b74f7ba8fbe315083182224af973fa": { + "balance": "1000000000000000000000000000000" + }, + "0xce1c62d0a77600fb2f959b4da76fcb9b3b9430a3": { + "balance": "1000000000000000000000000000000" + }, + "0xd1b6c947fb14060b38945584714491592e84875d": { + "balance": "1000000000000000000000000000000" + }, + "0xd23cd6a9ddcc3470300003621bbac1e06a7919d5": { + "balance": "1000000000000000000000000000000" + }, + "0xd2c5b39B4e735C17612Bb5a08FD024ccc5dBCb23": { + "balance": "100000000000000000000000" + }, + "0xd2cd302eb060e375a65d65946692a3ac2d838d35": { + "balance": "1000000000000000000000000000000" + }, + "0xd2e75c41ced8699e3176f6e335355701a2568b7b": { + "balance": "1000000000000000000000000000000" + }, + "0xd3d38f4cb0aeb4c7c2527ddaeec2ab3b910c8528": { + "balance": "1000000000000000000000000000000" + }, + "0xd5b561a27cca5049650a14ab93dbf1a20c0cefc1": { + "balance": "1000000000000000000000000000000" + }, + "0xd90045420b8abc37b3f9304ed2b385fc1b7fa8c5": { + "balance": "1000000000000000000000000000000" + }, + "0xd951bf4cff429062702a7d8699a5f0bf14845d9b": { + "balance": "1000000000000000000000000000000" + }, + "0xdc6a269c58e58a93a22b5df8cdf1af630c47481f": { + "balance": "1000000000000000000000000000000" + }, + "0xdc6d02ef4003a4f2d0ccff65ae1a2d8157fbb23e": { + "balance": "1000000000000000000000000000000" + }, + "0xde14aca36acc62c305a7ee571da37840a408e600": { + "balance": "1000000000000000000000000000000" + }, + "0xdee32ae508cf783f53ab8bc39d878fe323cdfae3": { + "balance": "1000000000000000000000000000000" + }, + "0xe083a100d51fc4f38aae4a3a68404c36ad96c612": { + "balance": "1000000000000000000000000000000" + }, + "0xe1607990ce800407e3c206e58de4917977181d4d": { + "balance": "1000000000000000000000000000000" + }, + "0xe25e5b63dfd4cf59b81eddf64f1195858634b8a6": { + "balance": "1000000000000000000000000000000" + }, + "0xe372377decb3bdc0c7f5272d38ce0ba2a54934fe": { + "balance": "1000000000000000000000000000000" + }, + "0xe3cc6ec63b5652d1594bc63bb293f4e80f76dbdd": { + "balance": "1000000000000000000000000000000" + }, + "0xe3da7c014286258944ab20a31e4d861b4c9262f1": { + "balance": "1000000000000000000000000000000" + }, + "0xe8b57f330d56081c856e618210fbedb414925ff0": { + "balance": "1000000000000000000000000000000" + }, + "0xe91ac72a568e752eb7c9f5235100586ce97c8cc1": { + "balance": "1000000000000000000000000000000" + }, + "0xf184c8c243a178c1748a0af45caedeca476105b4": { + "balance": "1000000000000000000000000000000" + }, + "0xf1a5912ff318aebf312cdb54c75642a9e632703c": { + "balance": "1000000000000000000000000000000" + }, + "0xf2197b153b4c9086fc5410431fbf7960d284c65e": { + "balance": "1000000000000000000000000000000" + }, + "0xf36620e71327f4a55d550d46e030ccf0c728f154": { + "balance": "1000000000000000000000000000000" + }, + "0xf9817fB82fc767aA9A4A97a1901676244b88ce0E": { + "balance": "100000000000000000000000" + }, + "0xfa723938fa8da1a8a2114ad409a11581761ee40d": { + "balance": "1000000000000000000000000000000" + }, + "0xfa7a8c69810eaf16a395d2a93b3ab51efeed2a1c": { + "balance": "1000000000000000000000000000000" + }, + "0xfaa1038074941571524934ba52d312e88b3577f5": { + "balance": "1000000000000000000000000000000" + }, + "0xfe14077c26a507496b7208384d459e21c49c4212": { + "balance": "1000000000000000000000000000000" + }, + "0xfe275c9b5ac792327da509b27eb9614196dfb07d": { + "balance": "1000000000000000000000000000000" + }, + "0xfe2c5aa110fff89361806ea7ee080bfffba0d3dd": { + "balance": "1000000000000000000000000000000" + }, + "0xfe3d4f1fc038f4f756ba44995129cd45c9e0e861": { + "balance": "1000000000000000000000000000000" + }, + "0xfee314cdc84ecfaa675e41b3559c0101e1eba6b8": { + "balance": "1000000000000000000000000000000" + } + }, + "genesis": { + "author": "0x0000000000000000000000000000000000000001", + "difficulty": "0x0", + "extraData": "0x11bbe8db4e347b4e8c937c1c8370e4b5ed33adb3db69cbdb7a38e1e50b1b82fa", + "gasLimit": "0xFFFFFFFFF", + "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000abc", + "nonce": "0x0000000000000042", + "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "timestamp": "0x00" + }, + "params": { + "EIP150ForkBlock": "0x00", + "EIP158ForkBlock": "0x00", + "accountStartNonce": "0x00", + "blockReward": "0x4563918244F40000", + "byzantiumForkBlock": "0x0", + "chainID": "0x12345", + "constantinopleForkBlock": "0x0", + "daoHardforkBlock": "0x0", + "difficultyBoundDivisor": "0x0800", + "durationLimit": "0x0d", + "externalGasDifficulty": "0x01", + "gasLimitBoundDivisor": "0x0400", + "homesteadForkBlock": "0x0", + "maxGasLimit": "0xFFFFFFFFF", + "maximumExtraDataSize": "0x20", + "minGasLimit": "0xFFFFFFFFF", + "minimumDifficulty": "0x0", + "networkID": "12313219", + "tieBreakingGas": false + }, + "sealEngine": "Ethash", + "skaleConfig": { + "nodeInfo": { + "basePort": 1231, + "bindIP": "0.0.0.0", + "collectionDuration": 10, + "collectionQueueSize": 2, + "db-path": "/tmp/test_eth_1_of_1", + "ecdsaKeyName": "", + "httpRpcPort": 1234, + "httpsRpcPort": 1239, + "logLevel": "info", + "logLevelProposal": "info", + "maxCacheSize": 2000, + "maxCacheSize": 2000, + "maxOpenLeveldbFiles": 25, + "minCacheSize": 1000, + "nodeID": 101, + "nodeName": "Node1", + "rotateAfterBlock": 0, + "testSignatures": true, + "transactionQueueSize": 10000, + "wsRpcPort": 1233, + "wssRpcPort": 1238 + }, + "sChain": { + "EIP1559TransactionsPatchTimestamp": 1, + "contractStorageLimit": 10000000000, + "contractStoragePatchTimestamp": 1, + "contractStorageZeroValuePatchTimestamp": 1, + "correctForkInPowPatchTimestamp": 1, + "emptyBlockIntervalMs": 10000, + "fastConsensusPatchTimestamp": 1, + "flexibleDeploymentPatchTimestamp": 1, + "levelDBReopenIntervalMs": 1, + "multiTransactionMode": false, + "nodes": [ + { + "basePort": 1231, + "ip": "127.0.0.1", + "nodeID": 101, + "publicKey": "", + "schainIndex": 1 + } + ], + "powCheckPatchTimestamp": 1, + "precompiledConfigPatchTimestamp": 1, + "pushZeroPatchTimestamp": 1, + "revertableFSPatchTimestamp": 1, + "schainID": 5, + "schainName": "TestChain", + "schainOwner": "0x907cd0881E50d359bb9Fd120B1A5A143b1C97De6", + "skipInvalidTransactionsPatchTimestamp": 1, + "storageDestructionPatchTimestamp": 1, + "verifyBlsSyncPatchTimestamp": 1, + "verifyDaSigsPatchTimestamp": 1 + } + }, + "unddos": { + "origins": [ + { + "ban_lengthy": 0, + "ban_peak": 0, + "max_calls_per_minute": 1000000000, + "max_calls_per_second": 1000000000, + "max_ws_conn": 65535, + "origin": [ + "*" + ] + } + ] + } +} \ No newline at end of file diff --git a/test/historicstate/configs/test_1_of_16.json b/test/historicstate/configs/test_1_of_16.json new file mode 100644 index 000000000..cbc649b53 --- /dev/null +++ b/test/historicstate/configs/test_1_of_16.json @@ -0,0 +1,910 @@ +{ + "accounts": { + "0000000000000000000000000000000000000001": { + "precompiled": { + "linear": { + "base": 3000, + "word": 0 + }, + "name": "ecrecover" + } + }, + "0000000000000000000000000000000000000002": { + "precompiled": { + "linear": { + "base": 60, + "word": 12 + }, + "name": "sha256" + } + }, + "0000000000000000000000000000000000000003": { + "precompiled": { + "linear": { + "base": 600, + "word": 120 + }, + "name": "ripemd160" + } + }, + "0000000000000000000000000000000000000004": { + "precompiled": { + "linear": { + "base": 15, + "word": 3 + }, + "name": "identity" + } + }, + "0000000000000000000000000000000000000005": { + "precompiled": { + "name": "modexp", + "startingBlock": "0x2dc6c0" + } + }, + "0000000000000000000000000000000000000006": { + "precompiled": { + "linear": { + "base": 500, + "word": 0 + }, + "name": "alt_bn128_G1_add", + "startingBlock": "0x2dc6c0" + } + }, + "0000000000000000000000000000000000000007": { + "precompiled": { + "linear": { + "base": 40000, + "word": 0 + }, + "name": "alt_bn128_G1_mul", + "startingBlock": "0x2dc6c0" + } + }, + "0000000000000000000000000000000000000008": { + "precompiled": { + "name": "alt_bn128_pairing_product", + "startingBlock": "0x2dc6c0" + } + }, + "000000000000000000000000000000000000000A": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "readChunk", + "startingBlock": "0x0" + } + }, + "000000000000000000000000000000000000000B": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "createFile", + "restrictAccess": [ + "69362535ec535F0643cBf62D16aDeDCAf32Ee6F7" + ], + "startingBlock": "0x0" + } + }, + "000000000000000000000000000000000000000C": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "uploadChunk", + "startingBlock": "0x0" + } + }, + "000000000000000000000000000000000000000D": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "getFileSize", + "startingBlock": "0x0" + } + }, + "000000000000000000000000000000000000000E": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "deleteFile", + "startingBlock": "0x0" + } + }, + "000000000000000000000000000000000000000F": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "createDirectory", + "startingBlock": "0x0" + } + }, + "0000000000000000000000000000000000000010": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "deleteDirectory", + "startingBlock": "0x0" + } + }, + "0x006d8e49ce0b9eb5646e34a4d91934801b9044fd": { + "balance": "1000000000000000000000000000000" + }, + "0x0150b461b06922a5030784ba888962c28bb1f188": { + "balance": "1000000000000000000000000000000" + }, + "0x03309956988ae70152ae4469daf99b0cac2306c5": { + "balance": "1000000000000000000000000000000" + }, + "0x06104a85a380895b6dd4030113806df2b044905e": { + "balance": "1000000000000000000000000000000" + }, + "0x079cf317ef40b16141784b6fabff812d64f7c0fd": { + "balance": "1000000000000000000000000000000" + }, + "0x0966454f51166c68b73b2865473c8fb2fcdefdd5": { + "balance": "1000000000000000000000000000000" + }, + "0x099452fedc71897880f584b1bc1706efc4e76e36": { + "balance": "1000000000000000000000000000000" + }, + "0x0aa6a44690ef52354e976990292cf9c5cd36ad59": { + "balance": "1000000000000000000000000000000" + }, + "0x0fbbe17a0e5a61ee3e8661f442d7f6b177c49820": { + "balance": "1000000000000000000000000000000" + }, + "0x1239fe658b410dbbac5bbd572035f5041542f9e5": { + "balance": "1000000000000000000000000000000" + }, + "0x12d5d7340a93be7be28ea7a3ae198242f8e1282c": { + "balance": "1000000000000000000000000000000" + }, + "0x137048b9fa4f1234d6519271b2c5ec64f480db0f": { + "balance": "1000000000000000000000000000000" + }, + "0x13867af77a63048e17380e39248ada90521e97e4": { + "balance": "1000000000000000000000000000000" + }, + "0x138ea4bdf0382c2deffd5b0bff0afe59f471467f": { + "balance": "1000000000000000000000000000000" + }, + "0x13d19c55ee0a212249d26b9d741ff6d7f416db01": { + "balance": "1000000000000000000000000000000" + }, + "0x157d38b52196b248e9fe6a2172e32ce2b8c078e6": { + "balance": "1000000000000000000000000000000" + }, + "0x16e8c390f8e576161cfe966f2c3e5dd303eb9039": { + "balance": "1000000000000000000000000000000" + }, + "0x194cb9991d3d94c43e400becf21dfea45e7b3b4c": { + "balance": "1000000000000000000000000000000" + }, + "0x1C9abe4ff0CcECa40fc404c74AB7d4923fEF8901": { + "balance": "100000000000000000000000" + }, + "0x1a66fc89809112c20aa76a993db712fa9e003e4e": { + "balance": "1000000000000000000000000000000" + }, + "0x1f1d6041e12a18cf1202019f146f2fc150915e8d": { + "balance": "1000000000000000000000000000000" + }, + "0x1feaf1671c1f0faf0d44c152f72dc755db932569": { + "balance": "1000000000000000000000000000000" + }, + "0x236bf02dfafaf03851a4e6f5d69052f4884cec32": { + "balance": "1000000000000000000000000000000" + }, + "0x26d88f6a8b659be4165ee53774a057e41b5201c9": { + "balance": "1000000000000000000000000000000" + }, + "0x28353685b0b986a724b92113debb3d8cd9a6b263": { + "balance": "1000000000000000000000000000000" + }, + "0x29d83322219fdfb821459d5fdf796360faf3166a": { + "balance": "1000000000000000000000000000000" + }, + "0x2bee474be207bdbeac83d6672da5ed2fd417eac9": { + "balance": "1000000000000000000000000000000" + }, + "0x2d93455b07bccf38e8d019f7f43a2c2d70b46b4e": { + "balance": "1000000000000000000000000000000" + }, + "0x2f971bd38806c3ca45ae0a125d1267118bf5619c": { + "balance": "1000000000000000000000000000000" + }, + "0x30aaab366dfac8331f3e827495c789cde9b437c0": { + "balance": "1000000000000000000000000000000" + }, + "0x32ea0400dc2d20664cc4744b2fab04ecb709445c": { + "balance": "1000000000000000000000000000000" + }, + "0x3760dc9594ccac0f33ade5cc5371402131696341": { + "balance": "1000000000000000000000000000000" + }, + "0x38855e430611bc179cd777a8704679ffc43921de": { + "balance": "1000000000000000000000000000000" + }, + "0x3a921471a2397644c37c88ef9572c421ab37145d": { + "balance": "1000000000000000000000000000000" + }, + "0x3bcca8a8471d55a1a668bc163c0336e4a57e5c99": { + "balance": "1000000000000000000000000000000" + }, + "0x3d46ee560227c1d73cd6042b47fc8fddd8a06ecb": { + "balance": "1000000000000000000000000000000" + }, + "0x3f5bdf5d4c274c82b8d17aa2810b00d2cf050f24": { + "balance": "1000000000000000000000000000000" + }, + "0x3ffe1c9183e0f97f52a816405a7d2350624ec88b": { + "balance": "1000000000000000000000000000000" + }, + "0x426ec5f07847674aada3856609d8baaa16805d88": { + "balance": "1000000000000000000000000000000" + }, + "0x482d7f53cba6ae73a354533673c48e2dfd560949": { + "balance": "1000000000000000000000000000000" + }, + "0x48acbd6a2724eadcc2a11144ab84b6a617d1a241": { + "balance": "1000000000000000000000000000000" + }, + "0x49ef89840e400026eb5c8d79bd1b0adc152fe86d": { + "balance": "1000000000000000000000000000000" + }, + "0x4bf989fa6572af36b190032505506f1db888357f": { + "balance": "1000000000000000000000000000000" + }, + "0x4cf9b195f7cb5f86694d9b399fe21a5f34616fd3": { + "balance": "1000000000000000000000000000000" + }, + "0x4e9b85904bca60aeb5b916ca86ac622096908427": { + "balance": "1000000000000000000000000000000" + }, + "0x50120c17d7b59200e9b76e89e4e3de2f0cd00090": { + "balance": "1000000000000000000000000000000" + }, + "0x54db355342c35085a1a53184162b2fddd0a43b0f": { + "balance": "1000000000000000000000000000000" + }, + "0x54e228d8fea148cfe2b109b3b152ff21321d09a2": { + "balance": "1000000000000000000000000000000" + }, + "0x5667601b7dcde6f24d06bccc4f291cb06976f4ee": { + "balance": "1000000000000000000000000000000" + }, + "0x57829f2ecca390cd9d1c41f92328bad4d1073bbb": { + "balance": "1000000000000000000000000000000" + }, + "0x5EF25557E2ed6AFfF321B266C93e95A0B4B05AbC": { + "balance": "1000000000000000000000000" + }, + "0x5a3adad4382b3eb1e0c65f2de2845901081039b5": { + "balance": "1000000000000000000000000000000" + }, + "0x5cdb7392efdce502ccc6fba5c3c1dd1653967b4d": { + "balance": "1000000000000000000000000000000" + }, + "0x5d012c13b2854bda8b7b6580e97e52751884f827": { + "balance": "1000000000000000000000000000000" + }, + "0x5d9326c6504833d84f8a0d65ded59b1a6e768ca2": { + "balance": "1000000000000000000000000000000" + }, + "0x60268f799d8f1808e4a32c2eb898e73a8881f6f0": { + "balance": "1000000000000000000000000000000" + }, + "0x605ba4a05d779f9869bd9a10234c22f516766cfe": { + "balance": "1000000000000000000000000000000" + }, + "0x6093f0f2a7b5148b71603ac439adbc4c0e5aa5da": { + "balance": "1000000000000000000000000000000" + }, + "0x6196d135CdDb9d73A0756C1E44b5b02B11acf594": { + "balance": "2000000000000000000000", + "code": "", + "nonce": "5076", + "storage": {} + }, + "0x62712ceccb50f62ca4c5402fff6da9c819c866cf": { + "balance": "1000000000000000000000000000000" + }, + "0x62971de462ea1ec0d3b43a6a85b6fb975e6c6f64": { + "balance": "1000000000000000000000000000000" + }, + "0x62cf32dfb9eb6358dc5deb006aef1d75fb153e5f": { + "balance": "1000000000000000000000000000000" + }, + "0x62d8b22c1d71577829b2fee20a5c3fff43aed0ec": { + "balance": "100000000000000000000000" + }, + "0x6314956b78bb2eaed1c49b3ae71d4d0ec501cfab": { + "balance": "1000000000000000000000000000000" + }, + "0x661bda4daeba3ce9ac2aa30b80d463580f90d31a": { + "balance": "1000000000000000000000000000000" + }, + "0x66c5a87f4a49DD75e970055A265E8dd5C3F8f852": { + "balance": "1000000000000000000000" + }, + "0x66cd465ddcd85504c0d2cfb1728acee994d55a3f": { + "balance": "1000000000000000000000000000000" + }, + "0x68bca79ae7aae796027ff843d2303444da5cf5d8": { + "balance": "1000000000000000000000000000000" + }, + "0x6923877b65e24966efa9efd1207822fa2eaf601a": { + "balance": "1000000000000000000000000000000" + }, + "0x69362535ec535F0643cBf62D16aDeDCAf32Ee6F7": { + "balance": "0", + "code": "0x608060405234801561001057600080fd5b50600436106100b45760003560e01c806379210e8e1161007157806379210e8e1461017757806381a8235a146101a757806385aeeb17146101c35780639a9a5593146101f3578063a99100541461020f578063b57321221461022b576100b4565b806307c6e7d3146100b9578063122f4fba146100d55780631c6ec7a9146101055780631cfe4e3b14610121578063373dedb41461013d57806361e46db51461015b575b600080fd5b6100d360048036036100ce9190810190613cff565b61025b565b005b6100ef60048036036100ea9190810190613cff565b610804565b6040516100fc9190614963565b60405180910390f35b61011f600480360361011a9190810190613cff565b610b43565b005b61013b60048036036101369190810190613cc3565b610f72565b005b610145611190565b6040516101529190614cbe565b60405180910390f35b61017560048036036101709190810190613d94565b611199565b005b610191600480360361018c9190810190613e13565b6113f9565b60405161019e9190614924565b60405180910390f35b6101c160048036036101bc9190810190613cff565b6116f9565b005b6101dd60048036036101d89190810190613cff565b61189e565b6040516101ea9190614941565b60405180910390f35b61020d60048036036102089190810190613d40565b611b9d565b005b61022960048036036102249190810190613cff565b61202c565b005b61024560048036036102409190810190613cff565b612682565b6040516102529190614cbe565b60405180910390f35b6000339050606061026b83612902565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b825181101561037c576000826001018460018403815181106102d557fe5b60200260200101516040516102ea91906148cc565b90815260200160405180910390205411610339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161033090614ade565b60405180910390fd5b8160020183600183038151811061034c57fe5b602002602001015160405161036191906148cc565b908152602001604051809103902091508060010190506102b7565b506060600183511161038e57846103a7565b8260018451038151811061039e57fe5b60200260200101515b9050600082600101826040516103bd91906148e3565b9081526020016040518091039020541161040c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161040390614ade565b60405180910390fd5b6000826002018260405161042091906148e3565b90815260200160405180910390206000018054905014610475576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161046c90614b5e565b60405180910390fd5b60006104818587612b02565b9050806104c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ba90614a7e565b60405180910390fd5b6104cb613888565b836000016001856000018054905003815481106104e457fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156105965780601f1061056b57610100808354040283529160200191610596565b820191906000526020600020905b81548152906001019060200180831161057957829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff1660028111156105e257fe5b60028111156105ed57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561066557602002820191906000526020600020906000905b82829054906101000a900460ff1615158152602001906001019060208260000104928301926001038202915080841161062f5790505b505050505081525050905080846000016001866001018660405161068991906148e3565b90815260200160405180910390205403815481106106a357fe5b906000526020600020906005020160008201518160000190805190602001906106cd9291906138c4565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561071c57fe5b0217905550608082015181600401908051906020019061073d929190613944565b50905050836001018360405161075391906148e3565b90815260200160405180910390205484600101826000015160405161077891906148cc565b9081526020016040518091039020819055506000846001018460405161079e91906148e3565b908152602001604051809103902081905550836000018054809190600190036107c791906139ea565b5083600201836040516107da91906148e3565b9081526020016040518091039020600080820160006107f99190613a1c565b505050505050505050565b600080606061081284612b66565b91509150606061082182612902565b90506000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b82518110156109065760008260010184600184038151811061088b57fe5b60200260200101516040516108a091906148cc565b90815260200160405180910390205414156108c357600095505050505050610b3e565b816002018360018303815181106108d657fe5b60200260200101516040516108eb91906148cc565b9081526020016040518091039020915080600101905061086d565b50606060018351116109185783610931565b8260018451038151811061092857fe5b60200260200101515b90506000826001018260405161094791906148e3565b908152602001604051809103902054141561096a57600095505050505050610b3e565b610972613888565b826000016001846001018460405161098a91906148e3565b90815260200160405180910390205403815481106109a457fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610a565780601f10610a2b57610100808354040283529160200191610a56565b820191906000526020600020905b815481529060010190602001808311610a3957829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115610aa257fe5b6002811115610aad57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015610b2557602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411610aef5790505b5050505050815250509050806060015196505050505050505b919050565b600160009054906101000a900460ff16610b85576120006002819055506210000060038190555060018060006101000a81548160ff0219169083151502179055505b6000815111610bc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc090614ade565b60405180910390fd5b60003390506060610bd983612902565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015610cea57600082600101846001840381518110610c4357fe5b6020026020010151604051610c5891906148cc565b90815260200160405180910390205411610ca7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9e90614ade565b60405180910390fd5b81600201836001830381518110610cba57fe5b6020026020010151604051610ccf91906148cc565b90815260200160405180910390209150806001019050610c25565b50600254816000018054905010610d36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2d90614bfe565b60405180910390fd5b60606001835111610d475784610d60565b82600184510381518110610d5757fe5b60200260200101515b905060008260010182604051610d7691906148e3565b90815260200160405180910390205414610dc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbc90614c3e565b60405180910390fd5b610dce81612ee8565b610e0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0490614afe565b60405180910390fd5b6000610e198587612fc9565b905080610e5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e529061499e565b60405180910390fd5b610e63613888565b82816000018190525060008160200190151590811515815250508360000181908060018154018082558091505090600182039060005260206000209060050201600090919290919091506000820151816000019080519060200190610ec99291906138c4565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff02191690836002811115610f1857fe5b02179055506080820151816004019080519060200190610f39929190613944565b5050505083600001805490508460010184604051610f5791906148e3565b90815260200160405180910390208190555050505050505050565b610f7a61302d565b73ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161480610fdf57503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614155b61101e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101590614a5e565b60405180910390fd5b80600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411156110a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109790614b3e565b60405180910390fd5b600054600754820111156110e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e0906149be565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460076000828254039250508190555080600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550806007600082825401925050819055505050565b60008054905090565b600033905060006111aa82866130c6565b9050600160028111156111b957fe5b8160030160009054906101000a900460ff1660028111156111d657fe5b14611216576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120d90614c1e565b60405180910390fd5b6000600354858161122357fe5b061480156112345750806002015484105b611273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126a9061497e565b60405180910390fd5b600354848260020154031080156112905750838160020154038351145b8061129d57506003548351145b6112dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d390614a1e565b60405180910390fd5b600015158160040160035486816112ef57fe5b04815481106112fa57fe5b90600052602060002090602091828204019190069054906101000a900460ff1615151461135c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611353906149fe565b60405180910390fd5b600061136a838787876132c5565b9050806113ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a390614b1e565b60405180910390fd5b60018260040160035487816113bd57fe5b04815481106113c857fe5b90600052602060002090602091828204019190066101000a81548160ff021916908315150217905550505050505050565b611401613a40565b6000606061140e86612b66565b9150915061141a613888565b61142483836130c6565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156114c85780601f1061149d576101008083540402835291602001916114c8565b820191906000526020600020905b8154815290600101906020018083116114ab57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561151457fe5b600281111561151f57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561159757602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116115615790505b50505050508152505090506002808111156115ae57fe5b816060015160028111156115be57fe5b146115fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f590614c9e565b60405180910390fd5b60035485111580156116105750600085115b61164f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164690614a1e565b60405180910390fd5b80604001518587011115611698576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168f9061497e565b60405180910390fd5b60006116a684848989613376565b8096508192505050806116ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e590614b9e565b60405180910390fd5b505050509392505050565b6000339050600061170a82846130c6565b90506001600281111561171957fe5b8160030160009054906101000a900460ff16600281111561173657fe5b14611776576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176d90614c1e565b60405180910390fd5b60006001905060008260040180549050905060008090505b818110156117e157600015158460040182815481106117a957fe5b90600052602060002090602091828204019190069054906101000a900460ff16151514156117d657600092505b80600101905061178e565b5081611822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181990614b7e565b60405180910390fd5b60028360030160006101000a81548160ff0219169083600281111561184357fe5b021790555060006118548587613409565b905080611896576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188d906149de565b60405180910390fd5b505050505050565b6060600060606118ad84612b66565b9150915060606118bc82612902565b90506000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008090505b82518110156119c65760008260010184838151811061192257fe5b602002602001015160405161193791906148cc565b90815260200160405180910390205411611986576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197d90614ade565b60405180910390fd5b8160020183828151811061199657fe5b60200260200101516040516119ab91906148cc565b90815260200160405180910390209150806001019050611907565b5080600001805480602002602001604051908101604052809291908181526020016000905b82821015611b8e57838290600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611aa75780601f10611a7c57610100808354040283529160200191611aa7565b820191906000526020600020905b815481529060010190602001808311611a8a57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115611af357fe5b6002811115611afe57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015611b7657602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411611b405790505b505050505081525050815260200190600101906119eb565b50505050945050505050919050565b600160009054906101000a900460ff16611bdf576120006002819055506210000060038190555060018060006101000a81548160ff0219169083151502179055505b60003390506305f5e100821115611c2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2290614bde565b60405180910390fd5b6060611c3684612902565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015611d4757600082600101846001840381518110611ca057fe5b6020026020010151604051611cb591906148cc565b90815260200160405180910390205411611d04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cfb90614ade565b60405180910390fd5b81600201836001830381518110611d1757fe5b6020026020010151604051611d2c91906148cc565b90815260200160405180910390209150806001019050611c82565b5060606001835111611d595785611d72565b82600184510381518110611d6957fe5b60200260200101515b905060008260010182604051611d8891906148e3565b90815260200160405180910390205414611dd7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dce90614c3e565b60405180910390fd5b611de081612ee8565b611e1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1690614bbe565b60405180910390fd5b6000611e2c85888861346d565b905080611e6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6590614c7e565b60405180910390fd5b6060600354600160035489010381611e8257fe5b04604051908082528060200260200182016040528015611eb15781602001602082028038833980820191505090505b509050836000016040518060a0016040528085815260200160011515815260200189815260200160016002811115611ee557fe5b815260200183815250908060018154018082558091505090600182039060005260206000209060050201600090919290919091506000820151816000019080519060200190611f359291906138c4565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff02191690836002811115611f8457fe5b02179055506080820151816004019080519060200190611fa5929190613944565b5050505083600001805490508460010184604051611fc391906148e3565b90815260200160405180910390208190555086600560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505050505050505050565b6000339050612039613888565b61204382846130c6565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156120e75780601f106120bc576101008083540402835291602001916120e7565b820191906000526020600020905b8154815290600101906020018083116120ca57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561213357fe5b600281111561213e57fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156121b657602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116121805790505b5050505050815250509050600060028111156121ce57fe5b816060015160028111156121de57fe5b141561221f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221690614a3e565b60405180910390fd5b600061222b83856134da565b90508061226d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226490614a9e565b60405180910390fd5b606061227885612902565b90506000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b825181101561231057816002018360018303815181106122e057fe5b60200260200101516040516122f591906148cc565b908152602001604051809103902091508060010190506122c4565b506000600182600101866000015160405161232b91906148cc565b908152602001604051809103902054039050612345613888565b8260000160018460000180549050038154811061235e57fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156124105780601f106123e557610100808354040283529160200191612410565b820191906000526020600020905b8154815290600101906020018083116123f357829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561245c57fe5b600281111561246757fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156124df57602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116124a95790505b5050505050815250509050808360000183815481106124fa57fe5b906000526020600020906005020160008201518160000190805190602001906125249291906138c4565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561257357fe5b02179055506080820151816004019080519060200190612594929190613944565b50905050826000018054809190600190036125af91906139ea565b508260010186600001516040516125c691906148cc565b9081526020016040518091039020548360010182600001516040516125eb91906148cc565b908152602001604051809103902081905550600083600101876000015160405161261591906148cc565b9081526020016040518091039020819055508560400151600560008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505050505050505050565b600080606061269084612b66565b9150915061269c613888565b6126a683836130c6565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561274a5780601f1061271f5761010080835404028352916020019161274a565b820191906000526020600020905b81548152906001019060200180831161272d57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561279657fe5b60028111156127a157fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561281957602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116127e35790505b50505050508152505090506001600281111561283157fe5b8160600151600281111561284157fe5b1480612866575060028081111561285457fe5b8160600151600281111561286457fe5b145b6128a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161289c90614c1e565b60405180910390fd5b60006128b1848461353e565b8096508192505050806128f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128f090614c5e565b60405180910390fd5b50505050919050565b606061290c613a65565b612915836135a7565b905061291f613a65565b61295d6040518060400160405280600181526020017f2f000000000000000000000000000000000000000000000000000000000000008152506135a7565b90506060600161297683856135d590919063ffffffff16565b016040519080825280602002602001820160405280156129aa57816020015b60608152602001906001900390816129955790505b50905060008090505b81518110156129fb576129d76129d2848661364a90919063ffffffff16565b613664565b8282815181106129e357fe5b602002602001018190525080806001019150506129b3565b50600081600183510381518110612a0e57fe5b6020026020010151511415612a795780600182510381518110612a2d57fe5b6020026020010160608152506001815103604051908082528060200260200182016040528015612a7157816020015b6060815260200190600190039081612a5c5790505b509350612ab2565b8051604051908082528060200260200182016040528015612aae57816020015b6060815260200190600190039081612a995790505b5093505b60008090505b8451811015612af957818181518110612acd57fe5b6020026020010151858281518110612ae157fe5b60200260200101819052508080600101915050612ab8565b50505050919050565b60008060016020601f85510181612b1557fe5b040190506040518481526020810160005b83811015612b47578060200286015181602002830152806001019050612b26565b50602082602085026040018460006010600019f1935050505092915050565b6000606060006028905080845111612bb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612baa90614abe565b60405180910390fd5b6060816040519080825280601f01601f191660200182016040528015612be85781602001600182028038833980820191505090505b50905060008090505b82811015612c5857858181518110612c0557fe5b602001015160f81c60f81b828281518110612c1c57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050612bf1565b50600080905060008090505b83811015612d87576000838281518110612c7a57fe5b602001015160f81c60f81b60f81c60ff16905060308110158015612c9f575060398111155b80612cb8575060418110158015612cb75750605a8111155b5b80612cd1575060618110158015612cd0575060668111155b5b612d10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d0790614abe565b60405180910390fd5b60308110158015612d22575060398111155b15612d335760308103601084020192505b60418110158015612d455750605a8111155b15612d565760378103601084020192505b60618110158015612d68575060668111155b15612d795760578103601084020192505b508080600101915050612c64565b508094507f2f00000000000000000000000000000000000000000000000000000000000000868481518110612db857fe5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612e25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e1c90614abe565b60405180910390fd5b6000600184885103039050806040519080825280601f01601f191660200182016040528015612e635781602001600182028038833980820191505090505b50945060008090505b81811015612ede5760008860018784010181518110612e8757fe5b602001015160f81c60f81b905080878381518110612ea157fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350508080600101915050612e6c565b5050505050915091565b6000604051602001612ef99061490f565b6040516020818303038152906040528051906020012082604051602001612f2091906148e3565b604051602081830303815290604052805190602001201480612f8b5750604051602001612f4c906148fa565b6040516020818303038152906040528051906020012082604051602001612f7391906148e3565b60405160208183030381529060405280519060200120145b80612f97575060008251145b15612fa55760009050612fc4565b60008251905060ff811115612fbe576000915050612fc4565b60019150505b919050565b60008060016020601f85510181612fdc57fe5b040190506040518481526020810160005b8381101561300e578060200286015181602002830152806001019050612fed565b5060208260208502604001846000600f600019f1935050505092915050565b600073d2001000000000000000000000000000000000d273ffffffffffffffffffffffffffffffffffffffff166383e781fe6040518163ffffffff1660e01b815260040160206040518083038186803b15801561308957600080fd5b505afa15801561309d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506130c19190810190613c9a565b905090565b600060606130d383612902565b90506000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b82518110156131e45760008260010184600184038151811061313d57fe5b602002602001015160405161315291906148cc565b908152602001604051809103902054116131a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161319890614ade565b60405180910390fd5b816002018360018303815181106131b457fe5b60200260200101516040516131c991906148cc565b9081526020016040518091039020915080600101905061311f565b50606060018351116131f6578461320f565b8260018451038151811061320657fe5b60200260200101515b90506000826001018260405161322591906148e3565b90815260200160405180910390205411613274576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161326b90614ade565b60405180910390fd5b6000826000016001846001018460405161328e91906148e3565b90815260200160405180910390205403815481106132a857fe5b906000526020600020906005020190508094505050505092915050565b60008060016020601f855101816132d857fe5b04019050600060016020601f885101816132ee57fe5b040190506040518781526020810160005b838110156133205780602002890151816020028301528060010190506132ff565b50868360200282015260005b84811015613352578060200287015181856001010160200283015280600101905061332c565b50602082848601602002606001846000600c600019f1945050505050949350505050565b6000613380613a40565b600060016020601f8851018161339257fe5b0401905060006020601f8601816133a557fe5b0490506040518881526020810160005b848110156133d657806020028a0151816020028301528060010190506133b5565b5083602002810188815287816020015283602002868660030160200285600a600019fa9650505050505094509492505050565b60008060016020601f8551018161341c57fe5b040190506040518481526020810160005b8381101561344e57806020028601518160200283015280600101905061342d565b50602082602085026040018460006011600019f1935050505092915050565b60008060016020601f8651018161348057fe5b040190506040518581526020810160005b838110156134b2578060200287015181602002830152806001019050613491565b50846020840282015260208260208502604001846000600b600019f193505050509392505050565b60008060016020601f855101816134ed57fe5b040190506040518481526020810160005b8381101561351f5780602002860151816020028301528060010190506134fe565b5060208260208502604001846000600e600019f1935050505092915050565b600080600060016020601f8651018161355357fe5b040190506040518581526020810160005b83811015613585578060200287015181602002830152806001019050613564565b506020826020850260200184600d600019fa9450815193505050509250929050565b6135af613a65565b600060208301905060405180604001604052808451815260200182815250915050919050565b60008082600001516135f985600001518660200151866000015187602001516136c6565b0190505b83600001518460200151018111613643578180600101925050826000015161363b8560200151830386600001510383866000015187602001516136c6565b0190506135fd565b5092915050565b613652613a65565b61365d8383836137a1565b5092915050565b60608082600001516040519080825280601f01601f19166020018201604052801561369e5781602001600182028038833980820191505090505b50905060006020820190506136bc818560200151866000015161383f565b8192505050919050565b6000808490506000868511613791576020851161374b57600060018660200360080260020a031960001b905060008186511690506000878a8a0103905060008386511690505b82811461373d5781861061372a578a8a019650505050505050613799565b858060010196505083865116905061370c565b859650505050505050613799565b60008585209050600091505b858803821161378f57600086842090508082141561377b5783945050505050613799565b600184019350508180600101925050613757565b505b868601925050505b949350505050565b6137a9613a65565b60006137c785600001518660200151866000015187602001516136c6565b90508460200151836020018181525050846020015181038360000181815250508460000151856020015101811415613809576000856000018181525050613834565b8360000151836000015101856000018181510391508181525050836000015181018560200181815250505b829150509392505050565b5b602081106138635781518352602083019250602082019150602081039050613840565b60006001826020036101000a0390508019835116818551168181178652505050505050565b6040518060a001604052806060815260200160001515815260200160008152602001600060028111156138b757fe5b8152602001606081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061390557805160ff1916838001178555613933565b82800160010185558215613933579182015b82811115613932578251825591602001919060010190613917565b5b5090506139409190613a7f565b5090565b82805482825590600052602060002090601f016020900481019282156139d95791602002820160005b838211156139aa57835183826101000a81548160ff021916908315150217905550926020019260010160208160000104928301926001030261396d565b80156139d75782816101000a81549060ff02191690556001016020816000010492830192600103026139aa565b505b5090506139e69190613aa4565b5090565b815481835581811115613a1757600502816005028360005260206000209182019101613a169190613ad4565b5b505050565b5080546000825560050290600052602060002090810190613a3d9190613ad4565b50565b6040518062100000016040528061800090602082028038833980820191505090505090565b604051806040016040528060008152602001600081525090565b613aa191905b80821115613a9d576000816000905550600101613a85565b5090565b90565b613ad191905b80821115613acd57600081816101000a81549060ff021916905550600101613aaa565b5090565b90565b613b4091905b80821115613b3c5760008082016000613af39190613b43565b6001820160006101000a81549060ff021916905560028201600090556003820160006101000a81549060ff0219169055600482016000613b339190613b8b565b50600501613ada565b5090565b90565b50805460018160011615610100020316600290046000825580601f10613b695750613b88565b601f016020900490600052602060002090810190613b879190613a7f565b5b50565b50805460008255601f016020900490600052602060002090810190613bb09190613a7f565b50565b600081359050613bc281614f18565b92915050565b600081519050613bd781614f18565b92915050565b600082601f830112613bee57600080fd5b8135613c01613bfc82614d06565b614cd9565b91508082526020830160208301858383011115613c1d57600080fd5b613c28838284614eb8565b50505092915050565b600082601f830112613c4257600080fd5b8135613c55613c5082614d32565b614cd9565b91508082526020830160208301858383011115613c7157600080fd5b613c7c838284614eb8565b50505092915050565b600081359050613c9481614f2f565b92915050565b600060208284031215613cac57600080fd5b6000613cba84828501613bc8565b91505092915050565b60008060408385031215613cd657600080fd5b6000613ce485828601613bb3565b9250506020613cf585828601613c85565b9150509250929050565b600060208284031215613d1157600080fd5b600082013567ffffffffffffffff811115613d2b57600080fd5b613d3784828501613c31565b91505092915050565b60008060408385031215613d5357600080fd5b600083013567ffffffffffffffff811115613d6d57600080fd5b613d7985828601613c31565b9250506020613d8a85828601613c85565b9150509250929050565b600080600060608486031215613da957600080fd5b600084013567ffffffffffffffff811115613dc357600080fd5b613dcf86828701613c31565b9350506020613de086828701613c85565b925050604084013567ffffffffffffffff811115613dfd57600080fd5b613e0986828701613bdd565b9150509250925092565b600080600060608486031215613e2857600080fd5b600084013567ffffffffffffffff811115613e4257600080fd5b613e4e86828701613c31565b9350506020613e5f86828701613c85565b9250506040613e7086828701613c85565b9150509250925092565b6000613e868383613fe8565b60208301905092915050565b6000613e9e8383613ff7565b60208301905092915050565b6000613eb68383614831565b905092915050565b6000613ec982614d88565b613ed38185614de7565b9350613ede83614d5e565b8060005b83811015613f0f578151613ef68882613e7a565b9750613f0183614dc0565b925050600181019050613ee2565b5085935050505092915050565b613f2581614d93565b613f2f8184614df8565b9250613f3a82614d6e565b8060005b83811015613f6b578151613f528782613e92565b9650613f5d83614dcd565b925050600181019050613f3e565b505050505050565b6000613f7e82614d9f565b613f888185614e03565b935083602082028501613f9a85614d78565b8060005b85811015613fd65784840389528151613fb78582613eaa565b9450613fc283614dda565b925060208a01995050600181019050613f9e565b50829750879550505050505092915050565b613ff181614e53565b82525050565b61400081614e5f565b82525050565b61400f81614ea6565b82525050565b61401e81614ea6565b82525050565b600061402f82614db5565b6140398185614e36565b9350614049818560208601614ec7565b80840191505092915050565b600061406082614daa565b61406a8185614e14565b935061407a818560208601614ec7565b61408381614efa565b840191505092915050565b600061409982614daa565b6140a38185614e36565b93506140b3818560208601614ec7565b80840191505092915050565b60006140cc601883614e25565b91507f496e636f7272656374206368756e6b20706f736974696f6e00000000000000006000830152602082019050919050565b600061410c601583614e25565b91507f4469726563746f7279206e6f74206372656174656400000000000000000000006000830152602082019050919050565b600061414c602483614e25565b91507f4e6f7420656e6f756768206d656d6f727920696e207468652046696c6573746f60008301527f72616765000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006141b2601b83614e25565b91507f48617368206861736e2774206265656e2063616c63756c6174656400000000006000830152602082019050919050565b60006141f2601983614e25565b91507f4368756e6b20697320616c72656164792075706c6f61646564000000000000006000830152602082019050919050565b6000614232601683614e25565b91507f496e636f7272656374206368756e6b206c656e677468000000000000000000006000830152602082019050919050565b6000614272600f83614e25565b91507f46696c65206e6f742065786973747300000000000000000000000000000000006000830152602082019050919050565b60006142b2600e83614e25565b91507f496e76616c69642073656e6465720000000000000000000000000000000000006000830152602082019050919050565b60006142f2601883614e25565b91507f4469726563746f7279206973206e6f742064656c6574656400000000000000006000830152602082019050919050565b6000614332601083614e25565b91507f46696c65206e6f742064656c65746564000000000000000000000000000000006000830152602082019050919050565b6000614372601383614e25565b91507f496e76616c69642073746f7261676550617468000000000000000000000000006000830152602082019050919050565b60006143b2600c83614e25565b91507f496e76616c6964207061746800000000000000000000000000000000000000006000830152602082019050919050565b60006143f2600183614e36565b91507f2e000000000000000000000000000000000000000000000000000000000000006000830152600182019050919050565b6000614432601683614e25565b91507f496e76616c6964206469726563746f7279206e616d65000000000000000000006000830152602082019050919050565b6000614472601583614e25565b91507f4368756e6b207761736e27742075706c6f6164656400000000000000000000006000830152602082019050919050565b60006144b2602683614e25565b91507f436f756c64206e6f742072657365727665206c657373207468616e207573656460008301527f20737061636500000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614518601683614e25565b91507f4469726563746f7279206973206e6f7420656d707479000000000000000000006000830152602082019050919050565b6000614558602383614e25565b91507f46696c65206861736e2774206265656e2075706c6f6164656420636f7272656360008301527f746c7900000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006145be601183614e25565b91507f4368756e6b207761736e277420726561640000000000000000000000000000006000830152602082019050919050565b60006145fe601883614e25565b91507f46696c656e616d652073686f756c64206265203c2032353600000000000000006000830152602082019050919050565b600061463e601f83614e25565b91507f46696c652073686f756c64206265206c657373207468616e20313030204d42006000830152602082019050919050565b600061467e600283614e36565b91507f2e2e0000000000000000000000000000000000000000000000000000000000006000830152600282019050919050565b60006146be601183614e25565b91507f4469726563746f72792069732066756c6c0000000000000000000000000000006000830152602082019050919050565b60006146fe600e83614e25565b91507f46696c65206e6f7420666f756e640000000000000000000000000000000000006000830152602082019050919050565b600061473e601883614e25565b91507f46696c65206f72206469726563746f72792065786973747300000000000000006000830152602082019050919050565b600061477e601883614e25565b91507f45564d206572726f7220696e2067657446696c6553697a6500000000000000006000830152602082019050919050565b60006147be601083614e25565b91507f46696c65206e6f742063726561746564000000000000000000000000000000006000830152602082019050919050565b60006147fe601983614e25565b91507f46696c65206861736e2774206265656e2075706c6f61646564000000000000006000830152602082019050919050565b600060a083016000830151848203600086015261484e8282614055565b91505060208301516148636020860182613fe8565b50604083015161487660408601826148ae565b5060608301516148896060860182614006565b50608083015184820360808601526148a18282613ebe565b9150508091505092915050565b6148b781614e9c565b82525050565b6148c681614e9c565b82525050565b60006148d8828461408e565b915081905092915050565b60006148ef8284614024565b915081905092915050565b6000614905826143e5565b9150819050919050565b600061491a82614671565b9150819050919050565b6000621000008201905061493b6000830184613f1c565b92915050565b6000602082019050818103600083015261495b8184613f73565b905092915050565b60006020820190506149786000830184614015565b92915050565b60006020820190508181036000830152614997816140bf565b9050919050565b600060208201905081810360008301526149b7816140ff565b9050919050565b600060208201905081810360008301526149d78161413f565b9050919050565b600060208201905081810360008301526149f7816141a5565b9050919050565b60006020820190508181036000830152614a17816141e5565b9050919050565b60006020820190508181036000830152614a3781614225565b9050919050565b60006020820190508181036000830152614a5781614265565b9050919050565b60006020820190508181036000830152614a77816142a5565b9050919050565b60006020820190508181036000830152614a97816142e5565b9050919050565b60006020820190508181036000830152614ab781614325565b9050919050565b60006020820190508181036000830152614ad781614365565b9050919050565b60006020820190508181036000830152614af7816143a5565b9050919050565b60006020820190508181036000830152614b1781614425565b9050919050565b60006020820190508181036000830152614b3781614465565b9050919050565b60006020820190508181036000830152614b57816144a5565b9050919050565b60006020820190508181036000830152614b778161450b565b9050919050565b60006020820190508181036000830152614b978161454b565b9050919050565b60006020820190508181036000830152614bb7816145b1565b9050919050565b60006020820190508181036000830152614bd7816145f1565b9050919050565b60006020820190508181036000830152614bf781614631565b9050919050565b60006020820190508181036000830152614c17816146b1565b9050919050565b60006020820190508181036000830152614c37816146f1565b9050919050565b60006020820190508181036000830152614c5781614731565b9050919050565b60006020820190508181036000830152614c7781614771565b9050919050565b60006020820190508181036000830152614c97816147b1565b9050919050565b60006020820190508181036000830152614cb7816147f1565b9050919050565b6000602082019050614cd360008301846148bd565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614cfc57600080fd5b8060405250919050565b600067ffffffffffffffff821115614d1d57600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614d4957600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050919050565b6000819050602082019050919050565b600081519050919050565b60006180009050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614e4c82614e7c565b9050919050565b60008115159050919050565b6000819050919050565b6000819050614e7782614f0b565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000614eb182614e69565b9050919050565b82818337600083830152505050565b60005b83811015614ee5578082015181840152602081019050614eca565b83811115614ef4576000848401525b50505050565b6000601f19601f8301169050919050565b60038110614f1557fe5b50565b614f2181614e41565b8114614f2c57600080fd5b50565b614f3881614e9c565b8114614f4357600080fd5b5056fea365627a7a723158202ae226b25ad72f9cff2d74c6dc7bcfb78530ab1d2438f48a8dab67499b37a8e56c6578706572696d656e74616cf564736f6c634300050d0040", + "nonce": "0", + "storage": { + "0x0": "2868903936" + } + }, + "0x69362535ec535F0643cBf62D16aDeDCAf32Ee6F8": { + "balance": "0", + "code": "0x608060405234801561001057600080fd5b50600436106100b45760003560e01c806379210e8e1161007157806379210e8e1461017757806381a8235a146101a757806385aeeb17146101c35780639a9a5593146101f3578063a99100541461020f578063b57321221461022b576100b4565b806307c6e7d3146100b9578063122f4fba146100d55780631c6ec7a9146101055780631cfe4e3b14610121578063373dedb41461013d57806361e46db51461015b575b600080fd5b6100d360048036036100ce9190810190613e0d565b61025b565b005b6100ef60048036036100ea9190810190613e0d565b610804565b6040516100fc9190614ab1565b60405180910390f35b61011f600480360361011a9190810190613e0d565b610b43565b005b61013b60048036036101369190810190613dd1565b610f72565b005b610145611190565b6040516101529190614e2c565b60405180910390f35b61017560048036036101709190810190613ea2565b611199565b005b610191600480360361018c9190810190613f21565b6113f9565b60405161019e9190614a72565b60405180910390f35b6101c160048036036101bc9190810190613e0d565b6116f9565b005b6101dd60048036036101d89190810190613e0d565b61189e565b6040516101ea9190614a8f565b60405180910390f35b61020d60048036036102089190810190613e4e565b611b9d565b005b61022960048036036102249190810190613e0d565b61213a565b005b61024560048036036102409190810190613e0d565b612790565b6040516102529190614e2c565b60405180910390f35b6000339050606061026b83612a10565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b825181101561037c576000826001018460018403815181106102d557fe5b60200260200101516040516102ea9190614a1a565b90815260200160405180910390205411610339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161033090614c2c565b60405180910390fd5b8160020183600183038151811061034c57fe5b60200260200101516040516103619190614a1a565b908152602001604051809103902091508060010190506102b7565b506060600183511161038e57846103a7565b8260018451038151811061039e57fe5b60200260200101515b9050600082600101826040516103bd9190614a31565b9081526020016040518091039020541161040c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161040390614c2c565b60405180910390fd5b600082600201826040516104209190614a31565b90815260200160405180910390206000018054905014610475576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161046c90614cac565b60405180910390fd5b60006104818587612c10565b9050806104c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ba90614bcc565b60405180910390fd5b6104cb613996565b836000016001856000018054905003815481106104e457fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156105965780601f1061056b57610100808354040283529160200191610596565b820191906000526020600020905b81548152906001019060200180831161057957829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff1660028111156105e257fe5b60028111156105ed57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561066557602002820191906000526020600020906000905b82829054906101000a900460ff1615158152602001906001019060208260000104928301926001038202915080841161062f5790505b50505050508152505090508084600001600186600101866040516106899190614a31565b90815260200160405180910390205403815481106106a357fe5b906000526020600020906005020160008201518160000190805190602001906106cd9291906139d2565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561071c57fe5b0217905550608082015181600401908051906020019061073d929190613a52565b5090505083600101836040516107539190614a31565b9081526020016040518091039020548460010182600001516040516107789190614a1a565b9081526020016040518091039020819055506000846001018460405161079e9190614a31565b908152602001604051809103902081905550836000018054809190600190036107c79190613af8565b5083600201836040516107da9190614a31565b9081526020016040518091039020600080820160006107f99190613b2a565b505050505050505050565b600080606061081284612c74565b91509150606061082182612a10565b90506000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b82518110156109065760008260010184600184038151811061088b57fe5b60200260200101516040516108a09190614a1a565b90815260200160405180910390205414156108c357600095505050505050610b3e565b816002018360018303815181106108d657fe5b60200260200101516040516108eb9190614a1a565b9081526020016040518091039020915080600101905061086d565b50606060018351116109185783610931565b8260018451038151811061092857fe5b60200260200101515b9050600082600101826040516109479190614a31565b908152602001604051809103902054141561096a57600095505050505050610b3e565b610972613996565b826000016001846001018460405161098a9190614a31565b90815260200160405180910390205403815481106109a457fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610a565780601f10610a2b57610100808354040283529160200191610a56565b820191906000526020600020905b815481529060010190602001808311610a3957829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115610aa257fe5b6002811115610aad57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015610b2557602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411610aef5790505b5050505050815250509050806060015196505050505050505b919050565b600160009054906101000a900460ff16610b85576120006002819055506210000060038190555060018060006101000a81548160ff0219169083151502179055505b6000815111610bc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc090614c2c565b60405180910390fd5b60003390506060610bd983612a10565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015610cea57600082600101846001840381518110610c4357fe5b6020026020010151604051610c589190614a1a565b90815260200160405180910390205411610ca7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9e90614c2c565b60405180910390fd5b81600201836001830381518110610cba57fe5b6020026020010151604051610ccf9190614a1a565b90815260200160405180910390209150806001019050610c25565b50600254816000018054905010610d36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2d90614d4c565b60405180910390fd5b60606001835111610d475784610d60565b82600184510381518110610d5757fe5b60200260200101515b905060008260010182604051610d769190614a31565b90815260200160405180910390205414610dc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbc90614d8c565b60405180910390fd5b610dce81612ff6565b610e0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0490614c4c565b60405180910390fd5b6000610e1985876130d7565b905080610e5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5290614aec565b60405180910390fd5b610e63613996565b82816000018190525060008160200190151590811515815250508360000181908060018154018082558091505090600182039060005260206000209060050201600090919290919091506000820151816000019080519060200190610ec99291906139d2565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff02191690836002811115610f1857fe5b02179055506080820151816004019080519060200190610f39929190613a52565b5050505083600001805490508460010184604051610f579190614a31565b90815260200160405180910390208190555050505050505050565b610f7a61313b565b73ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161480610fdf57503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614155b61101e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101590614bac565b60405180910390fd5b80600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411156110a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109790614c8c565b60405180910390fd5b600054600754820111156110e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e090614b0c565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460076000828254039250508190555080600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550806007600082825401925050819055505050565b60008054905090565b600033905060006111aa82866131d4565b9050600160028111156111b957fe5b8160030160009054906101000a900460ff1660028111156111d657fe5b14611216576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120d90614d6c565b60405180910390fd5b6000600354858161122357fe5b061480156112345750806002015484105b611273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126a90614acc565b60405180910390fd5b600354848260020154031080156112905750838160020154038351145b8061129d57506003548351145b6112dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d390614b6c565b60405180910390fd5b600015158160040160035486816112ef57fe5b04815481106112fa57fe5b90600052602060002090602091828204019190069054906101000a900460ff1615151461135c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135390614b4c565b60405180910390fd5b600061136a838787876133d3565b9050806113ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a390614c6c565b60405180910390fd5b60018260040160035487816113bd57fe5b04815481106113c857fe5b90600052602060002090602091828204019190066101000a81548160ff021916908315150217905550505050505050565b611401613b4e565b6000606061140e86612c74565b9150915061141a613996565b61142483836131d4565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156114c85780601f1061149d576101008083540402835291602001916114c8565b820191906000526020600020905b8154815290600101906020018083116114ab57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561151457fe5b600281111561151f57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561159757602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116115615790505b50505050508152505090506002808111156115ae57fe5b816060015160028111156115be57fe5b146115fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f590614e0c565b60405180910390fd5b60035485111580156116105750600085115b61164f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164690614b6c565b60405180910390fd5b80604001518587011115611698576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168f90614acc565b60405180910390fd5b60006116a684848989613484565b8096508192505050806116ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e590614cec565b60405180910390fd5b505050509392505050565b6000339050600061170a82846131d4565b90506001600281111561171957fe5b8160030160009054906101000a900460ff16600281111561173657fe5b14611776576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176d90614d6c565b60405180910390fd5b60006001905060008260040180549050905060008090505b818110156117e157600015158460040182815481106117a957fe5b90600052602060002090602091828204019190069054906101000a900460ff16151514156117d657600092505b80600101905061178e565b5081611822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181990614ccc565b60405180910390fd5b60028360030160006101000a81548160ff0219169083600281111561184357fe5b021790555060006118548587613517565b905080611896576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188d90614b2c565b60405180910390fd5b505050505050565b6060600060606118ad84612c74565b9150915060606118bc82612a10565b90506000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008090505b82518110156119c65760008260010184838151811061192257fe5b60200260200101516040516119379190614a1a565b90815260200160405180910390205411611986576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197d90614c2c565b60405180910390fd5b8160020183828151811061199657fe5b60200260200101516040516119ab9190614a1a565b90815260200160405180910390209150806001019050611907565b5080600001805480602002602001604051908101604052809291908181526020016000905b82821015611b8e57838290600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611aa75780601f10611a7c57610100808354040283529160200191611aa7565b820191906000526020600020905b815481529060010190602001808311611a8a57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115611af357fe5b6002811115611afe57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015611b7657602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411611b405790505b505050505081525050815260200190600101906119eb565b50505050945050505050919050565b600160009054906101000a900460ff16611bdf576120006002819055506210000060038190555060018060006101000a81548160ff0219169083151502179055505b60003390506305f5e100821115611c2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2290614d2c565b60405180910390fd5b600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205483011115611cee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce590614dac565b60405180910390fd5b6060611cf984612a10565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015611e0a57600082600101846001840381518110611d6357fe5b6020026020010151604051611d789190614a1a565b90815260200160405180910390205411611dc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dbe90614c2c565b60405180910390fd5b81600201836001830381518110611dda57fe5b6020026020010151604051611def9190614a1a565b90815260200160405180910390209150806001019050611d45565b50600254816000018054905010611e56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4d90614d4c565b60405180910390fd5b60606001835111611e675785611e80565b82600184510381518110611e7757fe5b60200260200101515b905060008260010182604051611e969190614a31565b90815260200160405180910390205414611ee5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611edc90614d8c565b60405180910390fd5b611eee81612ff6565b611f2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2490614d0c565b60405180910390fd5b6000611f3a85888861357b565b905080611f7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7390614dec565b60405180910390fd5b6060600354600160035489010381611f9057fe5b04604051908082528060200260200182016040528015611fbf5781602001602082028038833980820191505090505b509050836000016040518060a0016040528085815260200160011515815260200189815260200160016002811115611ff357fe5b8152602001838152509080600181540180825580915050906001820390600052602060002090600502016000909192909190915060008201518160000190805190602001906120439291906139d2565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561209257fe5b021790555060808201518160040190805190602001906120b3929190613a52565b50505050836000018054905084600101846040516120d19190614a31565b90815260200160405180910390208190555086600560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505050505050505050565b6000339050612147613996565b61215182846131d4565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156121f55780601f106121ca576101008083540402835291602001916121f5565b820191906000526020600020905b8154815290600101906020018083116121d857829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561224157fe5b600281111561224c57fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156122c457602002820191906000526020600020906000905b82829054906101000a900460ff1615158152602001906001019060208260000104928301926001038202915080841161228e5790505b5050505050815250509050600060028111156122dc57fe5b816060015160028111156122ec57fe5b141561232d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232490614b8c565b60405180910390fd5b600061233983856135e8565b90508061237b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161237290614bec565b60405180910390fd5b606061238685612a10565b90506000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b825181101561241e57816002018360018303815181106123ee57fe5b60200260200101516040516124039190614a1a565b908152602001604051809103902091508060010190506123d2565b50600060018260010186600001516040516124399190614a1a565b908152602001604051809103902054039050612453613996565b8260000160018460000180549050038154811061246c57fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561251e5780601f106124f35761010080835404028352916020019161251e565b820191906000526020600020905b81548152906001019060200180831161250157829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561256a57fe5b600281111561257557fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156125ed57602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116125b75790505b50505050508152505090508083600001838154811061260857fe5b906000526020600020906005020160008201518160000190805190602001906126329291906139d2565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561268157fe5b021790555060808201518160040190805190602001906126a2929190613a52565b50905050826000018054809190600190036126bd9190613af8565b508260010186600001516040516126d49190614a1a565b9081526020016040518091039020548360010182600001516040516126f99190614a1a565b90815260200160405180910390208190555060008360010187600001516040516127239190614a1a565b9081526020016040518091039020819055508560400151600560008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505050505050505050565b600080606061279e84612c74565b915091506127aa613996565b6127b483836131d4565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156128585780601f1061282d57610100808354040283529160200191612858565b820191906000526020600020905b81548152906001019060200180831161283b57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff1660028111156128a457fe5b60028111156128af57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561292757602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116128f15790505b50505050508152505090506001600281111561293f57fe5b8160600151600281111561294f57fe5b1480612974575060028081111561296257fe5b8160600151600281111561297257fe5b145b6129b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129aa90614d6c565b60405180910390fd5b60006129bf848461364c565b809650819250505080612a07576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129fe90614dcc565b60405180910390fd5b50505050919050565b6060612a1a613b73565b612a23836136b5565b9050612a2d613b73565b612a6b6040518060400160405280600181526020017f2f000000000000000000000000000000000000000000000000000000000000008152506136b5565b905060606001612a8483856136e390919063ffffffff16565b01604051908082528060200260200182016040528015612ab857816020015b6060815260200190600190039081612aa35790505b50905060008090505b8151811015612b0957612ae5612ae0848661375890919063ffffffff16565b613772565b828281518110612af157fe5b60200260200101819052508080600101915050612ac1565b50600081600183510381518110612b1c57fe5b6020026020010151511415612b875780600182510381518110612b3b57fe5b6020026020010160608152506001815103604051908082528060200260200182016040528015612b7f57816020015b6060815260200190600190039081612b6a5790505b509350612bc0565b8051604051908082528060200260200182016040528015612bbc57816020015b6060815260200190600190039081612ba75790505b5093505b60008090505b8451811015612c0757818181518110612bdb57fe5b6020026020010151858281518110612bef57fe5b60200260200101819052508080600101915050612bc6565b50505050919050565b60008060016020601f85510181612c2357fe5b040190506040518481526020810160005b83811015612c55578060200286015181602002830152806001019050612c34565b50602082602085026040018460006010600019f1935050505092915050565b6000606060006028905080845111612cc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cb890614c0c565b60405180910390fd5b6060816040519080825280601f01601f191660200182016040528015612cf65781602001600182028038833980820191505090505b50905060008090505b82811015612d6657858181518110612d1357fe5b602001015160f81c60f81b828281518110612d2a57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050612cff565b50600080905060008090505b83811015612e95576000838281518110612d8857fe5b602001015160f81c60f81b60f81c60ff16905060308110158015612dad575060398111155b80612dc6575060418110158015612dc55750605a8111155b5b80612ddf575060618110158015612dde575060668111155b5b612e1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e1590614c0c565b60405180910390fd5b60308110158015612e30575060398111155b15612e415760308103601084020192505b60418110158015612e535750605a8111155b15612e645760378103601084020192505b60618110158015612e76575060668111155b15612e875760578103601084020192505b508080600101915050612d72565b508094507f2f00000000000000000000000000000000000000000000000000000000000000868481518110612ec657fe5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612f33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f2a90614c0c565b60405180910390fd5b6000600184885103039050806040519080825280601f01601f191660200182016040528015612f715781602001600182028038833980820191505090505b50945060008090505b81811015612fec5760008860018784010181518110612f9557fe5b602001015160f81c60f81b905080878381518110612faf57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350508080600101915050612f7a565b5050505050915091565b600060405160200161300790614a5d565b604051602081830303815290604052805190602001208260405160200161302e9190614a31565b604051602081830303815290604052805190602001201480613099575060405160200161305a90614a48565b60405160208183030381529060405280519060200120826040516020016130819190614a31565b60405160208183030381529060405280519060200120145b806130a5575060008251145b156130b357600090506130d2565b60008251905060ff8111156130cc5760009150506130d2565b60019150505b919050565b60008060016020601f855101816130ea57fe5b040190506040518481526020810160005b8381101561311c5780602002860151816020028301528060010190506130fb565b5060208260208502604001846000600f600019f1935050505092915050565b600073d2001000000000000000000000000000000000d273ffffffffffffffffffffffffffffffffffffffff166383e781fe6040518163ffffffff1660e01b815260040160206040518083038186803b15801561319757600080fd5b505afa1580156131ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506131cf9190810190613da8565b905090565b600060606131e183612a10565b90506000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b82518110156132f25760008260010184600184038151811061324b57fe5b60200260200101516040516132609190614a1a565b908152602001604051809103902054116132af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132a690614c2c565b60405180910390fd5b816002018360018303815181106132c257fe5b60200260200101516040516132d79190614a1a565b9081526020016040518091039020915080600101905061322d565b5060606001835111613304578461331d565b8260018451038151811061331457fe5b60200260200101515b9050600082600101826040516133339190614a31565b90815260200160405180910390205411613382576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161337990614c2c565b60405180910390fd5b6000826000016001846001018460405161339c9190614a31565b90815260200160405180910390205403815481106133b657fe5b906000526020600020906005020190508094505050505092915050565b60008060016020601f855101816133e657fe5b04019050600060016020601f885101816133fc57fe5b040190506040518781526020810160005b8381101561342e57806020028901518160200283015280600101905061340d565b50868360200282015260005b84811015613460578060200287015181856001010160200283015280600101905061343a565b50602082848601602002606001846000600c600019f1945050505050949350505050565b600061348e613b4e565b600060016020601f885101816134a057fe5b0401905060006020601f8601816134b357fe5b0490506040518881526020810160005b848110156134e457806020028a0151816020028301528060010190506134c3565b5083602002810188815287816020015283602002868660030160200285600a600019fa9650505050505094509492505050565b60008060016020601f8551018161352a57fe5b040190506040518481526020810160005b8381101561355c57806020028601518160200283015280600101905061353b565b50602082602085026040018460006011600019f1935050505092915050565b60008060016020601f8651018161358e57fe5b040190506040518581526020810160005b838110156135c057806020028701518160200283015280600101905061359f565b50846020840282015260208260208502604001846000600b600019f193505050509392505050565b60008060016020601f855101816135fb57fe5b040190506040518481526020810160005b8381101561362d57806020028601518160200283015280600101905061360c565b5060208260208502604001846000600e600019f1935050505092915050565b600080600060016020601f8651018161366157fe5b040190506040518581526020810160005b83811015613693578060200287015181602002830152806001019050613672565b506020826020850260200184600d600019fa9450815193505050509250929050565b6136bd613b73565b600060208301905060405180604001604052808451815260200182815250915050919050565b600080826000015161370785600001518660200151866000015187602001516137d4565b0190505b8360000151846020015101811161375157818060010192505082600001516137498560200151830386600001510383866000015187602001516137d4565b01905061370b565b5092915050565b613760613b73565b61376b8383836138af565b5092915050565b60608082600001516040519080825280601f01601f1916602001820160405280156137ac5781602001600182028038833980820191505090505b50905060006020820190506137ca818560200151866000015161394d565b8192505050919050565b600080849050600086851161389f576020851161385957600060018660200360080260020a031960001b905060008186511690506000878a8a0103905060008386511690505b82811461384b57818610613838578a8a0196505050505050506138a7565b858060010196505083865116905061381a565b8596505050505050506138a7565b60008585209050600091505b858803821161389d57600086842090508082141561388957839450505050506138a7565b600184019350508180600101925050613865565b505b868601925050505b949350505050565b6138b7613b73565b60006138d585600001518660200151866000015187602001516137d4565b90508460200151836020018181525050846020015181038360000181815250508460000151856020015101811415613917576000856000018181525050613942565b8360000151836000015101856000018181510391508181525050836000015181018560200181815250505b829150509392505050565b5b60208110613971578151835260208301925060208201915060208103905061394e565b60006001826020036101000a0390508019835116818551168181178652505050505050565b6040518060a001604052806060815260200160001515815260200160008152602001600060028111156139c557fe5b8152602001606081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613a1357805160ff1916838001178555613a41565b82800160010185558215613a41579182015b82811115613a40578251825591602001919060010190613a25565b5b509050613a4e9190613b8d565b5090565b82805482825590600052602060002090601f01602090048101928215613ae75791602002820160005b83821115613ab857835183826101000a81548160ff0219169083151502179055509260200192600101602081600001049283019260010302613a7b565b8015613ae55782816101000a81549060ff0219169055600101602081600001049283019260010302613ab8565b505b509050613af49190613bb2565b5090565b815481835581811115613b2557600502816005028360005260206000209182019101613b249190613be2565b5b505050565b5080546000825560050290600052602060002090810190613b4b9190613be2565b50565b6040518062100000016040528061800090602082028038833980820191505090505090565b604051806040016040528060008152602001600081525090565b613baf91905b80821115613bab576000816000905550600101613b93565b5090565b90565b613bdf91905b80821115613bdb57600081816101000a81549060ff021916905550600101613bb8565b5090565b90565b613c4e91905b80821115613c4a5760008082016000613c019190613c51565b6001820160006101000a81549060ff021916905560028201600090556003820160006101000a81549060ff0219169055600482016000613c419190613c99565b50600501613be8565b5090565b90565b50805460018160011615610100020316600290046000825580601f10613c775750613c96565b601f016020900490600052602060002090810190613c959190613b8d565b5b50565b50805460008255601f016020900490600052602060002090810190613cbe9190613b8d565b50565b600081359050613cd081615086565b92915050565b600081519050613ce581615086565b92915050565b600082601f830112613cfc57600080fd5b8135613d0f613d0a82614e74565b614e47565b91508082526020830160208301858383011115613d2b57600080fd5b613d36838284615026565b50505092915050565b600082601f830112613d5057600080fd5b8135613d63613d5e82614ea0565b614e47565b91508082526020830160208301858383011115613d7f57600080fd5b613d8a838284615026565b50505092915050565b600081359050613da28161509d565b92915050565b600060208284031215613dba57600080fd5b6000613dc884828501613cd6565b91505092915050565b60008060408385031215613de457600080fd5b6000613df285828601613cc1565b9250506020613e0385828601613d93565b9150509250929050565b600060208284031215613e1f57600080fd5b600082013567ffffffffffffffff811115613e3957600080fd5b613e4584828501613d3f565b91505092915050565b60008060408385031215613e6157600080fd5b600083013567ffffffffffffffff811115613e7b57600080fd5b613e8785828601613d3f565b9250506020613e9885828601613d93565b9150509250929050565b600080600060608486031215613eb757600080fd5b600084013567ffffffffffffffff811115613ed157600080fd5b613edd86828701613d3f565b9350506020613eee86828701613d93565b925050604084013567ffffffffffffffff811115613f0b57600080fd5b613f1786828701613ceb565b9150509250925092565b600080600060608486031215613f3657600080fd5b600084013567ffffffffffffffff811115613f5057600080fd5b613f5c86828701613d3f565b9350506020613f6d86828701613d93565b9250506040613f7e86828701613d93565b9150509250925092565b6000613f9483836140f6565b60208301905092915050565b6000613fac8383614105565b60208301905092915050565b6000613fc4838361497f565b905092915050565b6000613fd782614ef6565b613fe18185614f55565b9350613fec83614ecc565b8060005b8381101561401d5781516140048882613f88565b975061400f83614f2e565b925050600181019050613ff0565b5085935050505092915050565b61403381614f01565b61403d8184614f66565b925061404882614edc565b8060005b838110156140795781516140608782613fa0565b965061406b83614f3b565b92505060018101905061404c565b505050505050565b600061408c82614f0d565b6140968185614f71565b9350836020820285016140a885614ee6565b8060005b858110156140e457848403895281516140c58582613fb8565b94506140d083614f48565b925060208a019950506001810190506140ac565b50829750879550505050505092915050565b6140ff81614fc1565b82525050565b61410e81614fcd565b82525050565b61411d81615014565b82525050565b61412c81615014565b82525050565b600061413d82614f23565b6141478185614fa4565b9350614157818560208601615035565b80840191505092915050565b600061416e82614f18565b6141788185614f82565b9350614188818560208601615035565b61419181615068565b840191505092915050565b60006141a782614f18565b6141b18185614fa4565b93506141c1818560208601615035565b80840191505092915050565b60006141da601883614f93565b91507f496e636f7272656374206368756e6b20706f736974696f6e00000000000000006000830152602082019050919050565b600061421a601583614f93565b91507f4469726563746f7279206e6f74206372656174656400000000000000000000006000830152602082019050919050565b600061425a602483614f93565b91507f4e6f7420656e6f756768206d656d6f727920696e207468652046696c6573746f60008301527f72616765000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006142c0601b83614f93565b91507f48617368206861736e2774206265656e2063616c63756c6174656400000000006000830152602082019050919050565b6000614300601983614f93565b91507f4368756e6b20697320616c72656164792075706c6f61646564000000000000006000830152602082019050919050565b6000614340601683614f93565b91507f496e636f7272656374206368756e6b206c656e677468000000000000000000006000830152602082019050919050565b6000614380600f83614f93565b91507f46696c65206e6f742065786973747300000000000000000000000000000000006000830152602082019050919050565b60006143c0600e83614f93565b91507f496e76616c69642073656e6465720000000000000000000000000000000000006000830152602082019050919050565b6000614400601883614f93565b91507f4469726563746f7279206973206e6f742064656c6574656400000000000000006000830152602082019050919050565b6000614440601083614f93565b91507f46696c65206e6f742064656c65746564000000000000000000000000000000006000830152602082019050919050565b6000614480601383614f93565b91507f496e76616c69642073746f7261676550617468000000000000000000000000006000830152602082019050919050565b60006144c0600c83614f93565b91507f496e76616c6964207061746800000000000000000000000000000000000000006000830152602082019050919050565b6000614500600183614fa4565b91507f2e000000000000000000000000000000000000000000000000000000000000006000830152600182019050919050565b6000614540601683614f93565b91507f496e76616c6964206469726563746f7279206e616d65000000000000000000006000830152602082019050919050565b6000614580601583614f93565b91507f4368756e6b207761736e27742075706c6f6164656400000000000000000000006000830152602082019050919050565b60006145c0602683614f93565b91507f436f756c64206e6f742072657365727665206c657373207468616e207573656460008301527f20737061636500000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614626601683614f93565b91507f4469726563746f7279206973206e6f7420656d707479000000000000000000006000830152602082019050919050565b6000614666602383614f93565b91507f46696c65206861736e2774206265656e2075706c6f6164656420636f7272656360008301527f746c7900000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006146cc601183614f93565b91507f4368756e6b207761736e277420726561640000000000000000000000000000006000830152602082019050919050565b600061470c601883614f93565b91507f46696c656e616d652073686f756c64206265203c2032353600000000000000006000830152602082019050919050565b600061474c601f83614f93565b91507f46696c652073686f756c64206265206c657373207468616e20313030204d42006000830152602082019050919050565b600061478c600283614fa4565b91507f2e2e0000000000000000000000000000000000000000000000000000000000006000830152600282019050919050565b60006147cc601183614f93565b91507f4469726563746f72792069732066756c6c0000000000000000000000000000006000830152602082019050919050565b600061480c600e83614f93565b91507f46696c65206e6f7420666f756e640000000000000000000000000000000000006000830152602082019050919050565b600061484c601883614f93565b91507f46696c65206f72206469726563746f72792065786973747300000000000000006000830152602082019050919050565b600061488c601983614f93565b91507f4e6f7420656e6f756768207265736572766564207370616365000000000000006000830152602082019050919050565b60006148cc601883614f93565b91507f45564d206572726f7220696e2067657446696c6553697a6500000000000000006000830152602082019050919050565b600061490c601083614f93565b91507f46696c65206e6f742063726561746564000000000000000000000000000000006000830152602082019050919050565b600061494c601983614f93565b91507f46696c65206861736e2774206265656e2075706c6f61646564000000000000006000830152602082019050919050565b600060a083016000830151848203600086015261499c8282614163565b91505060208301516149b160208601826140f6565b5060408301516149c460408601826149fc565b5060608301516149d76060860182614114565b50608083015184820360808601526149ef8282613fcc565b9150508091505092915050565b614a058161500a565b82525050565b614a148161500a565b82525050565b6000614a26828461419c565b915081905092915050565b6000614a3d8284614132565b915081905092915050565b6000614a53826144f3565b9150819050919050565b6000614a688261477f565b9150819050919050565b60006210000082019050614a89600083018461402a565b92915050565b60006020820190508181036000830152614aa98184614081565b905092915050565b6000602082019050614ac66000830184614123565b92915050565b60006020820190508181036000830152614ae5816141cd565b9050919050565b60006020820190508181036000830152614b058161420d565b9050919050565b60006020820190508181036000830152614b258161424d565b9050919050565b60006020820190508181036000830152614b45816142b3565b9050919050565b60006020820190508181036000830152614b65816142f3565b9050919050565b60006020820190508181036000830152614b8581614333565b9050919050565b60006020820190508181036000830152614ba581614373565b9050919050565b60006020820190508181036000830152614bc5816143b3565b9050919050565b60006020820190508181036000830152614be5816143f3565b9050919050565b60006020820190508181036000830152614c0581614433565b9050919050565b60006020820190508181036000830152614c2581614473565b9050919050565b60006020820190508181036000830152614c45816144b3565b9050919050565b60006020820190508181036000830152614c6581614533565b9050919050565b60006020820190508181036000830152614c8581614573565b9050919050565b60006020820190508181036000830152614ca5816145b3565b9050919050565b60006020820190508181036000830152614cc581614619565b9050919050565b60006020820190508181036000830152614ce581614659565b9050919050565b60006020820190508181036000830152614d05816146bf565b9050919050565b60006020820190508181036000830152614d25816146ff565b9050919050565b60006020820190508181036000830152614d458161473f565b9050919050565b60006020820190508181036000830152614d65816147bf565b9050919050565b60006020820190508181036000830152614d85816147ff565b9050919050565b60006020820190508181036000830152614da58161483f565b9050919050565b60006020820190508181036000830152614dc58161487f565b9050919050565b60006020820190508181036000830152614de5816148bf565b9050919050565b60006020820190508181036000830152614e05816148ff565b9050919050565b60006020820190508181036000830152614e258161493f565b9050919050565b6000602082019050614e416000830184614a0b565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614e6a57600080fd5b8060405250919050565b600067ffffffffffffffff821115614e8b57600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614eb757600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050919050565b6000819050602082019050919050565b600081519050919050565b60006180009050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614fba82614fea565b9050919050565b60008115159050919050565b6000819050919050565b6000819050614fe582615079565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061501f82614fd7565b9050919050565b82818337600083830152505050565b60005b83811015615053578082015181840152602081019050615038565b83811115615062576000848401525b50505050565b6000601f19601f8301169050919050565b6003811061508357fe5b50565b61508f81614faf565b811461509a57600080fd5b50565b6150a68161500a565b81146150b157600080fd5b5056fea365627a7a72315820314a90e541327f2678eaf7815f54348c3702e4fa45cdf1d5595b378d08af86896c6578706572696d656e74616cf564736f6c634300050d0040", + "nonce": "0", + "storage": { + "0x0": "2868903936" + } + }, + "0x69bfcdcb98c9562e0a2faee3ecdfd65e8a0adb19": { + "balance": "1000000000000000000000000000000" + }, + "0x6a37ad7dceec4595eea9f03b82d2710e738343ac": { + "balance": "1000000000000000000000000000000" + }, + "0x6b806862a977a0e22ed1752f858e5332647121c8": { + "balance": "1000000000000000000000000000000" + }, + "0x6c0ef9084a57df13c175afea32ea47a510c5506e": { + "balance": "1000000000000000000000000000000" + }, + "0x6cd5e637266e18d3e888ee99451eb828c6b491f4": { + "balance": "1000000000000000000000000000000" + }, + "0x6d0d7f0ff51917bd84a5f7270d31a894282aaf4b": { + "balance": "1000000000000000000000000000000" + }, + "0x6d8092cb926daf29236f866cd31c327ff73323d1": { + "balance": "1000000000000000000000000000000" + }, + "0x6d80aAC61F6d92c7F4A3c412850474ba963B698E": { + "balance": "1000000000000000000000" + }, + "0x6fec280c0ab320715b17d70e8b02c2d4141c1372": { + "balance": "1000000000000000000000000000000" + }, + "0x733ad609ef2e742334d96266fbc13733f1cf5e4a": { + "balance": "1000000000000000000000000000000" + }, + "0x7525198d8cd1121d57358a0b0ed037e924581a76": { + "balance": "1000000000000000000000000000000" + }, + "0x765708943c3b791563d1e3f0533b6d7e7d769e4d": { + "balance": "1000000000000000000000000000000" + }, + "0x7685d04f0b7657017b77efa004a14ff9f022acab": { + "balance": "1000000000000000000000000000000" + }, + "0x76b545cb6a2fc671f741950eeb27627e69a1e69b": { + "balance": "1000000000000000000000000000000" + }, + "0x77a0bc73442d3d9cb993e8d9752f95babf0ccaa6": { + "balance": "1000000000000000000000000000000" + }, + "0x7a89A6c323FaCfF0ADeF7EEF3e491aD4044d0592": { + "balance": "100000000000000000000000" + }, + "0x7e7E68F04D1799Fa25C8cff57314c8a5d3942e69": { + "balance": "1000000000000000000000000" + }, + "0x811d701d14539d190a8593fe901eafe8eff511f5": { + "balance": "1000000000000000000000000000000" + }, + "0x81dcbd71da28fafb9ca99ff5a22bfcebba84fecc": { + "balance": "100000000000000000000000" + }, + "0x83c1479d2a32d9ed9fa699289b6c2db56b7cd045": { + "balance": "1000000000000000000000000000000" + }, + "0x85b33f0853ab8eaa4e602bdfd724d44bc2731e90": { + "balance": "1000000000000000000000000000000" + }, + "0x863f816036e3cbba90855196c9d1e339fcff1650": { + "balance": "1000000000000000000000000000000" + }, + "0x87ea381878572d63b3453033d7540abddd191186": { + "balance": "1000000000000000000000000000000" + }, + "0x88fd5e01078629cc194c933d9631b9448fe10b1d": { + "balance": "1000000000000000000000000000000" + }, + "0x8945e48bd056f45c8b57f9025d2674bb03a24035": { + "balance": "1000000000000000000000000000000" + }, + "0x8a920edc1021ce76c22774e0e83723a6e51c2439": { + "balance": "1000000000000000000000000000000" + }, + "0x8e6081e272c8f4d49f5b29157b52f68cbd6307ad": { + "balance": "1000000000000000000000000000000" + }, + "0x8fe24dbbf9884bd458d8cfac528b4ad70e82497d": { + "balance": "1000000000000000000000000000000" + }, + "0x90431f3f75b26657f74abbb5c759b12e78f916cc": { + "balance": "1000000000000000000000000000000" + }, + "0x907cd0881E50d359bb9Fd120B1A5A143b1C97De6": { + "balance": "1000000000000000000000000000000000000000000000000000000000" + }, + "0x94c6e5746971d6aebeaa42cbbe2feca0f6b5b24f": { + "balance": "1000000000000000000000000000000" + }, + "0x96672f9e982936e1904b15c948cc81bf18027db6": { + "balance": "1000000000000000000000000000000" + }, + "0x97b921ba45e0aa8830701aa62050a83ee00a1bb8": { + "balance": "1000000000000000000000000000000" + }, + "0x98e50c97baf98dc6a81bdb95067339a269a36fc1": { + "balance": "1000000000000000000000000000000" + }, + "0x9b77f28285a49601169a33332f08aa309d97edd0": { + "balance": "1000000000000000000000000000000" + }, + "0x9f62f4215cd277ca40dede101b4ccb29290de6bb": { + "balance": "1000000000000000000000000000000" + }, + "0xD1001000000000000000000000000000000000D1": { + "balance": "0", + "code": "0x608060405260043610603f576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680636d4ce63c146044575b600080fd5b348015604f57600080fd5b506056606c565b6040518082815260200191505060405180910390f35b60006001600060048152602001908152602001600020600060098152602001908152602001600020600101549050905600a165627a7a723058208fe64219becc0bcab1c8f854f05804ebb6bb555da5dbc49e8f7021c31d77636a0029", + "nonce": "0", + "storage": { + "0x3b4da637a1b0e6dbfc6795f2b7f0cb29eebb91b3af4dcc335e1633f6b4af810b": "1111" + } + }, + "0xD3001000000000000000000000000000000000D3": { + "balance": "0", + "code": "0x60806040526004361061007b5760003560e01c80639623609d1161004e5780639623609d1461013657806399a88ec4146101f5578063f2fde38b14610230578063f3b7dead146102635761007b565b8063204e1c7a14610080578063715018a6146100cf5780637eff275e146100e65780638da5cb5b14610121575b600080fd5b34801561008c57600080fd5b506100b3600480360360208110156100a357600080fd5b50356001600160a01b0316610296565b604080516001600160a01b039092168252519081900360200190f35b3480156100db57600080fd5b506100e4610328565b005b3480156100f257600080fd5b506100e46004803603604081101561010957600080fd5b506001600160a01b03813581169160200135166103ca565b34801561012d57600080fd5b506100b3610496565b6100e46004803603606081101561014c57600080fd5b6001600160a01b03823581169260208101359091169181019060608101604082013564010000000081111561018057600080fd5b82018360208201111561019257600080fd5b803590602001918460018302840111640100000000831117156101b457600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506104a5945050505050565b34801561020157600080fd5b506100e46004803603604081101561021857600080fd5b506001600160a01b03813581169160200135166105dd565b34801561023c57600080fd5b506100e46004803603602081101561025357600080fd5b50356001600160a01b031661068d565b34801561026f57600080fd5b506100b36004803603602081101561028657600080fd5b50356001600160a01b0316610785565b6000806060836001600160a01b03166040518080635c60da1b60e01b8152506004019050600060405180830381855afa9150503d80600081146102f5576040519150601f19603f3d011682016040523d82523d6000602084013e6102fa565b606091505b50915091508161030957600080fd5b80806020019051602081101561031e57600080fd5b5051949350505050565b6103306107e4565b6000546001600160a01b03908116911614610380576040805162461bcd60e51b8152602060048201819052602482015260008051602061080f833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6103d26107e4565b6000546001600160a01b03908116911614610422576040805162461bcd60e51b8152602060048201819052602482015260008051602061080f833981519152604482015290519081900360640190fd5b816001600160a01b0316638f283970826040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050600060405180830381600087803b15801561047a57600080fd5b505af115801561048e573d6000803e3d6000fd5b505050505050565b6000546001600160a01b031690565b6104ad6107e4565b6000546001600160a01b039081169116146104fd576040805162461bcd60e51b8152602060048201819052602482015260008051602061080f833981519152604482015290519081900360640190fd5b826001600160a01b0316634f1ef2863484846040518463ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561057357818101518382015260200161055b565b50505050905090810190601f1680156105a05780820380516001836020036101000a031916815260200191505b5093505050506000604051808303818588803b1580156105bf57600080fd5b505af11580156105d3573d6000803e3d6000fd5b5050505050505050565b6105e56107e4565b6000546001600160a01b03908116911614610635576040805162461bcd60e51b8152602060048201819052602482015260008051602061080f833981519152604482015290519081900360640190fd5b816001600160a01b0316633659cfe6826040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050600060405180830381600087803b15801561047a57600080fd5b6106956107e4565b6000546001600160a01b039081169116146106e5576040805162461bcd60e51b8152602060048201819052602482015260008051602061080f833981519152604482015290519081900360640190fd5b6001600160a01b03811661072a5760405162461bcd60e51b81526004018080602001828103825260268152602001806107e96026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000806060836001600160a01b031660405180806303e1469160e61b8152506004019050600060405180830381855afa9150503d80600081146102f5576040519150601f19603f3d011682016040523d82523d6000602084013e6102fa565b339056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a26469706673582212201d968ac32bef5562c6b4f1bd5d2f2a74c14d07ce008ca6fdc5a3bd0f5fc265f564736f6c63430006080033", + "nonce": "0", + "storage": { + "0x0": "0x907cd0881E50d359bb9Fd120B1A5A143b1C97De6" + } + }, + "0xD3002000000000000000000000000000000000D3": { + "balance": "0", + "code": "0x60806040526004361061004e5760003560e01c80633659cfe6146100655780634f1ef286146100985780635c60da1b146101185780638f28397014610149578063f851a4401461017c5761005d565b3661005d5761005b610191565b005b61005b610191565b34801561007157600080fd5b5061005b6004803603602081101561008857600080fd5b50356001600160a01b03166101ab565b61005b600480360360408110156100ae57600080fd5b6001600160a01b0382351691908101906040810160208201356401000000008111156100d957600080fd5b8201836020820111156100eb57600080fd5b8035906020019184600183028401116401000000008311171561010d57600080fd5b5090925090506101e5565b34801561012457600080fd5b5061012d610292565b604080516001600160a01b039092168252519081900360200190f35b34801561015557600080fd5b5061005b6004803603602081101561016c57600080fd5b50356001600160a01b03166102cf565b34801561018857600080fd5b5061012d610389565b6101996103ba565b6101a96101a461041a565b61043f565b565b6101b3610463565b6001600160a01b0316336001600160a01b031614156101da576101d581610488565b6101e2565b6101e2610191565b50565b6101ed610463565b6001600160a01b0316336001600160a01b031614156102855761020f83610488565b6000836001600160a01b031683836040518083838082843760405192019450600093509091505080830381855af49150503d806000811461026c576040519150601f19603f3d011682016040523d82523d6000602084013e610271565b606091505b505090508061027f57600080fd5b5061028d565b61028d610191565b505050565b600061029c610463565b6001600160a01b0316336001600160a01b031614156102c4576102bd61041a565b90506102cc565b6102cc610191565b90565b6102d7610463565b6001600160a01b0316336001600160a01b031614156101da576001600160a01b0381166103355760405162461bcd60e51b81526004018080602001828103825260368152602001806105876036913960400191505060405180910390fd5b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f61035e610463565b604080516001600160a01b03928316815291841660208301528051918290030190a16101d5816104c8565b6000610393610463565b6001600160a01b0316336001600160a01b031614156102c4576102bd610463565b3b151590565b6103c2610463565b6001600160a01b0316336001600160a01b031614156104125760405162461bcd60e51b81526004018080602001828103825260328152602001806105556032913960400191505060405180910390fd5b6101a96101a9565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b3660008037600080366000845af43d6000803e80801561045e573d6000f35b3d6000fd5b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b610491816104ec565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610355565b6104f5816103b4565b6105305760405162461bcd60e51b815260040180806020018281038252603b8152602001806105bd603b913960400191505060405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5556fe43616e6e6f742063616c6c2066616c6c6261636b2066756e6374696f6e2066726f6d207468652070726f78792061646d696e43616e6e6f74206368616e6765207468652061646d696e206f6620612070726f787920746f20746865207a65726f206164647265737343616e6e6f742073657420612070726f787920696d706c656d656e746174696f6e20746f2061206e6f6e2d636f6e74726163742061646472657373a26469706673582212206e221e2a3547bd97244b05ed46430b1b078ba097cb2a4e25ec3d79cf9ac9f02c64736f6c63430006080033", + "nonce": "0", + "storage": { + "0x0": "1000000", + "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0xD3003000000000000000000000000000000000D3", + "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "0xD3001000000000000000000000000000000000D3" + } + }, + "0xD3003000000000000000000000000000000000D3": { + "balance": "0", + "code": "0x608060405234801561001057600080fd5b50600436106100b45760003560e01c806379210e8e1161007157806379210e8e1461017757806381a8235a146101a757806385aeeb17146101c35780639a9a5593146101f3578063a99100541461020f578063b57321221461022b576100b4565b806307c6e7d3146100b9578063122f4fba146100d55780631c6ec7a9146101055780631cfe4e3b14610121578063373dedb41461013d57806361e46db51461015b575b600080fd5b6100d360048036036100ce9190810190613e94565b61025b565b005b6100ef60048036036100ea9190810190613e94565b610862565b6040516100fc9190614b38565b60405180910390f35b61011f600480360361011a9190810190613e94565b610ba1565b005b61013b60048036036101369190810190613e58565b610fce565b005b6101456111ec565b6040516101529190614eb3565b60405180910390f35b61017560048036036101709190810190613f29565b6111f6565b005b610191600480360361018c9190810190613fa8565b611456565b60405161019e9190614af9565b60405180910390f35b6101c160048036036101bc9190810190613e94565b611756565b005b6101dd60048036036101d89190810190613e94565b6118fb565b6040516101ea9190614b16565b60405180910390f35b61020d60048036036102089190810190613ed5565b611bfa565b005b61022960048036036102249190810190613e94565b612195565b005b61024560048036036102409190810190613e94565b612849565b6040516102529190614eb3565b60405180910390f35b6000339050606061026b83612ac9565b90506000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b825181101561037c576000826001018460018403815181106102d557fe5b60200260200101516040516102ea9190614aa1565b90815260200160405180910390205411610339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161033090614cb3565b60405180910390fd5b8160020183600183038151811061034c57fe5b60200260200101516040516103619190614aa1565b908152602001604051809103902091508060010190506102b7565b506060600183511161038e57846103a7565b8260018451038151811061039e57fe5b60200260200101515b9050600082600101826040516103bd9190614ab8565b9081526020016040518091039020541161040c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161040390614cb3565b60405180910390fd5b600082600201826040516104209190614ab8565b90815260200160405180910390206000018054905014610475576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161046c90614d33565b60405180910390fd5b60006104818587612cc9565b9050806104c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ba90614c53565b60405180910390fd5b6104cb613a4f565b836000016001856000018054905003815481106104e457fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156105965780601f1061056b57610100808354040283529160200191610596565b820191906000526020600020905b81548152906001019060200180831161057957829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff1660028111156105e257fe5b60028111156105ed57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561066557602002820191906000526020600020906000905b82829054906101000a900460ff1615158152602001906001019060208260000104928301926001038202915080841161062f5790505b50505050508152505090508084600001600186600101866040516106899190614ab8565b90815260200160405180910390205403815481106106a357fe5b906000526020600020906005020160008201518160000190805190602001906106cd929190613a8b565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561071c57fe5b0217905550608082015181600401908051906020019061073d929190613b0b565b5090505083600101836040516107539190614ab8565b9081526020016040518091039020548460010182600001516040516107789190614aa1565b9081526020016040518091039020819055506000846001018460405161079e9190614ab8565b908152602001604051809103902081905550836000018054806107bd57fe5b6001900381819060005260206000209060050201600080820160006107e29190613bb1565b6001820160006101000a81549060ff021916905560028201600090556003820160006101000a81549060ff02191690556004820160006108229190613bf9565b5050905583600201836040516108389190614ab8565b9081526020016040518091039020600080820160006108579190613c21565b505050505050505050565b600080606061087084612d2d565b91509150606061087f82612ac9565b90506000600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015610964576000826001018460018403815181106108e957fe5b60200260200101516040516108fe9190614aa1565b908152602001604051809103902054141561092157600095505050505050610b9c565b8160020183600183038151811061093457fe5b60200260200101516040516109499190614aa1565b908152602001604051809103902091508060010190506108cb565b5060606001835111610976578361098f565b8260018451038151811061098657fe5b60200260200101515b9050600082600101826040516109a59190614ab8565b90815260200160405180910390205414156109c857600095505050505050610b9c565b6109d0613a4f565b82600001600184600101846040516109e89190614ab8565b9081526020016040518091039020540381548110610a0257fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610ab45780601f10610a8957610100808354040283529160200191610ab4565b820191906000526020600020905b815481529060010190602001808311610a9757829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115610b0057fe5b6002811115610b0b57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015610b8357602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411610b4d5790505b5050505050815250509050806060015196505050505050505b919050565b600360009054906101000a900460ff16610be457612000600481905550621000006005819055506001600360006101000a81548160ff0219169083151502179055505b6000815111610c28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1f90614cb3565b60405180910390fd5b60003390506060610c3883612ac9565b90506000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015610d4957600082600101846001840381518110610ca257fe5b6020026020010151604051610cb79190614aa1565b90815260200160405180910390205411610d06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cfd90614cb3565b60405180910390fd5b81600201836001830381518110610d1957fe5b6020026020010151604051610d2e9190614aa1565b90815260200160405180910390209150806001019050610c84565b50600454816000018054905010610d95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8c90614dd3565b60405180910390fd5b60606001835111610da65784610dbf565b82600184510381518110610db657fe5b60200260200101515b905060008260010182604051610dd59190614ab8565b90815260200160405180910390205414610e24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1b90614e13565b60405180910390fd5b610e2d816130af565b610e6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6390614cd3565b60405180910390fd5b6000610e788587613190565b905080610eba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb190614b73565b60405180910390fd5b610ec2613a4f565b8281600001819052506000816020019015159081151581525050836000018190806001815401808255809150506001900390600052602060002090600502016000909190919091506000820151816000019080519060200190610f26929190613a8b565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff02191690836002811115610f7557fe5b02179055506080820151816004019080519060200190610f96929190613b0b565b50505083600001805490508460010184604051610fb39190614ab8565b90815260200160405180910390208190555050505050505050565b610fd66131f4565b73ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16148061103b57503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614155b61107a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107190614c33565b60405180910390fd5b80600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411156110fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f390614d13565b60405180910390fd5b60025460095482011115611145576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113c90614b93565b60405180910390fd5b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460096000828254039250508190555080600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550806009600082825401925050819055505050565b6000600254905090565b60003390506000611207828661328d565b90506001600281111561121657fe5b8160030160009054906101000a900460ff16600281111561123357fe5b14611273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126a90614df3565b60405180910390fd5b6000600554858161128057fe5b061480156112915750806002015484105b6112d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c790614b53565b60405180910390fd5b600554848260020154031080156112ed5750838160020154038351145b806112fa57506005548351145b611339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133090614bf3565b60405180910390fd5b6000151581600401600554868161134c57fe5b048154811061135757fe5b90600052602060002090602091828204019190069054906101000a900460ff161515146113b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b090614bd3565b60405180910390fd5b60006113c78387878761348c565b905080611409576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140090614cf3565b60405180910390fd5b600182600401600554878161141a57fe5b048154811061142557fe5b90600052602060002090602091828204019190066101000a81548160ff021916908315150217905550505050505050565b61145e613c45565b6000606061146b86612d2d565b91509150611477613a4f565b611481838361328d565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156115255780601f106114fa57610100808354040283529160200191611525565b820191906000526020600020905b81548152906001019060200180831161150857829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561157157fe5b600281111561157c57fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156115f457602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116115be5790505b505050505081525050905060028081111561160b57fe5b8160600151600281111561161b57fe5b1461165b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165290614e93565b60405180910390fd5b600554851115801561166d5750600085115b6116ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a390614bf3565b60405180910390fd5b806040015185870111156116f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ec90614b53565b60405180910390fd5b60006117038484898961353d565b80965081925050508061174b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174290614d73565b60405180910390fd5b505050509392505050565b60003390506000611767828461328d565b90506001600281111561177657fe5b8160030160009054906101000a900460ff16600281111561179357fe5b146117d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ca90614df3565b60405180910390fd5b60006001905060008260040180549050905060008090505b8181101561183e576000151584600401828154811061180657fe5b90600052602060002090602091828204019190069054906101000a900460ff161515141561183357600092505b8060010190506117eb565b508161187f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187690614d53565b60405180910390fd5b60028360030160006101000a81548160ff021916908360028111156118a057fe5b021790555060006118b185876135d0565b9050806118f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ea90614bb3565b60405180910390fd5b505050505050565b60606000606061190a84612d2d565b91509150606061191982612ac9565b90506000600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008090505b8251811015611a235760008260010184838151811061197f57fe5b60200260200101516040516119949190614aa1565b908152602001604051809103902054116119e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119da90614cb3565b60405180910390fd5b816002018382815181106119f357fe5b6020026020010151604051611a089190614aa1565b90815260200160405180910390209150806001019050611964565b5080600001805480602002602001604051908101604052809291908181526020016000905b82821015611beb57838290600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611b045780601f10611ad957610100808354040283529160200191611b04565b820191906000526020600020905b815481529060010190602001808311611ae757829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115611b5057fe5b6002811115611b5b57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015611bd357602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411611b9d5790505b50505050508152505081526020019060010190611a48565b50505050945050505050919050565b600360009054906101000a900460ff16611c3d57612000600481905550621000006005819055506001600360006101000a81548160ff0219169083151502179055505b60003390506305f5e100821115611c89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8090614db3565b60405180910390fd5b600660008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205483011115611d4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4390614e33565b60405180910390fd5b6060611d5784612ac9565b90506000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015611e6857600082600101846001840381518110611dc157fe5b6020026020010151604051611dd69190614aa1565b90815260200160405180910390205411611e25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1c90614cb3565b60405180910390fd5b81600201836001830381518110611e3857fe5b6020026020010151604051611e4d9190614aa1565b90815260200160405180910390209150806001019050611da3565b50600454816000018054905010611eb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eab90614dd3565b60405180910390fd5b60606001835111611ec55785611ede565b82600184510381518110611ed557fe5b60200260200101515b905060008260010182604051611ef49190614ab8565b90815260200160405180910390205414611f43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3a90614e13565b60405180910390fd5b611f4c816130af565b611f8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8290614d93565b60405180910390fd5b6000611f98858888613634565b905080611fda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd190614e73565b60405180910390fd5b6060600554600160055489010381611fee57fe5b0460405190808252806020026020018201604052801561201d5781602001602082028038833980820191505090505b509050836000016040518060a001604052808581526020016001151581526020018981526020016001600281111561205157fe5b8152602001838152509080600181540180825580915050600190039060005260206000209060050201600090919091909150600082015181600001908051906020019061209f929190613a8b565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff021916908360028111156120ee57fe5b0217905550608082015181600401908051906020019061210f929190613b0b565b5050508360000180549050846001018460405161212c9190614ab8565b90815260200160405180910390208190555086600760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505050505050505050565b60003390506121a2613a4f565b6121ac828461328d565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156122505780601f1061222557610100808354040283529160200191612250565b820191906000526020600020905b81548152906001019060200180831161223357829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561229c57fe5b60028111156122a757fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561231f57602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116122e95790505b50505050508152505090506000600281111561233757fe5b8160600151600281111561234757fe5b1415612388576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161237f90614c13565b60405180910390fd5b600061239483856136a1565b9050806123d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123cd90614c73565b60405180910390fd5b60606123e185612ac9565b90506000600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015612479578160020183600183038151811061244957fe5b602002602001015160405161245e9190614aa1565b9081526020016040518091039020915080600101905061242d565b50600060018260010186600001516040516124949190614aa1565b9081526020016040518091039020540390506124ae613a4f565b826000016001846000018054905003815481106124c757fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156125795780601f1061254e57610100808354040283529160200191612579565b820191906000526020600020905b81548152906001019060200180831161255c57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff1660028111156125c557fe5b60028111156125d057fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561264857602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116126125790505b50505050508152505090508083600001838154811061266357fe5b9060005260206000209060050201600082015181600001908051906020019061268d929190613a8b565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff021916908360028111156126dc57fe5b021790555060808201518160040190805190602001906126fd929190613b0b565b509050508260000180548061270e57fe5b6001900381819060005260206000209060050201600080820160006127339190613bb1565b6001820160006101000a81549060ff021916905560028201600090556003820160006101000a81549060ff02191690556004820160006127739190613bf9565b5050905582600101866000015160405161278d9190614aa1565b9081526020016040518091039020548360010182600001516040516127b29190614aa1565b90815260200160405180910390208190555060008360010187600001516040516127dc9190614aa1565b9081526020016040518091039020819055508560400151600760008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505050505050505050565b600080606061285784612d2d565b91509150612863613a4f565b61286d838361328d565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156129115780601f106128e657610100808354040283529160200191612911565b820191906000526020600020905b8154815290600101906020018083116128f457829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561295d57fe5b600281111561296857fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156129e057602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116129aa5790505b5050505050815250509050600160028111156129f857fe5b81606001516002811115612a0857fe5b1480612a2d5750600280811115612a1b57fe5b81606001516002811115612a2b57fe5b145b612a6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a6390614df3565b60405180910390fd5b6000612a788484613705565b809650819250505080612ac0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ab790614e53565b60405180910390fd5b50505050919050565b6060612ad3613c6a565b612adc8361376e565b9050612ae6613c6a565b612b246040518060400160405280600181526020017f2f0000000000000000000000000000000000000000000000000000000000000081525061376e565b905060606001612b3d838561379c90919063ffffffff16565b01604051908082528060200260200182016040528015612b7157816020015b6060815260200190600190039081612b5c5790505b50905060008090505b8151811015612bc257612b9e612b99848661381190919063ffffffff16565b61382b565b828281518110612baa57fe5b60200260200101819052508080600101915050612b7a565b50600081600183510381518110612bd557fe5b6020026020010151511415612c405780600182510381518110612bf457fe5b6020026020010160608152506001815103604051908082528060200260200182016040528015612c3857816020015b6060815260200190600190039081612c235790505b509350612c79565b8051604051908082528060200260200182016040528015612c7557816020015b6060815260200190600190039081612c605790505b5093505b60008090505b8451811015612cc057818181518110612c9457fe5b6020026020010151858281518110612ca857fe5b60200260200101819052508080600101915050612c7f565b50505050919050565b60008060016020601f85510181612cdc57fe5b040190506040518481526020810160005b83811015612d0e578060200286015181602002830152806001019050612ced565b50602082602085026040018460006010600019f1935050505092915050565b6000606060006028905080845111612d7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d7190614c93565b60405180910390fd5b6060816040519080825280601f01601f191660200182016040528015612daf5781602001600182028038833980820191505090505b50905060008090505b82811015612e1f57858181518110612dcc57fe5b602001015160f81c60f81b828281518110612de357fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050612db8565b50600080905060008090505b83811015612f4e576000838281518110612e4157fe5b602001015160f81c60f81b60f81c60ff16905060308110158015612e66575060398111155b80612e7f575060418110158015612e7e5750605a8111155b5b80612e98575060618110158015612e97575060668111155b5b612ed7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ece90614c93565b60405180910390fd5b60308110158015612ee9575060398111155b15612efa5760308103601084020192505b60418110158015612f0c5750605a8111155b15612f1d5760378103601084020192505b60618110158015612f2f575060668111155b15612f405760578103601084020192505b508080600101915050612e2b565b508094507f2f00000000000000000000000000000000000000000000000000000000000000868481518110612f7f57fe5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612fec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fe390614c93565b60405180910390fd5b6000600184885103039050806040519080825280601f01601f19166020018201604052801561302a5781602001600182028038833980820191505090505b50945060008090505b818110156130a5576000886001878401018151811061304e57fe5b602001015160f81c60f81b90508087838151811061306857fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350508080600101915050613033565b5050505050915091565b60006040516020016130c090614ae4565b60405160208183030381529060405280519060200120826040516020016130e79190614ab8565b604051602081830303815290604052805190602001201480613152575060405160200161311390614acf565b604051602081830303815290604052805190602001208260405160200161313a9190614ab8565b60405160208183030381529060405280519060200120145b8061315e575060008251145b1561316c576000905061318b565b60008251905060ff81111561318557600091505061318b565b60019150505b919050565b60008060016020601f855101816131a357fe5b040190506040518481526020810160005b838110156131d55780602002860151816020028301528060010190506131b4565b5060208260208502604001846000600f600019f1935050505092915050565b600073d2001000000000000000000000000000000000d273ffffffffffffffffffffffffffffffffffffffff166383e781fe6040518163ffffffff1660e01b815260040160206040518083038186803b15801561325057600080fd5b505afa158015613264573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506132889190810190613e2f565b905090565b6000606061329a83612ac9565b90506000600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b82518110156133ab5760008260010184600184038151811061330457fe5b60200260200101516040516133199190614aa1565b90815260200160405180910390205411613368576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161335f90614cb3565b60405180910390fd5b8160020183600183038151811061337b57fe5b60200260200101516040516133909190614aa1565b908152602001604051809103902091508060010190506132e6565b50606060018351116133bd57846133d6565b826001845103815181106133cd57fe5b60200260200101515b9050600082600101826040516133ec9190614ab8565b9081526020016040518091039020541161343b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161343290614cb3565b60405180910390fd5b600082600001600184600101846040516134559190614ab8565b908152602001604051809103902054038154811061346f57fe5b906000526020600020906005020190508094505050505092915050565b60008060016020601f8551018161349f57fe5b04019050600060016020601f885101816134b557fe5b040190506040518781526020810160005b838110156134e75780602002890151816020028301528060010190506134c6565b50868360200282015260005b8481101561351957806020028701518185600101016020028301528060010190506134f3565b50602082848601602002606001846000600c600019f1945050505050949350505050565b6000613547613c45565b600060016020601f8851018161355957fe5b0401905060006020601f86018161356c57fe5b0490506040518881526020810160005b8481101561359d57806020028a01518160200283015280600101905061357c565b5083602002810188815287816020015283602002868660030160200285600a600019fa9650505050505094509492505050565b60008060016020601f855101816135e357fe5b040190506040518481526020810160005b838110156136155780602002860151816020028301528060010190506135f4565b50602082602085026040018460006011600019f1935050505092915050565b60008060016020601f8651018161364757fe5b040190506040518581526020810160005b83811015613679578060200287015181602002830152806001019050613658565b50846020840282015260208260208502604001846000600b600019f193505050509392505050565b60008060016020601f855101816136b457fe5b040190506040518481526020810160005b838110156136e65780602002860151816020028301528060010190506136c5565b5060208260208502604001846000600e600019f1935050505092915050565b600080600060016020601f8651018161371a57fe5b040190506040518581526020810160005b8381101561374c57806020028701518160200283015280600101905061372b565b506020826020850260200184600d600019fa9450815193505050509250929050565b613776613c6a565b600060208301905060405180604001604052808451815260200182815250915050919050565b60008082600001516137c0856000015186602001518660000151876020015161388d565b0190505b8360000151846020015101811161380a578180600101925050826000015161380285602001518303866000015103838660000151876020015161388d565b0190506137c4565b5092915050565b613819613c6a565b613824838383613968565b5092915050565b60608082600001516040519080825280601f01601f1916602001820160405280156138655781602001600182028038833980820191505090505b50905060006020820190506138838185602001518660000151613a06565b8192505050919050565b6000808490506000868511613958576020851161391257600060018660200360080260020a031960001b905060008186511690506000878a8a0103905060008386511690505b828114613904578186106138f1578a8a019650505050505050613960565b85806001019650508386511690506138d3565b859650505050505050613960565b60008585209050600091505b85880382116139565760008684209050808214156139425783945050505050613960565b60018401935050818060010192505061391e565b505b868601925050505b949350505050565b613970613c6a565b600061398e856000015186602001518660000151876020015161388d565b905084602001518360200181815250508460200151810383600001818152505084600001518560200151018114156139d05760008560000181815250506139fb565b8360000151836000015101856000018181510391508181525050836000015181018560200181815250505b829150509392505050565b5b60208110613a2a5781518352602083019250602082019150602081039050613a07565b60006001826020036101000a0390508019835116818551168181178652505050505050565b6040518060a00160405280606081526020016000151581526020016000815260200160006002811115613a7e57fe5b8152602001606081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613acc57805160ff1916838001178555613afa565b82800160010185558215613afa579182015b82811115613af9578251825591602001919060010190613ade565b5b509050613b079190613c84565b5090565b82805482825590600052602060002090601f01602090048101928215613ba05791602002820160005b83821115613b7157835183826101000a81548160ff0219169083151502179055509260200192600101602081600001049283019260010302613b34565b8015613b9e5782816101000a81549060ff0219169055600101602081600001049283019260010302613b71565b505b509050613bad9190613ca9565b5090565b50805460018160011615610100020316600290046000825580601f10613bd75750613bf6565b601f016020900490600052602060002090810190613bf59190613c84565b5b50565b50805460008255601f016020900490600052602060002090810190613c1e9190613c84565b50565b5080546000825560050290600052602060002090810190613c429190613cd9565b50565b6040518062100000016040528061800090602082028038833980820191505090505090565b604051806040016040528060008152602001600081525090565b613ca691905b80821115613ca2576000816000905550600101613c8a565b5090565b90565b613cd691905b80821115613cd257600081816101000a81549060ff021916905550600101613caf565b5090565b90565b613d4591905b80821115613d415760008082016000613cf89190613bb1565b6001820160006101000a81549060ff021916905560028201600090556003820160006101000a81549060ff0219169055600482016000613d389190613bf9565b50600501613cdf565b5090565b90565b600081359050613d578161510d565b92915050565b600081519050613d6c8161510d565b92915050565b600082601f830112613d8357600080fd5b8135613d96613d9182614efb565b614ece565b91508082526020830160208301858383011115613db257600080fd5b613dbd8382846150ad565b50505092915050565b600082601f830112613dd757600080fd5b8135613dea613de582614f27565b614ece565b91508082526020830160208301858383011115613e0657600080fd5b613e118382846150ad565b50505092915050565b600081359050613e2981615124565b92915050565b600060208284031215613e4157600080fd5b6000613e4f84828501613d5d565b91505092915050565b60008060408385031215613e6b57600080fd5b6000613e7985828601613d48565b9250506020613e8a85828601613e1a565b9150509250929050565b600060208284031215613ea657600080fd5b600082013567ffffffffffffffff811115613ec057600080fd5b613ecc84828501613dc6565b91505092915050565b60008060408385031215613ee857600080fd5b600083013567ffffffffffffffff811115613f0257600080fd5b613f0e85828601613dc6565b9250506020613f1f85828601613e1a565b9150509250929050565b600080600060608486031215613f3e57600080fd5b600084013567ffffffffffffffff811115613f5857600080fd5b613f6486828701613dc6565b9350506020613f7586828701613e1a565b925050604084013567ffffffffffffffff811115613f9257600080fd5b613f9e86828701613d72565b9150509250925092565b600080600060608486031215613fbd57600080fd5b600084013567ffffffffffffffff811115613fd757600080fd5b613fe386828701613dc6565b9350506020613ff486828701613e1a565b925050604061400586828701613e1a565b9150509250925092565b600061401b838361417d565b60208301905092915050565b6000614033838361418c565b60208301905092915050565b600061404b8383614a06565b905092915050565b600061405e82614f7d565b6140688185614fdc565b935061407383614f53565b8060005b838110156140a457815161408b888261400f565b975061409683614fb5565b925050600181019050614077565b5085935050505092915050565b6140ba81614f88565b6140c48184614fed565b92506140cf82614f63565b8060005b838110156141005781516140e78782614027565b96506140f283614fc2565b9250506001810190506140d3565b505050505050565b600061411382614f94565b61411d8185614ff8565b93508360208202850161412f85614f6d565b8060005b8581101561416b578484038952815161414c858261403f565b945061415783614fcf565b925060208a01995050600181019050614133565b50829750879550505050505092915050565b61418681615048565b82525050565b61419581615054565b82525050565b6141a48161509b565b82525050565b6141b38161509b565b82525050565b60006141c482614faa565b6141ce818561502b565b93506141de8185602086016150bc565b80840191505092915050565b60006141f582614f9f565b6141ff8185615009565b935061420f8185602086016150bc565b614218816150ef565b840191505092915050565b600061422e82614f9f565b614238818561502b565b93506142488185602086016150bc565b80840191505092915050565b600061426160188361501a565b91507f496e636f7272656374206368756e6b20706f736974696f6e00000000000000006000830152602082019050919050565b60006142a160158361501a565b91507f4469726563746f7279206e6f74206372656174656400000000000000000000006000830152602082019050919050565b60006142e160248361501a565b91507f4e6f7420656e6f756768206d656d6f727920696e207468652046696c6573746f60008301527f72616765000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614347601b8361501a565b91507f48617368206861736e2774206265656e2063616c63756c6174656400000000006000830152602082019050919050565b600061438760198361501a565b91507f4368756e6b20697320616c72656164792075706c6f61646564000000000000006000830152602082019050919050565b60006143c760168361501a565b91507f496e636f7272656374206368756e6b206c656e677468000000000000000000006000830152602082019050919050565b6000614407600f8361501a565b91507f46696c65206e6f742065786973747300000000000000000000000000000000006000830152602082019050919050565b6000614447600e8361501a565b91507f496e76616c69642073656e6465720000000000000000000000000000000000006000830152602082019050919050565b600061448760188361501a565b91507f4469726563746f7279206973206e6f742064656c6574656400000000000000006000830152602082019050919050565b60006144c760108361501a565b91507f46696c65206e6f742064656c65746564000000000000000000000000000000006000830152602082019050919050565b600061450760138361501a565b91507f496e76616c69642073746f7261676550617468000000000000000000000000006000830152602082019050919050565b6000614547600c8361501a565b91507f496e76616c6964207061746800000000000000000000000000000000000000006000830152602082019050919050565b600061458760018361502b565b91507f2e000000000000000000000000000000000000000000000000000000000000006000830152600182019050919050565b60006145c760168361501a565b91507f496e76616c6964206469726563746f7279206e616d65000000000000000000006000830152602082019050919050565b600061460760158361501a565b91507f4368756e6b207761736e27742075706c6f6164656400000000000000000000006000830152602082019050919050565b600061464760268361501a565b91507f436f756c64206e6f742072657365727665206c657373207468616e207573656460008301527f20737061636500000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006146ad60168361501a565b91507f4469726563746f7279206973206e6f7420656d707479000000000000000000006000830152602082019050919050565b60006146ed60238361501a565b91507f46696c65206861736e2774206265656e2075706c6f6164656420636f7272656360008301527f746c7900000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061475360118361501a565b91507f4368756e6b207761736e277420726561640000000000000000000000000000006000830152602082019050919050565b600061479360188361501a565b91507f46696c656e616d652073686f756c64206265203c2032353600000000000000006000830152602082019050919050565b60006147d3601f8361501a565b91507f46696c652073686f756c64206265206c657373207468616e20313030204d42006000830152602082019050919050565b600061481360028361502b565b91507f2e2e0000000000000000000000000000000000000000000000000000000000006000830152600282019050919050565b600061485360118361501a565b91507f4469726563746f72792069732066756c6c0000000000000000000000000000006000830152602082019050919050565b6000614893600e8361501a565b91507f46696c65206e6f7420666f756e640000000000000000000000000000000000006000830152602082019050919050565b60006148d360188361501a565b91507f46696c65206f72206469726563746f72792065786973747300000000000000006000830152602082019050919050565b600061491360198361501a565b91507f4e6f7420656e6f756768207265736572766564207370616365000000000000006000830152602082019050919050565b600061495360188361501a565b91507f45564d206572726f7220696e2067657446696c6553697a6500000000000000006000830152602082019050919050565b600061499360108361501a565b91507f46696c65206e6f742063726561746564000000000000000000000000000000006000830152602082019050919050565b60006149d360198361501a565b91507f46696c65206861736e2774206265656e2075706c6f61646564000000000000006000830152602082019050919050565b600060a0830160008301518482036000860152614a2382826141ea565b9150506020830151614a38602086018261417d565b506040830151614a4b6040860182614a83565b506060830151614a5e606086018261419b565b5060808301518482036080860152614a768282614053565b9150508091505092915050565b614a8c81615091565b82525050565b614a9b81615091565b82525050565b6000614aad8284614223565b915081905092915050565b6000614ac482846141b9565b915081905092915050565b6000614ada8261457a565b9150819050919050565b6000614aef82614806565b9150819050919050565b60006210000082019050614b1060008301846140b1565b92915050565b60006020820190508181036000830152614b308184614108565b905092915050565b6000602082019050614b4d60008301846141aa565b92915050565b60006020820190508181036000830152614b6c81614254565b9050919050565b60006020820190508181036000830152614b8c81614294565b9050919050565b60006020820190508181036000830152614bac816142d4565b9050919050565b60006020820190508181036000830152614bcc8161433a565b9050919050565b60006020820190508181036000830152614bec8161437a565b9050919050565b60006020820190508181036000830152614c0c816143ba565b9050919050565b60006020820190508181036000830152614c2c816143fa565b9050919050565b60006020820190508181036000830152614c4c8161443a565b9050919050565b60006020820190508181036000830152614c6c8161447a565b9050919050565b60006020820190508181036000830152614c8c816144ba565b9050919050565b60006020820190508181036000830152614cac816144fa565b9050919050565b60006020820190508181036000830152614ccc8161453a565b9050919050565b60006020820190508181036000830152614cec816145ba565b9050919050565b60006020820190508181036000830152614d0c816145fa565b9050919050565b60006020820190508181036000830152614d2c8161463a565b9050919050565b60006020820190508181036000830152614d4c816146a0565b9050919050565b60006020820190508181036000830152614d6c816146e0565b9050919050565b60006020820190508181036000830152614d8c81614746565b9050919050565b60006020820190508181036000830152614dac81614786565b9050919050565b60006020820190508181036000830152614dcc816147c6565b9050919050565b60006020820190508181036000830152614dec81614846565b9050919050565b60006020820190508181036000830152614e0c81614886565b9050919050565b60006020820190508181036000830152614e2c816148c6565b9050919050565b60006020820190508181036000830152614e4c81614906565b9050919050565b60006020820190508181036000830152614e6c81614946565b9050919050565b60006020820190508181036000830152614e8c81614986565b9050919050565b60006020820190508181036000830152614eac816149c6565b9050919050565b6000602082019050614ec86000830184614a92565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614ef157600080fd5b8060405250919050565b600067ffffffffffffffff821115614f1257600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614f3e57600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050919050565b6000819050602082019050919050565b600081519050919050565b60006180009050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061504182615071565b9050919050565b60008115159050919050565b6000819050919050565b600081905061506c82615100565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006150a68261505e565b9050919050565b82818337600083830152505050565b60005b838110156150da5780820151818401526020810190506150bf565b838111156150e9576000848401525b50505050565b6000601f19601f8301169050919050565b6003811061510a57fe5b50565b61511681615036565b811461512157600080fd5b50565b61512d81615091565b811461513857600080fd5b5056fea2646970667358221220a549ad9e778ae8bb3048c0a1805e77745871cc1560637ae1c3ebccb76638d9c464736f6c63430006020033", + "nonce": "0", + "storage": {} + }, + "0xa096b05a489831db893fc53aacc7ed20efb36382": { + "balance": "1000000000000000000000000000000" + }, + "0xa1cd651d99283be60e2a9d2e3bc8a90aedb8244f": { + "balance": "1000000000000000000000000000000" + }, + "0xa2969e82619021ea407338f8bdf7c6f2bd679673": { + "balance": "1000000000000000000000000000000" + }, + "0xa3597b1162b6559cb5e966904b63e762ece756a4": { + "balance": "1000000000000000000000000000000" + }, + "0xa68f946090c600eda6f139783077ee802afeb990": { + "balance": "1000000000000000000000000000000" + }, + "0xa6d50055592cecb795bc1ed3b9ea57ed426b0b7c": { + "balance": "1000000000000000000000000000000" + }, + "0xa7c0789bdeee38c6b59111a789dfb6b815489847": { + "balance": "1000000000000000000000000000000" + }, + "0xa8c813ee806b4c8537ff5f16084d44db18ea9ab1": { + "balance": "1000000000000000000000000000000" + }, + "0xaa6a87bbb74bc1f3cb40c1efb7fc171ee6407560": { + "balance": "1000000000000000000000000000000" + }, + "0xabf920b89f5a2487fdb70be17fd01a99a0602e62": { + "balance": "1000000000000000000000000000000" + }, + "0xac5df92da5171ba24a9618018b4f79494040334b": { + "balance": "1000000000000000000000000000000" + }, + "0xaf97a8318a1a51d5daeeb9650024b63ee44f45bd": { + "balance": "1000000000000000000000000000000" + }, + "0xb28c45b98ae43a5e9ee5509c97ea037b5de5d6d9": { + "balance": "1000000000000000000000000000000" + }, + "0xb64989ab32b089da3da103b93e6781d6d5dd10b4": { + "balance": "1000000000000000000000000000000" + }, + "0xb67e6f4a21f93c250fa6ff0cb142bd14dd4ca8eb": { + "balance": "1000000000000000000000000000000" + }, + "0xb70603c505f85130b5b2e73cd82d196dfd7d8b5e": { + "balance": "1000000000000000000000000000000" + }, + "0xb942414cae2a1ab1056657b905845c0ab6b6280a": { + "balance": "1000000000000000000000000000000" + }, + "0xbee0e5c1961d51be9bd670876caa9c90ba7d9016": { + "balance": "1000000000000000000000000000000" + }, + "0xbf2d8cebdeeb8ad8fed7b2a75f35922106f8d75c": { + "balance": "1000000000000000000000000000000" + }, + "0xbf5aa678b969c0871e2fbcf09c3dbb5d5865ac1e": { + "balance": "1000000000000000000000000000000" + }, + "0xc12bcedd9bcad9120150122cd50f39576ecccc08": { + "balance": "1000000000000000000000000000000" + }, + "0xc2d3852f3292acb81bd164dbae5f1e2a87535150": { + "balance": "1000000000000000000000000000000" + }, + "0xc3820490201e94d76b44655d2df713fec29d9795": { + "balance": "1000000000000000000000000000000" + }, + "0xc58744e2eceefd45cc5469f0e0a708ad24ddbbdb": { + "balance": "1000000000000000000000000000000" + }, + "0xc7865200e8e51ba1c8d695f327deed432930f2cc": { + "balance": "1000000000000000000000000000000" + }, + "0xc8e4d709eb3eb335dc69c9fbf2d24d447cb86105": { + "balance": "1000000000000000000000000000000" + }, + "0xc98af661e44c5bf31d2f8bdff4bbf2808ed4e991": { + "balance": "1000000000000000000000000000000" + }, + "0xca4409573a5129a72edf85d6c51e26760fc9c903": { + "balance": "100000000000000000000000" + }, + "0xcc33e23b04b74f7ba8fbe315083182224af973fa": { + "balance": "1000000000000000000000000000000" + }, + "0xce1c62d0a77600fb2f959b4da76fcb9b3b9430a3": { + "balance": "1000000000000000000000000000000" + }, + "0xd1b6c947fb14060b38945584714491592e84875d": { + "balance": "1000000000000000000000000000000" + }, + "0xd23cd6a9ddcc3470300003621bbac1e06a7919d5": { + "balance": "1000000000000000000000000000000" + }, + "0xd2c5b39B4e735C17612Bb5a08FD024ccc5dBCb23": { + "balance": "100000000000000000000000" + }, + "0xd2cd302eb060e375a65d65946692a3ac2d838d35": { + "balance": "1000000000000000000000000000000" + }, + "0xd2e75c41ced8699e3176f6e335355701a2568b7b": { + "balance": "1000000000000000000000000000000" + }, + "0xd3d38f4cb0aeb4c7c2527ddaeec2ab3b910c8528": { + "balance": "1000000000000000000000000000000" + }, + "0xd5b561a27cca5049650a14ab93dbf1a20c0cefc1": { + "balance": "1000000000000000000000000000000" + }, + "0xd90045420b8abc37b3f9304ed2b385fc1b7fa8c5": { + "balance": "1000000000000000000000000000000" + }, + "0xd951bf4cff429062702a7d8699a5f0bf14845d9b": { + "balance": "1000000000000000000000000000000" + }, + "0xdc6a269c58e58a93a22b5df8cdf1af630c47481f": { + "balance": "1000000000000000000000000000000" + }, + "0xdc6d02ef4003a4f2d0ccff65ae1a2d8157fbb23e": { + "balance": "1000000000000000000000000000000" + }, + "0xde14aca36acc62c305a7ee571da37840a408e600": { + "balance": "1000000000000000000000000000000" + }, + "0xdee32ae508cf783f53ab8bc39d878fe323cdfae3": { + "balance": "1000000000000000000000000000000" + }, + "0xe083a100d51fc4f38aae4a3a68404c36ad96c612": { + "balance": "1000000000000000000000000000000" + }, + "0xe1607990ce800407e3c206e58de4917977181d4d": { + "balance": "1000000000000000000000000000000" + }, + "0xe25e5b63dfd4cf59b81eddf64f1195858634b8a6": { + "balance": "1000000000000000000000000000000" + }, + "0xe372377decb3bdc0c7f5272d38ce0ba2a54934fe": { + "balance": "1000000000000000000000000000000" + }, + "0xe3cc6ec63b5652d1594bc63bb293f4e80f76dbdd": { + "balance": "1000000000000000000000000000000" + }, + "0xe3da7c014286258944ab20a31e4d861b4c9262f1": { + "balance": "1000000000000000000000000000000" + }, + "0xe8b57f330d56081c856e618210fbedb414925ff0": { + "balance": "1000000000000000000000000000000" + }, + "0xe91ac72a568e752eb7c9f5235100586ce97c8cc1": { + "balance": "1000000000000000000000000000000" + }, + "0xf184c8c243a178c1748a0af45caedeca476105b4": { + "balance": "1000000000000000000000000000000" + }, + "0xf1a5912ff318aebf312cdb54c75642a9e632703c": { + "balance": "1000000000000000000000000000000" + }, + "0xf2197b153b4c9086fc5410431fbf7960d284c65e": { + "balance": "1000000000000000000000000000000" + }, + "0xf36620e71327f4a55d550d46e030ccf0c728f154": { + "balance": "1000000000000000000000000000000" + }, + "0xf9817fB82fc767aA9A4A97a1901676244b88ce0E": { + "balance": "100000000000000000000000" + }, + "0xfa723938fa8da1a8a2114ad409a11581761ee40d": { + "balance": "1000000000000000000000000000000" + }, + "0xfa7a8c69810eaf16a395d2a93b3ab51efeed2a1c": { + "balance": "1000000000000000000000000000000" + }, + "0xfaa1038074941571524934ba52d312e88b3577f5": { + "balance": "1000000000000000000000000000000" + }, + "0xfe14077c26a507496b7208384d459e21c49c4212": { + "balance": "1000000000000000000000000000000" + }, + "0xfe275c9b5ac792327da509b27eb9614196dfb07d": { + "balance": "1000000000000000000000000000000" + }, + "0xfe2c5aa110fff89361806ea7ee080bfffba0d3dd": { + "balance": "1000000000000000000000000000000" + }, + "0xfe3d4f1fc038f4f756ba44995129cd45c9e0e861": { + "balance": "1000000000000000000000000000000" + }, + "0xfee314cdc84ecfaa675e41b3559c0101e1eba6b8": { + "balance": "1000000000000000000000000000000" + } + }, + "genesis": { + "author": "0x0000000000000000000000000000000000000001", + "difficulty": "0x0", + "extraData": "0x11bbe8db4e347b4e8c937c1c8370e4b5ed33adb3db69cbdb7a38e1e50b1b82fa", + "gasLimit": "0xFFFFFFFFF", + "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000abc", + "nonce": "0x0000000000000042", + "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "timestamp": "0x00" + }, + "params": { + "EIP150ForkBlock": "0x00", + "EIP158ForkBlock": "0x00", + "accountStartNonce": "0x00", + "blockReward": "0x4563918244F40000", + "byzantiumForkBlock": "0x0", + "chainID": "0x12345", + "constantinopleForkBlock": "0x0", + "daoHardforkBlock": "0x0", + "difficultyBoundDivisor": "0x0800", + "durationLimit": "0x0d", + "externalGasDifficulty": "0x01", + "gasLimitBoundDivisor": "0x0400", + "homesteadForkBlock": "0x0", + "maxGasLimit": "0xFFFFFFFFF", + "maximumExtraDataSize": "0x20", + "minGasLimit": "0xFFFFFFFFF", + "minimumDifficulty": "0x0", + "networkID": "12313219", + "tieBreakingGas": false + }, + "sealEngine": "Ethash", + "skaleConfig": { + "nodeInfo": { + "basePort": 1231, + "bindIP": "0.0.0.0", + "collectionDuration": 10, + "collectionQueueSize": 2, + "db-path": "/tmp/test_eth_1_of_16", + "ecdsaKeyName": "", + "httpRpcPort": 1234, + "httpsRpcPort": 1239, + "logLevel": "info", + "logLevelProposal": "info", + "maxCacheSize": 2000, + "maxOpenLeveldbFiles": 25, + "minCacheSize": 1000, + "nodeID": 1601, + "nodeName": "Node1", + "rotateAfterBlock": 0, + "testSignatures": true, + "transactionQueueSize": 10000, + "wsRpcPort": 1233, + "wssRpcPort": 1238 + }, + "sChain": { + "EIP1559TransactionsPatchTimestamp": 1, + "contractStorageLimit": 10000000000, + "contractStoragePatchTimestamp": 1, + "contractStorageZeroValuePatchTimestamp": 1, + "correctForkInPowPatchTimestamp": 1, + "emptyBlockIntervalMs": 10000, + "fastConsensusPatchTimestamp": 1, + "flexibleDeploymentPatchTimestamp": 1, + "levelDBReopenIntervalMs": 1, + "multiTransactionMode": false, + "nodes": [ + { + "basePort": 1231, + "ip": "127.0.0.1", + "nodeID": 1601, + "publicKey": "", + "schainIndex": 1 + }, + { + "basePort": 1331, + "ip": "127.0.0.1", + "nodeID": 1602, + "publicKey": "", + "schainIndex": 2 + }, + { + "basePort": 1431, + "ip": "127.0.0.1", + "nodeID": 1603, + "publicKey": "", + "schainIndex": 3 + }, + { + "basePort": 1531, + "ip": "127.0.0.1", + "nodeID": 1604, + "publicKey": "", + "schainIndex": 4 + }, + { + "basePort": 1631, + "ip": "127.0.0.1", + "nodeID": 1605, + "publicKey": "", + "schainIndex": 5 + }, + { + "basePort": 1731, + "ip": "127.0.0.1", + "nodeID": 1606, + "publicKey": "", + "schainIndex": 6 + }, + { + "basePort": 1831, + "ip": "127.0.0.1", + "nodeID": 1607, + "publicKey": "", + "schainIndex": 7 + }, + { + "basePort": 1931, + "ip": "127.0.0.1", + "nodeID": 1608, + "publicKey": "", + "schainIndex": 8 + }, + { + "basePort": 2031, + "ip": "127.0.0.1", + "nodeID": 1609, + "publicKey": "", + "schainIndex": 9 + }, + { + "basePort": 2131, + "ip": "127.0.0.1", + "nodeID": 1610, + "publicKey": "", + "schainIndex": 10 + }, + { + "basePort": 2231, + "ip": "127.0.0.1", + "nodeID": 1611, + "publicKey": "", + "schainIndex": 11 + }, + { + "basePort": 2331, + "ip": "127.0.0.1", + "nodeID": 1612, + "publicKey": "", + "schainIndex": 12 + }, + { + "basePort": 2431, + "ip": "127.0.0.1", + "nodeID": 1613, + "publicKey": "", + "schainIndex": 13 + }, + { + "basePort": 2531, + "ip": "127.0.0.1", + "nodeID": 1614, + "publicKey": "", + "schainIndex": 14 + }, + { + "basePort": 2631, + "ip": "127.0.0.1", + "nodeID": 1615, + "publicKey": "", + "schainIndex": 15 + }, + { + "basePort": 2731, + "ip": "127.0.0.1", + "nodeID": 1616, + "publicKey": "", + "schainIndex": 16 + } + ], + "powCheckPatchTimestamp": 1, + "precompiledConfigPatchTimestamp": 1, + "pushZeroPatchTimestamp": 1, + "revertableFSPatchTimestamp": 1, + "schainID": 5, + "schainName": "TestChain", + "schainOwner": "0x907cd0881E50d359bb9Fd120B1A5A143b1C97De6", + "skipInvalidTransactionsPatchTimestamp": 1, + "storageDestructionPatchTimestamp": 1, + "verifyBlsSyncPatchTimestamp": 1, + "verifyDaSigsPatchTimestamp": 1 + } + }, + "unddos": { + "origins": [ + { + "ban_lengthy": 0, + "ban_peak": 0, + "max_calls_per_minute": 1000000000, + "max_calls_per_second": 1000000000, + "max_ws_conn": 65535, + "origin": [ + "*" + ] + } + ] + } +} \ No newline at end of file diff --git a/test/historicstate/configs/test_1_of_4.json b/test/historicstate/configs/test_1_of_4.json new file mode 100644 index 000000000..59218b8d9 --- /dev/null +++ b/test/historicstate/configs/test_1_of_4.json @@ -0,0 +1,826 @@ +{ + "accounts": { + "0000000000000000000000000000000000000001": { + "precompiled": { + "linear": { + "base": 3000, + "word": 0 + }, + "name": "ecrecover" + } + }, + "0000000000000000000000000000000000000002": { + "precompiled": { + "linear": { + "base": 60, + "word": 12 + }, + "name": "sha256" + } + }, + "0000000000000000000000000000000000000003": { + "precompiled": { + "linear": { + "base": 600, + "word": 120 + }, + "name": "ripemd160" + } + }, + "0000000000000000000000000000000000000004": { + "precompiled": { + "linear": { + "base": 15, + "word": 3 + }, + "name": "identity" + } + }, + "0000000000000000000000000000000000000005": { + "precompiled": { + "name": "modexp", + "startingBlock": "0x2dc6c0" + } + }, + "0000000000000000000000000000000000000006": { + "precompiled": { + "linear": { + "base": 500, + "word": 0 + }, + "name": "alt_bn128_G1_add", + "startingBlock": "0x2dc6c0" + } + }, + "0000000000000000000000000000000000000007": { + "precompiled": { + "linear": { + "base": 40000, + "word": 0 + }, + "name": "alt_bn128_G1_mul", + "startingBlock": "0x2dc6c0" + } + }, + "0000000000000000000000000000000000000008": { + "precompiled": { + "name": "alt_bn128_pairing_product", + "startingBlock": "0x2dc6c0" + } + }, + "000000000000000000000000000000000000000A": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "readChunk", + "startingBlock": "0x0" + } + }, + "000000000000000000000000000000000000000B": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "createFile", + "restrictAccess": [ + "69362535ec535F0643cBf62D16aDeDCAf32Ee6F7" + ], + "startingBlock": "0x0" + } + }, + "000000000000000000000000000000000000000C": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "uploadChunk", + "startingBlock": "0x0" + } + }, + "000000000000000000000000000000000000000D": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "getFileSize", + "startingBlock": "0x0" + } + }, + "000000000000000000000000000000000000000E": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "deleteFile", + "startingBlock": "0x0" + } + }, + "000000000000000000000000000000000000000F": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "createDirectory", + "startingBlock": "0x0" + } + }, + "0000000000000000000000000000000000000010": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "deleteDirectory", + "startingBlock": "0x0" + } + }, + "0x006d8e49ce0b9eb5646e34a4d91934801b9044fd": { + "balance": "1000000000000000000000000000000" + }, + "0x0150b461b06922a5030784ba888962c28bb1f188": { + "balance": "1000000000000000000000000000000" + }, + "0x03309956988ae70152ae4469daf99b0cac2306c5": { + "balance": "1000000000000000000000000000000" + }, + "0x06104a85a380895b6dd4030113806df2b044905e": { + "balance": "1000000000000000000000000000000" + }, + "0x079cf317ef40b16141784b6fabff812d64f7c0fd": { + "balance": "1000000000000000000000000000000" + }, + "0x0966454f51166c68b73b2865473c8fb2fcdefdd5": { + "balance": "1000000000000000000000000000000" + }, + "0x099452fedc71897880f584b1bc1706efc4e76e36": { + "balance": "1000000000000000000000000000000" + }, + "0x0aa6a44690ef52354e976990292cf9c5cd36ad59": { + "balance": "1000000000000000000000000000000" + }, + "0x0fbbe17a0e5a61ee3e8661f442d7f6b177c49820": { + "balance": "1000000000000000000000000000000" + }, + "0x1239fe658b410dbbac5bbd572035f5041542f9e5": { + "balance": "1000000000000000000000000000000" + }, + "0x12d5d7340a93be7be28ea7a3ae198242f8e1282c": { + "balance": "1000000000000000000000000000000" + }, + "0x137048b9fa4f1234d6519271b2c5ec64f480db0f": { + "balance": "1000000000000000000000000000000" + }, + "0x13867af77a63048e17380e39248ada90521e97e4": { + "balance": "1000000000000000000000000000000" + }, + "0x138ea4bdf0382c2deffd5b0bff0afe59f471467f": { + "balance": "1000000000000000000000000000000" + }, + "0x13d19c55ee0a212249d26b9d741ff6d7f416db01": { + "balance": "1000000000000000000000000000000" + }, + "0x157d38b52196b248e9fe6a2172e32ce2b8c078e6": { + "balance": "1000000000000000000000000000000" + }, + "0x16e8c390f8e576161cfe966f2c3e5dd303eb9039": { + "balance": "1000000000000000000000000000000" + }, + "0x194cb9991d3d94c43e400becf21dfea45e7b3b4c": { + "balance": "1000000000000000000000000000000" + }, + "0x1C9abe4ff0CcECa40fc404c74AB7d4923fEF8901": { + "balance": "100000000000000000000000" + }, + "0x1a66fc89809112c20aa76a993db712fa9e003e4e": { + "balance": "1000000000000000000000000000000" + }, + "0x1f1d6041e12a18cf1202019f146f2fc150915e8d": { + "balance": "1000000000000000000000000000000" + }, + "0x1feaf1671c1f0faf0d44c152f72dc755db932569": { + "balance": "1000000000000000000000000000000" + }, + "0x236bf02dfafaf03851a4e6f5d69052f4884cec32": { + "balance": "1000000000000000000000000000000" + }, + "0x26d88f6a8b659be4165ee53774a057e41b5201c9": { + "balance": "1000000000000000000000000000000" + }, + "0x28353685b0b986a724b92113debb3d8cd9a6b263": { + "balance": "1000000000000000000000000000000" + }, + "0x29d83322219fdfb821459d5fdf796360faf3166a": { + "balance": "1000000000000000000000000000000" + }, + "0x2bee474be207bdbeac83d6672da5ed2fd417eac9": { + "balance": "1000000000000000000000000000000" + }, + "0x2d93455b07bccf38e8d019f7f43a2c2d70b46b4e": { + "balance": "1000000000000000000000000000000" + }, + "0x2f971bd38806c3ca45ae0a125d1267118bf5619c": { + "balance": "1000000000000000000000000000000" + }, + "0x30aaab366dfac8331f3e827495c789cde9b437c0": { + "balance": "1000000000000000000000000000000" + }, + "0x32ea0400dc2d20664cc4744b2fab04ecb709445c": { + "balance": "1000000000000000000000000000000" + }, + "0x3760dc9594ccac0f33ade5cc5371402131696341": { + "balance": "1000000000000000000000000000000" + }, + "0x38855e430611bc179cd777a8704679ffc43921de": { + "balance": "1000000000000000000000000000000" + }, + "0x3a921471a2397644c37c88ef9572c421ab37145d": { + "balance": "1000000000000000000000000000000" + }, + "0x3bcca8a8471d55a1a668bc163c0336e4a57e5c99": { + "balance": "1000000000000000000000000000000" + }, + "0x3d46ee560227c1d73cd6042b47fc8fddd8a06ecb": { + "balance": "1000000000000000000000000000000" + }, + "0x3f5bdf5d4c274c82b8d17aa2810b00d2cf050f24": { + "balance": "1000000000000000000000000000000" + }, + "0x3ffe1c9183e0f97f52a816405a7d2350624ec88b": { + "balance": "1000000000000000000000000000000" + }, + "0x426ec5f07847674aada3856609d8baaa16805d88": { + "balance": "1000000000000000000000000000000" + }, + "0x482d7f53cba6ae73a354533673c48e2dfd560949": { + "balance": "1000000000000000000000000000000" + }, + "0x48acbd6a2724eadcc2a11144ab84b6a617d1a241": { + "balance": "1000000000000000000000000000000" + }, + "0x49ef89840e400026eb5c8d79bd1b0adc152fe86d": { + "balance": "1000000000000000000000000000000" + }, + "0x4bf989fa6572af36b190032505506f1db888357f": { + "balance": "1000000000000000000000000000000" + }, + "0x4cf9b195f7cb5f86694d9b399fe21a5f34616fd3": { + "balance": "1000000000000000000000000000000" + }, + "0x4e9b85904bca60aeb5b916ca86ac622096908427": { + "balance": "1000000000000000000000000000000" + }, + "0x50120c17d7b59200e9b76e89e4e3de2f0cd00090": { + "balance": "1000000000000000000000000000000" + }, + "0x54db355342c35085a1a53184162b2fddd0a43b0f": { + "balance": "1000000000000000000000000000000" + }, + "0x54e228d8fea148cfe2b109b3b152ff21321d09a2": { + "balance": "1000000000000000000000000000000" + }, + "0x5667601b7dcde6f24d06bccc4f291cb06976f4ee": { + "balance": "1000000000000000000000000000000" + }, + "0x57829f2ecca390cd9d1c41f92328bad4d1073bbb": { + "balance": "1000000000000000000000000000000" + }, + "0x5EF25557E2ed6AFfF321B266C93e95A0B4B05AbC": { + "balance": "1000000000000000000000000" + }, + "0x5a3adad4382b3eb1e0c65f2de2845901081039b5": { + "balance": "1000000000000000000000000000000" + }, + "0x5cdb7392efdce502ccc6fba5c3c1dd1653967b4d": { + "balance": "1000000000000000000000000000000" + }, + "0x5d012c13b2854bda8b7b6580e97e52751884f827": { + "balance": "1000000000000000000000000000000" + }, + "0x5d9326c6504833d84f8a0d65ded59b1a6e768ca2": { + "balance": "1000000000000000000000000000000" + }, + "0x60268f799d8f1808e4a32c2eb898e73a8881f6f0": { + "balance": "1000000000000000000000000000000" + }, + "0x605ba4a05d779f9869bd9a10234c22f516766cfe": { + "balance": "1000000000000000000000000000000" + }, + "0x6093f0f2a7b5148b71603ac439adbc4c0e5aa5da": { + "balance": "1000000000000000000000000000000" + }, + "0x6196d135CdDb9d73A0756C1E44b5b02B11acf594": { + "balance": "2000000000000000000000", + "code": "", + "nonce": "5076", + "storage": {} + }, + "0x62712ceccb50f62ca4c5402fff6da9c819c866cf": { + "balance": "1000000000000000000000000000000" + }, + "0x62971de462ea1ec0d3b43a6a85b6fb975e6c6f64": { + "balance": "1000000000000000000000000000000" + }, + "0x62cf32dfb9eb6358dc5deb006aef1d75fb153e5f": { + "balance": "1000000000000000000000000000000" + }, + "0x62d8b22c1d71577829b2fee20a5c3fff43aed0ec": { + "balance": "100000000000000000000000" + }, + "0x6314956b78bb2eaed1c49b3ae71d4d0ec501cfab": { + "balance": "1000000000000000000000000000000" + }, + "0x661bda4daeba3ce9ac2aa30b80d463580f90d31a": { + "balance": "1000000000000000000000000000000" + }, + "0x66c5a87f4a49DD75e970055A265E8dd5C3F8f852": { + "balance": "1000000000000000000000" + }, + "0x66cd465ddcd85504c0d2cfb1728acee994d55a3f": { + "balance": "1000000000000000000000000000000" + }, + "0x68bca79ae7aae796027ff843d2303444da5cf5d8": { + "balance": "1000000000000000000000000000000" + }, + "0x6923877b65e24966efa9efd1207822fa2eaf601a": { + "balance": "1000000000000000000000000000000" + }, + "0x69362535ec535F0643cBf62D16aDeDCAf32Ee6F7": { + "balance": "0", + "code": "0x608060405234801561001057600080fd5b50600436106100b45760003560e01c806379210e8e1161007157806379210e8e1461017757806381a8235a146101a757806385aeeb17146101c35780639a9a5593146101f3578063a99100541461020f578063b57321221461022b576100b4565b806307c6e7d3146100b9578063122f4fba146100d55780631c6ec7a9146101055780631cfe4e3b14610121578063373dedb41461013d57806361e46db51461015b575b600080fd5b6100d360048036036100ce9190810190613cff565b61025b565b005b6100ef60048036036100ea9190810190613cff565b610804565b6040516100fc9190614963565b60405180910390f35b61011f600480360361011a9190810190613cff565b610b43565b005b61013b60048036036101369190810190613cc3565b610f72565b005b610145611190565b6040516101529190614cbe565b60405180910390f35b61017560048036036101709190810190613d94565b611199565b005b610191600480360361018c9190810190613e13565b6113f9565b60405161019e9190614924565b60405180910390f35b6101c160048036036101bc9190810190613cff565b6116f9565b005b6101dd60048036036101d89190810190613cff565b61189e565b6040516101ea9190614941565b60405180910390f35b61020d60048036036102089190810190613d40565b611b9d565b005b61022960048036036102249190810190613cff565b61202c565b005b61024560048036036102409190810190613cff565b612682565b6040516102529190614cbe565b60405180910390f35b6000339050606061026b83612902565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b825181101561037c576000826001018460018403815181106102d557fe5b60200260200101516040516102ea91906148cc565b90815260200160405180910390205411610339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161033090614ade565b60405180910390fd5b8160020183600183038151811061034c57fe5b602002602001015160405161036191906148cc565b908152602001604051809103902091508060010190506102b7565b506060600183511161038e57846103a7565b8260018451038151811061039e57fe5b60200260200101515b9050600082600101826040516103bd91906148e3565b9081526020016040518091039020541161040c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161040390614ade565b60405180910390fd5b6000826002018260405161042091906148e3565b90815260200160405180910390206000018054905014610475576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161046c90614b5e565b60405180910390fd5b60006104818587612b02565b9050806104c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ba90614a7e565b60405180910390fd5b6104cb613888565b836000016001856000018054905003815481106104e457fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156105965780601f1061056b57610100808354040283529160200191610596565b820191906000526020600020905b81548152906001019060200180831161057957829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff1660028111156105e257fe5b60028111156105ed57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561066557602002820191906000526020600020906000905b82829054906101000a900460ff1615158152602001906001019060208260000104928301926001038202915080841161062f5790505b505050505081525050905080846000016001866001018660405161068991906148e3565b90815260200160405180910390205403815481106106a357fe5b906000526020600020906005020160008201518160000190805190602001906106cd9291906138c4565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561071c57fe5b0217905550608082015181600401908051906020019061073d929190613944565b50905050836001018360405161075391906148e3565b90815260200160405180910390205484600101826000015160405161077891906148cc565b9081526020016040518091039020819055506000846001018460405161079e91906148e3565b908152602001604051809103902081905550836000018054809190600190036107c791906139ea565b5083600201836040516107da91906148e3565b9081526020016040518091039020600080820160006107f99190613a1c565b505050505050505050565b600080606061081284612b66565b91509150606061082182612902565b90506000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b82518110156109065760008260010184600184038151811061088b57fe5b60200260200101516040516108a091906148cc565b90815260200160405180910390205414156108c357600095505050505050610b3e565b816002018360018303815181106108d657fe5b60200260200101516040516108eb91906148cc565b9081526020016040518091039020915080600101905061086d565b50606060018351116109185783610931565b8260018451038151811061092857fe5b60200260200101515b90506000826001018260405161094791906148e3565b908152602001604051809103902054141561096a57600095505050505050610b3e565b610972613888565b826000016001846001018460405161098a91906148e3565b90815260200160405180910390205403815481106109a457fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610a565780601f10610a2b57610100808354040283529160200191610a56565b820191906000526020600020905b815481529060010190602001808311610a3957829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115610aa257fe5b6002811115610aad57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015610b2557602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411610aef5790505b5050505050815250509050806060015196505050505050505b919050565b600160009054906101000a900460ff16610b85576120006002819055506210000060038190555060018060006101000a81548160ff0219169083151502179055505b6000815111610bc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc090614ade565b60405180910390fd5b60003390506060610bd983612902565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015610cea57600082600101846001840381518110610c4357fe5b6020026020010151604051610c5891906148cc565b90815260200160405180910390205411610ca7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9e90614ade565b60405180910390fd5b81600201836001830381518110610cba57fe5b6020026020010151604051610ccf91906148cc565b90815260200160405180910390209150806001019050610c25565b50600254816000018054905010610d36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2d90614bfe565b60405180910390fd5b60606001835111610d475784610d60565b82600184510381518110610d5757fe5b60200260200101515b905060008260010182604051610d7691906148e3565b90815260200160405180910390205414610dc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbc90614c3e565b60405180910390fd5b610dce81612ee8565b610e0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0490614afe565b60405180910390fd5b6000610e198587612fc9565b905080610e5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e529061499e565b60405180910390fd5b610e63613888565b82816000018190525060008160200190151590811515815250508360000181908060018154018082558091505090600182039060005260206000209060050201600090919290919091506000820151816000019080519060200190610ec99291906138c4565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff02191690836002811115610f1857fe5b02179055506080820151816004019080519060200190610f39929190613944565b5050505083600001805490508460010184604051610f5791906148e3565b90815260200160405180910390208190555050505050505050565b610f7a61302d565b73ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161480610fdf57503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614155b61101e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101590614a5e565b60405180910390fd5b80600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411156110a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109790614b3e565b60405180910390fd5b600054600754820111156110e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e0906149be565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460076000828254039250508190555080600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550806007600082825401925050819055505050565b60008054905090565b600033905060006111aa82866130c6565b9050600160028111156111b957fe5b8160030160009054906101000a900460ff1660028111156111d657fe5b14611216576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120d90614c1e565b60405180910390fd5b6000600354858161122357fe5b061480156112345750806002015484105b611273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126a9061497e565b60405180910390fd5b600354848260020154031080156112905750838160020154038351145b8061129d57506003548351145b6112dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d390614a1e565b60405180910390fd5b600015158160040160035486816112ef57fe5b04815481106112fa57fe5b90600052602060002090602091828204019190069054906101000a900460ff1615151461135c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611353906149fe565b60405180910390fd5b600061136a838787876132c5565b9050806113ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a390614b1e565b60405180910390fd5b60018260040160035487816113bd57fe5b04815481106113c857fe5b90600052602060002090602091828204019190066101000a81548160ff021916908315150217905550505050505050565b611401613a40565b6000606061140e86612b66565b9150915061141a613888565b61142483836130c6565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156114c85780601f1061149d576101008083540402835291602001916114c8565b820191906000526020600020905b8154815290600101906020018083116114ab57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561151457fe5b600281111561151f57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561159757602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116115615790505b50505050508152505090506002808111156115ae57fe5b816060015160028111156115be57fe5b146115fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f590614c9e565b60405180910390fd5b60035485111580156116105750600085115b61164f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164690614a1e565b60405180910390fd5b80604001518587011115611698576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168f9061497e565b60405180910390fd5b60006116a684848989613376565b8096508192505050806116ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e590614b9e565b60405180910390fd5b505050509392505050565b6000339050600061170a82846130c6565b90506001600281111561171957fe5b8160030160009054906101000a900460ff16600281111561173657fe5b14611776576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176d90614c1e565b60405180910390fd5b60006001905060008260040180549050905060008090505b818110156117e157600015158460040182815481106117a957fe5b90600052602060002090602091828204019190069054906101000a900460ff16151514156117d657600092505b80600101905061178e565b5081611822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181990614b7e565b60405180910390fd5b60028360030160006101000a81548160ff0219169083600281111561184357fe5b021790555060006118548587613409565b905080611896576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188d906149de565b60405180910390fd5b505050505050565b6060600060606118ad84612b66565b9150915060606118bc82612902565b90506000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008090505b82518110156119c65760008260010184838151811061192257fe5b602002602001015160405161193791906148cc565b90815260200160405180910390205411611986576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197d90614ade565b60405180910390fd5b8160020183828151811061199657fe5b60200260200101516040516119ab91906148cc565b90815260200160405180910390209150806001019050611907565b5080600001805480602002602001604051908101604052809291908181526020016000905b82821015611b8e57838290600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611aa75780601f10611a7c57610100808354040283529160200191611aa7565b820191906000526020600020905b815481529060010190602001808311611a8a57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115611af357fe5b6002811115611afe57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015611b7657602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411611b405790505b505050505081525050815260200190600101906119eb565b50505050945050505050919050565b600160009054906101000a900460ff16611bdf576120006002819055506210000060038190555060018060006101000a81548160ff0219169083151502179055505b60003390506305f5e100821115611c2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2290614bde565b60405180910390fd5b6060611c3684612902565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015611d4757600082600101846001840381518110611ca057fe5b6020026020010151604051611cb591906148cc565b90815260200160405180910390205411611d04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cfb90614ade565b60405180910390fd5b81600201836001830381518110611d1757fe5b6020026020010151604051611d2c91906148cc565b90815260200160405180910390209150806001019050611c82565b5060606001835111611d595785611d72565b82600184510381518110611d6957fe5b60200260200101515b905060008260010182604051611d8891906148e3565b90815260200160405180910390205414611dd7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dce90614c3e565b60405180910390fd5b611de081612ee8565b611e1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1690614bbe565b60405180910390fd5b6000611e2c85888861346d565b905080611e6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6590614c7e565b60405180910390fd5b6060600354600160035489010381611e8257fe5b04604051908082528060200260200182016040528015611eb15781602001602082028038833980820191505090505b509050836000016040518060a0016040528085815260200160011515815260200189815260200160016002811115611ee557fe5b815260200183815250908060018154018082558091505090600182039060005260206000209060050201600090919290919091506000820151816000019080519060200190611f359291906138c4565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff02191690836002811115611f8457fe5b02179055506080820151816004019080519060200190611fa5929190613944565b5050505083600001805490508460010184604051611fc391906148e3565b90815260200160405180910390208190555086600560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505050505050505050565b6000339050612039613888565b61204382846130c6565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156120e75780601f106120bc576101008083540402835291602001916120e7565b820191906000526020600020905b8154815290600101906020018083116120ca57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561213357fe5b600281111561213e57fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156121b657602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116121805790505b5050505050815250509050600060028111156121ce57fe5b816060015160028111156121de57fe5b141561221f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221690614a3e565b60405180910390fd5b600061222b83856134da565b90508061226d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226490614a9e565b60405180910390fd5b606061227885612902565b90506000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b825181101561231057816002018360018303815181106122e057fe5b60200260200101516040516122f591906148cc565b908152602001604051809103902091508060010190506122c4565b506000600182600101866000015160405161232b91906148cc565b908152602001604051809103902054039050612345613888565b8260000160018460000180549050038154811061235e57fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156124105780601f106123e557610100808354040283529160200191612410565b820191906000526020600020905b8154815290600101906020018083116123f357829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561245c57fe5b600281111561246757fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156124df57602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116124a95790505b5050505050815250509050808360000183815481106124fa57fe5b906000526020600020906005020160008201518160000190805190602001906125249291906138c4565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561257357fe5b02179055506080820151816004019080519060200190612594929190613944565b50905050826000018054809190600190036125af91906139ea565b508260010186600001516040516125c691906148cc565b9081526020016040518091039020548360010182600001516040516125eb91906148cc565b908152602001604051809103902081905550600083600101876000015160405161261591906148cc565b9081526020016040518091039020819055508560400151600560008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505050505050505050565b600080606061269084612b66565b9150915061269c613888565b6126a683836130c6565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561274a5780601f1061271f5761010080835404028352916020019161274a565b820191906000526020600020905b81548152906001019060200180831161272d57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561279657fe5b60028111156127a157fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561281957602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116127e35790505b50505050508152505090506001600281111561283157fe5b8160600151600281111561284157fe5b1480612866575060028081111561285457fe5b8160600151600281111561286457fe5b145b6128a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161289c90614c1e565b60405180910390fd5b60006128b1848461353e565b8096508192505050806128f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128f090614c5e565b60405180910390fd5b50505050919050565b606061290c613a65565b612915836135a7565b905061291f613a65565b61295d6040518060400160405280600181526020017f2f000000000000000000000000000000000000000000000000000000000000008152506135a7565b90506060600161297683856135d590919063ffffffff16565b016040519080825280602002602001820160405280156129aa57816020015b60608152602001906001900390816129955790505b50905060008090505b81518110156129fb576129d76129d2848661364a90919063ffffffff16565b613664565b8282815181106129e357fe5b602002602001018190525080806001019150506129b3565b50600081600183510381518110612a0e57fe5b6020026020010151511415612a795780600182510381518110612a2d57fe5b6020026020010160608152506001815103604051908082528060200260200182016040528015612a7157816020015b6060815260200190600190039081612a5c5790505b509350612ab2565b8051604051908082528060200260200182016040528015612aae57816020015b6060815260200190600190039081612a995790505b5093505b60008090505b8451811015612af957818181518110612acd57fe5b6020026020010151858281518110612ae157fe5b60200260200101819052508080600101915050612ab8565b50505050919050565b60008060016020601f85510181612b1557fe5b040190506040518481526020810160005b83811015612b47578060200286015181602002830152806001019050612b26565b50602082602085026040018460006010600019f1935050505092915050565b6000606060006028905080845111612bb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612baa90614abe565b60405180910390fd5b6060816040519080825280601f01601f191660200182016040528015612be85781602001600182028038833980820191505090505b50905060008090505b82811015612c5857858181518110612c0557fe5b602001015160f81c60f81b828281518110612c1c57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050612bf1565b50600080905060008090505b83811015612d87576000838281518110612c7a57fe5b602001015160f81c60f81b60f81c60ff16905060308110158015612c9f575060398111155b80612cb8575060418110158015612cb75750605a8111155b5b80612cd1575060618110158015612cd0575060668111155b5b612d10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d0790614abe565b60405180910390fd5b60308110158015612d22575060398111155b15612d335760308103601084020192505b60418110158015612d455750605a8111155b15612d565760378103601084020192505b60618110158015612d68575060668111155b15612d795760578103601084020192505b508080600101915050612c64565b508094507f2f00000000000000000000000000000000000000000000000000000000000000868481518110612db857fe5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612e25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e1c90614abe565b60405180910390fd5b6000600184885103039050806040519080825280601f01601f191660200182016040528015612e635781602001600182028038833980820191505090505b50945060008090505b81811015612ede5760008860018784010181518110612e8757fe5b602001015160f81c60f81b905080878381518110612ea157fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350508080600101915050612e6c565b5050505050915091565b6000604051602001612ef99061490f565b6040516020818303038152906040528051906020012082604051602001612f2091906148e3565b604051602081830303815290604052805190602001201480612f8b5750604051602001612f4c906148fa565b6040516020818303038152906040528051906020012082604051602001612f7391906148e3565b60405160208183030381529060405280519060200120145b80612f97575060008251145b15612fa55760009050612fc4565b60008251905060ff811115612fbe576000915050612fc4565b60019150505b919050565b60008060016020601f85510181612fdc57fe5b040190506040518481526020810160005b8381101561300e578060200286015181602002830152806001019050612fed565b5060208260208502604001846000600f600019f1935050505092915050565b600073d2001000000000000000000000000000000000d273ffffffffffffffffffffffffffffffffffffffff166383e781fe6040518163ffffffff1660e01b815260040160206040518083038186803b15801561308957600080fd5b505afa15801561309d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506130c19190810190613c9a565b905090565b600060606130d383612902565b90506000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b82518110156131e45760008260010184600184038151811061313d57fe5b602002602001015160405161315291906148cc565b908152602001604051809103902054116131a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161319890614ade565b60405180910390fd5b816002018360018303815181106131b457fe5b60200260200101516040516131c991906148cc565b9081526020016040518091039020915080600101905061311f565b50606060018351116131f6578461320f565b8260018451038151811061320657fe5b60200260200101515b90506000826001018260405161322591906148e3565b90815260200160405180910390205411613274576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161326b90614ade565b60405180910390fd5b6000826000016001846001018460405161328e91906148e3565b90815260200160405180910390205403815481106132a857fe5b906000526020600020906005020190508094505050505092915050565b60008060016020601f855101816132d857fe5b04019050600060016020601f885101816132ee57fe5b040190506040518781526020810160005b838110156133205780602002890151816020028301528060010190506132ff565b50868360200282015260005b84811015613352578060200287015181856001010160200283015280600101905061332c565b50602082848601602002606001846000600c600019f1945050505050949350505050565b6000613380613a40565b600060016020601f8851018161339257fe5b0401905060006020601f8601816133a557fe5b0490506040518881526020810160005b848110156133d657806020028a0151816020028301528060010190506133b5565b5083602002810188815287816020015283602002868660030160200285600a600019fa9650505050505094509492505050565b60008060016020601f8551018161341c57fe5b040190506040518481526020810160005b8381101561344e57806020028601518160200283015280600101905061342d565b50602082602085026040018460006011600019f1935050505092915050565b60008060016020601f8651018161348057fe5b040190506040518581526020810160005b838110156134b2578060200287015181602002830152806001019050613491565b50846020840282015260208260208502604001846000600b600019f193505050509392505050565b60008060016020601f855101816134ed57fe5b040190506040518481526020810160005b8381101561351f5780602002860151816020028301528060010190506134fe565b5060208260208502604001846000600e600019f1935050505092915050565b600080600060016020601f8651018161355357fe5b040190506040518581526020810160005b83811015613585578060200287015181602002830152806001019050613564565b506020826020850260200184600d600019fa9450815193505050509250929050565b6135af613a65565b600060208301905060405180604001604052808451815260200182815250915050919050565b60008082600001516135f985600001518660200151866000015187602001516136c6565b0190505b83600001518460200151018111613643578180600101925050826000015161363b8560200151830386600001510383866000015187602001516136c6565b0190506135fd565b5092915050565b613652613a65565b61365d8383836137a1565b5092915050565b60608082600001516040519080825280601f01601f19166020018201604052801561369e5781602001600182028038833980820191505090505b50905060006020820190506136bc818560200151866000015161383f565b8192505050919050565b6000808490506000868511613791576020851161374b57600060018660200360080260020a031960001b905060008186511690506000878a8a0103905060008386511690505b82811461373d5781861061372a578a8a019650505050505050613799565b858060010196505083865116905061370c565b859650505050505050613799565b60008585209050600091505b858803821161378f57600086842090508082141561377b5783945050505050613799565b600184019350508180600101925050613757565b505b868601925050505b949350505050565b6137a9613a65565b60006137c785600001518660200151866000015187602001516136c6565b90508460200151836020018181525050846020015181038360000181815250508460000151856020015101811415613809576000856000018181525050613834565b8360000151836000015101856000018181510391508181525050836000015181018560200181815250505b829150509392505050565b5b602081106138635781518352602083019250602082019150602081039050613840565b60006001826020036101000a0390508019835116818551168181178652505050505050565b6040518060a001604052806060815260200160001515815260200160008152602001600060028111156138b757fe5b8152602001606081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061390557805160ff1916838001178555613933565b82800160010185558215613933579182015b82811115613932578251825591602001919060010190613917565b5b5090506139409190613a7f565b5090565b82805482825590600052602060002090601f016020900481019282156139d95791602002820160005b838211156139aa57835183826101000a81548160ff021916908315150217905550926020019260010160208160000104928301926001030261396d565b80156139d75782816101000a81549060ff02191690556001016020816000010492830192600103026139aa565b505b5090506139e69190613aa4565b5090565b815481835581811115613a1757600502816005028360005260206000209182019101613a169190613ad4565b5b505050565b5080546000825560050290600052602060002090810190613a3d9190613ad4565b50565b6040518062100000016040528061800090602082028038833980820191505090505090565b604051806040016040528060008152602001600081525090565b613aa191905b80821115613a9d576000816000905550600101613a85565b5090565b90565b613ad191905b80821115613acd57600081816101000a81549060ff021916905550600101613aaa565b5090565b90565b613b4091905b80821115613b3c5760008082016000613af39190613b43565b6001820160006101000a81549060ff021916905560028201600090556003820160006101000a81549060ff0219169055600482016000613b339190613b8b565b50600501613ada565b5090565b90565b50805460018160011615610100020316600290046000825580601f10613b695750613b88565b601f016020900490600052602060002090810190613b879190613a7f565b5b50565b50805460008255601f016020900490600052602060002090810190613bb09190613a7f565b50565b600081359050613bc281614f18565b92915050565b600081519050613bd781614f18565b92915050565b600082601f830112613bee57600080fd5b8135613c01613bfc82614d06565b614cd9565b91508082526020830160208301858383011115613c1d57600080fd5b613c28838284614eb8565b50505092915050565b600082601f830112613c4257600080fd5b8135613c55613c5082614d32565b614cd9565b91508082526020830160208301858383011115613c7157600080fd5b613c7c838284614eb8565b50505092915050565b600081359050613c9481614f2f565b92915050565b600060208284031215613cac57600080fd5b6000613cba84828501613bc8565b91505092915050565b60008060408385031215613cd657600080fd5b6000613ce485828601613bb3565b9250506020613cf585828601613c85565b9150509250929050565b600060208284031215613d1157600080fd5b600082013567ffffffffffffffff811115613d2b57600080fd5b613d3784828501613c31565b91505092915050565b60008060408385031215613d5357600080fd5b600083013567ffffffffffffffff811115613d6d57600080fd5b613d7985828601613c31565b9250506020613d8a85828601613c85565b9150509250929050565b600080600060608486031215613da957600080fd5b600084013567ffffffffffffffff811115613dc357600080fd5b613dcf86828701613c31565b9350506020613de086828701613c85565b925050604084013567ffffffffffffffff811115613dfd57600080fd5b613e0986828701613bdd565b9150509250925092565b600080600060608486031215613e2857600080fd5b600084013567ffffffffffffffff811115613e4257600080fd5b613e4e86828701613c31565b9350506020613e5f86828701613c85565b9250506040613e7086828701613c85565b9150509250925092565b6000613e868383613fe8565b60208301905092915050565b6000613e9e8383613ff7565b60208301905092915050565b6000613eb68383614831565b905092915050565b6000613ec982614d88565b613ed38185614de7565b9350613ede83614d5e565b8060005b83811015613f0f578151613ef68882613e7a565b9750613f0183614dc0565b925050600181019050613ee2565b5085935050505092915050565b613f2581614d93565b613f2f8184614df8565b9250613f3a82614d6e565b8060005b83811015613f6b578151613f528782613e92565b9650613f5d83614dcd565b925050600181019050613f3e565b505050505050565b6000613f7e82614d9f565b613f888185614e03565b935083602082028501613f9a85614d78565b8060005b85811015613fd65784840389528151613fb78582613eaa565b9450613fc283614dda565b925060208a01995050600181019050613f9e565b50829750879550505050505092915050565b613ff181614e53565b82525050565b61400081614e5f565b82525050565b61400f81614ea6565b82525050565b61401e81614ea6565b82525050565b600061402f82614db5565b6140398185614e36565b9350614049818560208601614ec7565b80840191505092915050565b600061406082614daa565b61406a8185614e14565b935061407a818560208601614ec7565b61408381614efa565b840191505092915050565b600061409982614daa565b6140a38185614e36565b93506140b3818560208601614ec7565b80840191505092915050565b60006140cc601883614e25565b91507f496e636f7272656374206368756e6b20706f736974696f6e00000000000000006000830152602082019050919050565b600061410c601583614e25565b91507f4469726563746f7279206e6f74206372656174656400000000000000000000006000830152602082019050919050565b600061414c602483614e25565b91507f4e6f7420656e6f756768206d656d6f727920696e207468652046696c6573746f60008301527f72616765000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006141b2601b83614e25565b91507f48617368206861736e2774206265656e2063616c63756c6174656400000000006000830152602082019050919050565b60006141f2601983614e25565b91507f4368756e6b20697320616c72656164792075706c6f61646564000000000000006000830152602082019050919050565b6000614232601683614e25565b91507f496e636f7272656374206368756e6b206c656e677468000000000000000000006000830152602082019050919050565b6000614272600f83614e25565b91507f46696c65206e6f742065786973747300000000000000000000000000000000006000830152602082019050919050565b60006142b2600e83614e25565b91507f496e76616c69642073656e6465720000000000000000000000000000000000006000830152602082019050919050565b60006142f2601883614e25565b91507f4469726563746f7279206973206e6f742064656c6574656400000000000000006000830152602082019050919050565b6000614332601083614e25565b91507f46696c65206e6f742064656c65746564000000000000000000000000000000006000830152602082019050919050565b6000614372601383614e25565b91507f496e76616c69642073746f7261676550617468000000000000000000000000006000830152602082019050919050565b60006143b2600c83614e25565b91507f496e76616c6964207061746800000000000000000000000000000000000000006000830152602082019050919050565b60006143f2600183614e36565b91507f2e000000000000000000000000000000000000000000000000000000000000006000830152600182019050919050565b6000614432601683614e25565b91507f496e76616c6964206469726563746f7279206e616d65000000000000000000006000830152602082019050919050565b6000614472601583614e25565b91507f4368756e6b207761736e27742075706c6f6164656400000000000000000000006000830152602082019050919050565b60006144b2602683614e25565b91507f436f756c64206e6f742072657365727665206c657373207468616e207573656460008301527f20737061636500000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614518601683614e25565b91507f4469726563746f7279206973206e6f7420656d707479000000000000000000006000830152602082019050919050565b6000614558602383614e25565b91507f46696c65206861736e2774206265656e2075706c6f6164656420636f7272656360008301527f746c7900000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006145be601183614e25565b91507f4368756e6b207761736e277420726561640000000000000000000000000000006000830152602082019050919050565b60006145fe601883614e25565b91507f46696c656e616d652073686f756c64206265203c2032353600000000000000006000830152602082019050919050565b600061463e601f83614e25565b91507f46696c652073686f756c64206265206c657373207468616e20313030204d42006000830152602082019050919050565b600061467e600283614e36565b91507f2e2e0000000000000000000000000000000000000000000000000000000000006000830152600282019050919050565b60006146be601183614e25565b91507f4469726563746f72792069732066756c6c0000000000000000000000000000006000830152602082019050919050565b60006146fe600e83614e25565b91507f46696c65206e6f7420666f756e640000000000000000000000000000000000006000830152602082019050919050565b600061473e601883614e25565b91507f46696c65206f72206469726563746f72792065786973747300000000000000006000830152602082019050919050565b600061477e601883614e25565b91507f45564d206572726f7220696e2067657446696c6553697a6500000000000000006000830152602082019050919050565b60006147be601083614e25565b91507f46696c65206e6f742063726561746564000000000000000000000000000000006000830152602082019050919050565b60006147fe601983614e25565b91507f46696c65206861736e2774206265656e2075706c6f61646564000000000000006000830152602082019050919050565b600060a083016000830151848203600086015261484e8282614055565b91505060208301516148636020860182613fe8565b50604083015161487660408601826148ae565b5060608301516148896060860182614006565b50608083015184820360808601526148a18282613ebe565b9150508091505092915050565b6148b781614e9c565b82525050565b6148c681614e9c565b82525050565b60006148d8828461408e565b915081905092915050565b60006148ef8284614024565b915081905092915050565b6000614905826143e5565b9150819050919050565b600061491a82614671565b9150819050919050565b6000621000008201905061493b6000830184613f1c565b92915050565b6000602082019050818103600083015261495b8184613f73565b905092915050565b60006020820190506149786000830184614015565b92915050565b60006020820190508181036000830152614997816140bf565b9050919050565b600060208201905081810360008301526149b7816140ff565b9050919050565b600060208201905081810360008301526149d78161413f565b9050919050565b600060208201905081810360008301526149f7816141a5565b9050919050565b60006020820190508181036000830152614a17816141e5565b9050919050565b60006020820190508181036000830152614a3781614225565b9050919050565b60006020820190508181036000830152614a5781614265565b9050919050565b60006020820190508181036000830152614a77816142a5565b9050919050565b60006020820190508181036000830152614a97816142e5565b9050919050565b60006020820190508181036000830152614ab781614325565b9050919050565b60006020820190508181036000830152614ad781614365565b9050919050565b60006020820190508181036000830152614af7816143a5565b9050919050565b60006020820190508181036000830152614b1781614425565b9050919050565b60006020820190508181036000830152614b3781614465565b9050919050565b60006020820190508181036000830152614b57816144a5565b9050919050565b60006020820190508181036000830152614b778161450b565b9050919050565b60006020820190508181036000830152614b978161454b565b9050919050565b60006020820190508181036000830152614bb7816145b1565b9050919050565b60006020820190508181036000830152614bd7816145f1565b9050919050565b60006020820190508181036000830152614bf781614631565b9050919050565b60006020820190508181036000830152614c17816146b1565b9050919050565b60006020820190508181036000830152614c37816146f1565b9050919050565b60006020820190508181036000830152614c5781614731565b9050919050565b60006020820190508181036000830152614c7781614771565b9050919050565b60006020820190508181036000830152614c97816147b1565b9050919050565b60006020820190508181036000830152614cb7816147f1565b9050919050565b6000602082019050614cd360008301846148bd565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614cfc57600080fd5b8060405250919050565b600067ffffffffffffffff821115614d1d57600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614d4957600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050919050565b6000819050602082019050919050565b600081519050919050565b60006180009050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614e4c82614e7c565b9050919050565b60008115159050919050565b6000819050919050565b6000819050614e7782614f0b565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000614eb182614e69565b9050919050565b82818337600083830152505050565b60005b83811015614ee5578082015181840152602081019050614eca565b83811115614ef4576000848401525b50505050565b6000601f19601f8301169050919050565b60038110614f1557fe5b50565b614f2181614e41565b8114614f2c57600080fd5b50565b614f3881614e9c565b8114614f4357600080fd5b5056fea365627a7a723158202ae226b25ad72f9cff2d74c6dc7bcfb78530ab1d2438f48a8dab67499b37a8e56c6578706572696d656e74616cf564736f6c634300050d0040", + "nonce": "0", + "storage": { + "0x0": "2868903936" + } + }, + "0x69362535ec535F0643cBf62D16aDeDCAf32Ee6F8": { + "balance": "0", + "code": "0x608060405234801561001057600080fd5b50600436106100b45760003560e01c806379210e8e1161007157806379210e8e1461017757806381a8235a146101a757806385aeeb17146101c35780639a9a5593146101f3578063a99100541461020f578063b57321221461022b576100b4565b806307c6e7d3146100b9578063122f4fba146100d55780631c6ec7a9146101055780631cfe4e3b14610121578063373dedb41461013d57806361e46db51461015b575b600080fd5b6100d360048036036100ce9190810190613e0d565b61025b565b005b6100ef60048036036100ea9190810190613e0d565b610804565b6040516100fc9190614ab1565b60405180910390f35b61011f600480360361011a9190810190613e0d565b610b43565b005b61013b60048036036101369190810190613dd1565b610f72565b005b610145611190565b6040516101529190614e2c565b60405180910390f35b61017560048036036101709190810190613ea2565b611199565b005b610191600480360361018c9190810190613f21565b6113f9565b60405161019e9190614a72565b60405180910390f35b6101c160048036036101bc9190810190613e0d565b6116f9565b005b6101dd60048036036101d89190810190613e0d565b61189e565b6040516101ea9190614a8f565b60405180910390f35b61020d60048036036102089190810190613e4e565b611b9d565b005b61022960048036036102249190810190613e0d565b61213a565b005b61024560048036036102409190810190613e0d565b612790565b6040516102529190614e2c565b60405180910390f35b6000339050606061026b83612a10565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b825181101561037c576000826001018460018403815181106102d557fe5b60200260200101516040516102ea9190614a1a565b90815260200160405180910390205411610339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161033090614c2c565b60405180910390fd5b8160020183600183038151811061034c57fe5b60200260200101516040516103619190614a1a565b908152602001604051809103902091508060010190506102b7565b506060600183511161038e57846103a7565b8260018451038151811061039e57fe5b60200260200101515b9050600082600101826040516103bd9190614a31565b9081526020016040518091039020541161040c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161040390614c2c565b60405180910390fd5b600082600201826040516104209190614a31565b90815260200160405180910390206000018054905014610475576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161046c90614cac565b60405180910390fd5b60006104818587612c10565b9050806104c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ba90614bcc565b60405180910390fd5b6104cb613996565b836000016001856000018054905003815481106104e457fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156105965780601f1061056b57610100808354040283529160200191610596565b820191906000526020600020905b81548152906001019060200180831161057957829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff1660028111156105e257fe5b60028111156105ed57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561066557602002820191906000526020600020906000905b82829054906101000a900460ff1615158152602001906001019060208260000104928301926001038202915080841161062f5790505b50505050508152505090508084600001600186600101866040516106899190614a31565b90815260200160405180910390205403815481106106a357fe5b906000526020600020906005020160008201518160000190805190602001906106cd9291906139d2565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561071c57fe5b0217905550608082015181600401908051906020019061073d929190613a52565b5090505083600101836040516107539190614a31565b9081526020016040518091039020548460010182600001516040516107789190614a1a565b9081526020016040518091039020819055506000846001018460405161079e9190614a31565b908152602001604051809103902081905550836000018054809190600190036107c79190613af8565b5083600201836040516107da9190614a31565b9081526020016040518091039020600080820160006107f99190613b2a565b505050505050505050565b600080606061081284612c74565b91509150606061082182612a10565b90506000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b82518110156109065760008260010184600184038151811061088b57fe5b60200260200101516040516108a09190614a1a565b90815260200160405180910390205414156108c357600095505050505050610b3e565b816002018360018303815181106108d657fe5b60200260200101516040516108eb9190614a1a565b9081526020016040518091039020915080600101905061086d565b50606060018351116109185783610931565b8260018451038151811061092857fe5b60200260200101515b9050600082600101826040516109479190614a31565b908152602001604051809103902054141561096a57600095505050505050610b3e565b610972613996565b826000016001846001018460405161098a9190614a31565b90815260200160405180910390205403815481106109a457fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610a565780601f10610a2b57610100808354040283529160200191610a56565b820191906000526020600020905b815481529060010190602001808311610a3957829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115610aa257fe5b6002811115610aad57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015610b2557602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411610aef5790505b5050505050815250509050806060015196505050505050505b919050565b600160009054906101000a900460ff16610b85576120006002819055506210000060038190555060018060006101000a81548160ff0219169083151502179055505b6000815111610bc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc090614c2c565b60405180910390fd5b60003390506060610bd983612a10565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015610cea57600082600101846001840381518110610c4357fe5b6020026020010151604051610c589190614a1a565b90815260200160405180910390205411610ca7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9e90614c2c565b60405180910390fd5b81600201836001830381518110610cba57fe5b6020026020010151604051610ccf9190614a1a565b90815260200160405180910390209150806001019050610c25565b50600254816000018054905010610d36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2d90614d4c565b60405180910390fd5b60606001835111610d475784610d60565b82600184510381518110610d5757fe5b60200260200101515b905060008260010182604051610d769190614a31565b90815260200160405180910390205414610dc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbc90614d8c565b60405180910390fd5b610dce81612ff6565b610e0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0490614c4c565b60405180910390fd5b6000610e1985876130d7565b905080610e5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5290614aec565b60405180910390fd5b610e63613996565b82816000018190525060008160200190151590811515815250508360000181908060018154018082558091505090600182039060005260206000209060050201600090919290919091506000820151816000019080519060200190610ec99291906139d2565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff02191690836002811115610f1857fe5b02179055506080820151816004019080519060200190610f39929190613a52565b5050505083600001805490508460010184604051610f579190614a31565b90815260200160405180910390208190555050505050505050565b610f7a61313b565b73ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161480610fdf57503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614155b61101e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101590614bac565b60405180910390fd5b80600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411156110a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109790614c8c565b60405180910390fd5b600054600754820111156110e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e090614b0c565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460076000828254039250508190555080600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550806007600082825401925050819055505050565b60008054905090565b600033905060006111aa82866131d4565b9050600160028111156111b957fe5b8160030160009054906101000a900460ff1660028111156111d657fe5b14611216576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120d90614d6c565b60405180910390fd5b6000600354858161122357fe5b061480156112345750806002015484105b611273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126a90614acc565b60405180910390fd5b600354848260020154031080156112905750838160020154038351145b8061129d57506003548351145b6112dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d390614b6c565b60405180910390fd5b600015158160040160035486816112ef57fe5b04815481106112fa57fe5b90600052602060002090602091828204019190069054906101000a900460ff1615151461135c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135390614b4c565b60405180910390fd5b600061136a838787876133d3565b9050806113ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a390614c6c565b60405180910390fd5b60018260040160035487816113bd57fe5b04815481106113c857fe5b90600052602060002090602091828204019190066101000a81548160ff021916908315150217905550505050505050565b611401613b4e565b6000606061140e86612c74565b9150915061141a613996565b61142483836131d4565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156114c85780601f1061149d576101008083540402835291602001916114c8565b820191906000526020600020905b8154815290600101906020018083116114ab57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561151457fe5b600281111561151f57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561159757602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116115615790505b50505050508152505090506002808111156115ae57fe5b816060015160028111156115be57fe5b146115fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f590614e0c565b60405180910390fd5b60035485111580156116105750600085115b61164f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164690614b6c565b60405180910390fd5b80604001518587011115611698576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168f90614acc565b60405180910390fd5b60006116a684848989613484565b8096508192505050806116ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e590614cec565b60405180910390fd5b505050509392505050565b6000339050600061170a82846131d4565b90506001600281111561171957fe5b8160030160009054906101000a900460ff16600281111561173657fe5b14611776576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176d90614d6c565b60405180910390fd5b60006001905060008260040180549050905060008090505b818110156117e157600015158460040182815481106117a957fe5b90600052602060002090602091828204019190069054906101000a900460ff16151514156117d657600092505b80600101905061178e565b5081611822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181990614ccc565b60405180910390fd5b60028360030160006101000a81548160ff0219169083600281111561184357fe5b021790555060006118548587613517565b905080611896576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188d90614b2c565b60405180910390fd5b505050505050565b6060600060606118ad84612c74565b9150915060606118bc82612a10565b90506000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008090505b82518110156119c65760008260010184838151811061192257fe5b60200260200101516040516119379190614a1a565b90815260200160405180910390205411611986576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197d90614c2c565b60405180910390fd5b8160020183828151811061199657fe5b60200260200101516040516119ab9190614a1a565b90815260200160405180910390209150806001019050611907565b5080600001805480602002602001604051908101604052809291908181526020016000905b82821015611b8e57838290600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611aa75780601f10611a7c57610100808354040283529160200191611aa7565b820191906000526020600020905b815481529060010190602001808311611a8a57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115611af357fe5b6002811115611afe57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015611b7657602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411611b405790505b505050505081525050815260200190600101906119eb565b50505050945050505050919050565b600160009054906101000a900460ff16611bdf576120006002819055506210000060038190555060018060006101000a81548160ff0219169083151502179055505b60003390506305f5e100821115611c2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2290614d2c565b60405180910390fd5b600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205483011115611cee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce590614dac565b60405180910390fd5b6060611cf984612a10565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015611e0a57600082600101846001840381518110611d6357fe5b6020026020010151604051611d789190614a1a565b90815260200160405180910390205411611dc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dbe90614c2c565b60405180910390fd5b81600201836001830381518110611dda57fe5b6020026020010151604051611def9190614a1a565b90815260200160405180910390209150806001019050611d45565b50600254816000018054905010611e56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4d90614d4c565b60405180910390fd5b60606001835111611e675785611e80565b82600184510381518110611e7757fe5b60200260200101515b905060008260010182604051611e969190614a31565b90815260200160405180910390205414611ee5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611edc90614d8c565b60405180910390fd5b611eee81612ff6565b611f2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2490614d0c565b60405180910390fd5b6000611f3a85888861357b565b905080611f7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7390614dec565b60405180910390fd5b6060600354600160035489010381611f9057fe5b04604051908082528060200260200182016040528015611fbf5781602001602082028038833980820191505090505b509050836000016040518060a0016040528085815260200160011515815260200189815260200160016002811115611ff357fe5b8152602001838152509080600181540180825580915050906001820390600052602060002090600502016000909192909190915060008201518160000190805190602001906120439291906139d2565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561209257fe5b021790555060808201518160040190805190602001906120b3929190613a52565b50505050836000018054905084600101846040516120d19190614a31565b90815260200160405180910390208190555086600560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505050505050505050565b6000339050612147613996565b61215182846131d4565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156121f55780601f106121ca576101008083540402835291602001916121f5565b820191906000526020600020905b8154815290600101906020018083116121d857829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561224157fe5b600281111561224c57fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156122c457602002820191906000526020600020906000905b82829054906101000a900460ff1615158152602001906001019060208260000104928301926001038202915080841161228e5790505b5050505050815250509050600060028111156122dc57fe5b816060015160028111156122ec57fe5b141561232d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232490614b8c565b60405180910390fd5b600061233983856135e8565b90508061237b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161237290614bec565b60405180910390fd5b606061238685612a10565b90506000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b825181101561241e57816002018360018303815181106123ee57fe5b60200260200101516040516124039190614a1a565b908152602001604051809103902091508060010190506123d2565b50600060018260010186600001516040516124399190614a1a565b908152602001604051809103902054039050612453613996565b8260000160018460000180549050038154811061246c57fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561251e5780601f106124f35761010080835404028352916020019161251e565b820191906000526020600020905b81548152906001019060200180831161250157829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561256a57fe5b600281111561257557fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156125ed57602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116125b75790505b50505050508152505090508083600001838154811061260857fe5b906000526020600020906005020160008201518160000190805190602001906126329291906139d2565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561268157fe5b021790555060808201518160040190805190602001906126a2929190613a52565b50905050826000018054809190600190036126bd9190613af8565b508260010186600001516040516126d49190614a1a565b9081526020016040518091039020548360010182600001516040516126f99190614a1a565b90815260200160405180910390208190555060008360010187600001516040516127239190614a1a565b9081526020016040518091039020819055508560400151600560008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505050505050505050565b600080606061279e84612c74565b915091506127aa613996565b6127b483836131d4565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156128585780601f1061282d57610100808354040283529160200191612858565b820191906000526020600020905b81548152906001019060200180831161283b57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff1660028111156128a457fe5b60028111156128af57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561292757602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116128f15790505b50505050508152505090506001600281111561293f57fe5b8160600151600281111561294f57fe5b1480612974575060028081111561296257fe5b8160600151600281111561297257fe5b145b6129b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129aa90614d6c565b60405180910390fd5b60006129bf848461364c565b809650819250505080612a07576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129fe90614dcc565b60405180910390fd5b50505050919050565b6060612a1a613b73565b612a23836136b5565b9050612a2d613b73565b612a6b6040518060400160405280600181526020017f2f000000000000000000000000000000000000000000000000000000000000008152506136b5565b905060606001612a8483856136e390919063ffffffff16565b01604051908082528060200260200182016040528015612ab857816020015b6060815260200190600190039081612aa35790505b50905060008090505b8151811015612b0957612ae5612ae0848661375890919063ffffffff16565b613772565b828281518110612af157fe5b60200260200101819052508080600101915050612ac1565b50600081600183510381518110612b1c57fe5b6020026020010151511415612b875780600182510381518110612b3b57fe5b6020026020010160608152506001815103604051908082528060200260200182016040528015612b7f57816020015b6060815260200190600190039081612b6a5790505b509350612bc0565b8051604051908082528060200260200182016040528015612bbc57816020015b6060815260200190600190039081612ba75790505b5093505b60008090505b8451811015612c0757818181518110612bdb57fe5b6020026020010151858281518110612bef57fe5b60200260200101819052508080600101915050612bc6565b50505050919050565b60008060016020601f85510181612c2357fe5b040190506040518481526020810160005b83811015612c55578060200286015181602002830152806001019050612c34565b50602082602085026040018460006010600019f1935050505092915050565b6000606060006028905080845111612cc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cb890614c0c565b60405180910390fd5b6060816040519080825280601f01601f191660200182016040528015612cf65781602001600182028038833980820191505090505b50905060008090505b82811015612d6657858181518110612d1357fe5b602001015160f81c60f81b828281518110612d2a57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050612cff565b50600080905060008090505b83811015612e95576000838281518110612d8857fe5b602001015160f81c60f81b60f81c60ff16905060308110158015612dad575060398111155b80612dc6575060418110158015612dc55750605a8111155b5b80612ddf575060618110158015612dde575060668111155b5b612e1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e1590614c0c565b60405180910390fd5b60308110158015612e30575060398111155b15612e415760308103601084020192505b60418110158015612e535750605a8111155b15612e645760378103601084020192505b60618110158015612e76575060668111155b15612e875760578103601084020192505b508080600101915050612d72565b508094507f2f00000000000000000000000000000000000000000000000000000000000000868481518110612ec657fe5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612f33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f2a90614c0c565b60405180910390fd5b6000600184885103039050806040519080825280601f01601f191660200182016040528015612f715781602001600182028038833980820191505090505b50945060008090505b81811015612fec5760008860018784010181518110612f9557fe5b602001015160f81c60f81b905080878381518110612faf57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350508080600101915050612f7a565b5050505050915091565b600060405160200161300790614a5d565b604051602081830303815290604052805190602001208260405160200161302e9190614a31565b604051602081830303815290604052805190602001201480613099575060405160200161305a90614a48565b60405160208183030381529060405280519060200120826040516020016130819190614a31565b60405160208183030381529060405280519060200120145b806130a5575060008251145b156130b357600090506130d2565b60008251905060ff8111156130cc5760009150506130d2565b60019150505b919050565b60008060016020601f855101816130ea57fe5b040190506040518481526020810160005b8381101561311c5780602002860151816020028301528060010190506130fb565b5060208260208502604001846000600f600019f1935050505092915050565b600073d2001000000000000000000000000000000000d273ffffffffffffffffffffffffffffffffffffffff166383e781fe6040518163ffffffff1660e01b815260040160206040518083038186803b15801561319757600080fd5b505afa1580156131ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506131cf9190810190613da8565b905090565b600060606131e183612a10565b90506000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b82518110156132f25760008260010184600184038151811061324b57fe5b60200260200101516040516132609190614a1a565b908152602001604051809103902054116132af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132a690614c2c565b60405180910390fd5b816002018360018303815181106132c257fe5b60200260200101516040516132d79190614a1a565b9081526020016040518091039020915080600101905061322d565b5060606001835111613304578461331d565b8260018451038151811061331457fe5b60200260200101515b9050600082600101826040516133339190614a31565b90815260200160405180910390205411613382576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161337990614c2c565b60405180910390fd5b6000826000016001846001018460405161339c9190614a31565b90815260200160405180910390205403815481106133b657fe5b906000526020600020906005020190508094505050505092915050565b60008060016020601f855101816133e657fe5b04019050600060016020601f885101816133fc57fe5b040190506040518781526020810160005b8381101561342e57806020028901518160200283015280600101905061340d565b50868360200282015260005b84811015613460578060200287015181856001010160200283015280600101905061343a565b50602082848601602002606001846000600c600019f1945050505050949350505050565b600061348e613b4e565b600060016020601f885101816134a057fe5b0401905060006020601f8601816134b357fe5b0490506040518881526020810160005b848110156134e457806020028a0151816020028301528060010190506134c3565b5083602002810188815287816020015283602002868660030160200285600a600019fa9650505050505094509492505050565b60008060016020601f8551018161352a57fe5b040190506040518481526020810160005b8381101561355c57806020028601518160200283015280600101905061353b565b50602082602085026040018460006011600019f1935050505092915050565b60008060016020601f8651018161358e57fe5b040190506040518581526020810160005b838110156135c057806020028701518160200283015280600101905061359f565b50846020840282015260208260208502604001846000600b600019f193505050509392505050565b60008060016020601f855101816135fb57fe5b040190506040518481526020810160005b8381101561362d57806020028601518160200283015280600101905061360c565b5060208260208502604001846000600e600019f1935050505092915050565b600080600060016020601f8651018161366157fe5b040190506040518581526020810160005b83811015613693578060200287015181602002830152806001019050613672565b506020826020850260200184600d600019fa9450815193505050509250929050565b6136bd613b73565b600060208301905060405180604001604052808451815260200182815250915050919050565b600080826000015161370785600001518660200151866000015187602001516137d4565b0190505b8360000151846020015101811161375157818060010192505082600001516137498560200151830386600001510383866000015187602001516137d4565b01905061370b565b5092915050565b613760613b73565b61376b8383836138af565b5092915050565b60608082600001516040519080825280601f01601f1916602001820160405280156137ac5781602001600182028038833980820191505090505b50905060006020820190506137ca818560200151866000015161394d565b8192505050919050565b600080849050600086851161389f576020851161385957600060018660200360080260020a031960001b905060008186511690506000878a8a0103905060008386511690505b82811461384b57818610613838578a8a0196505050505050506138a7565b858060010196505083865116905061381a565b8596505050505050506138a7565b60008585209050600091505b858803821161389d57600086842090508082141561388957839450505050506138a7565b600184019350508180600101925050613865565b505b868601925050505b949350505050565b6138b7613b73565b60006138d585600001518660200151866000015187602001516137d4565b90508460200151836020018181525050846020015181038360000181815250508460000151856020015101811415613917576000856000018181525050613942565b8360000151836000015101856000018181510391508181525050836000015181018560200181815250505b829150509392505050565b5b60208110613971578151835260208301925060208201915060208103905061394e565b60006001826020036101000a0390508019835116818551168181178652505050505050565b6040518060a001604052806060815260200160001515815260200160008152602001600060028111156139c557fe5b8152602001606081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613a1357805160ff1916838001178555613a41565b82800160010185558215613a41579182015b82811115613a40578251825591602001919060010190613a25565b5b509050613a4e9190613b8d565b5090565b82805482825590600052602060002090601f01602090048101928215613ae75791602002820160005b83821115613ab857835183826101000a81548160ff0219169083151502179055509260200192600101602081600001049283019260010302613a7b565b8015613ae55782816101000a81549060ff0219169055600101602081600001049283019260010302613ab8565b505b509050613af49190613bb2565b5090565b815481835581811115613b2557600502816005028360005260206000209182019101613b249190613be2565b5b505050565b5080546000825560050290600052602060002090810190613b4b9190613be2565b50565b6040518062100000016040528061800090602082028038833980820191505090505090565b604051806040016040528060008152602001600081525090565b613baf91905b80821115613bab576000816000905550600101613b93565b5090565b90565b613bdf91905b80821115613bdb57600081816101000a81549060ff021916905550600101613bb8565b5090565b90565b613c4e91905b80821115613c4a5760008082016000613c019190613c51565b6001820160006101000a81549060ff021916905560028201600090556003820160006101000a81549060ff0219169055600482016000613c419190613c99565b50600501613be8565b5090565b90565b50805460018160011615610100020316600290046000825580601f10613c775750613c96565b601f016020900490600052602060002090810190613c959190613b8d565b5b50565b50805460008255601f016020900490600052602060002090810190613cbe9190613b8d565b50565b600081359050613cd081615086565b92915050565b600081519050613ce581615086565b92915050565b600082601f830112613cfc57600080fd5b8135613d0f613d0a82614e74565b614e47565b91508082526020830160208301858383011115613d2b57600080fd5b613d36838284615026565b50505092915050565b600082601f830112613d5057600080fd5b8135613d63613d5e82614ea0565b614e47565b91508082526020830160208301858383011115613d7f57600080fd5b613d8a838284615026565b50505092915050565b600081359050613da28161509d565b92915050565b600060208284031215613dba57600080fd5b6000613dc884828501613cd6565b91505092915050565b60008060408385031215613de457600080fd5b6000613df285828601613cc1565b9250506020613e0385828601613d93565b9150509250929050565b600060208284031215613e1f57600080fd5b600082013567ffffffffffffffff811115613e3957600080fd5b613e4584828501613d3f565b91505092915050565b60008060408385031215613e6157600080fd5b600083013567ffffffffffffffff811115613e7b57600080fd5b613e8785828601613d3f565b9250506020613e9885828601613d93565b9150509250929050565b600080600060608486031215613eb757600080fd5b600084013567ffffffffffffffff811115613ed157600080fd5b613edd86828701613d3f565b9350506020613eee86828701613d93565b925050604084013567ffffffffffffffff811115613f0b57600080fd5b613f1786828701613ceb565b9150509250925092565b600080600060608486031215613f3657600080fd5b600084013567ffffffffffffffff811115613f5057600080fd5b613f5c86828701613d3f565b9350506020613f6d86828701613d93565b9250506040613f7e86828701613d93565b9150509250925092565b6000613f9483836140f6565b60208301905092915050565b6000613fac8383614105565b60208301905092915050565b6000613fc4838361497f565b905092915050565b6000613fd782614ef6565b613fe18185614f55565b9350613fec83614ecc565b8060005b8381101561401d5781516140048882613f88565b975061400f83614f2e565b925050600181019050613ff0565b5085935050505092915050565b61403381614f01565b61403d8184614f66565b925061404882614edc565b8060005b838110156140795781516140608782613fa0565b965061406b83614f3b565b92505060018101905061404c565b505050505050565b600061408c82614f0d565b6140968185614f71565b9350836020820285016140a885614ee6565b8060005b858110156140e457848403895281516140c58582613fb8565b94506140d083614f48565b925060208a019950506001810190506140ac565b50829750879550505050505092915050565b6140ff81614fc1565b82525050565b61410e81614fcd565b82525050565b61411d81615014565b82525050565b61412c81615014565b82525050565b600061413d82614f23565b6141478185614fa4565b9350614157818560208601615035565b80840191505092915050565b600061416e82614f18565b6141788185614f82565b9350614188818560208601615035565b61419181615068565b840191505092915050565b60006141a782614f18565b6141b18185614fa4565b93506141c1818560208601615035565b80840191505092915050565b60006141da601883614f93565b91507f496e636f7272656374206368756e6b20706f736974696f6e00000000000000006000830152602082019050919050565b600061421a601583614f93565b91507f4469726563746f7279206e6f74206372656174656400000000000000000000006000830152602082019050919050565b600061425a602483614f93565b91507f4e6f7420656e6f756768206d656d6f727920696e207468652046696c6573746f60008301527f72616765000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006142c0601b83614f93565b91507f48617368206861736e2774206265656e2063616c63756c6174656400000000006000830152602082019050919050565b6000614300601983614f93565b91507f4368756e6b20697320616c72656164792075706c6f61646564000000000000006000830152602082019050919050565b6000614340601683614f93565b91507f496e636f7272656374206368756e6b206c656e677468000000000000000000006000830152602082019050919050565b6000614380600f83614f93565b91507f46696c65206e6f742065786973747300000000000000000000000000000000006000830152602082019050919050565b60006143c0600e83614f93565b91507f496e76616c69642073656e6465720000000000000000000000000000000000006000830152602082019050919050565b6000614400601883614f93565b91507f4469726563746f7279206973206e6f742064656c6574656400000000000000006000830152602082019050919050565b6000614440601083614f93565b91507f46696c65206e6f742064656c65746564000000000000000000000000000000006000830152602082019050919050565b6000614480601383614f93565b91507f496e76616c69642073746f7261676550617468000000000000000000000000006000830152602082019050919050565b60006144c0600c83614f93565b91507f496e76616c6964207061746800000000000000000000000000000000000000006000830152602082019050919050565b6000614500600183614fa4565b91507f2e000000000000000000000000000000000000000000000000000000000000006000830152600182019050919050565b6000614540601683614f93565b91507f496e76616c6964206469726563746f7279206e616d65000000000000000000006000830152602082019050919050565b6000614580601583614f93565b91507f4368756e6b207761736e27742075706c6f6164656400000000000000000000006000830152602082019050919050565b60006145c0602683614f93565b91507f436f756c64206e6f742072657365727665206c657373207468616e207573656460008301527f20737061636500000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614626601683614f93565b91507f4469726563746f7279206973206e6f7420656d707479000000000000000000006000830152602082019050919050565b6000614666602383614f93565b91507f46696c65206861736e2774206265656e2075706c6f6164656420636f7272656360008301527f746c7900000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006146cc601183614f93565b91507f4368756e6b207761736e277420726561640000000000000000000000000000006000830152602082019050919050565b600061470c601883614f93565b91507f46696c656e616d652073686f756c64206265203c2032353600000000000000006000830152602082019050919050565b600061474c601f83614f93565b91507f46696c652073686f756c64206265206c657373207468616e20313030204d42006000830152602082019050919050565b600061478c600283614fa4565b91507f2e2e0000000000000000000000000000000000000000000000000000000000006000830152600282019050919050565b60006147cc601183614f93565b91507f4469726563746f72792069732066756c6c0000000000000000000000000000006000830152602082019050919050565b600061480c600e83614f93565b91507f46696c65206e6f7420666f756e640000000000000000000000000000000000006000830152602082019050919050565b600061484c601883614f93565b91507f46696c65206f72206469726563746f72792065786973747300000000000000006000830152602082019050919050565b600061488c601983614f93565b91507f4e6f7420656e6f756768207265736572766564207370616365000000000000006000830152602082019050919050565b60006148cc601883614f93565b91507f45564d206572726f7220696e2067657446696c6553697a6500000000000000006000830152602082019050919050565b600061490c601083614f93565b91507f46696c65206e6f742063726561746564000000000000000000000000000000006000830152602082019050919050565b600061494c601983614f93565b91507f46696c65206861736e2774206265656e2075706c6f61646564000000000000006000830152602082019050919050565b600060a083016000830151848203600086015261499c8282614163565b91505060208301516149b160208601826140f6565b5060408301516149c460408601826149fc565b5060608301516149d76060860182614114565b50608083015184820360808601526149ef8282613fcc565b9150508091505092915050565b614a058161500a565b82525050565b614a148161500a565b82525050565b6000614a26828461419c565b915081905092915050565b6000614a3d8284614132565b915081905092915050565b6000614a53826144f3565b9150819050919050565b6000614a688261477f565b9150819050919050565b60006210000082019050614a89600083018461402a565b92915050565b60006020820190508181036000830152614aa98184614081565b905092915050565b6000602082019050614ac66000830184614123565b92915050565b60006020820190508181036000830152614ae5816141cd565b9050919050565b60006020820190508181036000830152614b058161420d565b9050919050565b60006020820190508181036000830152614b258161424d565b9050919050565b60006020820190508181036000830152614b45816142b3565b9050919050565b60006020820190508181036000830152614b65816142f3565b9050919050565b60006020820190508181036000830152614b8581614333565b9050919050565b60006020820190508181036000830152614ba581614373565b9050919050565b60006020820190508181036000830152614bc5816143b3565b9050919050565b60006020820190508181036000830152614be5816143f3565b9050919050565b60006020820190508181036000830152614c0581614433565b9050919050565b60006020820190508181036000830152614c2581614473565b9050919050565b60006020820190508181036000830152614c45816144b3565b9050919050565b60006020820190508181036000830152614c6581614533565b9050919050565b60006020820190508181036000830152614c8581614573565b9050919050565b60006020820190508181036000830152614ca5816145b3565b9050919050565b60006020820190508181036000830152614cc581614619565b9050919050565b60006020820190508181036000830152614ce581614659565b9050919050565b60006020820190508181036000830152614d05816146bf565b9050919050565b60006020820190508181036000830152614d25816146ff565b9050919050565b60006020820190508181036000830152614d458161473f565b9050919050565b60006020820190508181036000830152614d65816147bf565b9050919050565b60006020820190508181036000830152614d85816147ff565b9050919050565b60006020820190508181036000830152614da58161483f565b9050919050565b60006020820190508181036000830152614dc58161487f565b9050919050565b60006020820190508181036000830152614de5816148bf565b9050919050565b60006020820190508181036000830152614e05816148ff565b9050919050565b60006020820190508181036000830152614e258161493f565b9050919050565b6000602082019050614e416000830184614a0b565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614e6a57600080fd5b8060405250919050565b600067ffffffffffffffff821115614e8b57600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614eb757600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050919050565b6000819050602082019050919050565b600081519050919050565b60006180009050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614fba82614fea565b9050919050565b60008115159050919050565b6000819050919050565b6000819050614fe582615079565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061501f82614fd7565b9050919050565b82818337600083830152505050565b60005b83811015615053578082015181840152602081019050615038565b83811115615062576000848401525b50505050565b6000601f19601f8301169050919050565b6003811061508357fe5b50565b61508f81614faf565b811461509a57600080fd5b50565b6150a68161500a565b81146150b157600080fd5b5056fea365627a7a72315820314a90e541327f2678eaf7815f54348c3702e4fa45cdf1d5595b378d08af86896c6578706572696d656e74616cf564736f6c634300050d0040", + "nonce": "0", + "storage": { + "0x0": "2868903936" + } + }, + "0x69bfcdcb98c9562e0a2faee3ecdfd65e8a0adb19": { + "balance": "1000000000000000000000000000000" + }, + "0x6a37ad7dceec4595eea9f03b82d2710e738343ac": { + "balance": "1000000000000000000000000000000" + }, + "0x6b806862a977a0e22ed1752f858e5332647121c8": { + "balance": "1000000000000000000000000000000" + }, + "0x6c0ef9084a57df13c175afea32ea47a510c5506e": { + "balance": "1000000000000000000000000000000" + }, + "0x6cd5e637266e18d3e888ee99451eb828c6b491f4": { + "balance": "1000000000000000000000000000000" + }, + "0x6d0d7f0ff51917bd84a5f7270d31a894282aaf4b": { + "balance": "1000000000000000000000000000000" + }, + "0x6d8092cb926daf29236f866cd31c327ff73323d1": { + "balance": "1000000000000000000000000000000" + }, + "0x6d80aAC61F6d92c7F4A3c412850474ba963B698E": { + "balance": "1000000000000000000000" + }, + "0x6fec280c0ab320715b17d70e8b02c2d4141c1372": { + "balance": "1000000000000000000000000000000" + }, + "0x733ad609ef2e742334d96266fbc13733f1cf5e4a": { + "balance": "1000000000000000000000000000000" + }, + "0x7525198d8cd1121d57358a0b0ed037e924581a76": { + "balance": "1000000000000000000000000000000" + }, + "0x765708943c3b791563d1e3f0533b6d7e7d769e4d": { + "balance": "1000000000000000000000000000000" + }, + "0x7685d04f0b7657017b77efa004a14ff9f022acab": { + "balance": "1000000000000000000000000000000" + }, + "0x76b545cb6a2fc671f741950eeb27627e69a1e69b": { + "balance": "1000000000000000000000000000000" + }, + "0x77a0bc73442d3d9cb993e8d9752f95babf0ccaa6": { + "balance": "1000000000000000000000000000000" + }, + "0x7a89A6c323FaCfF0ADeF7EEF3e491aD4044d0592": { + "balance": "100000000000000000000000" + }, + "0x7e7E68F04D1799Fa25C8cff57314c8a5d3942e69": { + "balance": "1000000000000000000000000" + }, + "0x811d701d14539d190a8593fe901eafe8eff511f5": { + "balance": "1000000000000000000000000000000" + }, + "0x81dcbd71da28fafb9ca99ff5a22bfcebba84fecc": { + "balance": "100000000000000000000000" + }, + "0x83c1479d2a32d9ed9fa699289b6c2db56b7cd045": { + "balance": "1000000000000000000000000000000" + }, + "0x85b33f0853ab8eaa4e602bdfd724d44bc2731e90": { + "balance": "1000000000000000000000000000000" + }, + "0x863f816036e3cbba90855196c9d1e339fcff1650": { + "balance": "1000000000000000000000000000000" + }, + "0x87ea381878572d63b3453033d7540abddd191186": { + "balance": "1000000000000000000000000000000" + }, + "0x88fd5e01078629cc194c933d9631b9448fe10b1d": { + "balance": "1000000000000000000000000000000" + }, + "0x8945e48bd056f45c8b57f9025d2674bb03a24035": { + "balance": "1000000000000000000000000000000" + }, + "0x8a920edc1021ce76c22774e0e83723a6e51c2439": { + "balance": "1000000000000000000000000000000" + }, + "0x8e6081e272c8f4d49f5b29157b52f68cbd6307ad": { + "balance": "1000000000000000000000000000000" + }, + "0x8fe24dbbf9884bd458d8cfac528b4ad70e82497d": { + "balance": "1000000000000000000000000000000" + }, + "0x90431f3f75b26657f74abbb5c759b12e78f916cc": { + "balance": "1000000000000000000000000000000" + }, + "0x907cd0881E50d359bb9Fd120B1A5A143b1C97De6": { + "balance": "1000000000000000000000000000000000000000000000000000000000" + }, + "0x94c6e5746971d6aebeaa42cbbe2feca0f6b5b24f": { + "balance": "1000000000000000000000000000000" + }, + "0x96672f9e982936e1904b15c948cc81bf18027db6": { + "balance": "1000000000000000000000000000000" + }, + "0x97b921ba45e0aa8830701aa62050a83ee00a1bb8": { + "balance": "1000000000000000000000000000000" + }, + "0x98e50c97baf98dc6a81bdb95067339a269a36fc1": { + "balance": "1000000000000000000000000000000" + }, + "0x9b77f28285a49601169a33332f08aa309d97edd0": { + "balance": "1000000000000000000000000000000" + }, + "0x9f62f4215cd277ca40dede101b4ccb29290de6bb": { + "balance": "1000000000000000000000000000000" + }, + "0xD1001000000000000000000000000000000000D1": { + "balance": "0", + "code": "0x608060405260043610603f576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680636d4ce63c146044575b600080fd5b348015604f57600080fd5b506056606c565b6040518082815260200191505060405180910390f35b60006001600060048152602001908152602001600020600060098152602001908152602001600020600101549050905600a165627a7a723058208fe64219becc0bcab1c8f854f05804ebb6bb555da5dbc49e8f7021c31d77636a0029", + "nonce": "0", + "storage": { + "0x3b4da637a1b0e6dbfc6795f2b7f0cb29eebb91b3af4dcc335e1633f6b4af810b": "1111" + } + }, + "0xD3001000000000000000000000000000000000D3": { + "balance": "0", + "code": "0x60806040526004361061007b5760003560e01c80639623609d1161004e5780639623609d1461013657806399a88ec4146101f5578063f2fde38b14610230578063f3b7dead146102635761007b565b8063204e1c7a14610080578063715018a6146100cf5780637eff275e146100e65780638da5cb5b14610121575b600080fd5b34801561008c57600080fd5b506100b3600480360360208110156100a357600080fd5b50356001600160a01b0316610296565b604080516001600160a01b039092168252519081900360200190f35b3480156100db57600080fd5b506100e4610328565b005b3480156100f257600080fd5b506100e46004803603604081101561010957600080fd5b506001600160a01b03813581169160200135166103ca565b34801561012d57600080fd5b506100b3610496565b6100e46004803603606081101561014c57600080fd5b6001600160a01b03823581169260208101359091169181019060608101604082013564010000000081111561018057600080fd5b82018360208201111561019257600080fd5b803590602001918460018302840111640100000000831117156101b457600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506104a5945050505050565b34801561020157600080fd5b506100e46004803603604081101561021857600080fd5b506001600160a01b03813581169160200135166105dd565b34801561023c57600080fd5b506100e46004803603602081101561025357600080fd5b50356001600160a01b031661068d565b34801561026f57600080fd5b506100b36004803603602081101561028657600080fd5b50356001600160a01b0316610785565b6000806060836001600160a01b03166040518080635c60da1b60e01b8152506004019050600060405180830381855afa9150503d80600081146102f5576040519150601f19603f3d011682016040523d82523d6000602084013e6102fa565b606091505b50915091508161030957600080fd5b80806020019051602081101561031e57600080fd5b5051949350505050565b6103306107e4565b6000546001600160a01b03908116911614610380576040805162461bcd60e51b8152602060048201819052602482015260008051602061080f833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6103d26107e4565b6000546001600160a01b03908116911614610422576040805162461bcd60e51b8152602060048201819052602482015260008051602061080f833981519152604482015290519081900360640190fd5b816001600160a01b0316638f283970826040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050600060405180830381600087803b15801561047a57600080fd5b505af115801561048e573d6000803e3d6000fd5b505050505050565b6000546001600160a01b031690565b6104ad6107e4565b6000546001600160a01b039081169116146104fd576040805162461bcd60e51b8152602060048201819052602482015260008051602061080f833981519152604482015290519081900360640190fd5b826001600160a01b0316634f1ef2863484846040518463ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561057357818101518382015260200161055b565b50505050905090810190601f1680156105a05780820380516001836020036101000a031916815260200191505b5093505050506000604051808303818588803b1580156105bf57600080fd5b505af11580156105d3573d6000803e3d6000fd5b5050505050505050565b6105e56107e4565b6000546001600160a01b03908116911614610635576040805162461bcd60e51b8152602060048201819052602482015260008051602061080f833981519152604482015290519081900360640190fd5b816001600160a01b0316633659cfe6826040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050600060405180830381600087803b15801561047a57600080fd5b6106956107e4565b6000546001600160a01b039081169116146106e5576040805162461bcd60e51b8152602060048201819052602482015260008051602061080f833981519152604482015290519081900360640190fd5b6001600160a01b03811661072a5760405162461bcd60e51b81526004018080602001828103825260268152602001806107e96026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000806060836001600160a01b031660405180806303e1469160e61b8152506004019050600060405180830381855afa9150503d80600081146102f5576040519150601f19603f3d011682016040523d82523d6000602084013e6102fa565b339056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a26469706673582212201d968ac32bef5562c6b4f1bd5d2f2a74c14d07ce008ca6fdc5a3bd0f5fc265f564736f6c63430006080033", + "nonce": "0", + "storage": { + "0x0": "0x907cd0881E50d359bb9Fd120B1A5A143b1C97De6" + } + }, + "0xD3002000000000000000000000000000000000D3": { + "balance": "0", + "code": "0x60806040526004361061004e5760003560e01c80633659cfe6146100655780634f1ef286146100985780635c60da1b146101185780638f28397014610149578063f851a4401461017c5761005d565b3661005d5761005b610191565b005b61005b610191565b34801561007157600080fd5b5061005b6004803603602081101561008857600080fd5b50356001600160a01b03166101ab565b61005b600480360360408110156100ae57600080fd5b6001600160a01b0382351691908101906040810160208201356401000000008111156100d957600080fd5b8201836020820111156100eb57600080fd5b8035906020019184600183028401116401000000008311171561010d57600080fd5b5090925090506101e5565b34801561012457600080fd5b5061012d610292565b604080516001600160a01b039092168252519081900360200190f35b34801561015557600080fd5b5061005b6004803603602081101561016c57600080fd5b50356001600160a01b03166102cf565b34801561018857600080fd5b5061012d610389565b6101996103ba565b6101a96101a461041a565b61043f565b565b6101b3610463565b6001600160a01b0316336001600160a01b031614156101da576101d581610488565b6101e2565b6101e2610191565b50565b6101ed610463565b6001600160a01b0316336001600160a01b031614156102855761020f83610488565b6000836001600160a01b031683836040518083838082843760405192019450600093509091505080830381855af49150503d806000811461026c576040519150601f19603f3d011682016040523d82523d6000602084013e610271565b606091505b505090508061027f57600080fd5b5061028d565b61028d610191565b505050565b600061029c610463565b6001600160a01b0316336001600160a01b031614156102c4576102bd61041a565b90506102cc565b6102cc610191565b90565b6102d7610463565b6001600160a01b0316336001600160a01b031614156101da576001600160a01b0381166103355760405162461bcd60e51b81526004018080602001828103825260368152602001806105876036913960400191505060405180910390fd5b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f61035e610463565b604080516001600160a01b03928316815291841660208301528051918290030190a16101d5816104c8565b6000610393610463565b6001600160a01b0316336001600160a01b031614156102c4576102bd610463565b3b151590565b6103c2610463565b6001600160a01b0316336001600160a01b031614156104125760405162461bcd60e51b81526004018080602001828103825260328152602001806105556032913960400191505060405180910390fd5b6101a96101a9565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b3660008037600080366000845af43d6000803e80801561045e573d6000f35b3d6000fd5b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b610491816104ec565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610355565b6104f5816103b4565b6105305760405162461bcd60e51b815260040180806020018281038252603b8152602001806105bd603b913960400191505060405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5556fe43616e6e6f742063616c6c2066616c6c6261636b2066756e6374696f6e2066726f6d207468652070726f78792061646d696e43616e6e6f74206368616e6765207468652061646d696e206f6620612070726f787920746f20746865207a65726f206164647265737343616e6e6f742073657420612070726f787920696d706c656d656e746174696f6e20746f2061206e6f6e2d636f6e74726163742061646472657373a26469706673582212206e221e2a3547bd97244b05ed46430b1b078ba097cb2a4e25ec3d79cf9ac9f02c64736f6c63430006080033", + "nonce": "0", + "storage": { + "0x0": "1000000", + "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0xD3003000000000000000000000000000000000D3", + "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "0xD3001000000000000000000000000000000000D3" + } + }, + "0xD3003000000000000000000000000000000000D3": { + "balance": "0", + "code": "0x608060405234801561001057600080fd5b50600436106100b45760003560e01c806379210e8e1161007157806379210e8e1461017757806381a8235a146101a757806385aeeb17146101c35780639a9a5593146101f3578063a99100541461020f578063b57321221461022b576100b4565b806307c6e7d3146100b9578063122f4fba146100d55780631c6ec7a9146101055780631cfe4e3b14610121578063373dedb41461013d57806361e46db51461015b575b600080fd5b6100d360048036036100ce9190810190613e94565b61025b565b005b6100ef60048036036100ea9190810190613e94565b610862565b6040516100fc9190614b38565b60405180910390f35b61011f600480360361011a9190810190613e94565b610ba1565b005b61013b60048036036101369190810190613e58565b610fce565b005b6101456111ec565b6040516101529190614eb3565b60405180910390f35b61017560048036036101709190810190613f29565b6111f6565b005b610191600480360361018c9190810190613fa8565b611456565b60405161019e9190614af9565b60405180910390f35b6101c160048036036101bc9190810190613e94565b611756565b005b6101dd60048036036101d89190810190613e94565b6118fb565b6040516101ea9190614b16565b60405180910390f35b61020d60048036036102089190810190613ed5565b611bfa565b005b61022960048036036102249190810190613e94565b612195565b005b61024560048036036102409190810190613e94565b612849565b6040516102529190614eb3565b60405180910390f35b6000339050606061026b83612ac9565b90506000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b825181101561037c576000826001018460018403815181106102d557fe5b60200260200101516040516102ea9190614aa1565b90815260200160405180910390205411610339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161033090614cb3565b60405180910390fd5b8160020183600183038151811061034c57fe5b60200260200101516040516103619190614aa1565b908152602001604051809103902091508060010190506102b7565b506060600183511161038e57846103a7565b8260018451038151811061039e57fe5b60200260200101515b9050600082600101826040516103bd9190614ab8565b9081526020016040518091039020541161040c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161040390614cb3565b60405180910390fd5b600082600201826040516104209190614ab8565b90815260200160405180910390206000018054905014610475576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161046c90614d33565b60405180910390fd5b60006104818587612cc9565b9050806104c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ba90614c53565b60405180910390fd5b6104cb613a4f565b836000016001856000018054905003815481106104e457fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156105965780601f1061056b57610100808354040283529160200191610596565b820191906000526020600020905b81548152906001019060200180831161057957829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff1660028111156105e257fe5b60028111156105ed57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561066557602002820191906000526020600020906000905b82829054906101000a900460ff1615158152602001906001019060208260000104928301926001038202915080841161062f5790505b50505050508152505090508084600001600186600101866040516106899190614ab8565b90815260200160405180910390205403815481106106a357fe5b906000526020600020906005020160008201518160000190805190602001906106cd929190613a8b565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561071c57fe5b0217905550608082015181600401908051906020019061073d929190613b0b565b5090505083600101836040516107539190614ab8565b9081526020016040518091039020548460010182600001516040516107789190614aa1565b9081526020016040518091039020819055506000846001018460405161079e9190614ab8565b908152602001604051809103902081905550836000018054806107bd57fe5b6001900381819060005260206000209060050201600080820160006107e29190613bb1565b6001820160006101000a81549060ff021916905560028201600090556003820160006101000a81549060ff02191690556004820160006108229190613bf9565b5050905583600201836040516108389190614ab8565b9081526020016040518091039020600080820160006108579190613c21565b505050505050505050565b600080606061087084612d2d565b91509150606061087f82612ac9565b90506000600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015610964576000826001018460018403815181106108e957fe5b60200260200101516040516108fe9190614aa1565b908152602001604051809103902054141561092157600095505050505050610b9c565b8160020183600183038151811061093457fe5b60200260200101516040516109499190614aa1565b908152602001604051809103902091508060010190506108cb565b5060606001835111610976578361098f565b8260018451038151811061098657fe5b60200260200101515b9050600082600101826040516109a59190614ab8565b90815260200160405180910390205414156109c857600095505050505050610b9c565b6109d0613a4f565b82600001600184600101846040516109e89190614ab8565b9081526020016040518091039020540381548110610a0257fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610ab45780601f10610a8957610100808354040283529160200191610ab4565b820191906000526020600020905b815481529060010190602001808311610a9757829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115610b0057fe5b6002811115610b0b57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015610b8357602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411610b4d5790505b5050505050815250509050806060015196505050505050505b919050565b600360009054906101000a900460ff16610be457612000600481905550621000006005819055506001600360006101000a81548160ff0219169083151502179055505b6000815111610c28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1f90614cb3565b60405180910390fd5b60003390506060610c3883612ac9565b90506000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015610d4957600082600101846001840381518110610ca257fe5b6020026020010151604051610cb79190614aa1565b90815260200160405180910390205411610d06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cfd90614cb3565b60405180910390fd5b81600201836001830381518110610d1957fe5b6020026020010151604051610d2e9190614aa1565b90815260200160405180910390209150806001019050610c84565b50600454816000018054905010610d95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8c90614dd3565b60405180910390fd5b60606001835111610da65784610dbf565b82600184510381518110610db657fe5b60200260200101515b905060008260010182604051610dd59190614ab8565b90815260200160405180910390205414610e24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1b90614e13565b60405180910390fd5b610e2d816130af565b610e6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6390614cd3565b60405180910390fd5b6000610e788587613190565b905080610eba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb190614b73565b60405180910390fd5b610ec2613a4f565b8281600001819052506000816020019015159081151581525050836000018190806001815401808255809150506001900390600052602060002090600502016000909190919091506000820151816000019080519060200190610f26929190613a8b565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff02191690836002811115610f7557fe5b02179055506080820151816004019080519060200190610f96929190613b0b565b50505083600001805490508460010184604051610fb39190614ab8565b90815260200160405180910390208190555050505050505050565b610fd66131f4565b73ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16148061103b57503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614155b61107a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107190614c33565b60405180910390fd5b80600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411156110fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f390614d13565b60405180910390fd5b60025460095482011115611145576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113c90614b93565b60405180910390fd5b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460096000828254039250508190555080600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550806009600082825401925050819055505050565b6000600254905090565b60003390506000611207828661328d565b90506001600281111561121657fe5b8160030160009054906101000a900460ff16600281111561123357fe5b14611273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126a90614df3565b60405180910390fd5b6000600554858161128057fe5b061480156112915750806002015484105b6112d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c790614b53565b60405180910390fd5b600554848260020154031080156112ed5750838160020154038351145b806112fa57506005548351145b611339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133090614bf3565b60405180910390fd5b6000151581600401600554868161134c57fe5b048154811061135757fe5b90600052602060002090602091828204019190069054906101000a900460ff161515146113b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b090614bd3565b60405180910390fd5b60006113c78387878761348c565b905080611409576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140090614cf3565b60405180910390fd5b600182600401600554878161141a57fe5b048154811061142557fe5b90600052602060002090602091828204019190066101000a81548160ff021916908315150217905550505050505050565b61145e613c45565b6000606061146b86612d2d565b91509150611477613a4f565b611481838361328d565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156115255780601f106114fa57610100808354040283529160200191611525565b820191906000526020600020905b81548152906001019060200180831161150857829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561157157fe5b600281111561157c57fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156115f457602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116115be5790505b505050505081525050905060028081111561160b57fe5b8160600151600281111561161b57fe5b1461165b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165290614e93565b60405180910390fd5b600554851115801561166d5750600085115b6116ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a390614bf3565b60405180910390fd5b806040015185870111156116f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ec90614b53565b60405180910390fd5b60006117038484898961353d565b80965081925050508061174b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174290614d73565b60405180910390fd5b505050509392505050565b60003390506000611767828461328d565b90506001600281111561177657fe5b8160030160009054906101000a900460ff16600281111561179357fe5b146117d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ca90614df3565b60405180910390fd5b60006001905060008260040180549050905060008090505b8181101561183e576000151584600401828154811061180657fe5b90600052602060002090602091828204019190069054906101000a900460ff161515141561183357600092505b8060010190506117eb565b508161187f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187690614d53565b60405180910390fd5b60028360030160006101000a81548160ff021916908360028111156118a057fe5b021790555060006118b185876135d0565b9050806118f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ea90614bb3565b60405180910390fd5b505050505050565b60606000606061190a84612d2d565b91509150606061191982612ac9565b90506000600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008090505b8251811015611a235760008260010184838151811061197f57fe5b60200260200101516040516119949190614aa1565b908152602001604051809103902054116119e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119da90614cb3565b60405180910390fd5b816002018382815181106119f357fe5b6020026020010151604051611a089190614aa1565b90815260200160405180910390209150806001019050611964565b5080600001805480602002602001604051908101604052809291908181526020016000905b82821015611beb57838290600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611b045780601f10611ad957610100808354040283529160200191611b04565b820191906000526020600020905b815481529060010190602001808311611ae757829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115611b5057fe5b6002811115611b5b57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015611bd357602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411611b9d5790505b50505050508152505081526020019060010190611a48565b50505050945050505050919050565b600360009054906101000a900460ff16611c3d57612000600481905550621000006005819055506001600360006101000a81548160ff0219169083151502179055505b60003390506305f5e100821115611c89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8090614db3565b60405180910390fd5b600660008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205483011115611d4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4390614e33565b60405180910390fd5b6060611d5784612ac9565b90506000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015611e6857600082600101846001840381518110611dc157fe5b6020026020010151604051611dd69190614aa1565b90815260200160405180910390205411611e25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1c90614cb3565b60405180910390fd5b81600201836001830381518110611e3857fe5b6020026020010151604051611e4d9190614aa1565b90815260200160405180910390209150806001019050611da3565b50600454816000018054905010611eb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eab90614dd3565b60405180910390fd5b60606001835111611ec55785611ede565b82600184510381518110611ed557fe5b60200260200101515b905060008260010182604051611ef49190614ab8565b90815260200160405180910390205414611f43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3a90614e13565b60405180910390fd5b611f4c816130af565b611f8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8290614d93565b60405180910390fd5b6000611f98858888613634565b905080611fda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd190614e73565b60405180910390fd5b6060600554600160055489010381611fee57fe5b0460405190808252806020026020018201604052801561201d5781602001602082028038833980820191505090505b509050836000016040518060a001604052808581526020016001151581526020018981526020016001600281111561205157fe5b8152602001838152509080600181540180825580915050600190039060005260206000209060050201600090919091909150600082015181600001908051906020019061209f929190613a8b565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff021916908360028111156120ee57fe5b0217905550608082015181600401908051906020019061210f929190613b0b565b5050508360000180549050846001018460405161212c9190614ab8565b90815260200160405180910390208190555086600760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505050505050505050565b60003390506121a2613a4f565b6121ac828461328d565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156122505780601f1061222557610100808354040283529160200191612250565b820191906000526020600020905b81548152906001019060200180831161223357829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561229c57fe5b60028111156122a757fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561231f57602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116122e95790505b50505050508152505090506000600281111561233757fe5b8160600151600281111561234757fe5b1415612388576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161237f90614c13565b60405180910390fd5b600061239483856136a1565b9050806123d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123cd90614c73565b60405180910390fd5b60606123e185612ac9565b90506000600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015612479578160020183600183038151811061244957fe5b602002602001015160405161245e9190614aa1565b9081526020016040518091039020915080600101905061242d565b50600060018260010186600001516040516124949190614aa1565b9081526020016040518091039020540390506124ae613a4f565b826000016001846000018054905003815481106124c757fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156125795780601f1061254e57610100808354040283529160200191612579565b820191906000526020600020905b81548152906001019060200180831161255c57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff1660028111156125c557fe5b60028111156125d057fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561264857602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116126125790505b50505050508152505090508083600001838154811061266357fe5b9060005260206000209060050201600082015181600001908051906020019061268d929190613a8b565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff021916908360028111156126dc57fe5b021790555060808201518160040190805190602001906126fd929190613b0b565b509050508260000180548061270e57fe5b6001900381819060005260206000209060050201600080820160006127339190613bb1565b6001820160006101000a81549060ff021916905560028201600090556003820160006101000a81549060ff02191690556004820160006127739190613bf9565b5050905582600101866000015160405161278d9190614aa1565b9081526020016040518091039020548360010182600001516040516127b29190614aa1565b90815260200160405180910390208190555060008360010187600001516040516127dc9190614aa1565b9081526020016040518091039020819055508560400151600760008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505050505050505050565b600080606061285784612d2d565b91509150612863613a4f565b61286d838361328d565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156129115780601f106128e657610100808354040283529160200191612911565b820191906000526020600020905b8154815290600101906020018083116128f457829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561295d57fe5b600281111561296857fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156129e057602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116129aa5790505b5050505050815250509050600160028111156129f857fe5b81606001516002811115612a0857fe5b1480612a2d5750600280811115612a1b57fe5b81606001516002811115612a2b57fe5b145b612a6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a6390614df3565b60405180910390fd5b6000612a788484613705565b809650819250505080612ac0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ab790614e53565b60405180910390fd5b50505050919050565b6060612ad3613c6a565b612adc8361376e565b9050612ae6613c6a565b612b246040518060400160405280600181526020017f2f0000000000000000000000000000000000000000000000000000000000000081525061376e565b905060606001612b3d838561379c90919063ffffffff16565b01604051908082528060200260200182016040528015612b7157816020015b6060815260200190600190039081612b5c5790505b50905060008090505b8151811015612bc257612b9e612b99848661381190919063ffffffff16565b61382b565b828281518110612baa57fe5b60200260200101819052508080600101915050612b7a565b50600081600183510381518110612bd557fe5b6020026020010151511415612c405780600182510381518110612bf457fe5b6020026020010160608152506001815103604051908082528060200260200182016040528015612c3857816020015b6060815260200190600190039081612c235790505b509350612c79565b8051604051908082528060200260200182016040528015612c7557816020015b6060815260200190600190039081612c605790505b5093505b60008090505b8451811015612cc057818181518110612c9457fe5b6020026020010151858281518110612ca857fe5b60200260200101819052508080600101915050612c7f565b50505050919050565b60008060016020601f85510181612cdc57fe5b040190506040518481526020810160005b83811015612d0e578060200286015181602002830152806001019050612ced565b50602082602085026040018460006010600019f1935050505092915050565b6000606060006028905080845111612d7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d7190614c93565b60405180910390fd5b6060816040519080825280601f01601f191660200182016040528015612daf5781602001600182028038833980820191505090505b50905060008090505b82811015612e1f57858181518110612dcc57fe5b602001015160f81c60f81b828281518110612de357fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050612db8565b50600080905060008090505b83811015612f4e576000838281518110612e4157fe5b602001015160f81c60f81b60f81c60ff16905060308110158015612e66575060398111155b80612e7f575060418110158015612e7e5750605a8111155b5b80612e98575060618110158015612e97575060668111155b5b612ed7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ece90614c93565b60405180910390fd5b60308110158015612ee9575060398111155b15612efa5760308103601084020192505b60418110158015612f0c5750605a8111155b15612f1d5760378103601084020192505b60618110158015612f2f575060668111155b15612f405760578103601084020192505b508080600101915050612e2b565b508094507f2f00000000000000000000000000000000000000000000000000000000000000868481518110612f7f57fe5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612fec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fe390614c93565b60405180910390fd5b6000600184885103039050806040519080825280601f01601f19166020018201604052801561302a5781602001600182028038833980820191505090505b50945060008090505b818110156130a5576000886001878401018151811061304e57fe5b602001015160f81c60f81b90508087838151811061306857fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350508080600101915050613033565b5050505050915091565b60006040516020016130c090614ae4565b60405160208183030381529060405280519060200120826040516020016130e79190614ab8565b604051602081830303815290604052805190602001201480613152575060405160200161311390614acf565b604051602081830303815290604052805190602001208260405160200161313a9190614ab8565b60405160208183030381529060405280519060200120145b8061315e575060008251145b1561316c576000905061318b565b60008251905060ff81111561318557600091505061318b565b60019150505b919050565b60008060016020601f855101816131a357fe5b040190506040518481526020810160005b838110156131d55780602002860151816020028301528060010190506131b4565b5060208260208502604001846000600f600019f1935050505092915050565b600073d2001000000000000000000000000000000000d273ffffffffffffffffffffffffffffffffffffffff166383e781fe6040518163ffffffff1660e01b815260040160206040518083038186803b15801561325057600080fd5b505afa158015613264573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506132889190810190613e2f565b905090565b6000606061329a83612ac9565b90506000600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b82518110156133ab5760008260010184600184038151811061330457fe5b60200260200101516040516133199190614aa1565b90815260200160405180910390205411613368576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161335f90614cb3565b60405180910390fd5b8160020183600183038151811061337b57fe5b60200260200101516040516133909190614aa1565b908152602001604051809103902091508060010190506132e6565b50606060018351116133bd57846133d6565b826001845103815181106133cd57fe5b60200260200101515b9050600082600101826040516133ec9190614ab8565b9081526020016040518091039020541161343b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161343290614cb3565b60405180910390fd5b600082600001600184600101846040516134559190614ab8565b908152602001604051809103902054038154811061346f57fe5b906000526020600020906005020190508094505050505092915050565b60008060016020601f8551018161349f57fe5b04019050600060016020601f885101816134b557fe5b040190506040518781526020810160005b838110156134e75780602002890151816020028301528060010190506134c6565b50868360200282015260005b8481101561351957806020028701518185600101016020028301528060010190506134f3565b50602082848601602002606001846000600c600019f1945050505050949350505050565b6000613547613c45565b600060016020601f8851018161355957fe5b0401905060006020601f86018161356c57fe5b0490506040518881526020810160005b8481101561359d57806020028a01518160200283015280600101905061357c565b5083602002810188815287816020015283602002868660030160200285600a600019fa9650505050505094509492505050565b60008060016020601f855101816135e357fe5b040190506040518481526020810160005b838110156136155780602002860151816020028301528060010190506135f4565b50602082602085026040018460006011600019f1935050505092915050565b60008060016020601f8651018161364757fe5b040190506040518581526020810160005b83811015613679578060200287015181602002830152806001019050613658565b50846020840282015260208260208502604001846000600b600019f193505050509392505050565b60008060016020601f855101816136b457fe5b040190506040518481526020810160005b838110156136e65780602002860151816020028301528060010190506136c5565b5060208260208502604001846000600e600019f1935050505092915050565b600080600060016020601f8651018161371a57fe5b040190506040518581526020810160005b8381101561374c57806020028701518160200283015280600101905061372b565b506020826020850260200184600d600019fa9450815193505050509250929050565b613776613c6a565b600060208301905060405180604001604052808451815260200182815250915050919050565b60008082600001516137c0856000015186602001518660000151876020015161388d565b0190505b8360000151846020015101811161380a578180600101925050826000015161380285602001518303866000015103838660000151876020015161388d565b0190506137c4565b5092915050565b613819613c6a565b613824838383613968565b5092915050565b60608082600001516040519080825280601f01601f1916602001820160405280156138655781602001600182028038833980820191505090505b50905060006020820190506138838185602001518660000151613a06565b8192505050919050565b6000808490506000868511613958576020851161391257600060018660200360080260020a031960001b905060008186511690506000878a8a0103905060008386511690505b828114613904578186106138f1578a8a019650505050505050613960565b85806001019650508386511690506138d3565b859650505050505050613960565b60008585209050600091505b85880382116139565760008684209050808214156139425783945050505050613960565b60018401935050818060010192505061391e565b505b868601925050505b949350505050565b613970613c6a565b600061398e856000015186602001518660000151876020015161388d565b905084602001518360200181815250508460200151810383600001818152505084600001518560200151018114156139d05760008560000181815250506139fb565b8360000151836000015101856000018181510391508181525050836000015181018560200181815250505b829150509392505050565b5b60208110613a2a5781518352602083019250602082019150602081039050613a07565b60006001826020036101000a0390508019835116818551168181178652505050505050565b6040518060a00160405280606081526020016000151581526020016000815260200160006002811115613a7e57fe5b8152602001606081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613acc57805160ff1916838001178555613afa565b82800160010185558215613afa579182015b82811115613af9578251825591602001919060010190613ade565b5b509050613b079190613c84565b5090565b82805482825590600052602060002090601f01602090048101928215613ba05791602002820160005b83821115613b7157835183826101000a81548160ff0219169083151502179055509260200192600101602081600001049283019260010302613b34565b8015613b9e5782816101000a81549060ff0219169055600101602081600001049283019260010302613b71565b505b509050613bad9190613ca9565b5090565b50805460018160011615610100020316600290046000825580601f10613bd75750613bf6565b601f016020900490600052602060002090810190613bf59190613c84565b5b50565b50805460008255601f016020900490600052602060002090810190613c1e9190613c84565b50565b5080546000825560050290600052602060002090810190613c429190613cd9565b50565b6040518062100000016040528061800090602082028038833980820191505090505090565b604051806040016040528060008152602001600081525090565b613ca691905b80821115613ca2576000816000905550600101613c8a565b5090565b90565b613cd691905b80821115613cd257600081816101000a81549060ff021916905550600101613caf565b5090565b90565b613d4591905b80821115613d415760008082016000613cf89190613bb1565b6001820160006101000a81549060ff021916905560028201600090556003820160006101000a81549060ff0219169055600482016000613d389190613bf9565b50600501613cdf565b5090565b90565b600081359050613d578161510d565b92915050565b600081519050613d6c8161510d565b92915050565b600082601f830112613d8357600080fd5b8135613d96613d9182614efb565b614ece565b91508082526020830160208301858383011115613db257600080fd5b613dbd8382846150ad565b50505092915050565b600082601f830112613dd757600080fd5b8135613dea613de582614f27565b614ece565b91508082526020830160208301858383011115613e0657600080fd5b613e118382846150ad565b50505092915050565b600081359050613e2981615124565b92915050565b600060208284031215613e4157600080fd5b6000613e4f84828501613d5d565b91505092915050565b60008060408385031215613e6b57600080fd5b6000613e7985828601613d48565b9250506020613e8a85828601613e1a565b9150509250929050565b600060208284031215613ea657600080fd5b600082013567ffffffffffffffff811115613ec057600080fd5b613ecc84828501613dc6565b91505092915050565b60008060408385031215613ee857600080fd5b600083013567ffffffffffffffff811115613f0257600080fd5b613f0e85828601613dc6565b9250506020613f1f85828601613e1a565b9150509250929050565b600080600060608486031215613f3e57600080fd5b600084013567ffffffffffffffff811115613f5857600080fd5b613f6486828701613dc6565b9350506020613f7586828701613e1a565b925050604084013567ffffffffffffffff811115613f9257600080fd5b613f9e86828701613d72565b9150509250925092565b600080600060608486031215613fbd57600080fd5b600084013567ffffffffffffffff811115613fd757600080fd5b613fe386828701613dc6565b9350506020613ff486828701613e1a565b925050604061400586828701613e1a565b9150509250925092565b600061401b838361417d565b60208301905092915050565b6000614033838361418c565b60208301905092915050565b600061404b8383614a06565b905092915050565b600061405e82614f7d565b6140688185614fdc565b935061407383614f53565b8060005b838110156140a457815161408b888261400f565b975061409683614fb5565b925050600181019050614077565b5085935050505092915050565b6140ba81614f88565b6140c48184614fed565b92506140cf82614f63565b8060005b838110156141005781516140e78782614027565b96506140f283614fc2565b9250506001810190506140d3565b505050505050565b600061411382614f94565b61411d8185614ff8565b93508360208202850161412f85614f6d565b8060005b8581101561416b578484038952815161414c858261403f565b945061415783614fcf565b925060208a01995050600181019050614133565b50829750879550505050505092915050565b61418681615048565b82525050565b61419581615054565b82525050565b6141a48161509b565b82525050565b6141b38161509b565b82525050565b60006141c482614faa565b6141ce818561502b565b93506141de8185602086016150bc565b80840191505092915050565b60006141f582614f9f565b6141ff8185615009565b935061420f8185602086016150bc565b614218816150ef565b840191505092915050565b600061422e82614f9f565b614238818561502b565b93506142488185602086016150bc565b80840191505092915050565b600061426160188361501a565b91507f496e636f7272656374206368756e6b20706f736974696f6e00000000000000006000830152602082019050919050565b60006142a160158361501a565b91507f4469726563746f7279206e6f74206372656174656400000000000000000000006000830152602082019050919050565b60006142e160248361501a565b91507f4e6f7420656e6f756768206d656d6f727920696e207468652046696c6573746f60008301527f72616765000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614347601b8361501a565b91507f48617368206861736e2774206265656e2063616c63756c6174656400000000006000830152602082019050919050565b600061438760198361501a565b91507f4368756e6b20697320616c72656164792075706c6f61646564000000000000006000830152602082019050919050565b60006143c760168361501a565b91507f496e636f7272656374206368756e6b206c656e677468000000000000000000006000830152602082019050919050565b6000614407600f8361501a565b91507f46696c65206e6f742065786973747300000000000000000000000000000000006000830152602082019050919050565b6000614447600e8361501a565b91507f496e76616c69642073656e6465720000000000000000000000000000000000006000830152602082019050919050565b600061448760188361501a565b91507f4469726563746f7279206973206e6f742064656c6574656400000000000000006000830152602082019050919050565b60006144c760108361501a565b91507f46696c65206e6f742064656c65746564000000000000000000000000000000006000830152602082019050919050565b600061450760138361501a565b91507f496e76616c69642073746f7261676550617468000000000000000000000000006000830152602082019050919050565b6000614547600c8361501a565b91507f496e76616c6964207061746800000000000000000000000000000000000000006000830152602082019050919050565b600061458760018361502b565b91507f2e000000000000000000000000000000000000000000000000000000000000006000830152600182019050919050565b60006145c760168361501a565b91507f496e76616c6964206469726563746f7279206e616d65000000000000000000006000830152602082019050919050565b600061460760158361501a565b91507f4368756e6b207761736e27742075706c6f6164656400000000000000000000006000830152602082019050919050565b600061464760268361501a565b91507f436f756c64206e6f742072657365727665206c657373207468616e207573656460008301527f20737061636500000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006146ad60168361501a565b91507f4469726563746f7279206973206e6f7420656d707479000000000000000000006000830152602082019050919050565b60006146ed60238361501a565b91507f46696c65206861736e2774206265656e2075706c6f6164656420636f7272656360008301527f746c7900000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061475360118361501a565b91507f4368756e6b207761736e277420726561640000000000000000000000000000006000830152602082019050919050565b600061479360188361501a565b91507f46696c656e616d652073686f756c64206265203c2032353600000000000000006000830152602082019050919050565b60006147d3601f8361501a565b91507f46696c652073686f756c64206265206c657373207468616e20313030204d42006000830152602082019050919050565b600061481360028361502b565b91507f2e2e0000000000000000000000000000000000000000000000000000000000006000830152600282019050919050565b600061485360118361501a565b91507f4469726563746f72792069732066756c6c0000000000000000000000000000006000830152602082019050919050565b6000614893600e8361501a565b91507f46696c65206e6f7420666f756e640000000000000000000000000000000000006000830152602082019050919050565b60006148d360188361501a565b91507f46696c65206f72206469726563746f72792065786973747300000000000000006000830152602082019050919050565b600061491360198361501a565b91507f4e6f7420656e6f756768207265736572766564207370616365000000000000006000830152602082019050919050565b600061495360188361501a565b91507f45564d206572726f7220696e2067657446696c6553697a6500000000000000006000830152602082019050919050565b600061499360108361501a565b91507f46696c65206e6f742063726561746564000000000000000000000000000000006000830152602082019050919050565b60006149d360198361501a565b91507f46696c65206861736e2774206265656e2075706c6f61646564000000000000006000830152602082019050919050565b600060a0830160008301518482036000860152614a2382826141ea565b9150506020830151614a38602086018261417d565b506040830151614a4b6040860182614a83565b506060830151614a5e606086018261419b565b5060808301518482036080860152614a768282614053565b9150508091505092915050565b614a8c81615091565b82525050565b614a9b81615091565b82525050565b6000614aad8284614223565b915081905092915050565b6000614ac482846141b9565b915081905092915050565b6000614ada8261457a565b9150819050919050565b6000614aef82614806565b9150819050919050565b60006210000082019050614b1060008301846140b1565b92915050565b60006020820190508181036000830152614b308184614108565b905092915050565b6000602082019050614b4d60008301846141aa565b92915050565b60006020820190508181036000830152614b6c81614254565b9050919050565b60006020820190508181036000830152614b8c81614294565b9050919050565b60006020820190508181036000830152614bac816142d4565b9050919050565b60006020820190508181036000830152614bcc8161433a565b9050919050565b60006020820190508181036000830152614bec8161437a565b9050919050565b60006020820190508181036000830152614c0c816143ba565b9050919050565b60006020820190508181036000830152614c2c816143fa565b9050919050565b60006020820190508181036000830152614c4c8161443a565b9050919050565b60006020820190508181036000830152614c6c8161447a565b9050919050565b60006020820190508181036000830152614c8c816144ba565b9050919050565b60006020820190508181036000830152614cac816144fa565b9050919050565b60006020820190508181036000830152614ccc8161453a565b9050919050565b60006020820190508181036000830152614cec816145ba565b9050919050565b60006020820190508181036000830152614d0c816145fa565b9050919050565b60006020820190508181036000830152614d2c8161463a565b9050919050565b60006020820190508181036000830152614d4c816146a0565b9050919050565b60006020820190508181036000830152614d6c816146e0565b9050919050565b60006020820190508181036000830152614d8c81614746565b9050919050565b60006020820190508181036000830152614dac81614786565b9050919050565b60006020820190508181036000830152614dcc816147c6565b9050919050565b60006020820190508181036000830152614dec81614846565b9050919050565b60006020820190508181036000830152614e0c81614886565b9050919050565b60006020820190508181036000830152614e2c816148c6565b9050919050565b60006020820190508181036000830152614e4c81614906565b9050919050565b60006020820190508181036000830152614e6c81614946565b9050919050565b60006020820190508181036000830152614e8c81614986565b9050919050565b60006020820190508181036000830152614eac816149c6565b9050919050565b6000602082019050614ec86000830184614a92565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614ef157600080fd5b8060405250919050565b600067ffffffffffffffff821115614f1257600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614f3e57600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050919050565b6000819050602082019050919050565b600081519050919050565b60006180009050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061504182615071565b9050919050565b60008115159050919050565b6000819050919050565b600081905061506c82615100565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006150a68261505e565b9050919050565b82818337600083830152505050565b60005b838110156150da5780820151818401526020810190506150bf565b838111156150e9576000848401525b50505050565b6000601f19601f8301169050919050565b6003811061510a57fe5b50565b61511681615036565b811461512157600080fd5b50565b61512d81615091565b811461513857600080fd5b5056fea2646970667358221220a549ad9e778ae8bb3048c0a1805e77745871cc1560637ae1c3ebccb76638d9c464736f6c63430006020033", + "nonce": "0", + "storage": {} + }, + "0xa096b05a489831db893fc53aacc7ed20efb36382": { + "balance": "1000000000000000000000000000000" + }, + "0xa1cd651d99283be60e2a9d2e3bc8a90aedb8244f": { + "balance": "1000000000000000000000000000000" + }, + "0xa2969e82619021ea407338f8bdf7c6f2bd679673": { + "balance": "1000000000000000000000000000000" + }, + "0xa3597b1162b6559cb5e966904b63e762ece756a4": { + "balance": "1000000000000000000000000000000" + }, + "0xa68f946090c600eda6f139783077ee802afeb990": { + "balance": "1000000000000000000000000000000" + }, + "0xa6d50055592cecb795bc1ed3b9ea57ed426b0b7c": { + "balance": "1000000000000000000000000000000" + }, + "0xa7c0789bdeee38c6b59111a789dfb6b815489847": { + "balance": "1000000000000000000000000000000" + }, + "0xa8c813ee806b4c8537ff5f16084d44db18ea9ab1": { + "balance": "1000000000000000000000000000000" + }, + "0xaa6a87bbb74bc1f3cb40c1efb7fc171ee6407560": { + "balance": "1000000000000000000000000000000" + }, + "0xabf920b89f5a2487fdb70be17fd01a99a0602e62": { + "balance": "1000000000000000000000000000000" + }, + "0xac5df92da5171ba24a9618018b4f79494040334b": { + "balance": "1000000000000000000000000000000" + }, + "0xaf97a8318a1a51d5daeeb9650024b63ee44f45bd": { + "balance": "1000000000000000000000000000000" + }, + "0xb28c45b98ae43a5e9ee5509c97ea037b5de5d6d9": { + "balance": "1000000000000000000000000000000" + }, + "0xb64989ab32b089da3da103b93e6781d6d5dd10b4": { + "balance": "1000000000000000000000000000000" + }, + "0xb67e6f4a21f93c250fa6ff0cb142bd14dd4ca8eb": { + "balance": "1000000000000000000000000000000" + }, + "0xb70603c505f85130b5b2e73cd82d196dfd7d8b5e": { + "balance": "1000000000000000000000000000000" + }, + "0xb942414cae2a1ab1056657b905845c0ab6b6280a": { + "balance": "1000000000000000000000000000000" + }, + "0xbee0e5c1961d51be9bd670876caa9c90ba7d9016": { + "balance": "1000000000000000000000000000000" + }, + "0xbf2d8cebdeeb8ad8fed7b2a75f35922106f8d75c": { + "balance": "1000000000000000000000000000000" + }, + "0xbf5aa678b969c0871e2fbcf09c3dbb5d5865ac1e": { + "balance": "1000000000000000000000000000000" + }, + "0xc12bcedd9bcad9120150122cd50f39576ecccc08": { + "balance": "1000000000000000000000000000000" + }, + "0xc2d3852f3292acb81bd164dbae5f1e2a87535150": { + "balance": "1000000000000000000000000000000" + }, + "0xc3820490201e94d76b44655d2df713fec29d9795": { + "balance": "1000000000000000000000000000000" + }, + "0xc58744e2eceefd45cc5469f0e0a708ad24ddbbdb": { + "balance": "1000000000000000000000000000000" + }, + "0xc7865200e8e51ba1c8d695f327deed432930f2cc": { + "balance": "1000000000000000000000000000000" + }, + "0xc8e4d709eb3eb335dc69c9fbf2d24d447cb86105": { + "balance": "1000000000000000000000000000000" + }, + "0xc98af661e44c5bf31d2f8bdff4bbf2808ed4e991": { + "balance": "1000000000000000000000000000000" + }, + "0xca4409573a5129a72edf85d6c51e26760fc9c903": { + "balance": "100000000000000000000000" + }, + "0xcc33e23b04b74f7ba8fbe315083182224af973fa": { + "balance": "1000000000000000000000000000000" + }, + "0xce1c62d0a77600fb2f959b4da76fcb9b3b9430a3": { + "balance": "1000000000000000000000000000000" + }, + "0xd1b6c947fb14060b38945584714491592e84875d": { + "balance": "1000000000000000000000000000000" + }, + "0xd23cd6a9ddcc3470300003621bbac1e06a7919d5": { + "balance": "1000000000000000000000000000000" + }, + "0xd2c5b39B4e735C17612Bb5a08FD024ccc5dBCb23": { + "balance": "100000000000000000000000" + }, + "0xd2cd302eb060e375a65d65946692a3ac2d838d35": { + "balance": "1000000000000000000000000000000" + }, + "0xd2e75c41ced8699e3176f6e335355701a2568b7b": { + "balance": "1000000000000000000000000000000" + }, + "0xd3d38f4cb0aeb4c7c2527ddaeec2ab3b910c8528": { + "balance": "1000000000000000000000000000000" + }, + "0xd5b561a27cca5049650a14ab93dbf1a20c0cefc1": { + "balance": "1000000000000000000000000000000" + }, + "0xd90045420b8abc37b3f9304ed2b385fc1b7fa8c5": { + "balance": "1000000000000000000000000000000" + }, + "0xd951bf4cff429062702a7d8699a5f0bf14845d9b": { + "balance": "1000000000000000000000000000000" + }, + "0xdc6a269c58e58a93a22b5df8cdf1af630c47481f": { + "balance": "1000000000000000000000000000000" + }, + "0xdc6d02ef4003a4f2d0ccff65ae1a2d8157fbb23e": { + "balance": "1000000000000000000000000000000" + }, + "0xde14aca36acc62c305a7ee571da37840a408e600": { + "balance": "1000000000000000000000000000000" + }, + "0xdee32ae508cf783f53ab8bc39d878fe323cdfae3": { + "balance": "1000000000000000000000000000000" + }, + "0xe083a100d51fc4f38aae4a3a68404c36ad96c612": { + "balance": "1000000000000000000000000000000" + }, + "0xe1607990ce800407e3c206e58de4917977181d4d": { + "balance": "1000000000000000000000000000000" + }, + "0xe25e5b63dfd4cf59b81eddf64f1195858634b8a6": { + "balance": "1000000000000000000000000000000" + }, + "0xe372377decb3bdc0c7f5272d38ce0ba2a54934fe": { + "balance": "1000000000000000000000000000000" + }, + "0xe3cc6ec63b5652d1594bc63bb293f4e80f76dbdd": { + "balance": "1000000000000000000000000000000" + }, + "0xe3da7c014286258944ab20a31e4d861b4c9262f1": { + "balance": "1000000000000000000000000000000" + }, + "0xe8b57f330d56081c856e618210fbedb414925ff0": { + "balance": "1000000000000000000000000000000" + }, + "0xe91ac72a568e752eb7c9f5235100586ce97c8cc1": { + "balance": "1000000000000000000000000000000" + }, + "0xf184c8c243a178c1748a0af45caedeca476105b4": { + "balance": "1000000000000000000000000000000" + }, + "0xf1a5912ff318aebf312cdb54c75642a9e632703c": { + "balance": "1000000000000000000000000000000" + }, + "0xf2197b153b4c9086fc5410431fbf7960d284c65e": { + "balance": "1000000000000000000000000000000" + }, + "0xf36620e71327f4a55d550d46e030ccf0c728f154": { + "balance": "1000000000000000000000000000000" + }, + "0xf9817fB82fc767aA9A4A97a1901676244b88ce0E": { + "balance": "100000000000000000000000" + }, + "0xfa723938fa8da1a8a2114ad409a11581761ee40d": { + "balance": "1000000000000000000000000000000" + }, + "0xfa7a8c69810eaf16a395d2a93b3ab51efeed2a1c": { + "balance": "1000000000000000000000000000000" + }, + "0xfaa1038074941571524934ba52d312e88b3577f5": { + "balance": "1000000000000000000000000000000" + }, + "0xfe14077c26a507496b7208384d459e21c49c4212": { + "balance": "1000000000000000000000000000000" + }, + "0xfe275c9b5ac792327da509b27eb9614196dfb07d": { + "balance": "1000000000000000000000000000000" + }, + "0xfe2c5aa110fff89361806ea7ee080bfffba0d3dd": { + "balance": "1000000000000000000000000000000" + }, + "0xfe3d4f1fc038f4f756ba44995129cd45c9e0e861": { + "balance": "1000000000000000000000000000000" + }, + "0xfee314cdc84ecfaa675e41b3559c0101e1eba6b8": { + "balance": "1000000000000000000000000000000" + } + }, + "genesis": { + "author": "0x0000000000000000000000000000000000000001", + "difficulty": "0x0", + "extraData": "0x11bbe8db4e347b4e8c937c1c8370e4b5ed33adb3db69cbdb7a38e1e50b1b82fa", + "gasLimit": "0xFFFFFFFFF", + "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000abc", + "nonce": "0x0000000000000042", + "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "timestamp": "0x00" + }, + "params": { + "EIP150ForkBlock": "0x00", + "EIP158ForkBlock": "0x00", + "accountStartNonce": "0x00", + "blockReward": "0x4563918244F40000", + "byzantiumForkBlock": "0x0", + "chainID": "0x12345", + "constantinopleForkBlock": "0x0", + "daoHardforkBlock": "0x0", + "difficultyBoundDivisor": "0x0800", + "durationLimit": "0x0d", + "externalGasDifficulty": "0x01", + "gasLimitBoundDivisor": "0x0400", + "homesteadForkBlock": "0x0", + "maxGasLimit": "0xFFFFFFFFF", + "maximumExtraDataSize": "0x20", + "minGasLimit": "0xFFFFFFFFF", + "minimumDifficulty": "0x0", + "networkID": "12313219", + "tieBreakingGas": false + }, + "sealEngine": "Ethash", + "skaleConfig": { + "nodeInfo": { + "basePort": 1231, + "bindIP": "0.0.0.0", + "collectionDuration": 10, + "collectionQueueSize": 2, + "db-path": "/tmp/test_eth_1_of_4", + "ecdsaKeyName": "", + "httpRpcPort": 1234, + "httpsRpcPort": 1239, + "logLevel": "info", + "logLevelProposal": "info", + "maxCacheSize": 2000, + "maxOpenLeveldbFiles": 25, + "minCacheSize": 1000, + "nodeID": 401, + "nodeName": "Node1", + "rotateAfterBlock": 0, + "testSignatures": true, + "transactionQueueSize": 10000, + "wsRpcPort": 1233, + "wssRpcPort": 1238 + }, + "sChain": { + "EIP1559TransactionsPatchTimestamp": 1, + "contractStorageLimit": 10000000000, + "contractStoragePatchTimestamp": 1, + "contractStorageZeroValuePatchTimestamp": 1, + "correctForkInPowPatchTimestamp": 1, + "emptyBlockIntervalMs": 10000, + "fastConsensusPatchTimestamp": 1, + "flexibleDeploymentPatchTimestamp": 1, + "levelDBReopenIntervalMs": 1, + "multiTransactionMode": false, + "nodes": [ + { + "basePort": 1231, + "ip": "127.0.0.1", + "nodeID": 401, + "publicKey": "", + "schainIndex": 1 + }, + { + "basePort": 1331, + "ip": "127.0.0.1", + "nodeID": 402, + "publicKey": "", + "schainIndex": 2 + }, + { + "basePort": 1431, + "ip": "127.0.0.1", + "nodeID": 403, + "publicKey": "", + "schainIndex": 3 + }, + { + "basePort": 1531, + "ip": "127.0.0.1", + "nodeID": 404, + "publicKey": "", + "schainIndex": 4 + } + ], + "powCheckPatchTimestamp": 1, + "precompiledConfigPatchTimestamp": 1, + "pushZeroPatchTimestamp": 1, + "revertableFSPatchTimestamp": 1, + "schainID": 5, + "schainName": "TestChain", + "schainOwner": "0x907cd0881E50d359bb9Fd120B1A5A143b1C97De6", + "skipInvalidTransactionsPatchTimestamp": 1, + "storageDestructionPatchTimestamp": 1, + "verifyBlsSyncPatchTimestamp": 1, + "verifyDaSigsPatchTimestamp": 1 + } + }, + "unddos": { + "origins": [ + { + "ban_lengthy": 0, + "ban_peak": 0, + "max_calls_per_minute": 1000000000, + "max_calls_per_second": 1000000000, + "max_ws_conn": 65535, + "origin": [ + "*" + ] + } + ] + } +} \ No newline at end of file diff --git a/test/historicstate/configs/test_2_of_16.json b/test/historicstate/configs/test_2_of_16.json new file mode 100644 index 000000000..e69da6e5f --- /dev/null +++ b/test/historicstate/configs/test_2_of_16.json @@ -0,0 +1,910 @@ +{ + "accounts": { + "0000000000000000000000000000000000000001": { + "precompiled": { + "linear": { + "base": 3000, + "word": 0 + }, + "name": "ecrecover" + } + }, + "0000000000000000000000000000000000000002": { + "precompiled": { + "linear": { + "base": 60, + "word": 12 + }, + "name": "sha256" + } + }, + "0000000000000000000000000000000000000003": { + "precompiled": { + "linear": { + "base": 600, + "word": 120 + }, + "name": "ripemd160" + } + }, + "0000000000000000000000000000000000000004": { + "precompiled": { + "linear": { + "base": 15, + "word": 3 + }, + "name": "identity" + } + }, + "0000000000000000000000000000000000000005": { + "precompiled": { + "name": "modexp", + "startingBlock": "0x2dc6c0" + } + }, + "0000000000000000000000000000000000000006": { + "precompiled": { + "linear": { + "base": 500, + "word": 0 + }, + "name": "alt_bn128_G1_add", + "startingBlock": "0x2dc6c0" + } + }, + "0000000000000000000000000000000000000007": { + "precompiled": { + "linear": { + "base": 40000, + "word": 0 + }, + "name": "alt_bn128_G1_mul", + "startingBlock": "0x2dc6c0" + } + }, + "0000000000000000000000000000000000000008": { + "precompiled": { + "name": "alt_bn128_pairing_product", + "startingBlock": "0x2dc6c0" + } + }, + "000000000000000000000000000000000000000A": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "readChunk", + "startingBlock": "0x0" + } + }, + "000000000000000000000000000000000000000B": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "createFile", + "restrictAccess": [ + "69362535ec535F0643cBf62D16aDeDCAf32Ee6F7" + ], + "startingBlock": "0x0" + } + }, + "000000000000000000000000000000000000000C": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "uploadChunk", + "startingBlock": "0x0" + } + }, + "000000000000000000000000000000000000000D": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "getFileSize", + "startingBlock": "0x0" + } + }, + "000000000000000000000000000000000000000E": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "deleteFile", + "startingBlock": "0x0" + } + }, + "000000000000000000000000000000000000000F": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "createDirectory", + "startingBlock": "0x0" + } + }, + "0000000000000000000000000000000000000010": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "deleteDirectory", + "startingBlock": "0x0" + } + }, + "0x006d8e49ce0b9eb5646e34a4d91934801b9044fd": { + "balance": "1000000000000000000000000000000" + }, + "0x0150b461b06922a5030784ba888962c28bb1f188": { + "balance": "1000000000000000000000000000000" + }, + "0x03309956988ae70152ae4469daf99b0cac2306c5": { + "balance": "1000000000000000000000000000000" + }, + "0x06104a85a380895b6dd4030113806df2b044905e": { + "balance": "1000000000000000000000000000000" + }, + "0x079cf317ef40b16141784b6fabff812d64f7c0fd": { + "balance": "1000000000000000000000000000000" + }, + "0x0966454f51166c68b73b2865473c8fb2fcdefdd5": { + "balance": "1000000000000000000000000000000" + }, + "0x099452fedc71897880f584b1bc1706efc4e76e36": { + "balance": "1000000000000000000000000000000" + }, + "0x0aa6a44690ef52354e976990292cf9c5cd36ad59": { + "balance": "1000000000000000000000000000000" + }, + "0x0fbbe17a0e5a61ee3e8661f442d7f6b177c49820": { + "balance": "1000000000000000000000000000000" + }, + "0x1239fe658b410dbbac5bbd572035f5041542f9e5": { + "balance": "1000000000000000000000000000000" + }, + "0x12d5d7340a93be7be28ea7a3ae198242f8e1282c": { + "balance": "1000000000000000000000000000000" + }, + "0x137048b9fa4f1234d6519271b2c5ec64f480db0f": { + "balance": "1000000000000000000000000000000" + }, + "0x13867af77a63048e17380e39248ada90521e97e4": { + "balance": "1000000000000000000000000000000" + }, + "0x138ea4bdf0382c2deffd5b0bff0afe59f471467f": { + "balance": "1000000000000000000000000000000" + }, + "0x13d19c55ee0a212249d26b9d741ff6d7f416db01": { + "balance": "1000000000000000000000000000000" + }, + "0x157d38b52196b248e9fe6a2172e32ce2b8c078e6": { + "balance": "1000000000000000000000000000000" + }, + "0x16e8c390f8e576161cfe966f2c3e5dd303eb9039": { + "balance": "1000000000000000000000000000000" + }, + "0x194cb9991d3d94c43e400becf21dfea45e7b3b4c": { + "balance": "1000000000000000000000000000000" + }, + "0x1C9abe4ff0CcECa40fc404c74AB7d4923fEF8901": { + "balance": "100000000000000000000000" + }, + "0x1a66fc89809112c20aa76a993db712fa9e003e4e": { + "balance": "1000000000000000000000000000000" + }, + "0x1f1d6041e12a18cf1202019f146f2fc150915e8d": { + "balance": "1000000000000000000000000000000" + }, + "0x1feaf1671c1f0faf0d44c152f72dc755db932569": { + "balance": "1000000000000000000000000000000" + }, + "0x236bf02dfafaf03851a4e6f5d69052f4884cec32": { + "balance": "1000000000000000000000000000000" + }, + "0x26d88f6a8b659be4165ee53774a057e41b5201c9": { + "balance": "1000000000000000000000000000000" + }, + "0x28353685b0b986a724b92113debb3d8cd9a6b263": { + "balance": "1000000000000000000000000000000" + }, + "0x29d83322219fdfb821459d5fdf796360faf3166a": { + "balance": "1000000000000000000000000000000" + }, + "0x2bee474be207bdbeac83d6672da5ed2fd417eac9": { + "balance": "1000000000000000000000000000000" + }, + "0x2d93455b07bccf38e8d019f7f43a2c2d70b46b4e": { + "balance": "1000000000000000000000000000000" + }, + "0x2f971bd38806c3ca45ae0a125d1267118bf5619c": { + "balance": "1000000000000000000000000000000" + }, + "0x30aaab366dfac8331f3e827495c789cde9b437c0": { + "balance": "1000000000000000000000000000000" + }, + "0x32ea0400dc2d20664cc4744b2fab04ecb709445c": { + "balance": "1000000000000000000000000000000" + }, + "0x3760dc9594ccac0f33ade5cc5371402131696341": { + "balance": "1000000000000000000000000000000" + }, + "0x38855e430611bc179cd777a8704679ffc43921de": { + "balance": "1000000000000000000000000000000" + }, + "0x3a921471a2397644c37c88ef9572c421ab37145d": { + "balance": "1000000000000000000000000000000" + }, + "0x3bcca8a8471d55a1a668bc163c0336e4a57e5c99": { + "balance": "1000000000000000000000000000000" + }, + "0x3d46ee560227c1d73cd6042b47fc8fddd8a06ecb": { + "balance": "1000000000000000000000000000000" + }, + "0x3f5bdf5d4c274c82b8d17aa2810b00d2cf050f24": { + "balance": "1000000000000000000000000000000" + }, + "0x3ffe1c9183e0f97f52a816405a7d2350624ec88b": { + "balance": "1000000000000000000000000000000" + }, + "0x426ec5f07847674aada3856609d8baaa16805d88": { + "balance": "1000000000000000000000000000000" + }, + "0x482d7f53cba6ae73a354533673c48e2dfd560949": { + "balance": "1000000000000000000000000000000" + }, + "0x48acbd6a2724eadcc2a11144ab84b6a617d1a241": { + "balance": "1000000000000000000000000000000" + }, + "0x49ef89840e400026eb5c8d79bd1b0adc152fe86d": { + "balance": "1000000000000000000000000000000" + }, + "0x4bf989fa6572af36b190032505506f1db888357f": { + "balance": "1000000000000000000000000000000" + }, + "0x4cf9b195f7cb5f86694d9b399fe21a5f34616fd3": { + "balance": "1000000000000000000000000000000" + }, + "0x4e9b85904bca60aeb5b916ca86ac622096908427": { + "balance": "1000000000000000000000000000000" + }, + "0x50120c17d7b59200e9b76e89e4e3de2f0cd00090": { + "balance": "1000000000000000000000000000000" + }, + "0x54db355342c35085a1a53184162b2fddd0a43b0f": { + "balance": "1000000000000000000000000000000" + }, + "0x54e228d8fea148cfe2b109b3b152ff21321d09a2": { + "balance": "1000000000000000000000000000000" + }, + "0x5667601b7dcde6f24d06bccc4f291cb06976f4ee": { + "balance": "1000000000000000000000000000000" + }, + "0x57829f2ecca390cd9d1c41f92328bad4d1073bbb": { + "balance": "1000000000000000000000000000000" + }, + "0x5EF25557E2ed6AFfF321B266C93e95A0B4B05AbC": { + "balance": "1000000000000000000000000" + }, + "0x5a3adad4382b3eb1e0c65f2de2845901081039b5": { + "balance": "1000000000000000000000000000000" + }, + "0x5cdb7392efdce502ccc6fba5c3c1dd1653967b4d": { + "balance": "1000000000000000000000000000000" + }, + "0x5d012c13b2854bda8b7b6580e97e52751884f827": { + "balance": "1000000000000000000000000000000" + }, + "0x5d9326c6504833d84f8a0d65ded59b1a6e768ca2": { + "balance": "1000000000000000000000000000000" + }, + "0x60268f799d8f1808e4a32c2eb898e73a8881f6f0": { + "balance": "1000000000000000000000000000000" + }, + "0x605ba4a05d779f9869bd9a10234c22f516766cfe": { + "balance": "1000000000000000000000000000000" + }, + "0x6093f0f2a7b5148b71603ac439adbc4c0e5aa5da": { + "balance": "1000000000000000000000000000000" + }, + "0x6196d135CdDb9d73A0756C1E44b5b02B11acf594": { + "balance": "2000000000000000000000", + "code": "", + "nonce": "5076", + "storage": {} + }, + "0x62712ceccb50f62ca4c5402fff6da9c819c866cf": { + "balance": "1000000000000000000000000000000" + }, + "0x62971de462ea1ec0d3b43a6a85b6fb975e6c6f64": { + "balance": "1000000000000000000000000000000" + }, + "0x62cf32dfb9eb6358dc5deb006aef1d75fb153e5f": { + "balance": "1000000000000000000000000000000" + }, + "0x62d8b22c1d71577829b2fee20a5c3fff43aed0ec": { + "balance": "100000000000000000000000" + }, + "0x6314956b78bb2eaed1c49b3ae71d4d0ec501cfab": { + "balance": "1000000000000000000000000000000" + }, + "0x661bda4daeba3ce9ac2aa30b80d463580f90d31a": { + "balance": "1000000000000000000000000000000" + }, + "0x66c5a87f4a49DD75e970055A265E8dd5C3F8f852": { + "balance": "1000000000000000000000" + }, + "0x66cd465ddcd85504c0d2cfb1728acee994d55a3f": { + "balance": "1000000000000000000000000000000" + }, + "0x68bca79ae7aae796027ff843d2303444da5cf5d8": { + "balance": "1000000000000000000000000000000" + }, + "0x6923877b65e24966efa9efd1207822fa2eaf601a": { + "balance": "1000000000000000000000000000000" + }, + "0x69362535ec535F0643cBf62D16aDeDCAf32Ee6F7": { + "balance": "0", + "code": "0x608060405234801561001057600080fd5b50600436106100b45760003560e01c806379210e8e1161007157806379210e8e1461017757806381a8235a146101a757806385aeeb17146101c35780639a9a5593146101f3578063a99100541461020f578063b57321221461022b576100b4565b806307c6e7d3146100b9578063122f4fba146100d55780631c6ec7a9146101055780631cfe4e3b14610121578063373dedb41461013d57806361e46db51461015b575b600080fd5b6100d360048036036100ce9190810190613cff565b61025b565b005b6100ef60048036036100ea9190810190613cff565b610804565b6040516100fc9190614963565b60405180910390f35b61011f600480360361011a9190810190613cff565b610b43565b005b61013b60048036036101369190810190613cc3565b610f72565b005b610145611190565b6040516101529190614cbe565b60405180910390f35b61017560048036036101709190810190613d94565b611199565b005b610191600480360361018c9190810190613e13565b6113f9565b60405161019e9190614924565b60405180910390f35b6101c160048036036101bc9190810190613cff565b6116f9565b005b6101dd60048036036101d89190810190613cff565b61189e565b6040516101ea9190614941565b60405180910390f35b61020d60048036036102089190810190613d40565b611b9d565b005b61022960048036036102249190810190613cff565b61202c565b005b61024560048036036102409190810190613cff565b612682565b6040516102529190614cbe565b60405180910390f35b6000339050606061026b83612902565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b825181101561037c576000826001018460018403815181106102d557fe5b60200260200101516040516102ea91906148cc565b90815260200160405180910390205411610339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161033090614ade565b60405180910390fd5b8160020183600183038151811061034c57fe5b602002602001015160405161036191906148cc565b908152602001604051809103902091508060010190506102b7565b506060600183511161038e57846103a7565b8260018451038151811061039e57fe5b60200260200101515b9050600082600101826040516103bd91906148e3565b9081526020016040518091039020541161040c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161040390614ade565b60405180910390fd5b6000826002018260405161042091906148e3565b90815260200160405180910390206000018054905014610475576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161046c90614b5e565b60405180910390fd5b60006104818587612b02565b9050806104c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ba90614a7e565b60405180910390fd5b6104cb613888565b836000016001856000018054905003815481106104e457fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156105965780601f1061056b57610100808354040283529160200191610596565b820191906000526020600020905b81548152906001019060200180831161057957829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff1660028111156105e257fe5b60028111156105ed57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561066557602002820191906000526020600020906000905b82829054906101000a900460ff1615158152602001906001019060208260000104928301926001038202915080841161062f5790505b505050505081525050905080846000016001866001018660405161068991906148e3565b90815260200160405180910390205403815481106106a357fe5b906000526020600020906005020160008201518160000190805190602001906106cd9291906138c4565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561071c57fe5b0217905550608082015181600401908051906020019061073d929190613944565b50905050836001018360405161075391906148e3565b90815260200160405180910390205484600101826000015160405161077891906148cc565b9081526020016040518091039020819055506000846001018460405161079e91906148e3565b908152602001604051809103902081905550836000018054809190600190036107c791906139ea565b5083600201836040516107da91906148e3565b9081526020016040518091039020600080820160006107f99190613a1c565b505050505050505050565b600080606061081284612b66565b91509150606061082182612902565b90506000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b82518110156109065760008260010184600184038151811061088b57fe5b60200260200101516040516108a091906148cc565b90815260200160405180910390205414156108c357600095505050505050610b3e565b816002018360018303815181106108d657fe5b60200260200101516040516108eb91906148cc565b9081526020016040518091039020915080600101905061086d565b50606060018351116109185783610931565b8260018451038151811061092857fe5b60200260200101515b90506000826001018260405161094791906148e3565b908152602001604051809103902054141561096a57600095505050505050610b3e565b610972613888565b826000016001846001018460405161098a91906148e3565b90815260200160405180910390205403815481106109a457fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610a565780601f10610a2b57610100808354040283529160200191610a56565b820191906000526020600020905b815481529060010190602001808311610a3957829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115610aa257fe5b6002811115610aad57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015610b2557602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411610aef5790505b5050505050815250509050806060015196505050505050505b919050565b600160009054906101000a900460ff16610b85576120006002819055506210000060038190555060018060006101000a81548160ff0219169083151502179055505b6000815111610bc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc090614ade565b60405180910390fd5b60003390506060610bd983612902565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015610cea57600082600101846001840381518110610c4357fe5b6020026020010151604051610c5891906148cc565b90815260200160405180910390205411610ca7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9e90614ade565b60405180910390fd5b81600201836001830381518110610cba57fe5b6020026020010151604051610ccf91906148cc565b90815260200160405180910390209150806001019050610c25565b50600254816000018054905010610d36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2d90614bfe565b60405180910390fd5b60606001835111610d475784610d60565b82600184510381518110610d5757fe5b60200260200101515b905060008260010182604051610d7691906148e3565b90815260200160405180910390205414610dc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbc90614c3e565b60405180910390fd5b610dce81612ee8565b610e0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0490614afe565b60405180910390fd5b6000610e198587612fc9565b905080610e5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e529061499e565b60405180910390fd5b610e63613888565b82816000018190525060008160200190151590811515815250508360000181908060018154018082558091505090600182039060005260206000209060050201600090919290919091506000820151816000019080519060200190610ec99291906138c4565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff02191690836002811115610f1857fe5b02179055506080820151816004019080519060200190610f39929190613944565b5050505083600001805490508460010184604051610f5791906148e3565b90815260200160405180910390208190555050505050505050565b610f7a61302d565b73ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161480610fdf57503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614155b61101e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101590614a5e565b60405180910390fd5b80600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411156110a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109790614b3e565b60405180910390fd5b600054600754820111156110e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e0906149be565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460076000828254039250508190555080600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550806007600082825401925050819055505050565b60008054905090565b600033905060006111aa82866130c6565b9050600160028111156111b957fe5b8160030160009054906101000a900460ff1660028111156111d657fe5b14611216576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120d90614c1e565b60405180910390fd5b6000600354858161122357fe5b061480156112345750806002015484105b611273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126a9061497e565b60405180910390fd5b600354848260020154031080156112905750838160020154038351145b8061129d57506003548351145b6112dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d390614a1e565b60405180910390fd5b600015158160040160035486816112ef57fe5b04815481106112fa57fe5b90600052602060002090602091828204019190069054906101000a900460ff1615151461135c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611353906149fe565b60405180910390fd5b600061136a838787876132c5565b9050806113ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a390614b1e565b60405180910390fd5b60018260040160035487816113bd57fe5b04815481106113c857fe5b90600052602060002090602091828204019190066101000a81548160ff021916908315150217905550505050505050565b611401613a40565b6000606061140e86612b66565b9150915061141a613888565b61142483836130c6565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156114c85780601f1061149d576101008083540402835291602001916114c8565b820191906000526020600020905b8154815290600101906020018083116114ab57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561151457fe5b600281111561151f57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561159757602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116115615790505b50505050508152505090506002808111156115ae57fe5b816060015160028111156115be57fe5b146115fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f590614c9e565b60405180910390fd5b60035485111580156116105750600085115b61164f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164690614a1e565b60405180910390fd5b80604001518587011115611698576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168f9061497e565b60405180910390fd5b60006116a684848989613376565b8096508192505050806116ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e590614b9e565b60405180910390fd5b505050509392505050565b6000339050600061170a82846130c6565b90506001600281111561171957fe5b8160030160009054906101000a900460ff16600281111561173657fe5b14611776576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176d90614c1e565b60405180910390fd5b60006001905060008260040180549050905060008090505b818110156117e157600015158460040182815481106117a957fe5b90600052602060002090602091828204019190069054906101000a900460ff16151514156117d657600092505b80600101905061178e565b5081611822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181990614b7e565b60405180910390fd5b60028360030160006101000a81548160ff0219169083600281111561184357fe5b021790555060006118548587613409565b905080611896576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188d906149de565b60405180910390fd5b505050505050565b6060600060606118ad84612b66565b9150915060606118bc82612902565b90506000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008090505b82518110156119c65760008260010184838151811061192257fe5b602002602001015160405161193791906148cc565b90815260200160405180910390205411611986576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197d90614ade565b60405180910390fd5b8160020183828151811061199657fe5b60200260200101516040516119ab91906148cc565b90815260200160405180910390209150806001019050611907565b5080600001805480602002602001604051908101604052809291908181526020016000905b82821015611b8e57838290600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611aa75780601f10611a7c57610100808354040283529160200191611aa7565b820191906000526020600020905b815481529060010190602001808311611a8a57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115611af357fe5b6002811115611afe57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015611b7657602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411611b405790505b505050505081525050815260200190600101906119eb565b50505050945050505050919050565b600160009054906101000a900460ff16611bdf576120006002819055506210000060038190555060018060006101000a81548160ff0219169083151502179055505b60003390506305f5e100821115611c2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2290614bde565b60405180910390fd5b6060611c3684612902565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015611d4757600082600101846001840381518110611ca057fe5b6020026020010151604051611cb591906148cc565b90815260200160405180910390205411611d04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cfb90614ade565b60405180910390fd5b81600201836001830381518110611d1757fe5b6020026020010151604051611d2c91906148cc565b90815260200160405180910390209150806001019050611c82565b5060606001835111611d595785611d72565b82600184510381518110611d6957fe5b60200260200101515b905060008260010182604051611d8891906148e3565b90815260200160405180910390205414611dd7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dce90614c3e565b60405180910390fd5b611de081612ee8565b611e1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1690614bbe565b60405180910390fd5b6000611e2c85888861346d565b905080611e6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6590614c7e565b60405180910390fd5b6060600354600160035489010381611e8257fe5b04604051908082528060200260200182016040528015611eb15781602001602082028038833980820191505090505b509050836000016040518060a0016040528085815260200160011515815260200189815260200160016002811115611ee557fe5b815260200183815250908060018154018082558091505090600182039060005260206000209060050201600090919290919091506000820151816000019080519060200190611f359291906138c4565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff02191690836002811115611f8457fe5b02179055506080820151816004019080519060200190611fa5929190613944565b5050505083600001805490508460010184604051611fc391906148e3565b90815260200160405180910390208190555086600560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505050505050505050565b6000339050612039613888565b61204382846130c6565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156120e75780601f106120bc576101008083540402835291602001916120e7565b820191906000526020600020905b8154815290600101906020018083116120ca57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561213357fe5b600281111561213e57fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156121b657602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116121805790505b5050505050815250509050600060028111156121ce57fe5b816060015160028111156121de57fe5b141561221f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221690614a3e565b60405180910390fd5b600061222b83856134da565b90508061226d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226490614a9e565b60405180910390fd5b606061227885612902565b90506000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b825181101561231057816002018360018303815181106122e057fe5b60200260200101516040516122f591906148cc565b908152602001604051809103902091508060010190506122c4565b506000600182600101866000015160405161232b91906148cc565b908152602001604051809103902054039050612345613888565b8260000160018460000180549050038154811061235e57fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156124105780601f106123e557610100808354040283529160200191612410565b820191906000526020600020905b8154815290600101906020018083116123f357829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561245c57fe5b600281111561246757fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156124df57602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116124a95790505b5050505050815250509050808360000183815481106124fa57fe5b906000526020600020906005020160008201518160000190805190602001906125249291906138c4565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561257357fe5b02179055506080820151816004019080519060200190612594929190613944565b50905050826000018054809190600190036125af91906139ea565b508260010186600001516040516125c691906148cc565b9081526020016040518091039020548360010182600001516040516125eb91906148cc565b908152602001604051809103902081905550600083600101876000015160405161261591906148cc565b9081526020016040518091039020819055508560400151600560008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505050505050505050565b600080606061269084612b66565b9150915061269c613888565b6126a683836130c6565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561274a5780601f1061271f5761010080835404028352916020019161274a565b820191906000526020600020905b81548152906001019060200180831161272d57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561279657fe5b60028111156127a157fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561281957602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116127e35790505b50505050508152505090506001600281111561283157fe5b8160600151600281111561284157fe5b1480612866575060028081111561285457fe5b8160600151600281111561286457fe5b145b6128a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161289c90614c1e565b60405180910390fd5b60006128b1848461353e565b8096508192505050806128f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128f090614c5e565b60405180910390fd5b50505050919050565b606061290c613a65565b612915836135a7565b905061291f613a65565b61295d6040518060400160405280600181526020017f2f000000000000000000000000000000000000000000000000000000000000008152506135a7565b90506060600161297683856135d590919063ffffffff16565b016040519080825280602002602001820160405280156129aa57816020015b60608152602001906001900390816129955790505b50905060008090505b81518110156129fb576129d76129d2848661364a90919063ffffffff16565b613664565b8282815181106129e357fe5b602002602001018190525080806001019150506129b3565b50600081600183510381518110612a0e57fe5b6020026020010151511415612a795780600182510381518110612a2d57fe5b6020026020010160608152506001815103604051908082528060200260200182016040528015612a7157816020015b6060815260200190600190039081612a5c5790505b509350612ab2565b8051604051908082528060200260200182016040528015612aae57816020015b6060815260200190600190039081612a995790505b5093505b60008090505b8451811015612af957818181518110612acd57fe5b6020026020010151858281518110612ae157fe5b60200260200101819052508080600101915050612ab8565b50505050919050565b60008060016020601f85510181612b1557fe5b040190506040518481526020810160005b83811015612b47578060200286015181602002830152806001019050612b26565b50602082602085026040018460006010600019f1935050505092915050565b6000606060006028905080845111612bb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612baa90614abe565b60405180910390fd5b6060816040519080825280601f01601f191660200182016040528015612be85781602001600182028038833980820191505090505b50905060008090505b82811015612c5857858181518110612c0557fe5b602001015160f81c60f81b828281518110612c1c57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050612bf1565b50600080905060008090505b83811015612d87576000838281518110612c7a57fe5b602001015160f81c60f81b60f81c60ff16905060308110158015612c9f575060398111155b80612cb8575060418110158015612cb75750605a8111155b5b80612cd1575060618110158015612cd0575060668111155b5b612d10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d0790614abe565b60405180910390fd5b60308110158015612d22575060398111155b15612d335760308103601084020192505b60418110158015612d455750605a8111155b15612d565760378103601084020192505b60618110158015612d68575060668111155b15612d795760578103601084020192505b508080600101915050612c64565b508094507f2f00000000000000000000000000000000000000000000000000000000000000868481518110612db857fe5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612e25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e1c90614abe565b60405180910390fd5b6000600184885103039050806040519080825280601f01601f191660200182016040528015612e635781602001600182028038833980820191505090505b50945060008090505b81811015612ede5760008860018784010181518110612e8757fe5b602001015160f81c60f81b905080878381518110612ea157fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350508080600101915050612e6c565b5050505050915091565b6000604051602001612ef99061490f565b6040516020818303038152906040528051906020012082604051602001612f2091906148e3565b604051602081830303815290604052805190602001201480612f8b5750604051602001612f4c906148fa565b6040516020818303038152906040528051906020012082604051602001612f7391906148e3565b60405160208183030381529060405280519060200120145b80612f97575060008251145b15612fa55760009050612fc4565b60008251905060ff811115612fbe576000915050612fc4565b60019150505b919050565b60008060016020601f85510181612fdc57fe5b040190506040518481526020810160005b8381101561300e578060200286015181602002830152806001019050612fed565b5060208260208502604001846000600f600019f1935050505092915050565b600073d2001000000000000000000000000000000000d273ffffffffffffffffffffffffffffffffffffffff166383e781fe6040518163ffffffff1660e01b815260040160206040518083038186803b15801561308957600080fd5b505afa15801561309d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506130c19190810190613c9a565b905090565b600060606130d383612902565b90506000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b82518110156131e45760008260010184600184038151811061313d57fe5b602002602001015160405161315291906148cc565b908152602001604051809103902054116131a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161319890614ade565b60405180910390fd5b816002018360018303815181106131b457fe5b60200260200101516040516131c991906148cc565b9081526020016040518091039020915080600101905061311f565b50606060018351116131f6578461320f565b8260018451038151811061320657fe5b60200260200101515b90506000826001018260405161322591906148e3565b90815260200160405180910390205411613274576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161326b90614ade565b60405180910390fd5b6000826000016001846001018460405161328e91906148e3565b90815260200160405180910390205403815481106132a857fe5b906000526020600020906005020190508094505050505092915050565b60008060016020601f855101816132d857fe5b04019050600060016020601f885101816132ee57fe5b040190506040518781526020810160005b838110156133205780602002890151816020028301528060010190506132ff565b50868360200282015260005b84811015613352578060200287015181856001010160200283015280600101905061332c565b50602082848601602002606001846000600c600019f1945050505050949350505050565b6000613380613a40565b600060016020601f8851018161339257fe5b0401905060006020601f8601816133a557fe5b0490506040518881526020810160005b848110156133d657806020028a0151816020028301528060010190506133b5565b5083602002810188815287816020015283602002868660030160200285600a600019fa9650505050505094509492505050565b60008060016020601f8551018161341c57fe5b040190506040518481526020810160005b8381101561344e57806020028601518160200283015280600101905061342d565b50602082602085026040018460006011600019f1935050505092915050565b60008060016020601f8651018161348057fe5b040190506040518581526020810160005b838110156134b2578060200287015181602002830152806001019050613491565b50846020840282015260208260208502604001846000600b600019f193505050509392505050565b60008060016020601f855101816134ed57fe5b040190506040518481526020810160005b8381101561351f5780602002860151816020028301528060010190506134fe565b5060208260208502604001846000600e600019f1935050505092915050565b600080600060016020601f8651018161355357fe5b040190506040518581526020810160005b83811015613585578060200287015181602002830152806001019050613564565b506020826020850260200184600d600019fa9450815193505050509250929050565b6135af613a65565b600060208301905060405180604001604052808451815260200182815250915050919050565b60008082600001516135f985600001518660200151866000015187602001516136c6565b0190505b83600001518460200151018111613643578180600101925050826000015161363b8560200151830386600001510383866000015187602001516136c6565b0190506135fd565b5092915050565b613652613a65565b61365d8383836137a1565b5092915050565b60608082600001516040519080825280601f01601f19166020018201604052801561369e5781602001600182028038833980820191505090505b50905060006020820190506136bc818560200151866000015161383f565b8192505050919050565b6000808490506000868511613791576020851161374b57600060018660200360080260020a031960001b905060008186511690506000878a8a0103905060008386511690505b82811461373d5781861061372a578a8a019650505050505050613799565b858060010196505083865116905061370c565b859650505050505050613799565b60008585209050600091505b858803821161378f57600086842090508082141561377b5783945050505050613799565b600184019350508180600101925050613757565b505b868601925050505b949350505050565b6137a9613a65565b60006137c785600001518660200151866000015187602001516136c6565b90508460200151836020018181525050846020015181038360000181815250508460000151856020015101811415613809576000856000018181525050613834565b8360000151836000015101856000018181510391508181525050836000015181018560200181815250505b829150509392505050565b5b602081106138635781518352602083019250602082019150602081039050613840565b60006001826020036101000a0390508019835116818551168181178652505050505050565b6040518060a001604052806060815260200160001515815260200160008152602001600060028111156138b757fe5b8152602001606081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061390557805160ff1916838001178555613933565b82800160010185558215613933579182015b82811115613932578251825591602001919060010190613917565b5b5090506139409190613a7f565b5090565b82805482825590600052602060002090601f016020900481019282156139d95791602002820160005b838211156139aa57835183826101000a81548160ff021916908315150217905550926020019260010160208160000104928301926001030261396d565b80156139d75782816101000a81549060ff02191690556001016020816000010492830192600103026139aa565b505b5090506139e69190613aa4565b5090565b815481835581811115613a1757600502816005028360005260206000209182019101613a169190613ad4565b5b505050565b5080546000825560050290600052602060002090810190613a3d9190613ad4565b50565b6040518062100000016040528061800090602082028038833980820191505090505090565b604051806040016040528060008152602001600081525090565b613aa191905b80821115613a9d576000816000905550600101613a85565b5090565b90565b613ad191905b80821115613acd57600081816101000a81549060ff021916905550600101613aaa565b5090565b90565b613b4091905b80821115613b3c5760008082016000613af39190613b43565b6001820160006101000a81549060ff021916905560028201600090556003820160006101000a81549060ff0219169055600482016000613b339190613b8b565b50600501613ada565b5090565b90565b50805460018160011615610100020316600290046000825580601f10613b695750613b88565b601f016020900490600052602060002090810190613b879190613a7f565b5b50565b50805460008255601f016020900490600052602060002090810190613bb09190613a7f565b50565b600081359050613bc281614f18565b92915050565b600081519050613bd781614f18565b92915050565b600082601f830112613bee57600080fd5b8135613c01613bfc82614d06565b614cd9565b91508082526020830160208301858383011115613c1d57600080fd5b613c28838284614eb8565b50505092915050565b600082601f830112613c4257600080fd5b8135613c55613c5082614d32565b614cd9565b91508082526020830160208301858383011115613c7157600080fd5b613c7c838284614eb8565b50505092915050565b600081359050613c9481614f2f565b92915050565b600060208284031215613cac57600080fd5b6000613cba84828501613bc8565b91505092915050565b60008060408385031215613cd657600080fd5b6000613ce485828601613bb3565b9250506020613cf585828601613c85565b9150509250929050565b600060208284031215613d1157600080fd5b600082013567ffffffffffffffff811115613d2b57600080fd5b613d3784828501613c31565b91505092915050565b60008060408385031215613d5357600080fd5b600083013567ffffffffffffffff811115613d6d57600080fd5b613d7985828601613c31565b9250506020613d8a85828601613c85565b9150509250929050565b600080600060608486031215613da957600080fd5b600084013567ffffffffffffffff811115613dc357600080fd5b613dcf86828701613c31565b9350506020613de086828701613c85565b925050604084013567ffffffffffffffff811115613dfd57600080fd5b613e0986828701613bdd565b9150509250925092565b600080600060608486031215613e2857600080fd5b600084013567ffffffffffffffff811115613e4257600080fd5b613e4e86828701613c31565b9350506020613e5f86828701613c85565b9250506040613e7086828701613c85565b9150509250925092565b6000613e868383613fe8565b60208301905092915050565b6000613e9e8383613ff7565b60208301905092915050565b6000613eb68383614831565b905092915050565b6000613ec982614d88565b613ed38185614de7565b9350613ede83614d5e565b8060005b83811015613f0f578151613ef68882613e7a565b9750613f0183614dc0565b925050600181019050613ee2565b5085935050505092915050565b613f2581614d93565b613f2f8184614df8565b9250613f3a82614d6e565b8060005b83811015613f6b578151613f528782613e92565b9650613f5d83614dcd565b925050600181019050613f3e565b505050505050565b6000613f7e82614d9f565b613f888185614e03565b935083602082028501613f9a85614d78565b8060005b85811015613fd65784840389528151613fb78582613eaa565b9450613fc283614dda565b925060208a01995050600181019050613f9e565b50829750879550505050505092915050565b613ff181614e53565b82525050565b61400081614e5f565b82525050565b61400f81614ea6565b82525050565b61401e81614ea6565b82525050565b600061402f82614db5565b6140398185614e36565b9350614049818560208601614ec7565b80840191505092915050565b600061406082614daa565b61406a8185614e14565b935061407a818560208601614ec7565b61408381614efa565b840191505092915050565b600061409982614daa565b6140a38185614e36565b93506140b3818560208601614ec7565b80840191505092915050565b60006140cc601883614e25565b91507f496e636f7272656374206368756e6b20706f736974696f6e00000000000000006000830152602082019050919050565b600061410c601583614e25565b91507f4469726563746f7279206e6f74206372656174656400000000000000000000006000830152602082019050919050565b600061414c602483614e25565b91507f4e6f7420656e6f756768206d656d6f727920696e207468652046696c6573746f60008301527f72616765000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006141b2601b83614e25565b91507f48617368206861736e2774206265656e2063616c63756c6174656400000000006000830152602082019050919050565b60006141f2601983614e25565b91507f4368756e6b20697320616c72656164792075706c6f61646564000000000000006000830152602082019050919050565b6000614232601683614e25565b91507f496e636f7272656374206368756e6b206c656e677468000000000000000000006000830152602082019050919050565b6000614272600f83614e25565b91507f46696c65206e6f742065786973747300000000000000000000000000000000006000830152602082019050919050565b60006142b2600e83614e25565b91507f496e76616c69642073656e6465720000000000000000000000000000000000006000830152602082019050919050565b60006142f2601883614e25565b91507f4469726563746f7279206973206e6f742064656c6574656400000000000000006000830152602082019050919050565b6000614332601083614e25565b91507f46696c65206e6f742064656c65746564000000000000000000000000000000006000830152602082019050919050565b6000614372601383614e25565b91507f496e76616c69642073746f7261676550617468000000000000000000000000006000830152602082019050919050565b60006143b2600c83614e25565b91507f496e76616c6964207061746800000000000000000000000000000000000000006000830152602082019050919050565b60006143f2600183614e36565b91507f2e000000000000000000000000000000000000000000000000000000000000006000830152600182019050919050565b6000614432601683614e25565b91507f496e76616c6964206469726563746f7279206e616d65000000000000000000006000830152602082019050919050565b6000614472601583614e25565b91507f4368756e6b207761736e27742075706c6f6164656400000000000000000000006000830152602082019050919050565b60006144b2602683614e25565b91507f436f756c64206e6f742072657365727665206c657373207468616e207573656460008301527f20737061636500000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614518601683614e25565b91507f4469726563746f7279206973206e6f7420656d707479000000000000000000006000830152602082019050919050565b6000614558602383614e25565b91507f46696c65206861736e2774206265656e2075706c6f6164656420636f7272656360008301527f746c7900000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006145be601183614e25565b91507f4368756e6b207761736e277420726561640000000000000000000000000000006000830152602082019050919050565b60006145fe601883614e25565b91507f46696c656e616d652073686f756c64206265203c2032353600000000000000006000830152602082019050919050565b600061463e601f83614e25565b91507f46696c652073686f756c64206265206c657373207468616e20313030204d42006000830152602082019050919050565b600061467e600283614e36565b91507f2e2e0000000000000000000000000000000000000000000000000000000000006000830152600282019050919050565b60006146be601183614e25565b91507f4469726563746f72792069732066756c6c0000000000000000000000000000006000830152602082019050919050565b60006146fe600e83614e25565b91507f46696c65206e6f7420666f756e640000000000000000000000000000000000006000830152602082019050919050565b600061473e601883614e25565b91507f46696c65206f72206469726563746f72792065786973747300000000000000006000830152602082019050919050565b600061477e601883614e25565b91507f45564d206572726f7220696e2067657446696c6553697a6500000000000000006000830152602082019050919050565b60006147be601083614e25565b91507f46696c65206e6f742063726561746564000000000000000000000000000000006000830152602082019050919050565b60006147fe601983614e25565b91507f46696c65206861736e2774206265656e2075706c6f61646564000000000000006000830152602082019050919050565b600060a083016000830151848203600086015261484e8282614055565b91505060208301516148636020860182613fe8565b50604083015161487660408601826148ae565b5060608301516148896060860182614006565b50608083015184820360808601526148a18282613ebe565b9150508091505092915050565b6148b781614e9c565b82525050565b6148c681614e9c565b82525050565b60006148d8828461408e565b915081905092915050565b60006148ef8284614024565b915081905092915050565b6000614905826143e5565b9150819050919050565b600061491a82614671565b9150819050919050565b6000621000008201905061493b6000830184613f1c565b92915050565b6000602082019050818103600083015261495b8184613f73565b905092915050565b60006020820190506149786000830184614015565b92915050565b60006020820190508181036000830152614997816140bf565b9050919050565b600060208201905081810360008301526149b7816140ff565b9050919050565b600060208201905081810360008301526149d78161413f565b9050919050565b600060208201905081810360008301526149f7816141a5565b9050919050565b60006020820190508181036000830152614a17816141e5565b9050919050565b60006020820190508181036000830152614a3781614225565b9050919050565b60006020820190508181036000830152614a5781614265565b9050919050565b60006020820190508181036000830152614a77816142a5565b9050919050565b60006020820190508181036000830152614a97816142e5565b9050919050565b60006020820190508181036000830152614ab781614325565b9050919050565b60006020820190508181036000830152614ad781614365565b9050919050565b60006020820190508181036000830152614af7816143a5565b9050919050565b60006020820190508181036000830152614b1781614425565b9050919050565b60006020820190508181036000830152614b3781614465565b9050919050565b60006020820190508181036000830152614b57816144a5565b9050919050565b60006020820190508181036000830152614b778161450b565b9050919050565b60006020820190508181036000830152614b978161454b565b9050919050565b60006020820190508181036000830152614bb7816145b1565b9050919050565b60006020820190508181036000830152614bd7816145f1565b9050919050565b60006020820190508181036000830152614bf781614631565b9050919050565b60006020820190508181036000830152614c17816146b1565b9050919050565b60006020820190508181036000830152614c37816146f1565b9050919050565b60006020820190508181036000830152614c5781614731565b9050919050565b60006020820190508181036000830152614c7781614771565b9050919050565b60006020820190508181036000830152614c97816147b1565b9050919050565b60006020820190508181036000830152614cb7816147f1565b9050919050565b6000602082019050614cd360008301846148bd565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614cfc57600080fd5b8060405250919050565b600067ffffffffffffffff821115614d1d57600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614d4957600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050919050565b6000819050602082019050919050565b600081519050919050565b60006180009050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614e4c82614e7c565b9050919050565b60008115159050919050565b6000819050919050565b6000819050614e7782614f0b565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000614eb182614e69565b9050919050565b82818337600083830152505050565b60005b83811015614ee5578082015181840152602081019050614eca565b83811115614ef4576000848401525b50505050565b6000601f19601f8301169050919050565b60038110614f1557fe5b50565b614f2181614e41565b8114614f2c57600080fd5b50565b614f3881614e9c565b8114614f4357600080fd5b5056fea365627a7a723158202ae226b25ad72f9cff2d74c6dc7bcfb78530ab1d2438f48a8dab67499b37a8e56c6578706572696d656e74616cf564736f6c634300050d0040", + "nonce": "0", + "storage": { + "0x0": "2868903936" + } + }, + "0x69362535ec535F0643cBf62D16aDeDCAf32Ee6F8": { + "balance": "0", + "code": "0x608060405234801561001057600080fd5b50600436106100b45760003560e01c806379210e8e1161007157806379210e8e1461017757806381a8235a146101a757806385aeeb17146101c35780639a9a5593146101f3578063a99100541461020f578063b57321221461022b576100b4565b806307c6e7d3146100b9578063122f4fba146100d55780631c6ec7a9146101055780631cfe4e3b14610121578063373dedb41461013d57806361e46db51461015b575b600080fd5b6100d360048036036100ce9190810190613e0d565b61025b565b005b6100ef60048036036100ea9190810190613e0d565b610804565b6040516100fc9190614ab1565b60405180910390f35b61011f600480360361011a9190810190613e0d565b610b43565b005b61013b60048036036101369190810190613dd1565b610f72565b005b610145611190565b6040516101529190614e2c565b60405180910390f35b61017560048036036101709190810190613ea2565b611199565b005b610191600480360361018c9190810190613f21565b6113f9565b60405161019e9190614a72565b60405180910390f35b6101c160048036036101bc9190810190613e0d565b6116f9565b005b6101dd60048036036101d89190810190613e0d565b61189e565b6040516101ea9190614a8f565b60405180910390f35b61020d60048036036102089190810190613e4e565b611b9d565b005b61022960048036036102249190810190613e0d565b61213a565b005b61024560048036036102409190810190613e0d565b612790565b6040516102529190614e2c565b60405180910390f35b6000339050606061026b83612a10565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b825181101561037c576000826001018460018403815181106102d557fe5b60200260200101516040516102ea9190614a1a565b90815260200160405180910390205411610339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161033090614c2c565b60405180910390fd5b8160020183600183038151811061034c57fe5b60200260200101516040516103619190614a1a565b908152602001604051809103902091508060010190506102b7565b506060600183511161038e57846103a7565b8260018451038151811061039e57fe5b60200260200101515b9050600082600101826040516103bd9190614a31565b9081526020016040518091039020541161040c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161040390614c2c565b60405180910390fd5b600082600201826040516104209190614a31565b90815260200160405180910390206000018054905014610475576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161046c90614cac565b60405180910390fd5b60006104818587612c10565b9050806104c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ba90614bcc565b60405180910390fd5b6104cb613996565b836000016001856000018054905003815481106104e457fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156105965780601f1061056b57610100808354040283529160200191610596565b820191906000526020600020905b81548152906001019060200180831161057957829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff1660028111156105e257fe5b60028111156105ed57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561066557602002820191906000526020600020906000905b82829054906101000a900460ff1615158152602001906001019060208260000104928301926001038202915080841161062f5790505b50505050508152505090508084600001600186600101866040516106899190614a31565b90815260200160405180910390205403815481106106a357fe5b906000526020600020906005020160008201518160000190805190602001906106cd9291906139d2565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561071c57fe5b0217905550608082015181600401908051906020019061073d929190613a52565b5090505083600101836040516107539190614a31565b9081526020016040518091039020548460010182600001516040516107789190614a1a565b9081526020016040518091039020819055506000846001018460405161079e9190614a31565b908152602001604051809103902081905550836000018054809190600190036107c79190613af8565b5083600201836040516107da9190614a31565b9081526020016040518091039020600080820160006107f99190613b2a565b505050505050505050565b600080606061081284612c74565b91509150606061082182612a10565b90506000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b82518110156109065760008260010184600184038151811061088b57fe5b60200260200101516040516108a09190614a1a565b90815260200160405180910390205414156108c357600095505050505050610b3e565b816002018360018303815181106108d657fe5b60200260200101516040516108eb9190614a1a565b9081526020016040518091039020915080600101905061086d565b50606060018351116109185783610931565b8260018451038151811061092857fe5b60200260200101515b9050600082600101826040516109479190614a31565b908152602001604051809103902054141561096a57600095505050505050610b3e565b610972613996565b826000016001846001018460405161098a9190614a31565b90815260200160405180910390205403815481106109a457fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610a565780601f10610a2b57610100808354040283529160200191610a56565b820191906000526020600020905b815481529060010190602001808311610a3957829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115610aa257fe5b6002811115610aad57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015610b2557602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411610aef5790505b5050505050815250509050806060015196505050505050505b919050565b600160009054906101000a900460ff16610b85576120006002819055506210000060038190555060018060006101000a81548160ff0219169083151502179055505b6000815111610bc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc090614c2c565b60405180910390fd5b60003390506060610bd983612a10565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015610cea57600082600101846001840381518110610c4357fe5b6020026020010151604051610c589190614a1a565b90815260200160405180910390205411610ca7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9e90614c2c565b60405180910390fd5b81600201836001830381518110610cba57fe5b6020026020010151604051610ccf9190614a1a565b90815260200160405180910390209150806001019050610c25565b50600254816000018054905010610d36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2d90614d4c565b60405180910390fd5b60606001835111610d475784610d60565b82600184510381518110610d5757fe5b60200260200101515b905060008260010182604051610d769190614a31565b90815260200160405180910390205414610dc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbc90614d8c565b60405180910390fd5b610dce81612ff6565b610e0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0490614c4c565b60405180910390fd5b6000610e1985876130d7565b905080610e5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5290614aec565b60405180910390fd5b610e63613996565b82816000018190525060008160200190151590811515815250508360000181908060018154018082558091505090600182039060005260206000209060050201600090919290919091506000820151816000019080519060200190610ec99291906139d2565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff02191690836002811115610f1857fe5b02179055506080820151816004019080519060200190610f39929190613a52565b5050505083600001805490508460010184604051610f579190614a31565b90815260200160405180910390208190555050505050505050565b610f7a61313b565b73ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161480610fdf57503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614155b61101e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101590614bac565b60405180910390fd5b80600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411156110a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109790614c8c565b60405180910390fd5b600054600754820111156110e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e090614b0c565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460076000828254039250508190555080600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550806007600082825401925050819055505050565b60008054905090565b600033905060006111aa82866131d4565b9050600160028111156111b957fe5b8160030160009054906101000a900460ff1660028111156111d657fe5b14611216576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120d90614d6c565b60405180910390fd5b6000600354858161122357fe5b061480156112345750806002015484105b611273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126a90614acc565b60405180910390fd5b600354848260020154031080156112905750838160020154038351145b8061129d57506003548351145b6112dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d390614b6c565b60405180910390fd5b600015158160040160035486816112ef57fe5b04815481106112fa57fe5b90600052602060002090602091828204019190069054906101000a900460ff1615151461135c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135390614b4c565b60405180910390fd5b600061136a838787876133d3565b9050806113ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a390614c6c565b60405180910390fd5b60018260040160035487816113bd57fe5b04815481106113c857fe5b90600052602060002090602091828204019190066101000a81548160ff021916908315150217905550505050505050565b611401613b4e565b6000606061140e86612c74565b9150915061141a613996565b61142483836131d4565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156114c85780601f1061149d576101008083540402835291602001916114c8565b820191906000526020600020905b8154815290600101906020018083116114ab57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561151457fe5b600281111561151f57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561159757602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116115615790505b50505050508152505090506002808111156115ae57fe5b816060015160028111156115be57fe5b146115fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f590614e0c565b60405180910390fd5b60035485111580156116105750600085115b61164f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164690614b6c565b60405180910390fd5b80604001518587011115611698576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168f90614acc565b60405180910390fd5b60006116a684848989613484565b8096508192505050806116ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e590614cec565b60405180910390fd5b505050509392505050565b6000339050600061170a82846131d4565b90506001600281111561171957fe5b8160030160009054906101000a900460ff16600281111561173657fe5b14611776576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176d90614d6c565b60405180910390fd5b60006001905060008260040180549050905060008090505b818110156117e157600015158460040182815481106117a957fe5b90600052602060002090602091828204019190069054906101000a900460ff16151514156117d657600092505b80600101905061178e565b5081611822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181990614ccc565b60405180910390fd5b60028360030160006101000a81548160ff0219169083600281111561184357fe5b021790555060006118548587613517565b905080611896576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188d90614b2c565b60405180910390fd5b505050505050565b6060600060606118ad84612c74565b9150915060606118bc82612a10565b90506000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008090505b82518110156119c65760008260010184838151811061192257fe5b60200260200101516040516119379190614a1a565b90815260200160405180910390205411611986576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197d90614c2c565b60405180910390fd5b8160020183828151811061199657fe5b60200260200101516040516119ab9190614a1a565b90815260200160405180910390209150806001019050611907565b5080600001805480602002602001604051908101604052809291908181526020016000905b82821015611b8e57838290600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611aa75780601f10611a7c57610100808354040283529160200191611aa7565b820191906000526020600020905b815481529060010190602001808311611a8a57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115611af357fe5b6002811115611afe57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015611b7657602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411611b405790505b505050505081525050815260200190600101906119eb565b50505050945050505050919050565b600160009054906101000a900460ff16611bdf576120006002819055506210000060038190555060018060006101000a81548160ff0219169083151502179055505b60003390506305f5e100821115611c2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2290614d2c565b60405180910390fd5b600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205483011115611cee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce590614dac565b60405180910390fd5b6060611cf984612a10565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015611e0a57600082600101846001840381518110611d6357fe5b6020026020010151604051611d789190614a1a565b90815260200160405180910390205411611dc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dbe90614c2c565b60405180910390fd5b81600201836001830381518110611dda57fe5b6020026020010151604051611def9190614a1a565b90815260200160405180910390209150806001019050611d45565b50600254816000018054905010611e56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4d90614d4c565b60405180910390fd5b60606001835111611e675785611e80565b82600184510381518110611e7757fe5b60200260200101515b905060008260010182604051611e969190614a31565b90815260200160405180910390205414611ee5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611edc90614d8c565b60405180910390fd5b611eee81612ff6565b611f2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2490614d0c565b60405180910390fd5b6000611f3a85888861357b565b905080611f7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7390614dec565b60405180910390fd5b6060600354600160035489010381611f9057fe5b04604051908082528060200260200182016040528015611fbf5781602001602082028038833980820191505090505b509050836000016040518060a0016040528085815260200160011515815260200189815260200160016002811115611ff357fe5b8152602001838152509080600181540180825580915050906001820390600052602060002090600502016000909192909190915060008201518160000190805190602001906120439291906139d2565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561209257fe5b021790555060808201518160040190805190602001906120b3929190613a52565b50505050836000018054905084600101846040516120d19190614a31565b90815260200160405180910390208190555086600560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505050505050505050565b6000339050612147613996565b61215182846131d4565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156121f55780601f106121ca576101008083540402835291602001916121f5565b820191906000526020600020905b8154815290600101906020018083116121d857829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561224157fe5b600281111561224c57fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156122c457602002820191906000526020600020906000905b82829054906101000a900460ff1615158152602001906001019060208260000104928301926001038202915080841161228e5790505b5050505050815250509050600060028111156122dc57fe5b816060015160028111156122ec57fe5b141561232d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232490614b8c565b60405180910390fd5b600061233983856135e8565b90508061237b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161237290614bec565b60405180910390fd5b606061238685612a10565b90506000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b825181101561241e57816002018360018303815181106123ee57fe5b60200260200101516040516124039190614a1a565b908152602001604051809103902091508060010190506123d2565b50600060018260010186600001516040516124399190614a1a565b908152602001604051809103902054039050612453613996565b8260000160018460000180549050038154811061246c57fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561251e5780601f106124f35761010080835404028352916020019161251e565b820191906000526020600020905b81548152906001019060200180831161250157829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561256a57fe5b600281111561257557fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156125ed57602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116125b75790505b50505050508152505090508083600001838154811061260857fe5b906000526020600020906005020160008201518160000190805190602001906126329291906139d2565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561268157fe5b021790555060808201518160040190805190602001906126a2929190613a52565b50905050826000018054809190600190036126bd9190613af8565b508260010186600001516040516126d49190614a1a565b9081526020016040518091039020548360010182600001516040516126f99190614a1a565b90815260200160405180910390208190555060008360010187600001516040516127239190614a1a565b9081526020016040518091039020819055508560400151600560008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505050505050505050565b600080606061279e84612c74565b915091506127aa613996565b6127b483836131d4565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156128585780601f1061282d57610100808354040283529160200191612858565b820191906000526020600020905b81548152906001019060200180831161283b57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff1660028111156128a457fe5b60028111156128af57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561292757602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116128f15790505b50505050508152505090506001600281111561293f57fe5b8160600151600281111561294f57fe5b1480612974575060028081111561296257fe5b8160600151600281111561297257fe5b145b6129b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129aa90614d6c565b60405180910390fd5b60006129bf848461364c565b809650819250505080612a07576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129fe90614dcc565b60405180910390fd5b50505050919050565b6060612a1a613b73565b612a23836136b5565b9050612a2d613b73565b612a6b6040518060400160405280600181526020017f2f000000000000000000000000000000000000000000000000000000000000008152506136b5565b905060606001612a8483856136e390919063ffffffff16565b01604051908082528060200260200182016040528015612ab857816020015b6060815260200190600190039081612aa35790505b50905060008090505b8151811015612b0957612ae5612ae0848661375890919063ffffffff16565b613772565b828281518110612af157fe5b60200260200101819052508080600101915050612ac1565b50600081600183510381518110612b1c57fe5b6020026020010151511415612b875780600182510381518110612b3b57fe5b6020026020010160608152506001815103604051908082528060200260200182016040528015612b7f57816020015b6060815260200190600190039081612b6a5790505b509350612bc0565b8051604051908082528060200260200182016040528015612bbc57816020015b6060815260200190600190039081612ba75790505b5093505b60008090505b8451811015612c0757818181518110612bdb57fe5b6020026020010151858281518110612bef57fe5b60200260200101819052508080600101915050612bc6565b50505050919050565b60008060016020601f85510181612c2357fe5b040190506040518481526020810160005b83811015612c55578060200286015181602002830152806001019050612c34565b50602082602085026040018460006010600019f1935050505092915050565b6000606060006028905080845111612cc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cb890614c0c565b60405180910390fd5b6060816040519080825280601f01601f191660200182016040528015612cf65781602001600182028038833980820191505090505b50905060008090505b82811015612d6657858181518110612d1357fe5b602001015160f81c60f81b828281518110612d2a57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050612cff565b50600080905060008090505b83811015612e95576000838281518110612d8857fe5b602001015160f81c60f81b60f81c60ff16905060308110158015612dad575060398111155b80612dc6575060418110158015612dc55750605a8111155b5b80612ddf575060618110158015612dde575060668111155b5b612e1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e1590614c0c565b60405180910390fd5b60308110158015612e30575060398111155b15612e415760308103601084020192505b60418110158015612e535750605a8111155b15612e645760378103601084020192505b60618110158015612e76575060668111155b15612e875760578103601084020192505b508080600101915050612d72565b508094507f2f00000000000000000000000000000000000000000000000000000000000000868481518110612ec657fe5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612f33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f2a90614c0c565b60405180910390fd5b6000600184885103039050806040519080825280601f01601f191660200182016040528015612f715781602001600182028038833980820191505090505b50945060008090505b81811015612fec5760008860018784010181518110612f9557fe5b602001015160f81c60f81b905080878381518110612faf57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350508080600101915050612f7a565b5050505050915091565b600060405160200161300790614a5d565b604051602081830303815290604052805190602001208260405160200161302e9190614a31565b604051602081830303815290604052805190602001201480613099575060405160200161305a90614a48565b60405160208183030381529060405280519060200120826040516020016130819190614a31565b60405160208183030381529060405280519060200120145b806130a5575060008251145b156130b357600090506130d2565b60008251905060ff8111156130cc5760009150506130d2565b60019150505b919050565b60008060016020601f855101816130ea57fe5b040190506040518481526020810160005b8381101561311c5780602002860151816020028301528060010190506130fb565b5060208260208502604001846000600f600019f1935050505092915050565b600073d2001000000000000000000000000000000000d273ffffffffffffffffffffffffffffffffffffffff166383e781fe6040518163ffffffff1660e01b815260040160206040518083038186803b15801561319757600080fd5b505afa1580156131ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506131cf9190810190613da8565b905090565b600060606131e183612a10565b90506000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b82518110156132f25760008260010184600184038151811061324b57fe5b60200260200101516040516132609190614a1a565b908152602001604051809103902054116132af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132a690614c2c565b60405180910390fd5b816002018360018303815181106132c257fe5b60200260200101516040516132d79190614a1a565b9081526020016040518091039020915080600101905061322d565b5060606001835111613304578461331d565b8260018451038151811061331457fe5b60200260200101515b9050600082600101826040516133339190614a31565b90815260200160405180910390205411613382576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161337990614c2c565b60405180910390fd5b6000826000016001846001018460405161339c9190614a31565b90815260200160405180910390205403815481106133b657fe5b906000526020600020906005020190508094505050505092915050565b60008060016020601f855101816133e657fe5b04019050600060016020601f885101816133fc57fe5b040190506040518781526020810160005b8381101561342e57806020028901518160200283015280600101905061340d565b50868360200282015260005b84811015613460578060200287015181856001010160200283015280600101905061343a565b50602082848601602002606001846000600c600019f1945050505050949350505050565b600061348e613b4e565b600060016020601f885101816134a057fe5b0401905060006020601f8601816134b357fe5b0490506040518881526020810160005b848110156134e457806020028a0151816020028301528060010190506134c3565b5083602002810188815287816020015283602002868660030160200285600a600019fa9650505050505094509492505050565b60008060016020601f8551018161352a57fe5b040190506040518481526020810160005b8381101561355c57806020028601518160200283015280600101905061353b565b50602082602085026040018460006011600019f1935050505092915050565b60008060016020601f8651018161358e57fe5b040190506040518581526020810160005b838110156135c057806020028701518160200283015280600101905061359f565b50846020840282015260208260208502604001846000600b600019f193505050509392505050565b60008060016020601f855101816135fb57fe5b040190506040518481526020810160005b8381101561362d57806020028601518160200283015280600101905061360c565b5060208260208502604001846000600e600019f1935050505092915050565b600080600060016020601f8651018161366157fe5b040190506040518581526020810160005b83811015613693578060200287015181602002830152806001019050613672565b506020826020850260200184600d600019fa9450815193505050509250929050565b6136bd613b73565b600060208301905060405180604001604052808451815260200182815250915050919050565b600080826000015161370785600001518660200151866000015187602001516137d4565b0190505b8360000151846020015101811161375157818060010192505082600001516137498560200151830386600001510383866000015187602001516137d4565b01905061370b565b5092915050565b613760613b73565b61376b8383836138af565b5092915050565b60608082600001516040519080825280601f01601f1916602001820160405280156137ac5781602001600182028038833980820191505090505b50905060006020820190506137ca818560200151866000015161394d565b8192505050919050565b600080849050600086851161389f576020851161385957600060018660200360080260020a031960001b905060008186511690506000878a8a0103905060008386511690505b82811461384b57818610613838578a8a0196505050505050506138a7565b858060010196505083865116905061381a565b8596505050505050506138a7565b60008585209050600091505b858803821161389d57600086842090508082141561388957839450505050506138a7565b600184019350508180600101925050613865565b505b868601925050505b949350505050565b6138b7613b73565b60006138d585600001518660200151866000015187602001516137d4565b90508460200151836020018181525050846020015181038360000181815250508460000151856020015101811415613917576000856000018181525050613942565b8360000151836000015101856000018181510391508181525050836000015181018560200181815250505b829150509392505050565b5b60208110613971578151835260208301925060208201915060208103905061394e565b60006001826020036101000a0390508019835116818551168181178652505050505050565b6040518060a001604052806060815260200160001515815260200160008152602001600060028111156139c557fe5b8152602001606081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613a1357805160ff1916838001178555613a41565b82800160010185558215613a41579182015b82811115613a40578251825591602001919060010190613a25565b5b509050613a4e9190613b8d565b5090565b82805482825590600052602060002090601f01602090048101928215613ae75791602002820160005b83821115613ab857835183826101000a81548160ff0219169083151502179055509260200192600101602081600001049283019260010302613a7b565b8015613ae55782816101000a81549060ff0219169055600101602081600001049283019260010302613ab8565b505b509050613af49190613bb2565b5090565b815481835581811115613b2557600502816005028360005260206000209182019101613b249190613be2565b5b505050565b5080546000825560050290600052602060002090810190613b4b9190613be2565b50565b6040518062100000016040528061800090602082028038833980820191505090505090565b604051806040016040528060008152602001600081525090565b613baf91905b80821115613bab576000816000905550600101613b93565b5090565b90565b613bdf91905b80821115613bdb57600081816101000a81549060ff021916905550600101613bb8565b5090565b90565b613c4e91905b80821115613c4a5760008082016000613c019190613c51565b6001820160006101000a81549060ff021916905560028201600090556003820160006101000a81549060ff0219169055600482016000613c419190613c99565b50600501613be8565b5090565b90565b50805460018160011615610100020316600290046000825580601f10613c775750613c96565b601f016020900490600052602060002090810190613c959190613b8d565b5b50565b50805460008255601f016020900490600052602060002090810190613cbe9190613b8d565b50565b600081359050613cd081615086565b92915050565b600081519050613ce581615086565b92915050565b600082601f830112613cfc57600080fd5b8135613d0f613d0a82614e74565b614e47565b91508082526020830160208301858383011115613d2b57600080fd5b613d36838284615026565b50505092915050565b600082601f830112613d5057600080fd5b8135613d63613d5e82614ea0565b614e47565b91508082526020830160208301858383011115613d7f57600080fd5b613d8a838284615026565b50505092915050565b600081359050613da28161509d565b92915050565b600060208284031215613dba57600080fd5b6000613dc884828501613cd6565b91505092915050565b60008060408385031215613de457600080fd5b6000613df285828601613cc1565b9250506020613e0385828601613d93565b9150509250929050565b600060208284031215613e1f57600080fd5b600082013567ffffffffffffffff811115613e3957600080fd5b613e4584828501613d3f565b91505092915050565b60008060408385031215613e6157600080fd5b600083013567ffffffffffffffff811115613e7b57600080fd5b613e8785828601613d3f565b9250506020613e9885828601613d93565b9150509250929050565b600080600060608486031215613eb757600080fd5b600084013567ffffffffffffffff811115613ed157600080fd5b613edd86828701613d3f565b9350506020613eee86828701613d93565b925050604084013567ffffffffffffffff811115613f0b57600080fd5b613f1786828701613ceb565b9150509250925092565b600080600060608486031215613f3657600080fd5b600084013567ffffffffffffffff811115613f5057600080fd5b613f5c86828701613d3f565b9350506020613f6d86828701613d93565b9250506040613f7e86828701613d93565b9150509250925092565b6000613f9483836140f6565b60208301905092915050565b6000613fac8383614105565b60208301905092915050565b6000613fc4838361497f565b905092915050565b6000613fd782614ef6565b613fe18185614f55565b9350613fec83614ecc565b8060005b8381101561401d5781516140048882613f88565b975061400f83614f2e565b925050600181019050613ff0565b5085935050505092915050565b61403381614f01565b61403d8184614f66565b925061404882614edc565b8060005b838110156140795781516140608782613fa0565b965061406b83614f3b565b92505060018101905061404c565b505050505050565b600061408c82614f0d565b6140968185614f71565b9350836020820285016140a885614ee6565b8060005b858110156140e457848403895281516140c58582613fb8565b94506140d083614f48565b925060208a019950506001810190506140ac565b50829750879550505050505092915050565b6140ff81614fc1565b82525050565b61410e81614fcd565b82525050565b61411d81615014565b82525050565b61412c81615014565b82525050565b600061413d82614f23565b6141478185614fa4565b9350614157818560208601615035565b80840191505092915050565b600061416e82614f18565b6141788185614f82565b9350614188818560208601615035565b61419181615068565b840191505092915050565b60006141a782614f18565b6141b18185614fa4565b93506141c1818560208601615035565b80840191505092915050565b60006141da601883614f93565b91507f496e636f7272656374206368756e6b20706f736974696f6e00000000000000006000830152602082019050919050565b600061421a601583614f93565b91507f4469726563746f7279206e6f74206372656174656400000000000000000000006000830152602082019050919050565b600061425a602483614f93565b91507f4e6f7420656e6f756768206d656d6f727920696e207468652046696c6573746f60008301527f72616765000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006142c0601b83614f93565b91507f48617368206861736e2774206265656e2063616c63756c6174656400000000006000830152602082019050919050565b6000614300601983614f93565b91507f4368756e6b20697320616c72656164792075706c6f61646564000000000000006000830152602082019050919050565b6000614340601683614f93565b91507f496e636f7272656374206368756e6b206c656e677468000000000000000000006000830152602082019050919050565b6000614380600f83614f93565b91507f46696c65206e6f742065786973747300000000000000000000000000000000006000830152602082019050919050565b60006143c0600e83614f93565b91507f496e76616c69642073656e6465720000000000000000000000000000000000006000830152602082019050919050565b6000614400601883614f93565b91507f4469726563746f7279206973206e6f742064656c6574656400000000000000006000830152602082019050919050565b6000614440601083614f93565b91507f46696c65206e6f742064656c65746564000000000000000000000000000000006000830152602082019050919050565b6000614480601383614f93565b91507f496e76616c69642073746f7261676550617468000000000000000000000000006000830152602082019050919050565b60006144c0600c83614f93565b91507f496e76616c6964207061746800000000000000000000000000000000000000006000830152602082019050919050565b6000614500600183614fa4565b91507f2e000000000000000000000000000000000000000000000000000000000000006000830152600182019050919050565b6000614540601683614f93565b91507f496e76616c6964206469726563746f7279206e616d65000000000000000000006000830152602082019050919050565b6000614580601583614f93565b91507f4368756e6b207761736e27742075706c6f6164656400000000000000000000006000830152602082019050919050565b60006145c0602683614f93565b91507f436f756c64206e6f742072657365727665206c657373207468616e207573656460008301527f20737061636500000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614626601683614f93565b91507f4469726563746f7279206973206e6f7420656d707479000000000000000000006000830152602082019050919050565b6000614666602383614f93565b91507f46696c65206861736e2774206265656e2075706c6f6164656420636f7272656360008301527f746c7900000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006146cc601183614f93565b91507f4368756e6b207761736e277420726561640000000000000000000000000000006000830152602082019050919050565b600061470c601883614f93565b91507f46696c656e616d652073686f756c64206265203c2032353600000000000000006000830152602082019050919050565b600061474c601f83614f93565b91507f46696c652073686f756c64206265206c657373207468616e20313030204d42006000830152602082019050919050565b600061478c600283614fa4565b91507f2e2e0000000000000000000000000000000000000000000000000000000000006000830152600282019050919050565b60006147cc601183614f93565b91507f4469726563746f72792069732066756c6c0000000000000000000000000000006000830152602082019050919050565b600061480c600e83614f93565b91507f46696c65206e6f7420666f756e640000000000000000000000000000000000006000830152602082019050919050565b600061484c601883614f93565b91507f46696c65206f72206469726563746f72792065786973747300000000000000006000830152602082019050919050565b600061488c601983614f93565b91507f4e6f7420656e6f756768207265736572766564207370616365000000000000006000830152602082019050919050565b60006148cc601883614f93565b91507f45564d206572726f7220696e2067657446696c6553697a6500000000000000006000830152602082019050919050565b600061490c601083614f93565b91507f46696c65206e6f742063726561746564000000000000000000000000000000006000830152602082019050919050565b600061494c601983614f93565b91507f46696c65206861736e2774206265656e2075706c6f61646564000000000000006000830152602082019050919050565b600060a083016000830151848203600086015261499c8282614163565b91505060208301516149b160208601826140f6565b5060408301516149c460408601826149fc565b5060608301516149d76060860182614114565b50608083015184820360808601526149ef8282613fcc565b9150508091505092915050565b614a058161500a565b82525050565b614a148161500a565b82525050565b6000614a26828461419c565b915081905092915050565b6000614a3d8284614132565b915081905092915050565b6000614a53826144f3565b9150819050919050565b6000614a688261477f565b9150819050919050565b60006210000082019050614a89600083018461402a565b92915050565b60006020820190508181036000830152614aa98184614081565b905092915050565b6000602082019050614ac66000830184614123565b92915050565b60006020820190508181036000830152614ae5816141cd565b9050919050565b60006020820190508181036000830152614b058161420d565b9050919050565b60006020820190508181036000830152614b258161424d565b9050919050565b60006020820190508181036000830152614b45816142b3565b9050919050565b60006020820190508181036000830152614b65816142f3565b9050919050565b60006020820190508181036000830152614b8581614333565b9050919050565b60006020820190508181036000830152614ba581614373565b9050919050565b60006020820190508181036000830152614bc5816143b3565b9050919050565b60006020820190508181036000830152614be5816143f3565b9050919050565b60006020820190508181036000830152614c0581614433565b9050919050565b60006020820190508181036000830152614c2581614473565b9050919050565b60006020820190508181036000830152614c45816144b3565b9050919050565b60006020820190508181036000830152614c6581614533565b9050919050565b60006020820190508181036000830152614c8581614573565b9050919050565b60006020820190508181036000830152614ca5816145b3565b9050919050565b60006020820190508181036000830152614cc581614619565b9050919050565b60006020820190508181036000830152614ce581614659565b9050919050565b60006020820190508181036000830152614d05816146bf565b9050919050565b60006020820190508181036000830152614d25816146ff565b9050919050565b60006020820190508181036000830152614d458161473f565b9050919050565b60006020820190508181036000830152614d65816147bf565b9050919050565b60006020820190508181036000830152614d85816147ff565b9050919050565b60006020820190508181036000830152614da58161483f565b9050919050565b60006020820190508181036000830152614dc58161487f565b9050919050565b60006020820190508181036000830152614de5816148bf565b9050919050565b60006020820190508181036000830152614e05816148ff565b9050919050565b60006020820190508181036000830152614e258161493f565b9050919050565b6000602082019050614e416000830184614a0b565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614e6a57600080fd5b8060405250919050565b600067ffffffffffffffff821115614e8b57600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614eb757600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050919050565b6000819050602082019050919050565b600081519050919050565b60006180009050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614fba82614fea565b9050919050565b60008115159050919050565b6000819050919050565b6000819050614fe582615079565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061501f82614fd7565b9050919050565b82818337600083830152505050565b60005b83811015615053578082015181840152602081019050615038565b83811115615062576000848401525b50505050565b6000601f19601f8301169050919050565b6003811061508357fe5b50565b61508f81614faf565b811461509a57600080fd5b50565b6150a68161500a565b81146150b157600080fd5b5056fea365627a7a72315820314a90e541327f2678eaf7815f54348c3702e4fa45cdf1d5595b378d08af86896c6578706572696d656e74616cf564736f6c634300050d0040", + "nonce": "0", + "storage": { + "0x0": "2868903936" + } + }, + "0x69bfcdcb98c9562e0a2faee3ecdfd65e8a0adb19": { + "balance": "1000000000000000000000000000000" + }, + "0x6a37ad7dceec4595eea9f03b82d2710e738343ac": { + "balance": "1000000000000000000000000000000" + }, + "0x6b806862a977a0e22ed1752f858e5332647121c8": { + "balance": "1000000000000000000000000000000" + }, + "0x6c0ef9084a57df13c175afea32ea47a510c5506e": { + "balance": "1000000000000000000000000000000" + }, + "0x6cd5e637266e18d3e888ee99451eb828c6b491f4": { + "balance": "1000000000000000000000000000000" + }, + "0x6d0d7f0ff51917bd84a5f7270d31a894282aaf4b": { + "balance": "1000000000000000000000000000000" + }, + "0x6d8092cb926daf29236f866cd31c327ff73323d1": { + "balance": "1000000000000000000000000000000" + }, + "0x6d80aAC61F6d92c7F4A3c412850474ba963B698E": { + "balance": "1000000000000000000000" + }, + "0x6fec280c0ab320715b17d70e8b02c2d4141c1372": { + "balance": "1000000000000000000000000000000" + }, + "0x733ad609ef2e742334d96266fbc13733f1cf5e4a": { + "balance": "1000000000000000000000000000000" + }, + "0x7525198d8cd1121d57358a0b0ed037e924581a76": { + "balance": "1000000000000000000000000000000" + }, + "0x765708943c3b791563d1e3f0533b6d7e7d769e4d": { + "balance": "1000000000000000000000000000000" + }, + "0x7685d04f0b7657017b77efa004a14ff9f022acab": { + "balance": "1000000000000000000000000000000" + }, + "0x76b545cb6a2fc671f741950eeb27627e69a1e69b": { + "balance": "1000000000000000000000000000000" + }, + "0x77a0bc73442d3d9cb993e8d9752f95babf0ccaa6": { + "balance": "1000000000000000000000000000000" + }, + "0x7a89A6c323FaCfF0ADeF7EEF3e491aD4044d0592": { + "balance": "100000000000000000000000" + }, + "0x7e7E68F04D1799Fa25C8cff57314c8a5d3942e69": { + "balance": "1000000000000000000000000" + }, + "0x811d701d14539d190a8593fe901eafe8eff511f5": { + "balance": "1000000000000000000000000000000" + }, + "0x81dcbd71da28fafb9ca99ff5a22bfcebba84fecc": { + "balance": "100000000000000000000000" + }, + "0x83c1479d2a32d9ed9fa699289b6c2db56b7cd045": { + "balance": "1000000000000000000000000000000" + }, + "0x85b33f0853ab8eaa4e602bdfd724d44bc2731e90": { + "balance": "1000000000000000000000000000000" + }, + "0x863f816036e3cbba90855196c9d1e339fcff1650": { + "balance": "1000000000000000000000000000000" + }, + "0x87ea381878572d63b3453033d7540abddd191186": { + "balance": "1000000000000000000000000000000" + }, + "0x88fd5e01078629cc194c933d9631b9448fe10b1d": { + "balance": "1000000000000000000000000000000" + }, + "0x8945e48bd056f45c8b57f9025d2674bb03a24035": { + "balance": "1000000000000000000000000000000" + }, + "0x8a920edc1021ce76c22774e0e83723a6e51c2439": { + "balance": "1000000000000000000000000000000" + }, + "0x8e6081e272c8f4d49f5b29157b52f68cbd6307ad": { + "balance": "1000000000000000000000000000000" + }, + "0x8fe24dbbf9884bd458d8cfac528b4ad70e82497d": { + "balance": "1000000000000000000000000000000" + }, + "0x90431f3f75b26657f74abbb5c759b12e78f916cc": { + "balance": "1000000000000000000000000000000" + }, + "0x907cd0881E50d359bb9Fd120B1A5A143b1C97De6": { + "balance": "1000000000000000000000000000000000000000000000000000000000" + }, + "0x94c6e5746971d6aebeaa42cbbe2feca0f6b5b24f": { + "balance": "1000000000000000000000000000000" + }, + "0x96672f9e982936e1904b15c948cc81bf18027db6": { + "balance": "1000000000000000000000000000000" + }, + "0x97b921ba45e0aa8830701aa62050a83ee00a1bb8": { + "balance": "1000000000000000000000000000000" + }, + "0x98e50c97baf98dc6a81bdb95067339a269a36fc1": { + "balance": "1000000000000000000000000000000" + }, + "0x9b77f28285a49601169a33332f08aa309d97edd0": { + "balance": "1000000000000000000000000000000" + }, + "0x9f62f4215cd277ca40dede101b4ccb29290de6bb": { + "balance": "1000000000000000000000000000000" + }, + "0xD1001000000000000000000000000000000000D1": { + "balance": "0", + "code": "0x608060405260043610603f576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680636d4ce63c146044575b600080fd5b348015604f57600080fd5b506056606c565b6040518082815260200191505060405180910390f35b60006001600060048152602001908152602001600020600060098152602001908152602001600020600101549050905600a165627a7a723058208fe64219becc0bcab1c8f854f05804ebb6bb555da5dbc49e8f7021c31d77636a0029", + "nonce": "0", + "storage": { + "0x3b4da637a1b0e6dbfc6795f2b7f0cb29eebb91b3af4dcc335e1633f6b4af810b": "1111" + } + }, + "0xD3001000000000000000000000000000000000D3": { + "balance": "0", + "code": "0x60806040526004361061007b5760003560e01c80639623609d1161004e5780639623609d1461013657806399a88ec4146101f5578063f2fde38b14610230578063f3b7dead146102635761007b565b8063204e1c7a14610080578063715018a6146100cf5780637eff275e146100e65780638da5cb5b14610121575b600080fd5b34801561008c57600080fd5b506100b3600480360360208110156100a357600080fd5b50356001600160a01b0316610296565b604080516001600160a01b039092168252519081900360200190f35b3480156100db57600080fd5b506100e4610328565b005b3480156100f257600080fd5b506100e46004803603604081101561010957600080fd5b506001600160a01b03813581169160200135166103ca565b34801561012d57600080fd5b506100b3610496565b6100e46004803603606081101561014c57600080fd5b6001600160a01b03823581169260208101359091169181019060608101604082013564010000000081111561018057600080fd5b82018360208201111561019257600080fd5b803590602001918460018302840111640100000000831117156101b457600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506104a5945050505050565b34801561020157600080fd5b506100e46004803603604081101561021857600080fd5b506001600160a01b03813581169160200135166105dd565b34801561023c57600080fd5b506100e46004803603602081101561025357600080fd5b50356001600160a01b031661068d565b34801561026f57600080fd5b506100b36004803603602081101561028657600080fd5b50356001600160a01b0316610785565b6000806060836001600160a01b03166040518080635c60da1b60e01b8152506004019050600060405180830381855afa9150503d80600081146102f5576040519150601f19603f3d011682016040523d82523d6000602084013e6102fa565b606091505b50915091508161030957600080fd5b80806020019051602081101561031e57600080fd5b5051949350505050565b6103306107e4565b6000546001600160a01b03908116911614610380576040805162461bcd60e51b8152602060048201819052602482015260008051602061080f833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6103d26107e4565b6000546001600160a01b03908116911614610422576040805162461bcd60e51b8152602060048201819052602482015260008051602061080f833981519152604482015290519081900360640190fd5b816001600160a01b0316638f283970826040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050600060405180830381600087803b15801561047a57600080fd5b505af115801561048e573d6000803e3d6000fd5b505050505050565b6000546001600160a01b031690565b6104ad6107e4565b6000546001600160a01b039081169116146104fd576040805162461bcd60e51b8152602060048201819052602482015260008051602061080f833981519152604482015290519081900360640190fd5b826001600160a01b0316634f1ef2863484846040518463ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561057357818101518382015260200161055b565b50505050905090810190601f1680156105a05780820380516001836020036101000a031916815260200191505b5093505050506000604051808303818588803b1580156105bf57600080fd5b505af11580156105d3573d6000803e3d6000fd5b5050505050505050565b6105e56107e4565b6000546001600160a01b03908116911614610635576040805162461bcd60e51b8152602060048201819052602482015260008051602061080f833981519152604482015290519081900360640190fd5b816001600160a01b0316633659cfe6826040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050600060405180830381600087803b15801561047a57600080fd5b6106956107e4565b6000546001600160a01b039081169116146106e5576040805162461bcd60e51b8152602060048201819052602482015260008051602061080f833981519152604482015290519081900360640190fd5b6001600160a01b03811661072a5760405162461bcd60e51b81526004018080602001828103825260268152602001806107e96026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000806060836001600160a01b031660405180806303e1469160e61b8152506004019050600060405180830381855afa9150503d80600081146102f5576040519150601f19603f3d011682016040523d82523d6000602084013e6102fa565b339056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a26469706673582212201d968ac32bef5562c6b4f1bd5d2f2a74c14d07ce008ca6fdc5a3bd0f5fc265f564736f6c63430006080033", + "nonce": "0", + "storage": { + "0x0": "0x907cd0881E50d359bb9Fd120B1A5A143b1C97De6" + } + }, + "0xD3002000000000000000000000000000000000D3": { + "balance": "0", + "code": "0x60806040526004361061004e5760003560e01c80633659cfe6146100655780634f1ef286146100985780635c60da1b146101185780638f28397014610149578063f851a4401461017c5761005d565b3661005d5761005b610191565b005b61005b610191565b34801561007157600080fd5b5061005b6004803603602081101561008857600080fd5b50356001600160a01b03166101ab565b61005b600480360360408110156100ae57600080fd5b6001600160a01b0382351691908101906040810160208201356401000000008111156100d957600080fd5b8201836020820111156100eb57600080fd5b8035906020019184600183028401116401000000008311171561010d57600080fd5b5090925090506101e5565b34801561012457600080fd5b5061012d610292565b604080516001600160a01b039092168252519081900360200190f35b34801561015557600080fd5b5061005b6004803603602081101561016c57600080fd5b50356001600160a01b03166102cf565b34801561018857600080fd5b5061012d610389565b6101996103ba565b6101a96101a461041a565b61043f565b565b6101b3610463565b6001600160a01b0316336001600160a01b031614156101da576101d581610488565b6101e2565b6101e2610191565b50565b6101ed610463565b6001600160a01b0316336001600160a01b031614156102855761020f83610488565b6000836001600160a01b031683836040518083838082843760405192019450600093509091505080830381855af49150503d806000811461026c576040519150601f19603f3d011682016040523d82523d6000602084013e610271565b606091505b505090508061027f57600080fd5b5061028d565b61028d610191565b505050565b600061029c610463565b6001600160a01b0316336001600160a01b031614156102c4576102bd61041a565b90506102cc565b6102cc610191565b90565b6102d7610463565b6001600160a01b0316336001600160a01b031614156101da576001600160a01b0381166103355760405162461bcd60e51b81526004018080602001828103825260368152602001806105876036913960400191505060405180910390fd5b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f61035e610463565b604080516001600160a01b03928316815291841660208301528051918290030190a16101d5816104c8565b6000610393610463565b6001600160a01b0316336001600160a01b031614156102c4576102bd610463565b3b151590565b6103c2610463565b6001600160a01b0316336001600160a01b031614156104125760405162461bcd60e51b81526004018080602001828103825260328152602001806105556032913960400191505060405180910390fd5b6101a96101a9565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b3660008037600080366000845af43d6000803e80801561045e573d6000f35b3d6000fd5b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b610491816104ec565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610355565b6104f5816103b4565b6105305760405162461bcd60e51b815260040180806020018281038252603b8152602001806105bd603b913960400191505060405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5556fe43616e6e6f742063616c6c2066616c6c6261636b2066756e6374696f6e2066726f6d207468652070726f78792061646d696e43616e6e6f74206368616e6765207468652061646d696e206f6620612070726f787920746f20746865207a65726f206164647265737343616e6e6f742073657420612070726f787920696d706c656d656e746174696f6e20746f2061206e6f6e2d636f6e74726163742061646472657373a26469706673582212206e221e2a3547bd97244b05ed46430b1b078ba097cb2a4e25ec3d79cf9ac9f02c64736f6c63430006080033", + "nonce": "0", + "storage": { + "0x0": "1000000", + "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0xD3003000000000000000000000000000000000D3", + "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "0xD3001000000000000000000000000000000000D3" + } + }, + "0xD3003000000000000000000000000000000000D3": { + "balance": "0", + "code": "0x608060405234801561001057600080fd5b50600436106100b45760003560e01c806379210e8e1161007157806379210e8e1461017757806381a8235a146101a757806385aeeb17146101c35780639a9a5593146101f3578063a99100541461020f578063b57321221461022b576100b4565b806307c6e7d3146100b9578063122f4fba146100d55780631c6ec7a9146101055780631cfe4e3b14610121578063373dedb41461013d57806361e46db51461015b575b600080fd5b6100d360048036036100ce9190810190613e94565b61025b565b005b6100ef60048036036100ea9190810190613e94565b610862565b6040516100fc9190614b38565b60405180910390f35b61011f600480360361011a9190810190613e94565b610ba1565b005b61013b60048036036101369190810190613e58565b610fce565b005b6101456111ec565b6040516101529190614eb3565b60405180910390f35b61017560048036036101709190810190613f29565b6111f6565b005b610191600480360361018c9190810190613fa8565b611456565b60405161019e9190614af9565b60405180910390f35b6101c160048036036101bc9190810190613e94565b611756565b005b6101dd60048036036101d89190810190613e94565b6118fb565b6040516101ea9190614b16565b60405180910390f35b61020d60048036036102089190810190613ed5565b611bfa565b005b61022960048036036102249190810190613e94565b612195565b005b61024560048036036102409190810190613e94565b612849565b6040516102529190614eb3565b60405180910390f35b6000339050606061026b83612ac9565b90506000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b825181101561037c576000826001018460018403815181106102d557fe5b60200260200101516040516102ea9190614aa1565b90815260200160405180910390205411610339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161033090614cb3565b60405180910390fd5b8160020183600183038151811061034c57fe5b60200260200101516040516103619190614aa1565b908152602001604051809103902091508060010190506102b7565b506060600183511161038e57846103a7565b8260018451038151811061039e57fe5b60200260200101515b9050600082600101826040516103bd9190614ab8565b9081526020016040518091039020541161040c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161040390614cb3565b60405180910390fd5b600082600201826040516104209190614ab8565b90815260200160405180910390206000018054905014610475576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161046c90614d33565b60405180910390fd5b60006104818587612cc9565b9050806104c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ba90614c53565b60405180910390fd5b6104cb613a4f565b836000016001856000018054905003815481106104e457fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156105965780601f1061056b57610100808354040283529160200191610596565b820191906000526020600020905b81548152906001019060200180831161057957829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff1660028111156105e257fe5b60028111156105ed57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561066557602002820191906000526020600020906000905b82829054906101000a900460ff1615158152602001906001019060208260000104928301926001038202915080841161062f5790505b50505050508152505090508084600001600186600101866040516106899190614ab8565b90815260200160405180910390205403815481106106a357fe5b906000526020600020906005020160008201518160000190805190602001906106cd929190613a8b565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561071c57fe5b0217905550608082015181600401908051906020019061073d929190613b0b565b5090505083600101836040516107539190614ab8565b9081526020016040518091039020548460010182600001516040516107789190614aa1565b9081526020016040518091039020819055506000846001018460405161079e9190614ab8565b908152602001604051809103902081905550836000018054806107bd57fe5b6001900381819060005260206000209060050201600080820160006107e29190613bb1565b6001820160006101000a81549060ff021916905560028201600090556003820160006101000a81549060ff02191690556004820160006108229190613bf9565b5050905583600201836040516108389190614ab8565b9081526020016040518091039020600080820160006108579190613c21565b505050505050505050565b600080606061087084612d2d565b91509150606061087f82612ac9565b90506000600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015610964576000826001018460018403815181106108e957fe5b60200260200101516040516108fe9190614aa1565b908152602001604051809103902054141561092157600095505050505050610b9c565b8160020183600183038151811061093457fe5b60200260200101516040516109499190614aa1565b908152602001604051809103902091508060010190506108cb565b5060606001835111610976578361098f565b8260018451038151811061098657fe5b60200260200101515b9050600082600101826040516109a59190614ab8565b90815260200160405180910390205414156109c857600095505050505050610b9c565b6109d0613a4f565b82600001600184600101846040516109e89190614ab8565b9081526020016040518091039020540381548110610a0257fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610ab45780601f10610a8957610100808354040283529160200191610ab4565b820191906000526020600020905b815481529060010190602001808311610a9757829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115610b0057fe5b6002811115610b0b57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015610b8357602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411610b4d5790505b5050505050815250509050806060015196505050505050505b919050565b600360009054906101000a900460ff16610be457612000600481905550621000006005819055506001600360006101000a81548160ff0219169083151502179055505b6000815111610c28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1f90614cb3565b60405180910390fd5b60003390506060610c3883612ac9565b90506000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015610d4957600082600101846001840381518110610ca257fe5b6020026020010151604051610cb79190614aa1565b90815260200160405180910390205411610d06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cfd90614cb3565b60405180910390fd5b81600201836001830381518110610d1957fe5b6020026020010151604051610d2e9190614aa1565b90815260200160405180910390209150806001019050610c84565b50600454816000018054905010610d95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8c90614dd3565b60405180910390fd5b60606001835111610da65784610dbf565b82600184510381518110610db657fe5b60200260200101515b905060008260010182604051610dd59190614ab8565b90815260200160405180910390205414610e24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1b90614e13565b60405180910390fd5b610e2d816130af565b610e6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6390614cd3565b60405180910390fd5b6000610e788587613190565b905080610eba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb190614b73565b60405180910390fd5b610ec2613a4f565b8281600001819052506000816020019015159081151581525050836000018190806001815401808255809150506001900390600052602060002090600502016000909190919091506000820151816000019080519060200190610f26929190613a8b565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff02191690836002811115610f7557fe5b02179055506080820151816004019080519060200190610f96929190613b0b565b50505083600001805490508460010184604051610fb39190614ab8565b90815260200160405180910390208190555050505050505050565b610fd66131f4565b73ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16148061103b57503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614155b61107a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107190614c33565b60405180910390fd5b80600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411156110fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f390614d13565b60405180910390fd5b60025460095482011115611145576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113c90614b93565b60405180910390fd5b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460096000828254039250508190555080600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550806009600082825401925050819055505050565b6000600254905090565b60003390506000611207828661328d565b90506001600281111561121657fe5b8160030160009054906101000a900460ff16600281111561123357fe5b14611273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126a90614df3565b60405180910390fd5b6000600554858161128057fe5b061480156112915750806002015484105b6112d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c790614b53565b60405180910390fd5b600554848260020154031080156112ed5750838160020154038351145b806112fa57506005548351145b611339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133090614bf3565b60405180910390fd5b6000151581600401600554868161134c57fe5b048154811061135757fe5b90600052602060002090602091828204019190069054906101000a900460ff161515146113b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b090614bd3565b60405180910390fd5b60006113c78387878761348c565b905080611409576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140090614cf3565b60405180910390fd5b600182600401600554878161141a57fe5b048154811061142557fe5b90600052602060002090602091828204019190066101000a81548160ff021916908315150217905550505050505050565b61145e613c45565b6000606061146b86612d2d565b91509150611477613a4f565b611481838361328d565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156115255780601f106114fa57610100808354040283529160200191611525565b820191906000526020600020905b81548152906001019060200180831161150857829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561157157fe5b600281111561157c57fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156115f457602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116115be5790505b505050505081525050905060028081111561160b57fe5b8160600151600281111561161b57fe5b1461165b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165290614e93565b60405180910390fd5b600554851115801561166d5750600085115b6116ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a390614bf3565b60405180910390fd5b806040015185870111156116f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ec90614b53565b60405180910390fd5b60006117038484898961353d565b80965081925050508061174b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174290614d73565b60405180910390fd5b505050509392505050565b60003390506000611767828461328d565b90506001600281111561177657fe5b8160030160009054906101000a900460ff16600281111561179357fe5b146117d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ca90614df3565b60405180910390fd5b60006001905060008260040180549050905060008090505b8181101561183e576000151584600401828154811061180657fe5b90600052602060002090602091828204019190069054906101000a900460ff161515141561183357600092505b8060010190506117eb565b508161187f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187690614d53565b60405180910390fd5b60028360030160006101000a81548160ff021916908360028111156118a057fe5b021790555060006118b185876135d0565b9050806118f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ea90614bb3565b60405180910390fd5b505050505050565b60606000606061190a84612d2d565b91509150606061191982612ac9565b90506000600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008090505b8251811015611a235760008260010184838151811061197f57fe5b60200260200101516040516119949190614aa1565b908152602001604051809103902054116119e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119da90614cb3565b60405180910390fd5b816002018382815181106119f357fe5b6020026020010151604051611a089190614aa1565b90815260200160405180910390209150806001019050611964565b5080600001805480602002602001604051908101604052809291908181526020016000905b82821015611beb57838290600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611b045780601f10611ad957610100808354040283529160200191611b04565b820191906000526020600020905b815481529060010190602001808311611ae757829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115611b5057fe5b6002811115611b5b57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015611bd357602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411611b9d5790505b50505050508152505081526020019060010190611a48565b50505050945050505050919050565b600360009054906101000a900460ff16611c3d57612000600481905550621000006005819055506001600360006101000a81548160ff0219169083151502179055505b60003390506305f5e100821115611c89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8090614db3565b60405180910390fd5b600660008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205483011115611d4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4390614e33565b60405180910390fd5b6060611d5784612ac9565b90506000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015611e6857600082600101846001840381518110611dc157fe5b6020026020010151604051611dd69190614aa1565b90815260200160405180910390205411611e25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1c90614cb3565b60405180910390fd5b81600201836001830381518110611e3857fe5b6020026020010151604051611e4d9190614aa1565b90815260200160405180910390209150806001019050611da3565b50600454816000018054905010611eb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eab90614dd3565b60405180910390fd5b60606001835111611ec55785611ede565b82600184510381518110611ed557fe5b60200260200101515b905060008260010182604051611ef49190614ab8565b90815260200160405180910390205414611f43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3a90614e13565b60405180910390fd5b611f4c816130af565b611f8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8290614d93565b60405180910390fd5b6000611f98858888613634565b905080611fda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd190614e73565b60405180910390fd5b6060600554600160055489010381611fee57fe5b0460405190808252806020026020018201604052801561201d5781602001602082028038833980820191505090505b509050836000016040518060a001604052808581526020016001151581526020018981526020016001600281111561205157fe5b8152602001838152509080600181540180825580915050600190039060005260206000209060050201600090919091909150600082015181600001908051906020019061209f929190613a8b565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff021916908360028111156120ee57fe5b0217905550608082015181600401908051906020019061210f929190613b0b565b5050508360000180549050846001018460405161212c9190614ab8565b90815260200160405180910390208190555086600760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505050505050505050565b60003390506121a2613a4f565b6121ac828461328d565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156122505780601f1061222557610100808354040283529160200191612250565b820191906000526020600020905b81548152906001019060200180831161223357829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561229c57fe5b60028111156122a757fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561231f57602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116122e95790505b50505050508152505090506000600281111561233757fe5b8160600151600281111561234757fe5b1415612388576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161237f90614c13565b60405180910390fd5b600061239483856136a1565b9050806123d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123cd90614c73565b60405180910390fd5b60606123e185612ac9565b90506000600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015612479578160020183600183038151811061244957fe5b602002602001015160405161245e9190614aa1565b9081526020016040518091039020915080600101905061242d565b50600060018260010186600001516040516124949190614aa1565b9081526020016040518091039020540390506124ae613a4f565b826000016001846000018054905003815481106124c757fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156125795780601f1061254e57610100808354040283529160200191612579565b820191906000526020600020905b81548152906001019060200180831161255c57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff1660028111156125c557fe5b60028111156125d057fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561264857602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116126125790505b50505050508152505090508083600001838154811061266357fe5b9060005260206000209060050201600082015181600001908051906020019061268d929190613a8b565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff021916908360028111156126dc57fe5b021790555060808201518160040190805190602001906126fd929190613b0b565b509050508260000180548061270e57fe5b6001900381819060005260206000209060050201600080820160006127339190613bb1565b6001820160006101000a81549060ff021916905560028201600090556003820160006101000a81549060ff02191690556004820160006127739190613bf9565b5050905582600101866000015160405161278d9190614aa1565b9081526020016040518091039020548360010182600001516040516127b29190614aa1565b90815260200160405180910390208190555060008360010187600001516040516127dc9190614aa1565b9081526020016040518091039020819055508560400151600760008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505050505050505050565b600080606061285784612d2d565b91509150612863613a4f565b61286d838361328d565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156129115780601f106128e657610100808354040283529160200191612911565b820191906000526020600020905b8154815290600101906020018083116128f457829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561295d57fe5b600281111561296857fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156129e057602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116129aa5790505b5050505050815250509050600160028111156129f857fe5b81606001516002811115612a0857fe5b1480612a2d5750600280811115612a1b57fe5b81606001516002811115612a2b57fe5b145b612a6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a6390614df3565b60405180910390fd5b6000612a788484613705565b809650819250505080612ac0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ab790614e53565b60405180910390fd5b50505050919050565b6060612ad3613c6a565b612adc8361376e565b9050612ae6613c6a565b612b246040518060400160405280600181526020017f2f0000000000000000000000000000000000000000000000000000000000000081525061376e565b905060606001612b3d838561379c90919063ffffffff16565b01604051908082528060200260200182016040528015612b7157816020015b6060815260200190600190039081612b5c5790505b50905060008090505b8151811015612bc257612b9e612b99848661381190919063ffffffff16565b61382b565b828281518110612baa57fe5b60200260200101819052508080600101915050612b7a565b50600081600183510381518110612bd557fe5b6020026020010151511415612c405780600182510381518110612bf457fe5b6020026020010160608152506001815103604051908082528060200260200182016040528015612c3857816020015b6060815260200190600190039081612c235790505b509350612c79565b8051604051908082528060200260200182016040528015612c7557816020015b6060815260200190600190039081612c605790505b5093505b60008090505b8451811015612cc057818181518110612c9457fe5b6020026020010151858281518110612ca857fe5b60200260200101819052508080600101915050612c7f565b50505050919050565b60008060016020601f85510181612cdc57fe5b040190506040518481526020810160005b83811015612d0e578060200286015181602002830152806001019050612ced565b50602082602085026040018460006010600019f1935050505092915050565b6000606060006028905080845111612d7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d7190614c93565b60405180910390fd5b6060816040519080825280601f01601f191660200182016040528015612daf5781602001600182028038833980820191505090505b50905060008090505b82811015612e1f57858181518110612dcc57fe5b602001015160f81c60f81b828281518110612de357fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050612db8565b50600080905060008090505b83811015612f4e576000838281518110612e4157fe5b602001015160f81c60f81b60f81c60ff16905060308110158015612e66575060398111155b80612e7f575060418110158015612e7e5750605a8111155b5b80612e98575060618110158015612e97575060668111155b5b612ed7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ece90614c93565b60405180910390fd5b60308110158015612ee9575060398111155b15612efa5760308103601084020192505b60418110158015612f0c5750605a8111155b15612f1d5760378103601084020192505b60618110158015612f2f575060668111155b15612f405760578103601084020192505b508080600101915050612e2b565b508094507f2f00000000000000000000000000000000000000000000000000000000000000868481518110612f7f57fe5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612fec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fe390614c93565b60405180910390fd5b6000600184885103039050806040519080825280601f01601f19166020018201604052801561302a5781602001600182028038833980820191505090505b50945060008090505b818110156130a5576000886001878401018151811061304e57fe5b602001015160f81c60f81b90508087838151811061306857fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350508080600101915050613033565b5050505050915091565b60006040516020016130c090614ae4565b60405160208183030381529060405280519060200120826040516020016130e79190614ab8565b604051602081830303815290604052805190602001201480613152575060405160200161311390614acf565b604051602081830303815290604052805190602001208260405160200161313a9190614ab8565b60405160208183030381529060405280519060200120145b8061315e575060008251145b1561316c576000905061318b565b60008251905060ff81111561318557600091505061318b565b60019150505b919050565b60008060016020601f855101816131a357fe5b040190506040518481526020810160005b838110156131d55780602002860151816020028301528060010190506131b4565b5060208260208502604001846000600f600019f1935050505092915050565b600073d2001000000000000000000000000000000000d273ffffffffffffffffffffffffffffffffffffffff166383e781fe6040518163ffffffff1660e01b815260040160206040518083038186803b15801561325057600080fd5b505afa158015613264573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506132889190810190613e2f565b905090565b6000606061329a83612ac9565b90506000600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b82518110156133ab5760008260010184600184038151811061330457fe5b60200260200101516040516133199190614aa1565b90815260200160405180910390205411613368576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161335f90614cb3565b60405180910390fd5b8160020183600183038151811061337b57fe5b60200260200101516040516133909190614aa1565b908152602001604051809103902091508060010190506132e6565b50606060018351116133bd57846133d6565b826001845103815181106133cd57fe5b60200260200101515b9050600082600101826040516133ec9190614ab8565b9081526020016040518091039020541161343b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161343290614cb3565b60405180910390fd5b600082600001600184600101846040516134559190614ab8565b908152602001604051809103902054038154811061346f57fe5b906000526020600020906005020190508094505050505092915050565b60008060016020601f8551018161349f57fe5b04019050600060016020601f885101816134b557fe5b040190506040518781526020810160005b838110156134e75780602002890151816020028301528060010190506134c6565b50868360200282015260005b8481101561351957806020028701518185600101016020028301528060010190506134f3565b50602082848601602002606001846000600c600019f1945050505050949350505050565b6000613547613c45565b600060016020601f8851018161355957fe5b0401905060006020601f86018161356c57fe5b0490506040518881526020810160005b8481101561359d57806020028a01518160200283015280600101905061357c565b5083602002810188815287816020015283602002868660030160200285600a600019fa9650505050505094509492505050565b60008060016020601f855101816135e357fe5b040190506040518481526020810160005b838110156136155780602002860151816020028301528060010190506135f4565b50602082602085026040018460006011600019f1935050505092915050565b60008060016020601f8651018161364757fe5b040190506040518581526020810160005b83811015613679578060200287015181602002830152806001019050613658565b50846020840282015260208260208502604001846000600b600019f193505050509392505050565b60008060016020601f855101816136b457fe5b040190506040518481526020810160005b838110156136e65780602002860151816020028301528060010190506136c5565b5060208260208502604001846000600e600019f1935050505092915050565b600080600060016020601f8651018161371a57fe5b040190506040518581526020810160005b8381101561374c57806020028701518160200283015280600101905061372b565b506020826020850260200184600d600019fa9450815193505050509250929050565b613776613c6a565b600060208301905060405180604001604052808451815260200182815250915050919050565b60008082600001516137c0856000015186602001518660000151876020015161388d565b0190505b8360000151846020015101811161380a578180600101925050826000015161380285602001518303866000015103838660000151876020015161388d565b0190506137c4565b5092915050565b613819613c6a565b613824838383613968565b5092915050565b60608082600001516040519080825280601f01601f1916602001820160405280156138655781602001600182028038833980820191505090505b50905060006020820190506138838185602001518660000151613a06565b8192505050919050565b6000808490506000868511613958576020851161391257600060018660200360080260020a031960001b905060008186511690506000878a8a0103905060008386511690505b828114613904578186106138f1578a8a019650505050505050613960565b85806001019650508386511690506138d3565b859650505050505050613960565b60008585209050600091505b85880382116139565760008684209050808214156139425783945050505050613960565b60018401935050818060010192505061391e565b505b868601925050505b949350505050565b613970613c6a565b600061398e856000015186602001518660000151876020015161388d565b905084602001518360200181815250508460200151810383600001818152505084600001518560200151018114156139d05760008560000181815250506139fb565b8360000151836000015101856000018181510391508181525050836000015181018560200181815250505b829150509392505050565b5b60208110613a2a5781518352602083019250602082019150602081039050613a07565b60006001826020036101000a0390508019835116818551168181178652505050505050565b6040518060a00160405280606081526020016000151581526020016000815260200160006002811115613a7e57fe5b8152602001606081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613acc57805160ff1916838001178555613afa565b82800160010185558215613afa579182015b82811115613af9578251825591602001919060010190613ade565b5b509050613b079190613c84565b5090565b82805482825590600052602060002090601f01602090048101928215613ba05791602002820160005b83821115613b7157835183826101000a81548160ff0219169083151502179055509260200192600101602081600001049283019260010302613b34565b8015613b9e5782816101000a81549060ff0219169055600101602081600001049283019260010302613b71565b505b509050613bad9190613ca9565b5090565b50805460018160011615610100020316600290046000825580601f10613bd75750613bf6565b601f016020900490600052602060002090810190613bf59190613c84565b5b50565b50805460008255601f016020900490600052602060002090810190613c1e9190613c84565b50565b5080546000825560050290600052602060002090810190613c429190613cd9565b50565b6040518062100000016040528061800090602082028038833980820191505090505090565b604051806040016040528060008152602001600081525090565b613ca691905b80821115613ca2576000816000905550600101613c8a565b5090565b90565b613cd691905b80821115613cd257600081816101000a81549060ff021916905550600101613caf565b5090565b90565b613d4591905b80821115613d415760008082016000613cf89190613bb1565b6001820160006101000a81549060ff021916905560028201600090556003820160006101000a81549060ff0219169055600482016000613d389190613bf9565b50600501613cdf565b5090565b90565b600081359050613d578161510d565b92915050565b600081519050613d6c8161510d565b92915050565b600082601f830112613d8357600080fd5b8135613d96613d9182614efb565b614ece565b91508082526020830160208301858383011115613db257600080fd5b613dbd8382846150ad565b50505092915050565b600082601f830112613dd757600080fd5b8135613dea613de582614f27565b614ece565b91508082526020830160208301858383011115613e0657600080fd5b613e118382846150ad565b50505092915050565b600081359050613e2981615124565b92915050565b600060208284031215613e4157600080fd5b6000613e4f84828501613d5d565b91505092915050565b60008060408385031215613e6b57600080fd5b6000613e7985828601613d48565b9250506020613e8a85828601613e1a565b9150509250929050565b600060208284031215613ea657600080fd5b600082013567ffffffffffffffff811115613ec057600080fd5b613ecc84828501613dc6565b91505092915050565b60008060408385031215613ee857600080fd5b600083013567ffffffffffffffff811115613f0257600080fd5b613f0e85828601613dc6565b9250506020613f1f85828601613e1a565b9150509250929050565b600080600060608486031215613f3e57600080fd5b600084013567ffffffffffffffff811115613f5857600080fd5b613f6486828701613dc6565b9350506020613f7586828701613e1a565b925050604084013567ffffffffffffffff811115613f9257600080fd5b613f9e86828701613d72565b9150509250925092565b600080600060608486031215613fbd57600080fd5b600084013567ffffffffffffffff811115613fd757600080fd5b613fe386828701613dc6565b9350506020613ff486828701613e1a565b925050604061400586828701613e1a565b9150509250925092565b600061401b838361417d565b60208301905092915050565b6000614033838361418c565b60208301905092915050565b600061404b8383614a06565b905092915050565b600061405e82614f7d565b6140688185614fdc565b935061407383614f53565b8060005b838110156140a457815161408b888261400f565b975061409683614fb5565b925050600181019050614077565b5085935050505092915050565b6140ba81614f88565b6140c48184614fed565b92506140cf82614f63565b8060005b838110156141005781516140e78782614027565b96506140f283614fc2565b9250506001810190506140d3565b505050505050565b600061411382614f94565b61411d8185614ff8565b93508360208202850161412f85614f6d565b8060005b8581101561416b578484038952815161414c858261403f565b945061415783614fcf565b925060208a01995050600181019050614133565b50829750879550505050505092915050565b61418681615048565b82525050565b61419581615054565b82525050565b6141a48161509b565b82525050565b6141b38161509b565b82525050565b60006141c482614faa565b6141ce818561502b565b93506141de8185602086016150bc565b80840191505092915050565b60006141f582614f9f565b6141ff8185615009565b935061420f8185602086016150bc565b614218816150ef565b840191505092915050565b600061422e82614f9f565b614238818561502b565b93506142488185602086016150bc565b80840191505092915050565b600061426160188361501a565b91507f496e636f7272656374206368756e6b20706f736974696f6e00000000000000006000830152602082019050919050565b60006142a160158361501a565b91507f4469726563746f7279206e6f74206372656174656400000000000000000000006000830152602082019050919050565b60006142e160248361501a565b91507f4e6f7420656e6f756768206d656d6f727920696e207468652046696c6573746f60008301527f72616765000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614347601b8361501a565b91507f48617368206861736e2774206265656e2063616c63756c6174656400000000006000830152602082019050919050565b600061438760198361501a565b91507f4368756e6b20697320616c72656164792075706c6f61646564000000000000006000830152602082019050919050565b60006143c760168361501a565b91507f496e636f7272656374206368756e6b206c656e677468000000000000000000006000830152602082019050919050565b6000614407600f8361501a565b91507f46696c65206e6f742065786973747300000000000000000000000000000000006000830152602082019050919050565b6000614447600e8361501a565b91507f496e76616c69642073656e6465720000000000000000000000000000000000006000830152602082019050919050565b600061448760188361501a565b91507f4469726563746f7279206973206e6f742064656c6574656400000000000000006000830152602082019050919050565b60006144c760108361501a565b91507f46696c65206e6f742064656c65746564000000000000000000000000000000006000830152602082019050919050565b600061450760138361501a565b91507f496e76616c69642073746f7261676550617468000000000000000000000000006000830152602082019050919050565b6000614547600c8361501a565b91507f496e76616c6964207061746800000000000000000000000000000000000000006000830152602082019050919050565b600061458760018361502b565b91507f2e000000000000000000000000000000000000000000000000000000000000006000830152600182019050919050565b60006145c760168361501a565b91507f496e76616c6964206469726563746f7279206e616d65000000000000000000006000830152602082019050919050565b600061460760158361501a565b91507f4368756e6b207761736e27742075706c6f6164656400000000000000000000006000830152602082019050919050565b600061464760268361501a565b91507f436f756c64206e6f742072657365727665206c657373207468616e207573656460008301527f20737061636500000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006146ad60168361501a565b91507f4469726563746f7279206973206e6f7420656d707479000000000000000000006000830152602082019050919050565b60006146ed60238361501a565b91507f46696c65206861736e2774206265656e2075706c6f6164656420636f7272656360008301527f746c7900000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061475360118361501a565b91507f4368756e6b207761736e277420726561640000000000000000000000000000006000830152602082019050919050565b600061479360188361501a565b91507f46696c656e616d652073686f756c64206265203c2032353600000000000000006000830152602082019050919050565b60006147d3601f8361501a565b91507f46696c652073686f756c64206265206c657373207468616e20313030204d42006000830152602082019050919050565b600061481360028361502b565b91507f2e2e0000000000000000000000000000000000000000000000000000000000006000830152600282019050919050565b600061485360118361501a565b91507f4469726563746f72792069732066756c6c0000000000000000000000000000006000830152602082019050919050565b6000614893600e8361501a565b91507f46696c65206e6f7420666f756e640000000000000000000000000000000000006000830152602082019050919050565b60006148d360188361501a565b91507f46696c65206f72206469726563746f72792065786973747300000000000000006000830152602082019050919050565b600061491360198361501a565b91507f4e6f7420656e6f756768207265736572766564207370616365000000000000006000830152602082019050919050565b600061495360188361501a565b91507f45564d206572726f7220696e2067657446696c6553697a6500000000000000006000830152602082019050919050565b600061499360108361501a565b91507f46696c65206e6f742063726561746564000000000000000000000000000000006000830152602082019050919050565b60006149d360198361501a565b91507f46696c65206861736e2774206265656e2075706c6f61646564000000000000006000830152602082019050919050565b600060a0830160008301518482036000860152614a2382826141ea565b9150506020830151614a38602086018261417d565b506040830151614a4b6040860182614a83565b506060830151614a5e606086018261419b565b5060808301518482036080860152614a768282614053565b9150508091505092915050565b614a8c81615091565b82525050565b614a9b81615091565b82525050565b6000614aad8284614223565b915081905092915050565b6000614ac482846141b9565b915081905092915050565b6000614ada8261457a565b9150819050919050565b6000614aef82614806565b9150819050919050565b60006210000082019050614b1060008301846140b1565b92915050565b60006020820190508181036000830152614b308184614108565b905092915050565b6000602082019050614b4d60008301846141aa565b92915050565b60006020820190508181036000830152614b6c81614254565b9050919050565b60006020820190508181036000830152614b8c81614294565b9050919050565b60006020820190508181036000830152614bac816142d4565b9050919050565b60006020820190508181036000830152614bcc8161433a565b9050919050565b60006020820190508181036000830152614bec8161437a565b9050919050565b60006020820190508181036000830152614c0c816143ba565b9050919050565b60006020820190508181036000830152614c2c816143fa565b9050919050565b60006020820190508181036000830152614c4c8161443a565b9050919050565b60006020820190508181036000830152614c6c8161447a565b9050919050565b60006020820190508181036000830152614c8c816144ba565b9050919050565b60006020820190508181036000830152614cac816144fa565b9050919050565b60006020820190508181036000830152614ccc8161453a565b9050919050565b60006020820190508181036000830152614cec816145ba565b9050919050565b60006020820190508181036000830152614d0c816145fa565b9050919050565b60006020820190508181036000830152614d2c8161463a565b9050919050565b60006020820190508181036000830152614d4c816146a0565b9050919050565b60006020820190508181036000830152614d6c816146e0565b9050919050565b60006020820190508181036000830152614d8c81614746565b9050919050565b60006020820190508181036000830152614dac81614786565b9050919050565b60006020820190508181036000830152614dcc816147c6565b9050919050565b60006020820190508181036000830152614dec81614846565b9050919050565b60006020820190508181036000830152614e0c81614886565b9050919050565b60006020820190508181036000830152614e2c816148c6565b9050919050565b60006020820190508181036000830152614e4c81614906565b9050919050565b60006020820190508181036000830152614e6c81614946565b9050919050565b60006020820190508181036000830152614e8c81614986565b9050919050565b60006020820190508181036000830152614eac816149c6565b9050919050565b6000602082019050614ec86000830184614a92565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614ef157600080fd5b8060405250919050565b600067ffffffffffffffff821115614f1257600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614f3e57600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050919050565b6000819050602082019050919050565b600081519050919050565b60006180009050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061504182615071565b9050919050565b60008115159050919050565b6000819050919050565b600081905061506c82615100565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006150a68261505e565b9050919050565b82818337600083830152505050565b60005b838110156150da5780820151818401526020810190506150bf565b838111156150e9576000848401525b50505050565b6000601f19601f8301169050919050565b6003811061510a57fe5b50565b61511681615036565b811461512157600080fd5b50565b61512d81615091565b811461513857600080fd5b5056fea2646970667358221220a549ad9e778ae8bb3048c0a1805e77745871cc1560637ae1c3ebccb76638d9c464736f6c63430006020033", + "nonce": "0", + "storage": {} + }, + "0xa096b05a489831db893fc53aacc7ed20efb36382": { + "balance": "1000000000000000000000000000000" + }, + "0xa1cd651d99283be60e2a9d2e3bc8a90aedb8244f": { + "balance": "1000000000000000000000000000000" + }, + "0xa2969e82619021ea407338f8bdf7c6f2bd679673": { + "balance": "1000000000000000000000000000000" + }, + "0xa3597b1162b6559cb5e966904b63e762ece756a4": { + "balance": "1000000000000000000000000000000" + }, + "0xa68f946090c600eda6f139783077ee802afeb990": { + "balance": "1000000000000000000000000000000" + }, + "0xa6d50055592cecb795bc1ed3b9ea57ed426b0b7c": { + "balance": "1000000000000000000000000000000" + }, + "0xa7c0789bdeee38c6b59111a789dfb6b815489847": { + "balance": "1000000000000000000000000000000" + }, + "0xa8c813ee806b4c8537ff5f16084d44db18ea9ab1": { + "balance": "1000000000000000000000000000000" + }, + "0xaa6a87bbb74bc1f3cb40c1efb7fc171ee6407560": { + "balance": "1000000000000000000000000000000" + }, + "0xabf920b89f5a2487fdb70be17fd01a99a0602e62": { + "balance": "1000000000000000000000000000000" + }, + "0xac5df92da5171ba24a9618018b4f79494040334b": { + "balance": "1000000000000000000000000000000" + }, + "0xaf97a8318a1a51d5daeeb9650024b63ee44f45bd": { + "balance": "1000000000000000000000000000000" + }, + "0xb28c45b98ae43a5e9ee5509c97ea037b5de5d6d9": { + "balance": "1000000000000000000000000000000" + }, + "0xb64989ab32b089da3da103b93e6781d6d5dd10b4": { + "balance": "1000000000000000000000000000000" + }, + "0xb67e6f4a21f93c250fa6ff0cb142bd14dd4ca8eb": { + "balance": "1000000000000000000000000000000" + }, + "0xb70603c505f85130b5b2e73cd82d196dfd7d8b5e": { + "balance": "1000000000000000000000000000000" + }, + "0xb942414cae2a1ab1056657b905845c0ab6b6280a": { + "balance": "1000000000000000000000000000000" + }, + "0xbee0e5c1961d51be9bd670876caa9c90ba7d9016": { + "balance": "1000000000000000000000000000000" + }, + "0xbf2d8cebdeeb8ad8fed7b2a75f35922106f8d75c": { + "balance": "1000000000000000000000000000000" + }, + "0xbf5aa678b969c0871e2fbcf09c3dbb5d5865ac1e": { + "balance": "1000000000000000000000000000000" + }, + "0xc12bcedd9bcad9120150122cd50f39576ecccc08": { + "balance": "1000000000000000000000000000000" + }, + "0xc2d3852f3292acb81bd164dbae5f1e2a87535150": { + "balance": "1000000000000000000000000000000" + }, + "0xc3820490201e94d76b44655d2df713fec29d9795": { + "balance": "1000000000000000000000000000000" + }, + "0xc58744e2eceefd45cc5469f0e0a708ad24ddbbdb": { + "balance": "1000000000000000000000000000000" + }, + "0xc7865200e8e51ba1c8d695f327deed432930f2cc": { + "balance": "1000000000000000000000000000000" + }, + "0xc8e4d709eb3eb335dc69c9fbf2d24d447cb86105": { + "balance": "1000000000000000000000000000000" + }, + "0xc98af661e44c5bf31d2f8bdff4bbf2808ed4e991": { + "balance": "1000000000000000000000000000000" + }, + "0xca4409573a5129a72edf85d6c51e26760fc9c903": { + "balance": "100000000000000000000000" + }, + "0xcc33e23b04b74f7ba8fbe315083182224af973fa": { + "balance": "1000000000000000000000000000000" + }, + "0xce1c62d0a77600fb2f959b4da76fcb9b3b9430a3": { + "balance": "1000000000000000000000000000000" + }, + "0xd1b6c947fb14060b38945584714491592e84875d": { + "balance": "1000000000000000000000000000000" + }, + "0xd23cd6a9ddcc3470300003621bbac1e06a7919d5": { + "balance": "1000000000000000000000000000000" + }, + "0xd2c5b39B4e735C17612Bb5a08FD024ccc5dBCb23": { + "balance": "100000000000000000000000" + }, + "0xd2cd302eb060e375a65d65946692a3ac2d838d35": { + "balance": "1000000000000000000000000000000" + }, + "0xd2e75c41ced8699e3176f6e335355701a2568b7b": { + "balance": "1000000000000000000000000000000" + }, + "0xd3d38f4cb0aeb4c7c2527ddaeec2ab3b910c8528": { + "balance": "1000000000000000000000000000000" + }, + "0xd5b561a27cca5049650a14ab93dbf1a20c0cefc1": { + "balance": "1000000000000000000000000000000" + }, + "0xd90045420b8abc37b3f9304ed2b385fc1b7fa8c5": { + "balance": "1000000000000000000000000000000" + }, + "0xd951bf4cff429062702a7d8699a5f0bf14845d9b": { + "balance": "1000000000000000000000000000000" + }, + "0xdc6a269c58e58a93a22b5df8cdf1af630c47481f": { + "balance": "1000000000000000000000000000000" + }, + "0xdc6d02ef4003a4f2d0ccff65ae1a2d8157fbb23e": { + "balance": "1000000000000000000000000000000" + }, + "0xde14aca36acc62c305a7ee571da37840a408e600": { + "balance": "1000000000000000000000000000000" + }, + "0xdee32ae508cf783f53ab8bc39d878fe323cdfae3": { + "balance": "1000000000000000000000000000000" + }, + "0xe083a100d51fc4f38aae4a3a68404c36ad96c612": { + "balance": "1000000000000000000000000000000" + }, + "0xe1607990ce800407e3c206e58de4917977181d4d": { + "balance": "1000000000000000000000000000000" + }, + "0xe25e5b63dfd4cf59b81eddf64f1195858634b8a6": { + "balance": "1000000000000000000000000000000" + }, + "0xe372377decb3bdc0c7f5272d38ce0ba2a54934fe": { + "balance": "1000000000000000000000000000000" + }, + "0xe3cc6ec63b5652d1594bc63bb293f4e80f76dbdd": { + "balance": "1000000000000000000000000000000" + }, + "0xe3da7c014286258944ab20a31e4d861b4c9262f1": { + "balance": "1000000000000000000000000000000" + }, + "0xe8b57f330d56081c856e618210fbedb414925ff0": { + "balance": "1000000000000000000000000000000" + }, + "0xe91ac72a568e752eb7c9f5235100586ce97c8cc1": { + "balance": "1000000000000000000000000000000" + }, + "0xf184c8c243a178c1748a0af45caedeca476105b4": { + "balance": "1000000000000000000000000000000" + }, + "0xf1a5912ff318aebf312cdb54c75642a9e632703c": { + "balance": "1000000000000000000000000000000" + }, + "0xf2197b153b4c9086fc5410431fbf7960d284c65e": { + "balance": "1000000000000000000000000000000" + }, + "0xf36620e71327f4a55d550d46e030ccf0c728f154": { + "balance": "1000000000000000000000000000000" + }, + "0xf9817fB82fc767aA9A4A97a1901676244b88ce0E": { + "balance": "100000000000000000000000" + }, + "0xfa723938fa8da1a8a2114ad409a11581761ee40d": { + "balance": "1000000000000000000000000000000" + }, + "0xfa7a8c69810eaf16a395d2a93b3ab51efeed2a1c": { + "balance": "1000000000000000000000000000000" + }, + "0xfaa1038074941571524934ba52d312e88b3577f5": { + "balance": "1000000000000000000000000000000" + }, + "0xfe14077c26a507496b7208384d459e21c49c4212": { + "balance": "1000000000000000000000000000000" + }, + "0xfe275c9b5ac792327da509b27eb9614196dfb07d": { + "balance": "1000000000000000000000000000000" + }, + "0xfe2c5aa110fff89361806ea7ee080bfffba0d3dd": { + "balance": "1000000000000000000000000000000" + }, + "0xfe3d4f1fc038f4f756ba44995129cd45c9e0e861": { + "balance": "1000000000000000000000000000000" + }, + "0xfee314cdc84ecfaa675e41b3559c0101e1eba6b8": { + "balance": "1000000000000000000000000000000" + } + }, + "genesis": { + "author": "0x0000000000000000000000000000000000000001", + "difficulty": "0x0", + "extraData": "0x11bbe8db4e347b4e8c937c1c8370e4b5ed33adb3db69cbdb7a38e1e50b1b82fa", + "gasLimit": "0xFFFFFFFFF", + "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000abc", + "nonce": "0x0000000000000042", + "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "timestamp": "0x00" + }, + "params": { + "EIP150ForkBlock": "0x00", + "EIP158ForkBlock": "0x00", + "accountStartNonce": "0x00", + "blockReward": "0x4563918244F40000", + "byzantiumForkBlock": "0x0", + "chainID": "0x12345", + "constantinopleForkBlock": "0x0", + "daoHardforkBlock": "0x0", + "difficultyBoundDivisor": "0x0800", + "durationLimit": "0x0d", + "externalGasDifficulty": "0x01", + "gasLimitBoundDivisor": "0x0400", + "homesteadForkBlock": "0x0", + "maxGasLimit": "0xFFFFFFFFF", + "maximumExtraDataSize": "0x20", + "minGasLimit": "0xFFFFFFFFF", + "minimumDifficulty": "0x0", + "networkID": "12313219", + "tieBreakingGas": false + }, + "sealEngine": "Ethash", + "skaleConfig": { + "nodeInfo": { + "basePort": 1331, + "bindIP": "0.0.0.0", + "collectionDuration": 10, + "collectionQueueSize": 2, + "db-path": "/tmp/test_eth_2_of_16", + "ecdsaKeyName": "", + "httpRpcPort": 1334, + "httpsRpcPort": 1239, + "logLevel": "info", + "logLevelProposal": "info", + "maxCacheSize": 2000, + "maxOpenLeveldbFiles": 25, + "minCacheSize": 1000, + "nodeID": 1602, + "nodeName": "Node1", + "rotateAfterBlock": 0, + "testSignatures": true, + "transactionQueueSize": 10000, + "wsRpcPort": 1333, + "wssRpcPort": 1338 + }, + "sChain": { + "EIP1559TransactionsPatchTimestamp": 1, + "contractStorageLimit": 10000000000, + "contractStoragePatchTimestamp": 1, + "contractStorageZeroValuePatchTimestamp": 1, + "correctForkInPowPatchTimestamp": 1, + "emptyBlockIntervalMs": 10000, + "fastConsensusPatchTimestamp": 1, + "flexibleDeploymentPatchTimestamp": 1, + "levelDBReopenIntervalMs": 1, + "multiTransactionMode": false, + "nodes": [ + { + "basePort": 1231, + "ip": "127.0.0.1", + "nodeID": 1601, + "publicKey": "", + "schainIndex": 1 + }, + { + "basePort": 1331, + "ip": "127.0.0.1", + "nodeID": 1602, + "publicKey": "", + "schainIndex": 2 + }, + { + "basePort": 1431, + "ip": "127.0.0.1", + "nodeID": 1603, + "publicKey": "", + "schainIndex": 3 + }, + { + "basePort": 1531, + "ip": "127.0.0.1", + "nodeID": 1604, + "publicKey": "", + "schainIndex": 4 + }, + { + "basePort": 1631, + "ip": "127.0.0.1", + "nodeID": 1605, + "publicKey": "", + "schainIndex": 5 + }, + { + "basePort": 1731, + "ip": "127.0.0.1", + "nodeID": 1606, + "publicKey": "", + "schainIndex": 6 + }, + { + "basePort": 1831, + "ip": "127.0.0.1", + "nodeID": 1607, + "publicKey": "", + "schainIndex": 7 + }, + { + "basePort": 1931, + "ip": "127.0.0.1", + "nodeID": 1608, + "publicKey": "", + "schainIndex": 8 + }, + { + "basePort": 2031, + "ip": "127.0.0.1", + "nodeID": 1609, + "publicKey": "", + "schainIndex": 9 + }, + { + "basePort": 2131, + "ip": "127.0.0.1", + "nodeID": 1610, + "publicKey": "", + "schainIndex": 10 + }, + { + "basePort": 2231, + "ip": "127.0.0.1", + "nodeID": 1611, + "publicKey": "", + "schainIndex": 11 + }, + { + "basePort": 2331, + "ip": "127.0.0.1", + "nodeID": 1612, + "publicKey": "", + "schainIndex": 12 + }, + { + "basePort": 2431, + "ip": "127.0.0.1", + "nodeID": 1613, + "publicKey": "", + "schainIndex": 13 + }, + { + "basePort": 2531, + "ip": "127.0.0.1", + "nodeID": 1614, + "publicKey": "", + "schainIndex": 14 + }, + { + "basePort": 2631, + "ip": "127.0.0.1", + "nodeID": 1615, + "publicKey": "", + "schainIndex": 15 + }, + { + "basePort": 2731, + "ip": "127.0.0.1", + "nodeID": 1616, + "publicKey": "", + "schainIndex": 16 + } + ], + "powCheckPatchTimestamp": 1, + "precompiledConfigPatchTimestamp": 1, + "pushZeroPatchTimestamp": 1, + "revertableFSPatchTimestamp": 1, + "schainID": 5, + "schainName": "TestChain", + "schainOwner": "0x907cd0881E50d359bb9Fd120B1A5A143b1C97De6", + "skipInvalidTransactionsPatchTimestamp": 1, + "storageDestructionPatchTimestamp": 1, + "verifyBlsSyncPatchTimestamp": 1, + "verifyDaSigsPatchTimestamp": 1 + } + }, + "unddos": { + "origins": [ + { + "ban_lengthy": 0, + "ban_peak": 0, + "max_calls_per_minute": 1000000000, + "max_calls_per_second": 1000000000, + "max_ws_conn": 65535, + "origin": [ + "*" + ] + } + ] + } +} \ No newline at end of file diff --git a/test/historicstate/configs/test_2_of_4.json b/test/historicstate/configs/test_2_of_4.json new file mode 100644 index 000000000..019205a01 --- /dev/null +++ b/test/historicstate/configs/test_2_of_4.json @@ -0,0 +1,826 @@ +{ + "accounts": { + "0000000000000000000000000000000000000001": { + "precompiled": { + "linear": { + "base": 3000, + "word": 0 + }, + "name": "ecrecover" + } + }, + "0000000000000000000000000000000000000002": { + "precompiled": { + "linear": { + "base": 60, + "word": 12 + }, + "name": "sha256" + } + }, + "0000000000000000000000000000000000000003": { + "precompiled": { + "linear": { + "base": 600, + "word": 120 + }, + "name": "ripemd160" + } + }, + "0000000000000000000000000000000000000004": { + "precompiled": { + "linear": { + "base": 15, + "word": 3 + }, + "name": "identity" + } + }, + "0000000000000000000000000000000000000005": { + "precompiled": { + "name": "modexp", + "startingBlock": "0x2dc6c0" + } + }, + "0000000000000000000000000000000000000006": { + "precompiled": { + "linear": { + "base": 500, + "word": 0 + }, + "name": "alt_bn128_G1_add", + "startingBlock": "0x2dc6c0" + } + }, + "0000000000000000000000000000000000000007": { + "precompiled": { + "linear": { + "base": 40000, + "word": 0 + }, + "name": "alt_bn128_G1_mul", + "startingBlock": "0x2dc6c0" + } + }, + "0000000000000000000000000000000000000008": { + "precompiled": { + "name": "alt_bn128_pairing_product", + "startingBlock": "0x2dc6c0" + } + }, + "000000000000000000000000000000000000000A": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "readChunk", + "startingBlock": "0x0" + } + }, + "000000000000000000000000000000000000000B": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "createFile", + "restrictAccess": [ + "69362535ec535F0643cBf62D16aDeDCAf32Ee6F7" + ], + "startingBlock": "0x0" + } + }, + "000000000000000000000000000000000000000C": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "uploadChunk", + "startingBlock": "0x0" + } + }, + "000000000000000000000000000000000000000D": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "getFileSize", + "startingBlock": "0x0" + } + }, + "000000000000000000000000000000000000000E": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "deleteFile", + "startingBlock": "0x0" + } + }, + "000000000000000000000000000000000000000F": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "createDirectory", + "startingBlock": "0x0" + } + }, + "0000000000000000000000000000000000000010": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "deleteDirectory", + "startingBlock": "0x0" + } + }, + "0x006d8e49ce0b9eb5646e34a4d91934801b9044fd": { + "balance": "1000000000000000000000000000000" + }, + "0x0150b461b06922a5030784ba888962c28bb1f188": { + "balance": "1000000000000000000000000000000" + }, + "0x03309956988ae70152ae4469daf99b0cac2306c5": { + "balance": "1000000000000000000000000000000" + }, + "0x06104a85a380895b6dd4030113806df2b044905e": { + "balance": "1000000000000000000000000000000" + }, + "0x079cf317ef40b16141784b6fabff812d64f7c0fd": { + "balance": "1000000000000000000000000000000" + }, + "0x0966454f51166c68b73b2865473c8fb2fcdefdd5": { + "balance": "1000000000000000000000000000000" + }, + "0x099452fedc71897880f584b1bc1706efc4e76e36": { + "balance": "1000000000000000000000000000000" + }, + "0x0aa6a44690ef52354e976990292cf9c5cd36ad59": { + "balance": "1000000000000000000000000000000" + }, + "0x0fbbe17a0e5a61ee3e8661f442d7f6b177c49820": { + "balance": "1000000000000000000000000000000" + }, + "0x1239fe658b410dbbac5bbd572035f5041542f9e5": { + "balance": "1000000000000000000000000000000" + }, + "0x12d5d7340a93be7be28ea7a3ae198242f8e1282c": { + "balance": "1000000000000000000000000000000" + }, + "0x137048b9fa4f1234d6519271b2c5ec64f480db0f": { + "balance": "1000000000000000000000000000000" + }, + "0x13867af77a63048e17380e39248ada90521e97e4": { + "balance": "1000000000000000000000000000000" + }, + "0x138ea4bdf0382c2deffd5b0bff0afe59f471467f": { + "balance": "1000000000000000000000000000000" + }, + "0x13d19c55ee0a212249d26b9d741ff6d7f416db01": { + "balance": "1000000000000000000000000000000" + }, + "0x157d38b52196b248e9fe6a2172e32ce2b8c078e6": { + "balance": "1000000000000000000000000000000" + }, + "0x16e8c390f8e576161cfe966f2c3e5dd303eb9039": { + "balance": "1000000000000000000000000000000" + }, + "0x194cb9991d3d94c43e400becf21dfea45e7b3b4c": { + "balance": "1000000000000000000000000000000" + }, + "0x1C9abe4ff0CcECa40fc404c74AB7d4923fEF8901": { + "balance": "100000000000000000000000" + }, + "0x1a66fc89809112c20aa76a993db712fa9e003e4e": { + "balance": "1000000000000000000000000000000" + }, + "0x1f1d6041e12a18cf1202019f146f2fc150915e8d": { + "balance": "1000000000000000000000000000000" + }, + "0x1feaf1671c1f0faf0d44c152f72dc755db932569": { + "balance": "1000000000000000000000000000000" + }, + "0x236bf02dfafaf03851a4e6f5d69052f4884cec32": { + "balance": "1000000000000000000000000000000" + }, + "0x26d88f6a8b659be4165ee53774a057e41b5201c9": { + "balance": "1000000000000000000000000000000" + }, + "0x28353685b0b986a724b92113debb3d8cd9a6b263": { + "balance": "1000000000000000000000000000000" + }, + "0x29d83322219fdfb821459d5fdf796360faf3166a": { + "balance": "1000000000000000000000000000000" + }, + "0x2bee474be207bdbeac83d6672da5ed2fd417eac9": { + "balance": "1000000000000000000000000000000" + }, + "0x2d93455b07bccf38e8d019f7f43a2c2d70b46b4e": { + "balance": "1000000000000000000000000000000" + }, + "0x2f971bd38806c3ca45ae0a125d1267118bf5619c": { + "balance": "1000000000000000000000000000000" + }, + "0x30aaab366dfac8331f3e827495c789cde9b437c0": { + "balance": "1000000000000000000000000000000" + }, + "0x32ea0400dc2d20664cc4744b2fab04ecb709445c": { + "balance": "1000000000000000000000000000000" + }, + "0x3760dc9594ccac0f33ade5cc5371402131696341": { + "balance": "1000000000000000000000000000000" + }, + "0x38855e430611bc179cd777a8704679ffc43921de": { + "balance": "1000000000000000000000000000000" + }, + "0x3a921471a2397644c37c88ef9572c421ab37145d": { + "balance": "1000000000000000000000000000000" + }, + "0x3bcca8a8471d55a1a668bc163c0336e4a57e5c99": { + "balance": "1000000000000000000000000000000" + }, + "0x3d46ee560227c1d73cd6042b47fc8fddd8a06ecb": { + "balance": "1000000000000000000000000000000" + }, + "0x3f5bdf5d4c274c82b8d17aa2810b00d2cf050f24": { + "balance": "1000000000000000000000000000000" + }, + "0x3ffe1c9183e0f97f52a816405a7d2350624ec88b": { + "balance": "1000000000000000000000000000000" + }, + "0x426ec5f07847674aada3856609d8baaa16805d88": { + "balance": "1000000000000000000000000000000" + }, + "0x482d7f53cba6ae73a354533673c48e2dfd560949": { + "balance": "1000000000000000000000000000000" + }, + "0x48acbd6a2724eadcc2a11144ab84b6a617d1a241": { + "balance": "1000000000000000000000000000000" + }, + "0x49ef89840e400026eb5c8d79bd1b0adc152fe86d": { + "balance": "1000000000000000000000000000000" + }, + "0x4bf989fa6572af36b190032505506f1db888357f": { + "balance": "1000000000000000000000000000000" + }, + "0x4cf9b195f7cb5f86694d9b399fe21a5f34616fd3": { + "balance": "1000000000000000000000000000000" + }, + "0x4e9b85904bca60aeb5b916ca86ac622096908427": { + "balance": "1000000000000000000000000000000" + }, + "0x50120c17d7b59200e9b76e89e4e3de2f0cd00090": { + "balance": "1000000000000000000000000000000" + }, + "0x54db355342c35085a1a53184162b2fddd0a43b0f": { + "balance": "1000000000000000000000000000000" + }, + "0x54e228d8fea148cfe2b109b3b152ff21321d09a2": { + "balance": "1000000000000000000000000000000" + }, + "0x5667601b7dcde6f24d06bccc4f291cb06976f4ee": { + "balance": "1000000000000000000000000000000" + }, + "0x57829f2ecca390cd9d1c41f92328bad4d1073bbb": { + "balance": "1000000000000000000000000000000" + }, + "0x5EF25557E2ed6AFfF321B266C93e95A0B4B05AbC": { + "balance": "1000000000000000000000000" + }, + "0x5a3adad4382b3eb1e0c65f2de2845901081039b5": { + "balance": "1000000000000000000000000000000" + }, + "0x5cdb7392efdce502ccc6fba5c3c1dd1653967b4d": { + "balance": "1000000000000000000000000000000" + }, + "0x5d012c13b2854bda8b7b6580e97e52751884f827": { + "balance": "1000000000000000000000000000000" + }, + "0x5d9326c6504833d84f8a0d65ded59b1a6e768ca2": { + "balance": "1000000000000000000000000000000" + }, + "0x60268f799d8f1808e4a32c2eb898e73a8881f6f0": { + "balance": "1000000000000000000000000000000" + }, + "0x605ba4a05d779f9869bd9a10234c22f516766cfe": { + "balance": "1000000000000000000000000000000" + }, + "0x6093f0f2a7b5148b71603ac439adbc4c0e5aa5da": { + "balance": "1000000000000000000000000000000" + }, + "0x6196d135CdDb9d73A0756C1E44b5b02B11acf594": { + "balance": "2000000000000000000000", + "code": "", + "nonce": "5076", + "storage": {} + }, + "0x62712ceccb50f62ca4c5402fff6da9c819c866cf": { + "balance": "1000000000000000000000000000000" + }, + "0x62971de462ea1ec0d3b43a6a85b6fb975e6c6f64": { + "balance": "1000000000000000000000000000000" + }, + "0x62cf32dfb9eb6358dc5deb006aef1d75fb153e5f": { + "balance": "1000000000000000000000000000000" + }, + "0x62d8b22c1d71577829b2fee20a5c3fff43aed0ec": { + "balance": "100000000000000000000000" + }, + "0x6314956b78bb2eaed1c49b3ae71d4d0ec501cfab": { + "balance": "1000000000000000000000000000000" + }, + "0x661bda4daeba3ce9ac2aa30b80d463580f90d31a": { + "balance": "1000000000000000000000000000000" + }, + "0x66c5a87f4a49DD75e970055A265E8dd5C3F8f852": { + "balance": "1000000000000000000000" + }, + "0x66cd465ddcd85504c0d2cfb1728acee994d55a3f": { + "balance": "1000000000000000000000000000000" + }, + "0x68bca79ae7aae796027ff843d2303444da5cf5d8": { + "balance": "1000000000000000000000000000000" + }, + "0x6923877b65e24966efa9efd1207822fa2eaf601a": { + "balance": "1000000000000000000000000000000" + }, + "0x69362535ec535F0643cBf62D16aDeDCAf32Ee6F7": { + "balance": "0", + "code": "0x608060405234801561001057600080fd5b50600436106100b45760003560e01c806379210e8e1161007157806379210e8e1461017757806381a8235a146101a757806385aeeb17146101c35780639a9a5593146101f3578063a99100541461020f578063b57321221461022b576100b4565b806307c6e7d3146100b9578063122f4fba146100d55780631c6ec7a9146101055780631cfe4e3b14610121578063373dedb41461013d57806361e46db51461015b575b600080fd5b6100d360048036036100ce9190810190613cff565b61025b565b005b6100ef60048036036100ea9190810190613cff565b610804565b6040516100fc9190614963565b60405180910390f35b61011f600480360361011a9190810190613cff565b610b43565b005b61013b60048036036101369190810190613cc3565b610f72565b005b610145611190565b6040516101529190614cbe565b60405180910390f35b61017560048036036101709190810190613d94565b611199565b005b610191600480360361018c9190810190613e13565b6113f9565b60405161019e9190614924565b60405180910390f35b6101c160048036036101bc9190810190613cff565b6116f9565b005b6101dd60048036036101d89190810190613cff565b61189e565b6040516101ea9190614941565b60405180910390f35b61020d60048036036102089190810190613d40565b611b9d565b005b61022960048036036102249190810190613cff565b61202c565b005b61024560048036036102409190810190613cff565b612682565b6040516102529190614cbe565b60405180910390f35b6000339050606061026b83612902565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b825181101561037c576000826001018460018403815181106102d557fe5b60200260200101516040516102ea91906148cc565b90815260200160405180910390205411610339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161033090614ade565b60405180910390fd5b8160020183600183038151811061034c57fe5b602002602001015160405161036191906148cc565b908152602001604051809103902091508060010190506102b7565b506060600183511161038e57846103a7565b8260018451038151811061039e57fe5b60200260200101515b9050600082600101826040516103bd91906148e3565b9081526020016040518091039020541161040c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161040390614ade565b60405180910390fd5b6000826002018260405161042091906148e3565b90815260200160405180910390206000018054905014610475576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161046c90614b5e565b60405180910390fd5b60006104818587612b02565b9050806104c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ba90614a7e565b60405180910390fd5b6104cb613888565b836000016001856000018054905003815481106104e457fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156105965780601f1061056b57610100808354040283529160200191610596565b820191906000526020600020905b81548152906001019060200180831161057957829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff1660028111156105e257fe5b60028111156105ed57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561066557602002820191906000526020600020906000905b82829054906101000a900460ff1615158152602001906001019060208260000104928301926001038202915080841161062f5790505b505050505081525050905080846000016001866001018660405161068991906148e3565b90815260200160405180910390205403815481106106a357fe5b906000526020600020906005020160008201518160000190805190602001906106cd9291906138c4565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561071c57fe5b0217905550608082015181600401908051906020019061073d929190613944565b50905050836001018360405161075391906148e3565b90815260200160405180910390205484600101826000015160405161077891906148cc565b9081526020016040518091039020819055506000846001018460405161079e91906148e3565b908152602001604051809103902081905550836000018054809190600190036107c791906139ea565b5083600201836040516107da91906148e3565b9081526020016040518091039020600080820160006107f99190613a1c565b505050505050505050565b600080606061081284612b66565b91509150606061082182612902565b90506000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b82518110156109065760008260010184600184038151811061088b57fe5b60200260200101516040516108a091906148cc565b90815260200160405180910390205414156108c357600095505050505050610b3e565b816002018360018303815181106108d657fe5b60200260200101516040516108eb91906148cc565b9081526020016040518091039020915080600101905061086d565b50606060018351116109185783610931565b8260018451038151811061092857fe5b60200260200101515b90506000826001018260405161094791906148e3565b908152602001604051809103902054141561096a57600095505050505050610b3e565b610972613888565b826000016001846001018460405161098a91906148e3565b90815260200160405180910390205403815481106109a457fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610a565780601f10610a2b57610100808354040283529160200191610a56565b820191906000526020600020905b815481529060010190602001808311610a3957829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115610aa257fe5b6002811115610aad57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015610b2557602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411610aef5790505b5050505050815250509050806060015196505050505050505b919050565b600160009054906101000a900460ff16610b85576120006002819055506210000060038190555060018060006101000a81548160ff0219169083151502179055505b6000815111610bc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc090614ade565b60405180910390fd5b60003390506060610bd983612902565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015610cea57600082600101846001840381518110610c4357fe5b6020026020010151604051610c5891906148cc565b90815260200160405180910390205411610ca7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9e90614ade565b60405180910390fd5b81600201836001830381518110610cba57fe5b6020026020010151604051610ccf91906148cc565b90815260200160405180910390209150806001019050610c25565b50600254816000018054905010610d36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2d90614bfe565b60405180910390fd5b60606001835111610d475784610d60565b82600184510381518110610d5757fe5b60200260200101515b905060008260010182604051610d7691906148e3565b90815260200160405180910390205414610dc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbc90614c3e565b60405180910390fd5b610dce81612ee8565b610e0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0490614afe565b60405180910390fd5b6000610e198587612fc9565b905080610e5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e529061499e565b60405180910390fd5b610e63613888565b82816000018190525060008160200190151590811515815250508360000181908060018154018082558091505090600182039060005260206000209060050201600090919290919091506000820151816000019080519060200190610ec99291906138c4565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff02191690836002811115610f1857fe5b02179055506080820151816004019080519060200190610f39929190613944565b5050505083600001805490508460010184604051610f5791906148e3565b90815260200160405180910390208190555050505050505050565b610f7a61302d565b73ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161480610fdf57503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614155b61101e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101590614a5e565b60405180910390fd5b80600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411156110a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109790614b3e565b60405180910390fd5b600054600754820111156110e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e0906149be565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460076000828254039250508190555080600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550806007600082825401925050819055505050565b60008054905090565b600033905060006111aa82866130c6565b9050600160028111156111b957fe5b8160030160009054906101000a900460ff1660028111156111d657fe5b14611216576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120d90614c1e565b60405180910390fd5b6000600354858161122357fe5b061480156112345750806002015484105b611273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126a9061497e565b60405180910390fd5b600354848260020154031080156112905750838160020154038351145b8061129d57506003548351145b6112dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d390614a1e565b60405180910390fd5b600015158160040160035486816112ef57fe5b04815481106112fa57fe5b90600052602060002090602091828204019190069054906101000a900460ff1615151461135c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611353906149fe565b60405180910390fd5b600061136a838787876132c5565b9050806113ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a390614b1e565b60405180910390fd5b60018260040160035487816113bd57fe5b04815481106113c857fe5b90600052602060002090602091828204019190066101000a81548160ff021916908315150217905550505050505050565b611401613a40565b6000606061140e86612b66565b9150915061141a613888565b61142483836130c6565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156114c85780601f1061149d576101008083540402835291602001916114c8565b820191906000526020600020905b8154815290600101906020018083116114ab57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561151457fe5b600281111561151f57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561159757602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116115615790505b50505050508152505090506002808111156115ae57fe5b816060015160028111156115be57fe5b146115fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f590614c9e565b60405180910390fd5b60035485111580156116105750600085115b61164f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164690614a1e565b60405180910390fd5b80604001518587011115611698576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168f9061497e565b60405180910390fd5b60006116a684848989613376565b8096508192505050806116ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e590614b9e565b60405180910390fd5b505050509392505050565b6000339050600061170a82846130c6565b90506001600281111561171957fe5b8160030160009054906101000a900460ff16600281111561173657fe5b14611776576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176d90614c1e565b60405180910390fd5b60006001905060008260040180549050905060008090505b818110156117e157600015158460040182815481106117a957fe5b90600052602060002090602091828204019190069054906101000a900460ff16151514156117d657600092505b80600101905061178e565b5081611822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181990614b7e565b60405180910390fd5b60028360030160006101000a81548160ff0219169083600281111561184357fe5b021790555060006118548587613409565b905080611896576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188d906149de565b60405180910390fd5b505050505050565b6060600060606118ad84612b66565b9150915060606118bc82612902565b90506000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008090505b82518110156119c65760008260010184838151811061192257fe5b602002602001015160405161193791906148cc565b90815260200160405180910390205411611986576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197d90614ade565b60405180910390fd5b8160020183828151811061199657fe5b60200260200101516040516119ab91906148cc565b90815260200160405180910390209150806001019050611907565b5080600001805480602002602001604051908101604052809291908181526020016000905b82821015611b8e57838290600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611aa75780601f10611a7c57610100808354040283529160200191611aa7565b820191906000526020600020905b815481529060010190602001808311611a8a57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115611af357fe5b6002811115611afe57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015611b7657602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411611b405790505b505050505081525050815260200190600101906119eb565b50505050945050505050919050565b600160009054906101000a900460ff16611bdf576120006002819055506210000060038190555060018060006101000a81548160ff0219169083151502179055505b60003390506305f5e100821115611c2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2290614bde565b60405180910390fd5b6060611c3684612902565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015611d4757600082600101846001840381518110611ca057fe5b6020026020010151604051611cb591906148cc565b90815260200160405180910390205411611d04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cfb90614ade565b60405180910390fd5b81600201836001830381518110611d1757fe5b6020026020010151604051611d2c91906148cc565b90815260200160405180910390209150806001019050611c82565b5060606001835111611d595785611d72565b82600184510381518110611d6957fe5b60200260200101515b905060008260010182604051611d8891906148e3565b90815260200160405180910390205414611dd7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dce90614c3e565b60405180910390fd5b611de081612ee8565b611e1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1690614bbe565b60405180910390fd5b6000611e2c85888861346d565b905080611e6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6590614c7e565b60405180910390fd5b6060600354600160035489010381611e8257fe5b04604051908082528060200260200182016040528015611eb15781602001602082028038833980820191505090505b509050836000016040518060a0016040528085815260200160011515815260200189815260200160016002811115611ee557fe5b815260200183815250908060018154018082558091505090600182039060005260206000209060050201600090919290919091506000820151816000019080519060200190611f359291906138c4565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff02191690836002811115611f8457fe5b02179055506080820151816004019080519060200190611fa5929190613944565b5050505083600001805490508460010184604051611fc391906148e3565b90815260200160405180910390208190555086600560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505050505050505050565b6000339050612039613888565b61204382846130c6565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156120e75780601f106120bc576101008083540402835291602001916120e7565b820191906000526020600020905b8154815290600101906020018083116120ca57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561213357fe5b600281111561213e57fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156121b657602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116121805790505b5050505050815250509050600060028111156121ce57fe5b816060015160028111156121de57fe5b141561221f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221690614a3e565b60405180910390fd5b600061222b83856134da565b90508061226d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226490614a9e565b60405180910390fd5b606061227885612902565b90506000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b825181101561231057816002018360018303815181106122e057fe5b60200260200101516040516122f591906148cc565b908152602001604051809103902091508060010190506122c4565b506000600182600101866000015160405161232b91906148cc565b908152602001604051809103902054039050612345613888565b8260000160018460000180549050038154811061235e57fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156124105780601f106123e557610100808354040283529160200191612410565b820191906000526020600020905b8154815290600101906020018083116123f357829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561245c57fe5b600281111561246757fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156124df57602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116124a95790505b5050505050815250509050808360000183815481106124fa57fe5b906000526020600020906005020160008201518160000190805190602001906125249291906138c4565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561257357fe5b02179055506080820151816004019080519060200190612594929190613944565b50905050826000018054809190600190036125af91906139ea565b508260010186600001516040516125c691906148cc565b9081526020016040518091039020548360010182600001516040516125eb91906148cc565b908152602001604051809103902081905550600083600101876000015160405161261591906148cc565b9081526020016040518091039020819055508560400151600560008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505050505050505050565b600080606061269084612b66565b9150915061269c613888565b6126a683836130c6565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561274a5780601f1061271f5761010080835404028352916020019161274a565b820191906000526020600020905b81548152906001019060200180831161272d57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561279657fe5b60028111156127a157fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561281957602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116127e35790505b50505050508152505090506001600281111561283157fe5b8160600151600281111561284157fe5b1480612866575060028081111561285457fe5b8160600151600281111561286457fe5b145b6128a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161289c90614c1e565b60405180910390fd5b60006128b1848461353e565b8096508192505050806128f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128f090614c5e565b60405180910390fd5b50505050919050565b606061290c613a65565b612915836135a7565b905061291f613a65565b61295d6040518060400160405280600181526020017f2f000000000000000000000000000000000000000000000000000000000000008152506135a7565b90506060600161297683856135d590919063ffffffff16565b016040519080825280602002602001820160405280156129aa57816020015b60608152602001906001900390816129955790505b50905060008090505b81518110156129fb576129d76129d2848661364a90919063ffffffff16565b613664565b8282815181106129e357fe5b602002602001018190525080806001019150506129b3565b50600081600183510381518110612a0e57fe5b6020026020010151511415612a795780600182510381518110612a2d57fe5b6020026020010160608152506001815103604051908082528060200260200182016040528015612a7157816020015b6060815260200190600190039081612a5c5790505b509350612ab2565b8051604051908082528060200260200182016040528015612aae57816020015b6060815260200190600190039081612a995790505b5093505b60008090505b8451811015612af957818181518110612acd57fe5b6020026020010151858281518110612ae157fe5b60200260200101819052508080600101915050612ab8565b50505050919050565b60008060016020601f85510181612b1557fe5b040190506040518481526020810160005b83811015612b47578060200286015181602002830152806001019050612b26565b50602082602085026040018460006010600019f1935050505092915050565b6000606060006028905080845111612bb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612baa90614abe565b60405180910390fd5b6060816040519080825280601f01601f191660200182016040528015612be85781602001600182028038833980820191505090505b50905060008090505b82811015612c5857858181518110612c0557fe5b602001015160f81c60f81b828281518110612c1c57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050612bf1565b50600080905060008090505b83811015612d87576000838281518110612c7a57fe5b602001015160f81c60f81b60f81c60ff16905060308110158015612c9f575060398111155b80612cb8575060418110158015612cb75750605a8111155b5b80612cd1575060618110158015612cd0575060668111155b5b612d10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d0790614abe565b60405180910390fd5b60308110158015612d22575060398111155b15612d335760308103601084020192505b60418110158015612d455750605a8111155b15612d565760378103601084020192505b60618110158015612d68575060668111155b15612d795760578103601084020192505b508080600101915050612c64565b508094507f2f00000000000000000000000000000000000000000000000000000000000000868481518110612db857fe5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612e25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e1c90614abe565b60405180910390fd5b6000600184885103039050806040519080825280601f01601f191660200182016040528015612e635781602001600182028038833980820191505090505b50945060008090505b81811015612ede5760008860018784010181518110612e8757fe5b602001015160f81c60f81b905080878381518110612ea157fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350508080600101915050612e6c565b5050505050915091565b6000604051602001612ef99061490f565b6040516020818303038152906040528051906020012082604051602001612f2091906148e3565b604051602081830303815290604052805190602001201480612f8b5750604051602001612f4c906148fa565b6040516020818303038152906040528051906020012082604051602001612f7391906148e3565b60405160208183030381529060405280519060200120145b80612f97575060008251145b15612fa55760009050612fc4565b60008251905060ff811115612fbe576000915050612fc4565b60019150505b919050565b60008060016020601f85510181612fdc57fe5b040190506040518481526020810160005b8381101561300e578060200286015181602002830152806001019050612fed565b5060208260208502604001846000600f600019f1935050505092915050565b600073d2001000000000000000000000000000000000d273ffffffffffffffffffffffffffffffffffffffff166383e781fe6040518163ffffffff1660e01b815260040160206040518083038186803b15801561308957600080fd5b505afa15801561309d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506130c19190810190613c9a565b905090565b600060606130d383612902565b90506000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b82518110156131e45760008260010184600184038151811061313d57fe5b602002602001015160405161315291906148cc565b908152602001604051809103902054116131a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161319890614ade565b60405180910390fd5b816002018360018303815181106131b457fe5b60200260200101516040516131c991906148cc565b9081526020016040518091039020915080600101905061311f565b50606060018351116131f6578461320f565b8260018451038151811061320657fe5b60200260200101515b90506000826001018260405161322591906148e3565b90815260200160405180910390205411613274576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161326b90614ade565b60405180910390fd5b6000826000016001846001018460405161328e91906148e3565b90815260200160405180910390205403815481106132a857fe5b906000526020600020906005020190508094505050505092915050565b60008060016020601f855101816132d857fe5b04019050600060016020601f885101816132ee57fe5b040190506040518781526020810160005b838110156133205780602002890151816020028301528060010190506132ff565b50868360200282015260005b84811015613352578060200287015181856001010160200283015280600101905061332c565b50602082848601602002606001846000600c600019f1945050505050949350505050565b6000613380613a40565b600060016020601f8851018161339257fe5b0401905060006020601f8601816133a557fe5b0490506040518881526020810160005b848110156133d657806020028a0151816020028301528060010190506133b5565b5083602002810188815287816020015283602002868660030160200285600a600019fa9650505050505094509492505050565b60008060016020601f8551018161341c57fe5b040190506040518481526020810160005b8381101561344e57806020028601518160200283015280600101905061342d565b50602082602085026040018460006011600019f1935050505092915050565b60008060016020601f8651018161348057fe5b040190506040518581526020810160005b838110156134b2578060200287015181602002830152806001019050613491565b50846020840282015260208260208502604001846000600b600019f193505050509392505050565b60008060016020601f855101816134ed57fe5b040190506040518481526020810160005b8381101561351f5780602002860151816020028301528060010190506134fe565b5060208260208502604001846000600e600019f1935050505092915050565b600080600060016020601f8651018161355357fe5b040190506040518581526020810160005b83811015613585578060200287015181602002830152806001019050613564565b506020826020850260200184600d600019fa9450815193505050509250929050565b6135af613a65565b600060208301905060405180604001604052808451815260200182815250915050919050565b60008082600001516135f985600001518660200151866000015187602001516136c6565b0190505b83600001518460200151018111613643578180600101925050826000015161363b8560200151830386600001510383866000015187602001516136c6565b0190506135fd565b5092915050565b613652613a65565b61365d8383836137a1565b5092915050565b60608082600001516040519080825280601f01601f19166020018201604052801561369e5781602001600182028038833980820191505090505b50905060006020820190506136bc818560200151866000015161383f565b8192505050919050565b6000808490506000868511613791576020851161374b57600060018660200360080260020a031960001b905060008186511690506000878a8a0103905060008386511690505b82811461373d5781861061372a578a8a019650505050505050613799565b858060010196505083865116905061370c565b859650505050505050613799565b60008585209050600091505b858803821161378f57600086842090508082141561377b5783945050505050613799565b600184019350508180600101925050613757565b505b868601925050505b949350505050565b6137a9613a65565b60006137c785600001518660200151866000015187602001516136c6565b90508460200151836020018181525050846020015181038360000181815250508460000151856020015101811415613809576000856000018181525050613834565b8360000151836000015101856000018181510391508181525050836000015181018560200181815250505b829150509392505050565b5b602081106138635781518352602083019250602082019150602081039050613840565b60006001826020036101000a0390508019835116818551168181178652505050505050565b6040518060a001604052806060815260200160001515815260200160008152602001600060028111156138b757fe5b8152602001606081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061390557805160ff1916838001178555613933565b82800160010185558215613933579182015b82811115613932578251825591602001919060010190613917565b5b5090506139409190613a7f565b5090565b82805482825590600052602060002090601f016020900481019282156139d95791602002820160005b838211156139aa57835183826101000a81548160ff021916908315150217905550926020019260010160208160000104928301926001030261396d565b80156139d75782816101000a81549060ff02191690556001016020816000010492830192600103026139aa565b505b5090506139e69190613aa4565b5090565b815481835581811115613a1757600502816005028360005260206000209182019101613a169190613ad4565b5b505050565b5080546000825560050290600052602060002090810190613a3d9190613ad4565b50565b6040518062100000016040528061800090602082028038833980820191505090505090565b604051806040016040528060008152602001600081525090565b613aa191905b80821115613a9d576000816000905550600101613a85565b5090565b90565b613ad191905b80821115613acd57600081816101000a81549060ff021916905550600101613aaa565b5090565b90565b613b4091905b80821115613b3c5760008082016000613af39190613b43565b6001820160006101000a81549060ff021916905560028201600090556003820160006101000a81549060ff0219169055600482016000613b339190613b8b565b50600501613ada565b5090565b90565b50805460018160011615610100020316600290046000825580601f10613b695750613b88565b601f016020900490600052602060002090810190613b879190613a7f565b5b50565b50805460008255601f016020900490600052602060002090810190613bb09190613a7f565b50565b600081359050613bc281614f18565b92915050565b600081519050613bd781614f18565b92915050565b600082601f830112613bee57600080fd5b8135613c01613bfc82614d06565b614cd9565b91508082526020830160208301858383011115613c1d57600080fd5b613c28838284614eb8565b50505092915050565b600082601f830112613c4257600080fd5b8135613c55613c5082614d32565b614cd9565b91508082526020830160208301858383011115613c7157600080fd5b613c7c838284614eb8565b50505092915050565b600081359050613c9481614f2f565b92915050565b600060208284031215613cac57600080fd5b6000613cba84828501613bc8565b91505092915050565b60008060408385031215613cd657600080fd5b6000613ce485828601613bb3565b9250506020613cf585828601613c85565b9150509250929050565b600060208284031215613d1157600080fd5b600082013567ffffffffffffffff811115613d2b57600080fd5b613d3784828501613c31565b91505092915050565b60008060408385031215613d5357600080fd5b600083013567ffffffffffffffff811115613d6d57600080fd5b613d7985828601613c31565b9250506020613d8a85828601613c85565b9150509250929050565b600080600060608486031215613da957600080fd5b600084013567ffffffffffffffff811115613dc357600080fd5b613dcf86828701613c31565b9350506020613de086828701613c85565b925050604084013567ffffffffffffffff811115613dfd57600080fd5b613e0986828701613bdd565b9150509250925092565b600080600060608486031215613e2857600080fd5b600084013567ffffffffffffffff811115613e4257600080fd5b613e4e86828701613c31565b9350506020613e5f86828701613c85565b9250506040613e7086828701613c85565b9150509250925092565b6000613e868383613fe8565b60208301905092915050565b6000613e9e8383613ff7565b60208301905092915050565b6000613eb68383614831565b905092915050565b6000613ec982614d88565b613ed38185614de7565b9350613ede83614d5e565b8060005b83811015613f0f578151613ef68882613e7a565b9750613f0183614dc0565b925050600181019050613ee2565b5085935050505092915050565b613f2581614d93565b613f2f8184614df8565b9250613f3a82614d6e565b8060005b83811015613f6b578151613f528782613e92565b9650613f5d83614dcd565b925050600181019050613f3e565b505050505050565b6000613f7e82614d9f565b613f888185614e03565b935083602082028501613f9a85614d78565b8060005b85811015613fd65784840389528151613fb78582613eaa565b9450613fc283614dda565b925060208a01995050600181019050613f9e565b50829750879550505050505092915050565b613ff181614e53565b82525050565b61400081614e5f565b82525050565b61400f81614ea6565b82525050565b61401e81614ea6565b82525050565b600061402f82614db5565b6140398185614e36565b9350614049818560208601614ec7565b80840191505092915050565b600061406082614daa565b61406a8185614e14565b935061407a818560208601614ec7565b61408381614efa565b840191505092915050565b600061409982614daa565b6140a38185614e36565b93506140b3818560208601614ec7565b80840191505092915050565b60006140cc601883614e25565b91507f496e636f7272656374206368756e6b20706f736974696f6e00000000000000006000830152602082019050919050565b600061410c601583614e25565b91507f4469726563746f7279206e6f74206372656174656400000000000000000000006000830152602082019050919050565b600061414c602483614e25565b91507f4e6f7420656e6f756768206d656d6f727920696e207468652046696c6573746f60008301527f72616765000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006141b2601b83614e25565b91507f48617368206861736e2774206265656e2063616c63756c6174656400000000006000830152602082019050919050565b60006141f2601983614e25565b91507f4368756e6b20697320616c72656164792075706c6f61646564000000000000006000830152602082019050919050565b6000614232601683614e25565b91507f496e636f7272656374206368756e6b206c656e677468000000000000000000006000830152602082019050919050565b6000614272600f83614e25565b91507f46696c65206e6f742065786973747300000000000000000000000000000000006000830152602082019050919050565b60006142b2600e83614e25565b91507f496e76616c69642073656e6465720000000000000000000000000000000000006000830152602082019050919050565b60006142f2601883614e25565b91507f4469726563746f7279206973206e6f742064656c6574656400000000000000006000830152602082019050919050565b6000614332601083614e25565b91507f46696c65206e6f742064656c65746564000000000000000000000000000000006000830152602082019050919050565b6000614372601383614e25565b91507f496e76616c69642073746f7261676550617468000000000000000000000000006000830152602082019050919050565b60006143b2600c83614e25565b91507f496e76616c6964207061746800000000000000000000000000000000000000006000830152602082019050919050565b60006143f2600183614e36565b91507f2e000000000000000000000000000000000000000000000000000000000000006000830152600182019050919050565b6000614432601683614e25565b91507f496e76616c6964206469726563746f7279206e616d65000000000000000000006000830152602082019050919050565b6000614472601583614e25565b91507f4368756e6b207761736e27742075706c6f6164656400000000000000000000006000830152602082019050919050565b60006144b2602683614e25565b91507f436f756c64206e6f742072657365727665206c657373207468616e207573656460008301527f20737061636500000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614518601683614e25565b91507f4469726563746f7279206973206e6f7420656d707479000000000000000000006000830152602082019050919050565b6000614558602383614e25565b91507f46696c65206861736e2774206265656e2075706c6f6164656420636f7272656360008301527f746c7900000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006145be601183614e25565b91507f4368756e6b207761736e277420726561640000000000000000000000000000006000830152602082019050919050565b60006145fe601883614e25565b91507f46696c656e616d652073686f756c64206265203c2032353600000000000000006000830152602082019050919050565b600061463e601f83614e25565b91507f46696c652073686f756c64206265206c657373207468616e20313030204d42006000830152602082019050919050565b600061467e600283614e36565b91507f2e2e0000000000000000000000000000000000000000000000000000000000006000830152600282019050919050565b60006146be601183614e25565b91507f4469726563746f72792069732066756c6c0000000000000000000000000000006000830152602082019050919050565b60006146fe600e83614e25565b91507f46696c65206e6f7420666f756e640000000000000000000000000000000000006000830152602082019050919050565b600061473e601883614e25565b91507f46696c65206f72206469726563746f72792065786973747300000000000000006000830152602082019050919050565b600061477e601883614e25565b91507f45564d206572726f7220696e2067657446696c6553697a6500000000000000006000830152602082019050919050565b60006147be601083614e25565b91507f46696c65206e6f742063726561746564000000000000000000000000000000006000830152602082019050919050565b60006147fe601983614e25565b91507f46696c65206861736e2774206265656e2075706c6f61646564000000000000006000830152602082019050919050565b600060a083016000830151848203600086015261484e8282614055565b91505060208301516148636020860182613fe8565b50604083015161487660408601826148ae565b5060608301516148896060860182614006565b50608083015184820360808601526148a18282613ebe565b9150508091505092915050565b6148b781614e9c565b82525050565b6148c681614e9c565b82525050565b60006148d8828461408e565b915081905092915050565b60006148ef8284614024565b915081905092915050565b6000614905826143e5565b9150819050919050565b600061491a82614671565b9150819050919050565b6000621000008201905061493b6000830184613f1c565b92915050565b6000602082019050818103600083015261495b8184613f73565b905092915050565b60006020820190506149786000830184614015565b92915050565b60006020820190508181036000830152614997816140bf565b9050919050565b600060208201905081810360008301526149b7816140ff565b9050919050565b600060208201905081810360008301526149d78161413f565b9050919050565b600060208201905081810360008301526149f7816141a5565b9050919050565b60006020820190508181036000830152614a17816141e5565b9050919050565b60006020820190508181036000830152614a3781614225565b9050919050565b60006020820190508181036000830152614a5781614265565b9050919050565b60006020820190508181036000830152614a77816142a5565b9050919050565b60006020820190508181036000830152614a97816142e5565b9050919050565b60006020820190508181036000830152614ab781614325565b9050919050565b60006020820190508181036000830152614ad781614365565b9050919050565b60006020820190508181036000830152614af7816143a5565b9050919050565b60006020820190508181036000830152614b1781614425565b9050919050565b60006020820190508181036000830152614b3781614465565b9050919050565b60006020820190508181036000830152614b57816144a5565b9050919050565b60006020820190508181036000830152614b778161450b565b9050919050565b60006020820190508181036000830152614b978161454b565b9050919050565b60006020820190508181036000830152614bb7816145b1565b9050919050565b60006020820190508181036000830152614bd7816145f1565b9050919050565b60006020820190508181036000830152614bf781614631565b9050919050565b60006020820190508181036000830152614c17816146b1565b9050919050565b60006020820190508181036000830152614c37816146f1565b9050919050565b60006020820190508181036000830152614c5781614731565b9050919050565b60006020820190508181036000830152614c7781614771565b9050919050565b60006020820190508181036000830152614c97816147b1565b9050919050565b60006020820190508181036000830152614cb7816147f1565b9050919050565b6000602082019050614cd360008301846148bd565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614cfc57600080fd5b8060405250919050565b600067ffffffffffffffff821115614d1d57600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614d4957600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050919050565b6000819050602082019050919050565b600081519050919050565b60006180009050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614e4c82614e7c565b9050919050565b60008115159050919050565b6000819050919050565b6000819050614e7782614f0b565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000614eb182614e69565b9050919050565b82818337600083830152505050565b60005b83811015614ee5578082015181840152602081019050614eca565b83811115614ef4576000848401525b50505050565b6000601f19601f8301169050919050565b60038110614f1557fe5b50565b614f2181614e41565b8114614f2c57600080fd5b50565b614f3881614e9c565b8114614f4357600080fd5b5056fea365627a7a723158202ae226b25ad72f9cff2d74c6dc7bcfb78530ab1d2438f48a8dab67499b37a8e56c6578706572696d656e74616cf564736f6c634300050d0040", + "nonce": "0", + "storage": { + "0x0": "2868903936" + } + }, + "0x69362535ec535F0643cBf62D16aDeDCAf32Ee6F8": { + "balance": "0", + "code": "0x608060405234801561001057600080fd5b50600436106100b45760003560e01c806379210e8e1161007157806379210e8e1461017757806381a8235a146101a757806385aeeb17146101c35780639a9a5593146101f3578063a99100541461020f578063b57321221461022b576100b4565b806307c6e7d3146100b9578063122f4fba146100d55780631c6ec7a9146101055780631cfe4e3b14610121578063373dedb41461013d57806361e46db51461015b575b600080fd5b6100d360048036036100ce9190810190613e0d565b61025b565b005b6100ef60048036036100ea9190810190613e0d565b610804565b6040516100fc9190614ab1565b60405180910390f35b61011f600480360361011a9190810190613e0d565b610b43565b005b61013b60048036036101369190810190613dd1565b610f72565b005b610145611190565b6040516101529190614e2c565b60405180910390f35b61017560048036036101709190810190613ea2565b611199565b005b610191600480360361018c9190810190613f21565b6113f9565b60405161019e9190614a72565b60405180910390f35b6101c160048036036101bc9190810190613e0d565b6116f9565b005b6101dd60048036036101d89190810190613e0d565b61189e565b6040516101ea9190614a8f565b60405180910390f35b61020d60048036036102089190810190613e4e565b611b9d565b005b61022960048036036102249190810190613e0d565b61213a565b005b61024560048036036102409190810190613e0d565b612790565b6040516102529190614e2c565b60405180910390f35b6000339050606061026b83612a10565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b825181101561037c576000826001018460018403815181106102d557fe5b60200260200101516040516102ea9190614a1a565b90815260200160405180910390205411610339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161033090614c2c565b60405180910390fd5b8160020183600183038151811061034c57fe5b60200260200101516040516103619190614a1a565b908152602001604051809103902091508060010190506102b7565b506060600183511161038e57846103a7565b8260018451038151811061039e57fe5b60200260200101515b9050600082600101826040516103bd9190614a31565b9081526020016040518091039020541161040c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161040390614c2c565b60405180910390fd5b600082600201826040516104209190614a31565b90815260200160405180910390206000018054905014610475576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161046c90614cac565b60405180910390fd5b60006104818587612c10565b9050806104c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ba90614bcc565b60405180910390fd5b6104cb613996565b836000016001856000018054905003815481106104e457fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156105965780601f1061056b57610100808354040283529160200191610596565b820191906000526020600020905b81548152906001019060200180831161057957829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff1660028111156105e257fe5b60028111156105ed57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561066557602002820191906000526020600020906000905b82829054906101000a900460ff1615158152602001906001019060208260000104928301926001038202915080841161062f5790505b50505050508152505090508084600001600186600101866040516106899190614a31565b90815260200160405180910390205403815481106106a357fe5b906000526020600020906005020160008201518160000190805190602001906106cd9291906139d2565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561071c57fe5b0217905550608082015181600401908051906020019061073d929190613a52565b5090505083600101836040516107539190614a31565b9081526020016040518091039020548460010182600001516040516107789190614a1a565b9081526020016040518091039020819055506000846001018460405161079e9190614a31565b908152602001604051809103902081905550836000018054809190600190036107c79190613af8565b5083600201836040516107da9190614a31565b9081526020016040518091039020600080820160006107f99190613b2a565b505050505050505050565b600080606061081284612c74565b91509150606061082182612a10565b90506000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b82518110156109065760008260010184600184038151811061088b57fe5b60200260200101516040516108a09190614a1a565b90815260200160405180910390205414156108c357600095505050505050610b3e565b816002018360018303815181106108d657fe5b60200260200101516040516108eb9190614a1a565b9081526020016040518091039020915080600101905061086d565b50606060018351116109185783610931565b8260018451038151811061092857fe5b60200260200101515b9050600082600101826040516109479190614a31565b908152602001604051809103902054141561096a57600095505050505050610b3e565b610972613996565b826000016001846001018460405161098a9190614a31565b90815260200160405180910390205403815481106109a457fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610a565780601f10610a2b57610100808354040283529160200191610a56565b820191906000526020600020905b815481529060010190602001808311610a3957829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115610aa257fe5b6002811115610aad57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015610b2557602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411610aef5790505b5050505050815250509050806060015196505050505050505b919050565b600160009054906101000a900460ff16610b85576120006002819055506210000060038190555060018060006101000a81548160ff0219169083151502179055505b6000815111610bc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc090614c2c565b60405180910390fd5b60003390506060610bd983612a10565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015610cea57600082600101846001840381518110610c4357fe5b6020026020010151604051610c589190614a1a565b90815260200160405180910390205411610ca7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9e90614c2c565b60405180910390fd5b81600201836001830381518110610cba57fe5b6020026020010151604051610ccf9190614a1a565b90815260200160405180910390209150806001019050610c25565b50600254816000018054905010610d36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2d90614d4c565b60405180910390fd5b60606001835111610d475784610d60565b82600184510381518110610d5757fe5b60200260200101515b905060008260010182604051610d769190614a31565b90815260200160405180910390205414610dc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbc90614d8c565b60405180910390fd5b610dce81612ff6565b610e0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0490614c4c565b60405180910390fd5b6000610e1985876130d7565b905080610e5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5290614aec565b60405180910390fd5b610e63613996565b82816000018190525060008160200190151590811515815250508360000181908060018154018082558091505090600182039060005260206000209060050201600090919290919091506000820151816000019080519060200190610ec99291906139d2565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff02191690836002811115610f1857fe5b02179055506080820151816004019080519060200190610f39929190613a52565b5050505083600001805490508460010184604051610f579190614a31565b90815260200160405180910390208190555050505050505050565b610f7a61313b565b73ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161480610fdf57503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614155b61101e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101590614bac565b60405180910390fd5b80600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411156110a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109790614c8c565b60405180910390fd5b600054600754820111156110e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e090614b0c565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460076000828254039250508190555080600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550806007600082825401925050819055505050565b60008054905090565b600033905060006111aa82866131d4565b9050600160028111156111b957fe5b8160030160009054906101000a900460ff1660028111156111d657fe5b14611216576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120d90614d6c565b60405180910390fd5b6000600354858161122357fe5b061480156112345750806002015484105b611273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126a90614acc565b60405180910390fd5b600354848260020154031080156112905750838160020154038351145b8061129d57506003548351145b6112dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d390614b6c565b60405180910390fd5b600015158160040160035486816112ef57fe5b04815481106112fa57fe5b90600052602060002090602091828204019190069054906101000a900460ff1615151461135c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135390614b4c565b60405180910390fd5b600061136a838787876133d3565b9050806113ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a390614c6c565b60405180910390fd5b60018260040160035487816113bd57fe5b04815481106113c857fe5b90600052602060002090602091828204019190066101000a81548160ff021916908315150217905550505050505050565b611401613b4e565b6000606061140e86612c74565b9150915061141a613996565b61142483836131d4565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156114c85780601f1061149d576101008083540402835291602001916114c8565b820191906000526020600020905b8154815290600101906020018083116114ab57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561151457fe5b600281111561151f57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561159757602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116115615790505b50505050508152505090506002808111156115ae57fe5b816060015160028111156115be57fe5b146115fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f590614e0c565b60405180910390fd5b60035485111580156116105750600085115b61164f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164690614b6c565b60405180910390fd5b80604001518587011115611698576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168f90614acc565b60405180910390fd5b60006116a684848989613484565b8096508192505050806116ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e590614cec565b60405180910390fd5b505050509392505050565b6000339050600061170a82846131d4565b90506001600281111561171957fe5b8160030160009054906101000a900460ff16600281111561173657fe5b14611776576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176d90614d6c565b60405180910390fd5b60006001905060008260040180549050905060008090505b818110156117e157600015158460040182815481106117a957fe5b90600052602060002090602091828204019190069054906101000a900460ff16151514156117d657600092505b80600101905061178e565b5081611822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181990614ccc565b60405180910390fd5b60028360030160006101000a81548160ff0219169083600281111561184357fe5b021790555060006118548587613517565b905080611896576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188d90614b2c565b60405180910390fd5b505050505050565b6060600060606118ad84612c74565b9150915060606118bc82612a10565b90506000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008090505b82518110156119c65760008260010184838151811061192257fe5b60200260200101516040516119379190614a1a565b90815260200160405180910390205411611986576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197d90614c2c565b60405180910390fd5b8160020183828151811061199657fe5b60200260200101516040516119ab9190614a1a565b90815260200160405180910390209150806001019050611907565b5080600001805480602002602001604051908101604052809291908181526020016000905b82821015611b8e57838290600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611aa75780601f10611a7c57610100808354040283529160200191611aa7565b820191906000526020600020905b815481529060010190602001808311611a8a57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115611af357fe5b6002811115611afe57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015611b7657602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411611b405790505b505050505081525050815260200190600101906119eb565b50505050945050505050919050565b600160009054906101000a900460ff16611bdf576120006002819055506210000060038190555060018060006101000a81548160ff0219169083151502179055505b60003390506305f5e100821115611c2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2290614d2c565b60405180910390fd5b600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205483011115611cee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce590614dac565b60405180910390fd5b6060611cf984612a10565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015611e0a57600082600101846001840381518110611d6357fe5b6020026020010151604051611d789190614a1a565b90815260200160405180910390205411611dc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dbe90614c2c565b60405180910390fd5b81600201836001830381518110611dda57fe5b6020026020010151604051611def9190614a1a565b90815260200160405180910390209150806001019050611d45565b50600254816000018054905010611e56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4d90614d4c565b60405180910390fd5b60606001835111611e675785611e80565b82600184510381518110611e7757fe5b60200260200101515b905060008260010182604051611e969190614a31565b90815260200160405180910390205414611ee5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611edc90614d8c565b60405180910390fd5b611eee81612ff6565b611f2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2490614d0c565b60405180910390fd5b6000611f3a85888861357b565b905080611f7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7390614dec565b60405180910390fd5b6060600354600160035489010381611f9057fe5b04604051908082528060200260200182016040528015611fbf5781602001602082028038833980820191505090505b509050836000016040518060a0016040528085815260200160011515815260200189815260200160016002811115611ff357fe5b8152602001838152509080600181540180825580915050906001820390600052602060002090600502016000909192909190915060008201518160000190805190602001906120439291906139d2565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561209257fe5b021790555060808201518160040190805190602001906120b3929190613a52565b50505050836000018054905084600101846040516120d19190614a31565b90815260200160405180910390208190555086600560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505050505050505050565b6000339050612147613996565b61215182846131d4565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156121f55780601f106121ca576101008083540402835291602001916121f5565b820191906000526020600020905b8154815290600101906020018083116121d857829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561224157fe5b600281111561224c57fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156122c457602002820191906000526020600020906000905b82829054906101000a900460ff1615158152602001906001019060208260000104928301926001038202915080841161228e5790505b5050505050815250509050600060028111156122dc57fe5b816060015160028111156122ec57fe5b141561232d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232490614b8c565b60405180910390fd5b600061233983856135e8565b90508061237b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161237290614bec565b60405180910390fd5b606061238685612a10565b90506000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b825181101561241e57816002018360018303815181106123ee57fe5b60200260200101516040516124039190614a1a565b908152602001604051809103902091508060010190506123d2565b50600060018260010186600001516040516124399190614a1a565b908152602001604051809103902054039050612453613996565b8260000160018460000180549050038154811061246c57fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561251e5780601f106124f35761010080835404028352916020019161251e565b820191906000526020600020905b81548152906001019060200180831161250157829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561256a57fe5b600281111561257557fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156125ed57602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116125b75790505b50505050508152505090508083600001838154811061260857fe5b906000526020600020906005020160008201518160000190805190602001906126329291906139d2565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561268157fe5b021790555060808201518160040190805190602001906126a2929190613a52565b50905050826000018054809190600190036126bd9190613af8565b508260010186600001516040516126d49190614a1a565b9081526020016040518091039020548360010182600001516040516126f99190614a1a565b90815260200160405180910390208190555060008360010187600001516040516127239190614a1a565b9081526020016040518091039020819055508560400151600560008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505050505050505050565b600080606061279e84612c74565b915091506127aa613996565b6127b483836131d4565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156128585780601f1061282d57610100808354040283529160200191612858565b820191906000526020600020905b81548152906001019060200180831161283b57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff1660028111156128a457fe5b60028111156128af57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561292757602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116128f15790505b50505050508152505090506001600281111561293f57fe5b8160600151600281111561294f57fe5b1480612974575060028081111561296257fe5b8160600151600281111561297257fe5b145b6129b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129aa90614d6c565b60405180910390fd5b60006129bf848461364c565b809650819250505080612a07576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129fe90614dcc565b60405180910390fd5b50505050919050565b6060612a1a613b73565b612a23836136b5565b9050612a2d613b73565b612a6b6040518060400160405280600181526020017f2f000000000000000000000000000000000000000000000000000000000000008152506136b5565b905060606001612a8483856136e390919063ffffffff16565b01604051908082528060200260200182016040528015612ab857816020015b6060815260200190600190039081612aa35790505b50905060008090505b8151811015612b0957612ae5612ae0848661375890919063ffffffff16565b613772565b828281518110612af157fe5b60200260200101819052508080600101915050612ac1565b50600081600183510381518110612b1c57fe5b6020026020010151511415612b875780600182510381518110612b3b57fe5b6020026020010160608152506001815103604051908082528060200260200182016040528015612b7f57816020015b6060815260200190600190039081612b6a5790505b509350612bc0565b8051604051908082528060200260200182016040528015612bbc57816020015b6060815260200190600190039081612ba75790505b5093505b60008090505b8451811015612c0757818181518110612bdb57fe5b6020026020010151858281518110612bef57fe5b60200260200101819052508080600101915050612bc6565b50505050919050565b60008060016020601f85510181612c2357fe5b040190506040518481526020810160005b83811015612c55578060200286015181602002830152806001019050612c34565b50602082602085026040018460006010600019f1935050505092915050565b6000606060006028905080845111612cc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cb890614c0c565b60405180910390fd5b6060816040519080825280601f01601f191660200182016040528015612cf65781602001600182028038833980820191505090505b50905060008090505b82811015612d6657858181518110612d1357fe5b602001015160f81c60f81b828281518110612d2a57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050612cff565b50600080905060008090505b83811015612e95576000838281518110612d8857fe5b602001015160f81c60f81b60f81c60ff16905060308110158015612dad575060398111155b80612dc6575060418110158015612dc55750605a8111155b5b80612ddf575060618110158015612dde575060668111155b5b612e1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e1590614c0c565b60405180910390fd5b60308110158015612e30575060398111155b15612e415760308103601084020192505b60418110158015612e535750605a8111155b15612e645760378103601084020192505b60618110158015612e76575060668111155b15612e875760578103601084020192505b508080600101915050612d72565b508094507f2f00000000000000000000000000000000000000000000000000000000000000868481518110612ec657fe5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612f33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f2a90614c0c565b60405180910390fd5b6000600184885103039050806040519080825280601f01601f191660200182016040528015612f715781602001600182028038833980820191505090505b50945060008090505b81811015612fec5760008860018784010181518110612f9557fe5b602001015160f81c60f81b905080878381518110612faf57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350508080600101915050612f7a565b5050505050915091565b600060405160200161300790614a5d565b604051602081830303815290604052805190602001208260405160200161302e9190614a31565b604051602081830303815290604052805190602001201480613099575060405160200161305a90614a48565b60405160208183030381529060405280519060200120826040516020016130819190614a31565b60405160208183030381529060405280519060200120145b806130a5575060008251145b156130b357600090506130d2565b60008251905060ff8111156130cc5760009150506130d2565b60019150505b919050565b60008060016020601f855101816130ea57fe5b040190506040518481526020810160005b8381101561311c5780602002860151816020028301528060010190506130fb565b5060208260208502604001846000600f600019f1935050505092915050565b600073d2001000000000000000000000000000000000d273ffffffffffffffffffffffffffffffffffffffff166383e781fe6040518163ffffffff1660e01b815260040160206040518083038186803b15801561319757600080fd5b505afa1580156131ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506131cf9190810190613da8565b905090565b600060606131e183612a10565b90506000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b82518110156132f25760008260010184600184038151811061324b57fe5b60200260200101516040516132609190614a1a565b908152602001604051809103902054116132af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132a690614c2c565b60405180910390fd5b816002018360018303815181106132c257fe5b60200260200101516040516132d79190614a1a565b9081526020016040518091039020915080600101905061322d565b5060606001835111613304578461331d565b8260018451038151811061331457fe5b60200260200101515b9050600082600101826040516133339190614a31565b90815260200160405180910390205411613382576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161337990614c2c565b60405180910390fd5b6000826000016001846001018460405161339c9190614a31565b90815260200160405180910390205403815481106133b657fe5b906000526020600020906005020190508094505050505092915050565b60008060016020601f855101816133e657fe5b04019050600060016020601f885101816133fc57fe5b040190506040518781526020810160005b8381101561342e57806020028901518160200283015280600101905061340d565b50868360200282015260005b84811015613460578060200287015181856001010160200283015280600101905061343a565b50602082848601602002606001846000600c600019f1945050505050949350505050565b600061348e613b4e565b600060016020601f885101816134a057fe5b0401905060006020601f8601816134b357fe5b0490506040518881526020810160005b848110156134e457806020028a0151816020028301528060010190506134c3565b5083602002810188815287816020015283602002868660030160200285600a600019fa9650505050505094509492505050565b60008060016020601f8551018161352a57fe5b040190506040518481526020810160005b8381101561355c57806020028601518160200283015280600101905061353b565b50602082602085026040018460006011600019f1935050505092915050565b60008060016020601f8651018161358e57fe5b040190506040518581526020810160005b838110156135c057806020028701518160200283015280600101905061359f565b50846020840282015260208260208502604001846000600b600019f193505050509392505050565b60008060016020601f855101816135fb57fe5b040190506040518481526020810160005b8381101561362d57806020028601518160200283015280600101905061360c565b5060208260208502604001846000600e600019f1935050505092915050565b600080600060016020601f8651018161366157fe5b040190506040518581526020810160005b83811015613693578060200287015181602002830152806001019050613672565b506020826020850260200184600d600019fa9450815193505050509250929050565b6136bd613b73565b600060208301905060405180604001604052808451815260200182815250915050919050565b600080826000015161370785600001518660200151866000015187602001516137d4565b0190505b8360000151846020015101811161375157818060010192505082600001516137498560200151830386600001510383866000015187602001516137d4565b01905061370b565b5092915050565b613760613b73565b61376b8383836138af565b5092915050565b60608082600001516040519080825280601f01601f1916602001820160405280156137ac5781602001600182028038833980820191505090505b50905060006020820190506137ca818560200151866000015161394d565b8192505050919050565b600080849050600086851161389f576020851161385957600060018660200360080260020a031960001b905060008186511690506000878a8a0103905060008386511690505b82811461384b57818610613838578a8a0196505050505050506138a7565b858060010196505083865116905061381a565b8596505050505050506138a7565b60008585209050600091505b858803821161389d57600086842090508082141561388957839450505050506138a7565b600184019350508180600101925050613865565b505b868601925050505b949350505050565b6138b7613b73565b60006138d585600001518660200151866000015187602001516137d4565b90508460200151836020018181525050846020015181038360000181815250508460000151856020015101811415613917576000856000018181525050613942565b8360000151836000015101856000018181510391508181525050836000015181018560200181815250505b829150509392505050565b5b60208110613971578151835260208301925060208201915060208103905061394e565b60006001826020036101000a0390508019835116818551168181178652505050505050565b6040518060a001604052806060815260200160001515815260200160008152602001600060028111156139c557fe5b8152602001606081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613a1357805160ff1916838001178555613a41565b82800160010185558215613a41579182015b82811115613a40578251825591602001919060010190613a25565b5b509050613a4e9190613b8d565b5090565b82805482825590600052602060002090601f01602090048101928215613ae75791602002820160005b83821115613ab857835183826101000a81548160ff0219169083151502179055509260200192600101602081600001049283019260010302613a7b565b8015613ae55782816101000a81549060ff0219169055600101602081600001049283019260010302613ab8565b505b509050613af49190613bb2565b5090565b815481835581811115613b2557600502816005028360005260206000209182019101613b249190613be2565b5b505050565b5080546000825560050290600052602060002090810190613b4b9190613be2565b50565b6040518062100000016040528061800090602082028038833980820191505090505090565b604051806040016040528060008152602001600081525090565b613baf91905b80821115613bab576000816000905550600101613b93565b5090565b90565b613bdf91905b80821115613bdb57600081816101000a81549060ff021916905550600101613bb8565b5090565b90565b613c4e91905b80821115613c4a5760008082016000613c019190613c51565b6001820160006101000a81549060ff021916905560028201600090556003820160006101000a81549060ff0219169055600482016000613c419190613c99565b50600501613be8565b5090565b90565b50805460018160011615610100020316600290046000825580601f10613c775750613c96565b601f016020900490600052602060002090810190613c959190613b8d565b5b50565b50805460008255601f016020900490600052602060002090810190613cbe9190613b8d565b50565b600081359050613cd081615086565b92915050565b600081519050613ce581615086565b92915050565b600082601f830112613cfc57600080fd5b8135613d0f613d0a82614e74565b614e47565b91508082526020830160208301858383011115613d2b57600080fd5b613d36838284615026565b50505092915050565b600082601f830112613d5057600080fd5b8135613d63613d5e82614ea0565b614e47565b91508082526020830160208301858383011115613d7f57600080fd5b613d8a838284615026565b50505092915050565b600081359050613da28161509d565b92915050565b600060208284031215613dba57600080fd5b6000613dc884828501613cd6565b91505092915050565b60008060408385031215613de457600080fd5b6000613df285828601613cc1565b9250506020613e0385828601613d93565b9150509250929050565b600060208284031215613e1f57600080fd5b600082013567ffffffffffffffff811115613e3957600080fd5b613e4584828501613d3f565b91505092915050565b60008060408385031215613e6157600080fd5b600083013567ffffffffffffffff811115613e7b57600080fd5b613e8785828601613d3f565b9250506020613e9885828601613d93565b9150509250929050565b600080600060608486031215613eb757600080fd5b600084013567ffffffffffffffff811115613ed157600080fd5b613edd86828701613d3f565b9350506020613eee86828701613d93565b925050604084013567ffffffffffffffff811115613f0b57600080fd5b613f1786828701613ceb565b9150509250925092565b600080600060608486031215613f3657600080fd5b600084013567ffffffffffffffff811115613f5057600080fd5b613f5c86828701613d3f565b9350506020613f6d86828701613d93565b9250506040613f7e86828701613d93565b9150509250925092565b6000613f9483836140f6565b60208301905092915050565b6000613fac8383614105565b60208301905092915050565b6000613fc4838361497f565b905092915050565b6000613fd782614ef6565b613fe18185614f55565b9350613fec83614ecc565b8060005b8381101561401d5781516140048882613f88565b975061400f83614f2e565b925050600181019050613ff0565b5085935050505092915050565b61403381614f01565b61403d8184614f66565b925061404882614edc565b8060005b838110156140795781516140608782613fa0565b965061406b83614f3b565b92505060018101905061404c565b505050505050565b600061408c82614f0d565b6140968185614f71565b9350836020820285016140a885614ee6565b8060005b858110156140e457848403895281516140c58582613fb8565b94506140d083614f48565b925060208a019950506001810190506140ac565b50829750879550505050505092915050565b6140ff81614fc1565b82525050565b61410e81614fcd565b82525050565b61411d81615014565b82525050565b61412c81615014565b82525050565b600061413d82614f23565b6141478185614fa4565b9350614157818560208601615035565b80840191505092915050565b600061416e82614f18565b6141788185614f82565b9350614188818560208601615035565b61419181615068565b840191505092915050565b60006141a782614f18565b6141b18185614fa4565b93506141c1818560208601615035565b80840191505092915050565b60006141da601883614f93565b91507f496e636f7272656374206368756e6b20706f736974696f6e00000000000000006000830152602082019050919050565b600061421a601583614f93565b91507f4469726563746f7279206e6f74206372656174656400000000000000000000006000830152602082019050919050565b600061425a602483614f93565b91507f4e6f7420656e6f756768206d656d6f727920696e207468652046696c6573746f60008301527f72616765000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006142c0601b83614f93565b91507f48617368206861736e2774206265656e2063616c63756c6174656400000000006000830152602082019050919050565b6000614300601983614f93565b91507f4368756e6b20697320616c72656164792075706c6f61646564000000000000006000830152602082019050919050565b6000614340601683614f93565b91507f496e636f7272656374206368756e6b206c656e677468000000000000000000006000830152602082019050919050565b6000614380600f83614f93565b91507f46696c65206e6f742065786973747300000000000000000000000000000000006000830152602082019050919050565b60006143c0600e83614f93565b91507f496e76616c69642073656e6465720000000000000000000000000000000000006000830152602082019050919050565b6000614400601883614f93565b91507f4469726563746f7279206973206e6f742064656c6574656400000000000000006000830152602082019050919050565b6000614440601083614f93565b91507f46696c65206e6f742064656c65746564000000000000000000000000000000006000830152602082019050919050565b6000614480601383614f93565b91507f496e76616c69642073746f7261676550617468000000000000000000000000006000830152602082019050919050565b60006144c0600c83614f93565b91507f496e76616c6964207061746800000000000000000000000000000000000000006000830152602082019050919050565b6000614500600183614fa4565b91507f2e000000000000000000000000000000000000000000000000000000000000006000830152600182019050919050565b6000614540601683614f93565b91507f496e76616c6964206469726563746f7279206e616d65000000000000000000006000830152602082019050919050565b6000614580601583614f93565b91507f4368756e6b207761736e27742075706c6f6164656400000000000000000000006000830152602082019050919050565b60006145c0602683614f93565b91507f436f756c64206e6f742072657365727665206c657373207468616e207573656460008301527f20737061636500000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614626601683614f93565b91507f4469726563746f7279206973206e6f7420656d707479000000000000000000006000830152602082019050919050565b6000614666602383614f93565b91507f46696c65206861736e2774206265656e2075706c6f6164656420636f7272656360008301527f746c7900000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006146cc601183614f93565b91507f4368756e6b207761736e277420726561640000000000000000000000000000006000830152602082019050919050565b600061470c601883614f93565b91507f46696c656e616d652073686f756c64206265203c2032353600000000000000006000830152602082019050919050565b600061474c601f83614f93565b91507f46696c652073686f756c64206265206c657373207468616e20313030204d42006000830152602082019050919050565b600061478c600283614fa4565b91507f2e2e0000000000000000000000000000000000000000000000000000000000006000830152600282019050919050565b60006147cc601183614f93565b91507f4469726563746f72792069732066756c6c0000000000000000000000000000006000830152602082019050919050565b600061480c600e83614f93565b91507f46696c65206e6f7420666f756e640000000000000000000000000000000000006000830152602082019050919050565b600061484c601883614f93565b91507f46696c65206f72206469726563746f72792065786973747300000000000000006000830152602082019050919050565b600061488c601983614f93565b91507f4e6f7420656e6f756768207265736572766564207370616365000000000000006000830152602082019050919050565b60006148cc601883614f93565b91507f45564d206572726f7220696e2067657446696c6553697a6500000000000000006000830152602082019050919050565b600061490c601083614f93565b91507f46696c65206e6f742063726561746564000000000000000000000000000000006000830152602082019050919050565b600061494c601983614f93565b91507f46696c65206861736e2774206265656e2075706c6f61646564000000000000006000830152602082019050919050565b600060a083016000830151848203600086015261499c8282614163565b91505060208301516149b160208601826140f6565b5060408301516149c460408601826149fc565b5060608301516149d76060860182614114565b50608083015184820360808601526149ef8282613fcc565b9150508091505092915050565b614a058161500a565b82525050565b614a148161500a565b82525050565b6000614a26828461419c565b915081905092915050565b6000614a3d8284614132565b915081905092915050565b6000614a53826144f3565b9150819050919050565b6000614a688261477f565b9150819050919050565b60006210000082019050614a89600083018461402a565b92915050565b60006020820190508181036000830152614aa98184614081565b905092915050565b6000602082019050614ac66000830184614123565b92915050565b60006020820190508181036000830152614ae5816141cd565b9050919050565b60006020820190508181036000830152614b058161420d565b9050919050565b60006020820190508181036000830152614b258161424d565b9050919050565b60006020820190508181036000830152614b45816142b3565b9050919050565b60006020820190508181036000830152614b65816142f3565b9050919050565b60006020820190508181036000830152614b8581614333565b9050919050565b60006020820190508181036000830152614ba581614373565b9050919050565b60006020820190508181036000830152614bc5816143b3565b9050919050565b60006020820190508181036000830152614be5816143f3565b9050919050565b60006020820190508181036000830152614c0581614433565b9050919050565b60006020820190508181036000830152614c2581614473565b9050919050565b60006020820190508181036000830152614c45816144b3565b9050919050565b60006020820190508181036000830152614c6581614533565b9050919050565b60006020820190508181036000830152614c8581614573565b9050919050565b60006020820190508181036000830152614ca5816145b3565b9050919050565b60006020820190508181036000830152614cc581614619565b9050919050565b60006020820190508181036000830152614ce581614659565b9050919050565b60006020820190508181036000830152614d05816146bf565b9050919050565b60006020820190508181036000830152614d25816146ff565b9050919050565b60006020820190508181036000830152614d458161473f565b9050919050565b60006020820190508181036000830152614d65816147bf565b9050919050565b60006020820190508181036000830152614d85816147ff565b9050919050565b60006020820190508181036000830152614da58161483f565b9050919050565b60006020820190508181036000830152614dc58161487f565b9050919050565b60006020820190508181036000830152614de5816148bf565b9050919050565b60006020820190508181036000830152614e05816148ff565b9050919050565b60006020820190508181036000830152614e258161493f565b9050919050565b6000602082019050614e416000830184614a0b565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614e6a57600080fd5b8060405250919050565b600067ffffffffffffffff821115614e8b57600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614eb757600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050919050565b6000819050602082019050919050565b600081519050919050565b60006180009050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614fba82614fea565b9050919050565b60008115159050919050565b6000819050919050565b6000819050614fe582615079565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061501f82614fd7565b9050919050565b82818337600083830152505050565b60005b83811015615053578082015181840152602081019050615038565b83811115615062576000848401525b50505050565b6000601f19601f8301169050919050565b6003811061508357fe5b50565b61508f81614faf565b811461509a57600080fd5b50565b6150a68161500a565b81146150b157600080fd5b5056fea365627a7a72315820314a90e541327f2678eaf7815f54348c3702e4fa45cdf1d5595b378d08af86896c6578706572696d656e74616cf564736f6c634300050d0040", + "nonce": "0", + "storage": { + "0x0": "2868903936" + } + }, + "0x69bfcdcb98c9562e0a2faee3ecdfd65e8a0adb19": { + "balance": "1000000000000000000000000000000" + }, + "0x6a37ad7dceec4595eea9f03b82d2710e738343ac": { + "balance": "1000000000000000000000000000000" + }, + "0x6b806862a977a0e22ed1752f858e5332647121c8": { + "balance": "1000000000000000000000000000000" + }, + "0x6c0ef9084a57df13c175afea32ea47a510c5506e": { + "balance": "1000000000000000000000000000000" + }, + "0x6cd5e637266e18d3e888ee99451eb828c6b491f4": { + "balance": "1000000000000000000000000000000" + }, + "0x6d0d7f0ff51917bd84a5f7270d31a894282aaf4b": { + "balance": "1000000000000000000000000000000" + }, + "0x6d8092cb926daf29236f866cd31c327ff73323d1": { + "balance": "1000000000000000000000000000000" + }, + "0x6d80aAC61F6d92c7F4A3c412850474ba963B698E": { + "balance": "1000000000000000000000" + }, + "0x6fec280c0ab320715b17d70e8b02c2d4141c1372": { + "balance": "1000000000000000000000000000000" + }, + "0x733ad609ef2e742334d96266fbc13733f1cf5e4a": { + "balance": "1000000000000000000000000000000" + }, + "0x7525198d8cd1121d57358a0b0ed037e924581a76": { + "balance": "1000000000000000000000000000000" + }, + "0x765708943c3b791563d1e3f0533b6d7e7d769e4d": { + "balance": "1000000000000000000000000000000" + }, + "0x7685d04f0b7657017b77efa004a14ff9f022acab": { + "balance": "1000000000000000000000000000000" + }, + "0x76b545cb6a2fc671f741950eeb27627e69a1e69b": { + "balance": "1000000000000000000000000000000" + }, + "0x77a0bc73442d3d9cb993e8d9752f95babf0ccaa6": { + "balance": "1000000000000000000000000000000" + }, + "0x7a89A6c323FaCfF0ADeF7EEF3e491aD4044d0592": { + "balance": "100000000000000000000000" + }, + "0x7e7E68F04D1799Fa25C8cff57314c8a5d3942e69": { + "balance": "1000000000000000000000000" + }, + "0x811d701d14539d190a8593fe901eafe8eff511f5": { + "balance": "1000000000000000000000000000000" + }, + "0x81dcbd71da28fafb9ca99ff5a22bfcebba84fecc": { + "balance": "100000000000000000000000" + }, + "0x83c1479d2a32d9ed9fa699289b6c2db56b7cd045": { + "balance": "1000000000000000000000000000000" + }, + "0x85b33f0853ab8eaa4e602bdfd724d44bc2731e90": { + "balance": "1000000000000000000000000000000" + }, + "0x863f816036e3cbba90855196c9d1e339fcff1650": { + "balance": "1000000000000000000000000000000" + }, + "0x87ea381878572d63b3453033d7540abddd191186": { + "balance": "1000000000000000000000000000000" + }, + "0x88fd5e01078629cc194c933d9631b9448fe10b1d": { + "balance": "1000000000000000000000000000000" + }, + "0x8945e48bd056f45c8b57f9025d2674bb03a24035": { + "balance": "1000000000000000000000000000000" + }, + "0x8a920edc1021ce76c22774e0e83723a6e51c2439": { + "balance": "1000000000000000000000000000000" + }, + "0x8e6081e272c8f4d49f5b29157b52f68cbd6307ad": { + "balance": "1000000000000000000000000000000" + }, + "0x8fe24dbbf9884bd458d8cfac528b4ad70e82497d": { + "balance": "1000000000000000000000000000000" + }, + "0x90431f3f75b26657f74abbb5c759b12e78f916cc": { + "balance": "1000000000000000000000000000000" + }, + "0x907cd0881E50d359bb9Fd120B1A5A143b1C97De6": { + "balance": "1000000000000000000000000000000000000000000000000000000000" + }, + "0x94c6e5746971d6aebeaa42cbbe2feca0f6b5b24f": { + "balance": "1000000000000000000000000000000" + }, + "0x96672f9e982936e1904b15c948cc81bf18027db6": { + "balance": "1000000000000000000000000000000" + }, + "0x97b921ba45e0aa8830701aa62050a83ee00a1bb8": { + "balance": "1000000000000000000000000000000" + }, + "0x98e50c97baf98dc6a81bdb95067339a269a36fc1": { + "balance": "1000000000000000000000000000000" + }, + "0x9b77f28285a49601169a33332f08aa309d97edd0": { + "balance": "1000000000000000000000000000000" + }, + "0x9f62f4215cd277ca40dede101b4ccb29290de6bb": { + "balance": "1000000000000000000000000000000" + }, + "0xD1001000000000000000000000000000000000D1": { + "balance": "0", + "code": "0x608060405260043610603f576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680636d4ce63c146044575b600080fd5b348015604f57600080fd5b506056606c565b6040518082815260200191505060405180910390f35b60006001600060048152602001908152602001600020600060098152602001908152602001600020600101549050905600a165627a7a723058208fe64219becc0bcab1c8f854f05804ebb6bb555da5dbc49e8f7021c31d77636a0029", + "nonce": "0", + "storage": { + "0x3b4da637a1b0e6dbfc6795f2b7f0cb29eebb91b3af4dcc335e1633f6b4af810b": "1111" + } + }, + "0xD3001000000000000000000000000000000000D3": { + "balance": "0", + "code": "0x60806040526004361061007b5760003560e01c80639623609d1161004e5780639623609d1461013657806399a88ec4146101f5578063f2fde38b14610230578063f3b7dead146102635761007b565b8063204e1c7a14610080578063715018a6146100cf5780637eff275e146100e65780638da5cb5b14610121575b600080fd5b34801561008c57600080fd5b506100b3600480360360208110156100a357600080fd5b50356001600160a01b0316610296565b604080516001600160a01b039092168252519081900360200190f35b3480156100db57600080fd5b506100e4610328565b005b3480156100f257600080fd5b506100e46004803603604081101561010957600080fd5b506001600160a01b03813581169160200135166103ca565b34801561012d57600080fd5b506100b3610496565b6100e46004803603606081101561014c57600080fd5b6001600160a01b03823581169260208101359091169181019060608101604082013564010000000081111561018057600080fd5b82018360208201111561019257600080fd5b803590602001918460018302840111640100000000831117156101b457600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506104a5945050505050565b34801561020157600080fd5b506100e46004803603604081101561021857600080fd5b506001600160a01b03813581169160200135166105dd565b34801561023c57600080fd5b506100e46004803603602081101561025357600080fd5b50356001600160a01b031661068d565b34801561026f57600080fd5b506100b36004803603602081101561028657600080fd5b50356001600160a01b0316610785565b6000806060836001600160a01b03166040518080635c60da1b60e01b8152506004019050600060405180830381855afa9150503d80600081146102f5576040519150601f19603f3d011682016040523d82523d6000602084013e6102fa565b606091505b50915091508161030957600080fd5b80806020019051602081101561031e57600080fd5b5051949350505050565b6103306107e4565b6000546001600160a01b03908116911614610380576040805162461bcd60e51b8152602060048201819052602482015260008051602061080f833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6103d26107e4565b6000546001600160a01b03908116911614610422576040805162461bcd60e51b8152602060048201819052602482015260008051602061080f833981519152604482015290519081900360640190fd5b816001600160a01b0316638f283970826040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050600060405180830381600087803b15801561047a57600080fd5b505af115801561048e573d6000803e3d6000fd5b505050505050565b6000546001600160a01b031690565b6104ad6107e4565b6000546001600160a01b039081169116146104fd576040805162461bcd60e51b8152602060048201819052602482015260008051602061080f833981519152604482015290519081900360640190fd5b826001600160a01b0316634f1ef2863484846040518463ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561057357818101518382015260200161055b565b50505050905090810190601f1680156105a05780820380516001836020036101000a031916815260200191505b5093505050506000604051808303818588803b1580156105bf57600080fd5b505af11580156105d3573d6000803e3d6000fd5b5050505050505050565b6105e56107e4565b6000546001600160a01b03908116911614610635576040805162461bcd60e51b8152602060048201819052602482015260008051602061080f833981519152604482015290519081900360640190fd5b816001600160a01b0316633659cfe6826040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050600060405180830381600087803b15801561047a57600080fd5b6106956107e4565b6000546001600160a01b039081169116146106e5576040805162461bcd60e51b8152602060048201819052602482015260008051602061080f833981519152604482015290519081900360640190fd5b6001600160a01b03811661072a5760405162461bcd60e51b81526004018080602001828103825260268152602001806107e96026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000806060836001600160a01b031660405180806303e1469160e61b8152506004019050600060405180830381855afa9150503d80600081146102f5576040519150601f19603f3d011682016040523d82523d6000602084013e6102fa565b339056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a26469706673582212201d968ac32bef5562c6b4f1bd5d2f2a74c14d07ce008ca6fdc5a3bd0f5fc265f564736f6c63430006080033", + "nonce": "0", + "storage": { + "0x0": "0x907cd0881E50d359bb9Fd120B1A5A143b1C97De6" + } + }, + "0xD3002000000000000000000000000000000000D3": { + "balance": "0", + "code": "0x60806040526004361061004e5760003560e01c80633659cfe6146100655780634f1ef286146100985780635c60da1b146101185780638f28397014610149578063f851a4401461017c5761005d565b3661005d5761005b610191565b005b61005b610191565b34801561007157600080fd5b5061005b6004803603602081101561008857600080fd5b50356001600160a01b03166101ab565b61005b600480360360408110156100ae57600080fd5b6001600160a01b0382351691908101906040810160208201356401000000008111156100d957600080fd5b8201836020820111156100eb57600080fd5b8035906020019184600183028401116401000000008311171561010d57600080fd5b5090925090506101e5565b34801561012457600080fd5b5061012d610292565b604080516001600160a01b039092168252519081900360200190f35b34801561015557600080fd5b5061005b6004803603602081101561016c57600080fd5b50356001600160a01b03166102cf565b34801561018857600080fd5b5061012d610389565b6101996103ba565b6101a96101a461041a565b61043f565b565b6101b3610463565b6001600160a01b0316336001600160a01b031614156101da576101d581610488565b6101e2565b6101e2610191565b50565b6101ed610463565b6001600160a01b0316336001600160a01b031614156102855761020f83610488565b6000836001600160a01b031683836040518083838082843760405192019450600093509091505080830381855af49150503d806000811461026c576040519150601f19603f3d011682016040523d82523d6000602084013e610271565b606091505b505090508061027f57600080fd5b5061028d565b61028d610191565b505050565b600061029c610463565b6001600160a01b0316336001600160a01b031614156102c4576102bd61041a565b90506102cc565b6102cc610191565b90565b6102d7610463565b6001600160a01b0316336001600160a01b031614156101da576001600160a01b0381166103355760405162461bcd60e51b81526004018080602001828103825260368152602001806105876036913960400191505060405180910390fd5b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f61035e610463565b604080516001600160a01b03928316815291841660208301528051918290030190a16101d5816104c8565b6000610393610463565b6001600160a01b0316336001600160a01b031614156102c4576102bd610463565b3b151590565b6103c2610463565b6001600160a01b0316336001600160a01b031614156104125760405162461bcd60e51b81526004018080602001828103825260328152602001806105556032913960400191505060405180910390fd5b6101a96101a9565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b3660008037600080366000845af43d6000803e80801561045e573d6000f35b3d6000fd5b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b610491816104ec565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610355565b6104f5816103b4565b6105305760405162461bcd60e51b815260040180806020018281038252603b8152602001806105bd603b913960400191505060405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5556fe43616e6e6f742063616c6c2066616c6c6261636b2066756e6374696f6e2066726f6d207468652070726f78792061646d696e43616e6e6f74206368616e6765207468652061646d696e206f6620612070726f787920746f20746865207a65726f206164647265737343616e6e6f742073657420612070726f787920696d706c656d656e746174696f6e20746f2061206e6f6e2d636f6e74726163742061646472657373a26469706673582212206e221e2a3547bd97244b05ed46430b1b078ba097cb2a4e25ec3d79cf9ac9f02c64736f6c63430006080033", + "nonce": "0", + "storage": { + "0x0": "1000000", + "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0xD3003000000000000000000000000000000000D3", + "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "0xD3001000000000000000000000000000000000D3" + } + }, + "0xD3003000000000000000000000000000000000D3": { + "balance": "0", + "code": "0x608060405234801561001057600080fd5b50600436106100b45760003560e01c806379210e8e1161007157806379210e8e1461017757806381a8235a146101a757806385aeeb17146101c35780639a9a5593146101f3578063a99100541461020f578063b57321221461022b576100b4565b806307c6e7d3146100b9578063122f4fba146100d55780631c6ec7a9146101055780631cfe4e3b14610121578063373dedb41461013d57806361e46db51461015b575b600080fd5b6100d360048036036100ce9190810190613e94565b61025b565b005b6100ef60048036036100ea9190810190613e94565b610862565b6040516100fc9190614b38565b60405180910390f35b61011f600480360361011a9190810190613e94565b610ba1565b005b61013b60048036036101369190810190613e58565b610fce565b005b6101456111ec565b6040516101529190614eb3565b60405180910390f35b61017560048036036101709190810190613f29565b6111f6565b005b610191600480360361018c9190810190613fa8565b611456565b60405161019e9190614af9565b60405180910390f35b6101c160048036036101bc9190810190613e94565b611756565b005b6101dd60048036036101d89190810190613e94565b6118fb565b6040516101ea9190614b16565b60405180910390f35b61020d60048036036102089190810190613ed5565b611bfa565b005b61022960048036036102249190810190613e94565b612195565b005b61024560048036036102409190810190613e94565b612849565b6040516102529190614eb3565b60405180910390f35b6000339050606061026b83612ac9565b90506000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b825181101561037c576000826001018460018403815181106102d557fe5b60200260200101516040516102ea9190614aa1565b90815260200160405180910390205411610339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161033090614cb3565b60405180910390fd5b8160020183600183038151811061034c57fe5b60200260200101516040516103619190614aa1565b908152602001604051809103902091508060010190506102b7565b506060600183511161038e57846103a7565b8260018451038151811061039e57fe5b60200260200101515b9050600082600101826040516103bd9190614ab8565b9081526020016040518091039020541161040c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161040390614cb3565b60405180910390fd5b600082600201826040516104209190614ab8565b90815260200160405180910390206000018054905014610475576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161046c90614d33565b60405180910390fd5b60006104818587612cc9565b9050806104c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ba90614c53565b60405180910390fd5b6104cb613a4f565b836000016001856000018054905003815481106104e457fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156105965780601f1061056b57610100808354040283529160200191610596565b820191906000526020600020905b81548152906001019060200180831161057957829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff1660028111156105e257fe5b60028111156105ed57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561066557602002820191906000526020600020906000905b82829054906101000a900460ff1615158152602001906001019060208260000104928301926001038202915080841161062f5790505b50505050508152505090508084600001600186600101866040516106899190614ab8565b90815260200160405180910390205403815481106106a357fe5b906000526020600020906005020160008201518160000190805190602001906106cd929190613a8b565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561071c57fe5b0217905550608082015181600401908051906020019061073d929190613b0b565b5090505083600101836040516107539190614ab8565b9081526020016040518091039020548460010182600001516040516107789190614aa1565b9081526020016040518091039020819055506000846001018460405161079e9190614ab8565b908152602001604051809103902081905550836000018054806107bd57fe5b6001900381819060005260206000209060050201600080820160006107e29190613bb1565b6001820160006101000a81549060ff021916905560028201600090556003820160006101000a81549060ff02191690556004820160006108229190613bf9565b5050905583600201836040516108389190614ab8565b9081526020016040518091039020600080820160006108579190613c21565b505050505050505050565b600080606061087084612d2d565b91509150606061087f82612ac9565b90506000600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015610964576000826001018460018403815181106108e957fe5b60200260200101516040516108fe9190614aa1565b908152602001604051809103902054141561092157600095505050505050610b9c565b8160020183600183038151811061093457fe5b60200260200101516040516109499190614aa1565b908152602001604051809103902091508060010190506108cb565b5060606001835111610976578361098f565b8260018451038151811061098657fe5b60200260200101515b9050600082600101826040516109a59190614ab8565b90815260200160405180910390205414156109c857600095505050505050610b9c565b6109d0613a4f565b82600001600184600101846040516109e89190614ab8565b9081526020016040518091039020540381548110610a0257fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610ab45780601f10610a8957610100808354040283529160200191610ab4565b820191906000526020600020905b815481529060010190602001808311610a9757829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115610b0057fe5b6002811115610b0b57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015610b8357602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411610b4d5790505b5050505050815250509050806060015196505050505050505b919050565b600360009054906101000a900460ff16610be457612000600481905550621000006005819055506001600360006101000a81548160ff0219169083151502179055505b6000815111610c28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1f90614cb3565b60405180910390fd5b60003390506060610c3883612ac9565b90506000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015610d4957600082600101846001840381518110610ca257fe5b6020026020010151604051610cb79190614aa1565b90815260200160405180910390205411610d06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cfd90614cb3565b60405180910390fd5b81600201836001830381518110610d1957fe5b6020026020010151604051610d2e9190614aa1565b90815260200160405180910390209150806001019050610c84565b50600454816000018054905010610d95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8c90614dd3565b60405180910390fd5b60606001835111610da65784610dbf565b82600184510381518110610db657fe5b60200260200101515b905060008260010182604051610dd59190614ab8565b90815260200160405180910390205414610e24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1b90614e13565b60405180910390fd5b610e2d816130af565b610e6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6390614cd3565b60405180910390fd5b6000610e788587613190565b905080610eba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb190614b73565b60405180910390fd5b610ec2613a4f565b8281600001819052506000816020019015159081151581525050836000018190806001815401808255809150506001900390600052602060002090600502016000909190919091506000820151816000019080519060200190610f26929190613a8b565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff02191690836002811115610f7557fe5b02179055506080820151816004019080519060200190610f96929190613b0b565b50505083600001805490508460010184604051610fb39190614ab8565b90815260200160405180910390208190555050505050505050565b610fd66131f4565b73ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16148061103b57503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614155b61107a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107190614c33565b60405180910390fd5b80600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411156110fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f390614d13565b60405180910390fd5b60025460095482011115611145576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113c90614b93565b60405180910390fd5b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460096000828254039250508190555080600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550806009600082825401925050819055505050565b6000600254905090565b60003390506000611207828661328d565b90506001600281111561121657fe5b8160030160009054906101000a900460ff16600281111561123357fe5b14611273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126a90614df3565b60405180910390fd5b6000600554858161128057fe5b061480156112915750806002015484105b6112d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c790614b53565b60405180910390fd5b600554848260020154031080156112ed5750838160020154038351145b806112fa57506005548351145b611339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133090614bf3565b60405180910390fd5b6000151581600401600554868161134c57fe5b048154811061135757fe5b90600052602060002090602091828204019190069054906101000a900460ff161515146113b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b090614bd3565b60405180910390fd5b60006113c78387878761348c565b905080611409576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140090614cf3565b60405180910390fd5b600182600401600554878161141a57fe5b048154811061142557fe5b90600052602060002090602091828204019190066101000a81548160ff021916908315150217905550505050505050565b61145e613c45565b6000606061146b86612d2d565b91509150611477613a4f565b611481838361328d565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156115255780601f106114fa57610100808354040283529160200191611525565b820191906000526020600020905b81548152906001019060200180831161150857829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561157157fe5b600281111561157c57fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156115f457602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116115be5790505b505050505081525050905060028081111561160b57fe5b8160600151600281111561161b57fe5b1461165b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165290614e93565b60405180910390fd5b600554851115801561166d5750600085115b6116ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a390614bf3565b60405180910390fd5b806040015185870111156116f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ec90614b53565b60405180910390fd5b60006117038484898961353d565b80965081925050508061174b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174290614d73565b60405180910390fd5b505050509392505050565b60003390506000611767828461328d565b90506001600281111561177657fe5b8160030160009054906101000a900460ff16600281111561179357fe5b146117d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ca90614df3565b60405180910390fd5b60006001905060008260040180549050905060008090505b8181101561183e576000151584600401828154811061180657fe5b90600052602060002090602091828204019190069054906101000a900460ff161515141561183357600092505b8060010190506117eb565b508161187f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187690614d53565b60405180910390fd5b60028360030160006101000a81548160ff021916908360028111156118a057fe5b021790555060006118b185876135d0565b9050806118f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ea90614bb3565b60405180910390fd5b505050505050565b60606000606061190a84612d2d565b91509150606061191982612ac9565b90506000600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008090505b8251811015611a235760008260010184838151811061197f57fe5b60200260200101516040516119949190614aa1565b908152602001604051809103902054116119e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119da90614cb3565b60405180910390fd5b816002018382815181106119f357fe5b6020026020010151604051611a089190614aa1565b90815260200160405180910390209150806001019050611964565b5080600001805480602002602001604051908101604052809291908181526020016000905b82821015611beb57838290600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611b045780601f10611ad957610100808354040283529160200191611b04565b820191906000526020600020905b815481529060010190602001808311611ae757829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115611b5057fe5b6002811115611b5b57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015611bd357602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411611b9d5790505b50505050508152505081526020019060010190611a48565b50505050945050505050919050565b600360009054906101000a900460ff16611c3d57612000600481905550621000006005819055506001600360006101000a81548160ff0219169083151502179055505b60003390506305f5e100821115611c89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8090614db3565b60405180910390fd5b600660008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205483011115611d4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4390614e33565b60405180910390fd5b6060611d5784612ac9565b90506000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015611e6857600082600101846001840381518110611dc157fe5b6020026020010151604051611dd69190614aa1565b90815260200160405180910390205411611e25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1c90614cb3565b60405180910390fd5b81600201836001830381518110611e3857fe5b6020026020010151604051611e4d9190614aa1565b90815260200160405180910390209150806001019050611da3565b50600454816000018054905010611eb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eab90614dd3565b60405180910390fd5b60606001835111611ec55785611ede565b82600184510381518110611ed557fe5b60200260200101515b905060008260010182604051611ef49190614ab8565b90815260200160405180910390205414611f43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3a90614e13565b60405180910390fd5b611f4c816130af565b611f8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8290614d93565b60405180910390fd5b6000611f98858888613634565b905080611fda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd190614e73565b60405180910390fd5b6060600554600160055489010381611fee57fe5b0460405190808252806020026020018201604052801561201d5781602001602082028038833980820191505090505b509050836000016040518060a001604052808581526020016001151581526020018981526020016001600281111561205157fe5b8152602001838152509080600181540180825580915050600190039060005260206000209060050201600090919091909150600082015181600001908051906020019061209f929190613a8b565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff021916908360028111156120ee57fe5b0217905550608082015181600401908051906020019061210f929190613b0b565b5050508360000180549050846001018460405161212c9190614ab8565b90815260200160405180910390208190555086600760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505050505050505050565b60003390506121a2613a4f565b6121ac828461328d565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156122505780601f1061222557610100808354040283529160200191612250565b820191906000526020600020905b81548152906001019060200180831161223357829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561229c57fe5b60028111156122a757fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561231f57602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116122e95790505b50505050508152505090506000600281111561233757fe5b8160600151600281111561234757fe5b1415612388576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161237f90614c13565b60405180910390fd5b600061239483856136a1565b9050806123d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123cd90614c73565b60405180910390fd5b60606123e185612ac9565b90506000600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015612479578160020183600183038151811061244957fe5b602002602001015160405161245e9190614aa1565b9081526020016040518091039020915080600101905061242d565b50600060018260010186600001516040516124949190614aa1565b9081526020016040518091039020540390506124ae613a4f565b826000016001846000018054905003815481106124c757fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156125795780601f1061254e57610100808354040283529160200191612579565b820191906000526020600020905b81548152906001019060200180831161255c57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff1660028111156125c557fe5b60028111156125d057fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561264857602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116126125790505b50505050508152505090508083600001838154811061266357fe5b9060005260206000209060050201600082015181600001908051906020019061268d929190613a8b565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff021916908360028111156126dc57fe5b021790555060808201518160040190805190602001906126fd929190613b0b565b509050508260000180548061270e57fe5b6001900381819060005260206000209060050201600080820160006127339190613bb1565b6001820160006101000a81549060ff021916905560028201600090556003820160006101000a81549060ff02191690556004820160006127739190613bf9565b5050905582600101866000015160405161278d9190614aa1565b9081526020016040518091039020548360010182600001516040516127b29190614aa1565b90815260200160405180910390208190555060008360010187600001516040516127dc9190614aa1565b9081526020016040518091039020819055508560400151600760008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505050505050505050565b600080606061285784612d2d565b91509150612863613a4f565b61286d838361328d565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156129115780601f106128e657610100808354040283529160200191612911565b820191906000526020600020905b8154815290600101906020018083116128f457829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561295d57fe5b600281111561296857fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156129e057602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116129aa5790505b5050505050815250509050600160028111156129f857fe5b81606001516002811115612a0857fe5b1480612a2d5750600280811115612a1b57fe5b81606001516002811115612a2b57fe5b145b612a6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a6390614df3565b60405180910390fd5b6000612a788484613705565b809650819250505080612ac0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ab790614e53565b60405180910390fd5b50505050919050565b6060612ad3613c6a565b612adc8361376e565b9050612ae6613c6a565b612b246040518060400160405280600181526020017f2f0000000000000000000000000000000000000000000000000000000000000081525061376e565b905060606001612b3d838561379c90919063ffffffff16565b01604051908082528060200260200182016040528015612b7157816020015b6060815260200190600190039081612b5c5790505b50905060008090505b8151811015612bc257612b9e612b99848661381190919063ffffffff16565b61382b565b828281518110612baa57fe5b60200260200101819052508080600101915050612b7a565b50600081600183510381518110612bd557fe5b6020026020010151511415612c405780600182510381518110612bf457fe5b6020026020010160608152506001815103604051908082528060200260200182016040528015612c3857816020015b6060815260200190600190039081612c235790505b509350612c79565b8051604051908082528060200260200182016040528015612c7557816020015b6060815260200190600190039081612c605790505b5093505b60008090505b8451811015612cc057818181518110612c9457fe5b6020026020010151858281518110612ca857fe5b60200260200101819052508080600101915050612c7f565b50505050919050565b60008060016020601f85510181612cdc57fe5b040190506040518481526020810160005b83811015612d0e578060200286015181602002830152806001019050612ced565b50602082602085026040018460006010600019f1935050505092915050565b6000606060006028905080845111612d7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d7190614c93565b60405180910390fd5b6060816040519080825280601f01601f191660200182016040528015612daf5781602001600182028038833980820191505090505b50905060008090505b82811015612e1f57858181518110612dcc57fe5b602001015160f81c60f81b828281518110612de357fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050612db8565b50600080905060008090505b83811015612f4e576000838281518110612e4157fe5b602001015160f81c60f81b60f81c60ff16905060308110158015612e66575060398111155b80612e7f575060418110158015612e7e5750605a8111155b5b80612e98575060618110158015612e97575060668111155b5b612ed7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ece90614c93565b60405180910390fd5b60308110158015612ee9575060398111155b15612efa5760308103601084020192505b60418110158015612f0c5750605a8111155b15612f1d5760378103601084020192505b60618110158015612f2f575060668111155b15612f405760578103601084020192505b508080600101915050612e2b565b508094507f2f00000000000000000000000000000000000000000000000000000000000000868481518110612f7f57fe5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612fec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fe390614c93565b60405180910390fd5b6000600184885103039050806040519080825280601f01601f19166020018201604052801561302a5781602001600182028038833980820191505090505b50945060008090505b818110156130a5576000886001878401018151811061304e57fe5b602001015160f81c60f81b90508087838151811061306857fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350508080600101915050613033565b5050505050915091565b60006040516020016130c090614ae4565b60405160208183030381529060405280519060200120826040516020016130e79190614ab8565b604051602081830303815290604052805190602001201480613152575060405160200161311390614acf565b604051602081830303815290604052805190602001208260405160200161313a9190614ab8565b60405160208183030381529060405280519060200120145b8061315e575060008251145b1561316c576000905061318b565b60008251905060ff81111561318557600091505061318b565b60019150505b919050565b60008060016020601f855101816131a357fe5b040190506040518481526020810160005b838110156131d55780602002860151816020028301528060010190506131b4565b5060208260208502604001846000600f600019f1935050505092915050565b600073d2001000000000000000000000000000000000d273ffffffffffffffffffffffffffffffffffffffff166383e781fe6040518163ffffffff1660e01b815260040160206040518083038186803b15801561325057600080fd5b505afa158015613264573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506132889190810190613e2f565b905090565b6000606061329a83612ac9565b90506000600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b82518110156133ab5760008260010184600184038151811061330457fe5b60200260200101516040516133199190614aa1565b90815260200160405180910390205411613368576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161335f90614cb3565b60405180910390fd5b8160020183600183038151811061337b57fe5b60200260200101516040516133909190614aa1565b908152602001604051809103902091508060010190506132e6565b50606060018351116133bd57846133d6565b826001845103815181106133cd57fe5b60200260200101515b9050600082600101826040516133ec9190614ab8565b9081526020016040518091039020541161343b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161343290614cb3565b60405180910390fd5b600082600001600184600101846040516134559190614ab8565b908152602001604051809103902054038154811061346f57fe5b906000526020600020906005020190508094505050505092915050565b60008060016020601f8551018161349f57fe5b04019050600060016020601f885101816134b557fe5b040190506040518781526020810160005b838110156134e75780602002890151816020028301528060010190506134c6565b50868360200282015260005b8481101561351957806020028701518185600101016020028301528060010190506134f3565b50602082848601602002606001846000600c600019f1945050505050949350505050565b6000613547613c45565b600060016020601f8851018161355957fe5b0401905060006020601f86018161356c57fe5b0490506040518881526020810160005b8481101561359d57806020028a01518160200283015280600101905061357c565b5083602002810188815287816020015283602002868660030160200285600a600019fa9650505050505094509492505050565b60008060016020601f855101816135e357fe5b040190506040518481526020810160005b838110156136155780602002860151816020028301528060010190506135f4565b50602082602085026040018460006011600019f1935050505092915050565b60008060016020601f8651018161364757fe5b040190506040518581526020810160005b83811015613679578060200287015181602002830152806001019050613658565b50846020840282015260208260208502604001846000600b600019f193505050509392505050565b60008060016020601f855101816136b457fe5b040190506040518481526020810160005b838110156136e65780602002860151816020028301528060010190506136c5565b5060208260208502604001846000600e600019f1935050505092915050565b600080600060016020601f8651018161371a57fe5b040190506040518581526020810160005b8381101561374c57806020028701518160200283015280600101905061372b565b506020826020850260200184600d600019fa9450815193505050509250929050565b613776613c6a565b600060208301905060405180604001604052808451815260200182815250915050919050565b60008082600001516137c0856000015186602001518660000151876020015161388d565b0190505b8360000151846020015101811161380a578180600101925050826000015161380285602001518303866000015103838660000151876020015161388d565b0190506137c4565b5092915050565b613819613c6a565b613824838383613968565b5092915050565b60608082600001516040519080825280601f01601f1916602001820160405280156138655781602001600182028038833980820191505090505b50905060006020820190506138838185602001518660000151613a06565b8192505050919050565b6000808490506000868511613958576020851161391257600060018660200360080260020a031960001b905060008186511690506000878a8a0103905060008386511690505b828114613904578186106138f1578a8a019650505050505050613960565b85806001019650508386511690506138d3565b859650505050505050613960565b60008585209050600091505b85880382116139565760008684209050808214156139425783945050505050613960565b60018401935050818060010192505061391e565b505b868601925050505b949350505050565b613970613c6a565b600061398e856000015186602001518660000151876020015161388d565b905084602001518360200181815250508460200151810383600001818152505084600001518560200151018114156139d05760008560000181815250506139fb565b8360000151836000015101856000018181510391508181525050836000015181018560200181815250505b829150509392505050565b5b60208110613a2a5781518352602083019250602082019150602081039050613a07565b60006001826020036101000a0390508019835116818551168181178652505050505050565b6040518060a00160405280606081526020016000151581526020016000815260200160006002811115613a7e57fe5b8152602001606081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613acc57805160ff1916838001178555613afa565b82800160010185558215613afa579182015b82811115613af9578251825591602001919060010190613ade565b5b509050613b079190613c84565b5090565b82805482825590600052602060002090601f01602090048101928215613ba05791602002820160005b83821115613b7157835183826101000a81548160ff0219169083151502179055509260200192600101602081600001049283019260010302613b34565b8015613b9e5782816101000a81549060ff0219169055600101602081600001049283019260010302613b71565b505b509050613bad9190613ca9565b5090565b50805460018160011615610100020316600290046000825580601f10613bd75750613bf6565b601f016020900490600052602060002090810190613bf59190613c84565b5b50565b50805460008255601f016020900490600052602060002090810190613c1e9190613c84565b50565b5080546000825560050290600052602060002090810190613c429190613cd9565b50565b6040518062100000016040528061800090602082028038833980820191505090505090565b604051806040016040528060008152602001600081525090565b613ca691905b80821115613ca2576000816000905550600101613c8a565b5090565b90565b613cd691905b80821115613cd257600081816101000a81549060ff021916905550600101613caf565b5090565b90565b613d4591905b80821115613d415760008082016000613cf89190613bb1565b6001820160006101000a81549060ff021916905560028201600090556003820160006101000a81549060ff0219169055600482016000613d389190613bf9565b50600501613cdf565b5090565b90565b600081359050613d578161510d565b92915050565b600081519050613d6c8161510d565b92915050565b600082601f830112613d8357600080fd5b8135613d96613d9182614efb565b614ece565b91508082526020830160208301858383011115613db257600080fd5b613dbd8382846150ad565b50505092915050565b600082601f830112613dd757600080fd5b8135613dea613de582614f27565b614ece565b91508082526020830160208301858383011115613e0657600080fd5b613e118382846150ad565b50505092915050565b600081359050613e2981615124565b92915050565b600060208284031215613e4157600080fd5b6000613e4f84828501613d5d565b91505092915050565b60008060408385031215613e6b57600080fd5b6000613e7985828601613d48565b9250506020613e8a85828601613e1a565b9150509250929050565b600060208284031215613ea657600080fd5b600082013567ffffffffffffffff811115613ec057600080fd5b613ecc84828501613dc6565b91505092915050565b60008060408385031215613ee857600080fd5b600083013567ffffffffffffffff811115613f0257600080fd5b613f0e85828601613dc6565b9250506020613f1f85828601613e1a565b9150509250929050565b600080600060608486031215613f3e57600080fd5b600084013567ffffffffffffffff811115613f5857600080fd5b613f6486828701613dc6565b9350506020613f7586828701613e1a565b925050604084013567ffffffffffffffff811115613f9257600080fd5b613f9e86828701613d72565b9150509250925092565b600080600060608486031215613fbd57600080fd5b600084013567ffffffffffffffff811115613fd757600080fd5b613fe386828701613dc6565b9350506020613ff486828701613e1a565b925050604061400586828701613e1a565b9150509250925092565b600061401b838361417d565b60208301905092915050565b6000614033838361418c565b60208301905092915050565b600061404b8383614a06565b905092915050565b600061405e82614f7d565b6140688185614fdc565b935061407383614f53565b8060005b838110156140a457815161408b888261400f565b975061409683614fb5565b925050600181019050614077565b5085935050505092915050565b6140ba81614f88565b6140c48184614fed565b92506140cf82614f63565b8060005b838110156141005781516140e78782614027565b96506140f283614fc2565b9250506001810190506140d3565b505050505050565b600061411382614f94565b61411d8185614ff8565b93508360208202850161412f85614f6d565b8060005b8581101561416b578484038952815161414c858261403f565b945061415783614fcf565b925060208a01995050600181019050614133565b50829750879550505050505092915050565b61418681615048565b82525050565b61419581615054565b82525050565b6141a48161509b565b82525050565b6141b38161509b565b82525050565b60006141c482614faa565b6141ce818561502b565b93506141de8185602086016150bc565b80840191505092915050565b60006141f582614f9f565b6141ff8185615009565b935061420f8185602086016150bc565b614218816150ef565b840191505092915050565b600061422e82614f9f565b614238818561502b565b93506142488185602086016150bc565b80840191505092915050565b600061426160188361501a565b91507f496e636f7272656374206368756e6b20706f736974696f6e00000000000000006000830152602082019050919050565b60006142a160158361501a565b91507f4469726563746f7279206e6f74206372656174656400000000000000000000006000830152602082019050919050565b60006142e160248361501a565b91507f4e6f7420656e6f756768206d656d6f727920696e207468652046696c6573746f60008301527f72616765000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614347601b8361501a565b91507f48617368206861736e2774206265656e2063616c63756c6174656400000000006000830152602082019050919050565b600061438760198361501a565b91507f4368756e6b20697320616c72656164792075706c6f61646564000000000000006000830152602082019050919050565b60006143c760168361501a565b91507f496e636f7272656374206368756e6b206c656e677468000000000000000000006000830152602082019050919050565b6000614407600f8361501a565b91507f46696c65206e6f742065786973747300000000000000000000000000000000006000830152602082019050919050565b6000614447600e8361501a565b91507f496e76616c69642073656e6465720000000000000000000000000000000000006000830152602082019050919050565b600061448760188361501a565b91507f4469726563746f7279206973206e6f742064656c6574656400000000000000006000830152602082019050919050565b60006144c760108361501a565b91507f46696c65206e6f742064656c65746564000000000000000000000000000000006000830152602082019050919050565b600061450760138361501a565b91507f496e76616c69642073746f7261676550617468000000000000000000000000006000830152602082019050919050565b6000614547600c8361501a565b91507f496e76616c6964207061746800000000000000000000000000000000000000006000830152602082019050919050565b600061458760018361502b565b91507f2e000000000000000000000000000000000000000000000000000000000000006000830152600182019050919050565b60006145c760168361501a565b91507f496e76616c6964206469726563746f7279206e616d65000000000000000000006000830152602082019050919050565b600061460760158361501a565b91507f4368756e6b207761736e27742075706c6f6164656400000000000000000000006000830152602082019050919050565b600061464760268361501a565b91507f436f756c64206e6f742072657365727665206c657373207468616e207573656460008301527f20737061636500000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006146ad60168361501a565b91507f4469726563746f7279206973206e6f7420656d707479000000000000000000006000830152602082019050919050565b60006146ed60238361501a565b91507f46696c65206861736e2774206265656e2075706c6f6164656420636f7272656360008301527f746c7900000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061475360118361501a565b91507f4368756e6b207761736e277420726561640000000000000000000000000000006000830152602082019050919050565b600061479360188361501a565b91507f46696c656e616d652073686f756c64206265203c2032353600000000000000006000830152602082019050919050565b60006147d3601f8361501a565b91507f46696c652073686f756c64206265206c657373207468616e20313030204d42006000830152602082019050919050565b600061481360028361502b565b91507f2e2e0000000000000000000000000000000000000000000000000000000000006000830152600282019050919050565b600061485360118361501a565b91507f4469726563746f72792069732066756c6c0000000000000000000000000000006000830152602082019050919050565b6000614893600e8361501a565b91507f46696c65206e6f7420666f756e640000000000000000000000000000000000006000830152602082019050919050565b60006148d360188361501a565b91507f46696c65206f72206469726563746f72792065786973747300000000000000006000830152602082019050919050565b600061491360198361501a565b91507f4e6f7420656e6f756768207265736572766564207370616365000000000000006000830152602082019050919050565b600061495360188361501a565b91507f45564d206572726f7220696e2067657446696c6553697a6500000000000000006000830152602082019050919050565b600061499360108361501a565b91507f46696c65206e6f742063726561746564000000000000000000000000000000006000830152602082019050919050565b60006149d360198361501a565b91507f46696c65206861736e2774206265656e2075706c6f61646564000000000000006000830152602082019050919050565b600060a0830160008301518482036000860152614a2382826141ea565b9150506020830151614a38602086018261417d565b506040830151614a4b6040860182614a83565b506060830151614a5e606086018261419b565b5060808301518482036080860152614a768282614053565b9150508091505092915050565b614a8c81615091565b82525050565b614a9b81615091565b82525050565b6000614aad8284614223565b915081905092915050565b6000614ac482846141b9565b915081905092915050565b6000614ada8261457a565b9150819050919050565b6000614aef82614806565b9150819050919050565b60006210000082019050614b1060008301846140b1565b92915050565b60006020820190508181036000830152614b308184614108565b905092915050565b6000602082019050614b4d60008301846141aa565b92915050565b60006020820190508181036000830152614b6c81614254565b9050919050565b60006020820190508181036000830152614b8c81614294565b9050919050565b60006020820190508181036000830152614bac816142d4565b9050919050565b60006020820190508181036000830152614bcc8161433a565b9050919050565b60006020820190508181036000830152614bec8161437a565b9050919050565b60006020820190508181036000830152614c0c816143ba565b9050919050565b60006020820190508181036000830152614c2c816143fa565b9050919050565b60006020820190508181036000830152614c4c8161443a565b9050919050565b60006020820190508181036000830152614c6c8161447a565b9050919050565b60006020820190508181036000830152614c8c816144ba565b9050919050565b60006020820190508181036000830152614cac816144fa565b9050919050565b60006020820190508181036000830152614ccc8161453a565b9050919050565b60006020820190508181036000830152614cec816145ba565b9050919050565b60006020820190508181036000830152614d0c816145fa565b9050919050565b60006020820190508181036000830152614d2c8161463a565b9050919050565b60006020820190508181036000830152614d4c816146a0565b9050919050565b60006020820190508181036000830152614d6c816146e0565b9050919050565b60006020820190508181036000830152614d8c81614746565b9050919050565b60006020820190508181036000830152614dac81614786565b9050919050565b60006020820190508181036000830152614dcc816147c6565b9050919050565b60006020820190508181036000830152614dec81614846565b9050919050565b60006020820190508181036000830152614e0c81614886565b9050919050565b60006020820190508181036000830152614e2c816148c6565b9050919050565b60006020820190508181036000830152614e4c81614906565b9050919050565b60006020820190508181036000830152614e6c81614946565b9050919050565b60006020820190508181036000830152614e8c81614986565b9050919050565b60006020820190508181036000830152614eac816149c6565b9050919050565b6000602082019050614ec86000830184614a92565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614ef157600080fd5b8060405250919050565b600067ffffffffffffffff821115614f1257600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614f3e57600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050919050565b6000819050602082019050919050565b600081519050919050565b60006180009050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061504182615071565b9050919050565b60008115159050919050565b6000819050919050565b600081905061506c82615100565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006150a68261505e565b9050919050565b82818337600083830152505050565b60005b838110156150da5780820151818401526020810190506150bf565b838111156150e9576000848401525b50505050565b6000601f19601f8301169050919050565b6003811061510a57fe5b50565b61511681615036565b811461512157600080fd5b50565b61512d81615091565b811461513857600080fd5b5056fea2646970667358221220a549ad9e778ae8bb3048c0a1805e77745871cc1560637ae1c3ebccb76638d9c464736f6c63430006020033", + "nonce": "0", + "storage": {} + }, + "0xa096b05a489831db893fc53aacc7ed20efb36382": { + "balance": "1000000000000000000000000000000" + }, + "0xa1cd651d99283be60e2a9d2e3bc8a90aedb8244f": { + "balance": "1000000000000000000000000000000" + }, + "0xa2969e82619021ea407338f8bdf7c6f2bd679673": { + "balance": "1000000000000000000000000000000" + }, + "0xa3597b1162b6559cb5e966904b63e762ece756a4": { + "balance": "1000000000000000000000000000000" + }, + "0xa68f946090c600eda6f139783077ee802afeb990": { + "balance": "1000000000000000000000000000000" + }, + "0xa6d50055592cecb795bc1ed3b9ea57ed426b0b7c": { + "balance": "1000000000000000000000000000000" + }, + "0xa7c0789bdeee38c6b59111a789dfb6b815489847": { + "balance": "1000000000000000000000000000000" + }, + "0xa8c813ee806b4c8537ff5f16084d44db18ea9ab1": { + "balance": "1000000000000000000000000000000" + }, + "0xaa6a87bbb74bc1f3cb40c1efb7fc171ee6407560": { + "balance": "1000000000000000000000000000000" + }, + "0xabf920b89f5a2487fdb70be17fd01a99a0602e62": { + "balance": "1000000000000000000000000000000" + }, + "0xac5df92da5171ba24a9618018b4f79494040334b": { + "balance": "1000000000000000000000000000000" + }, + "0xaf97a8318a1a51d5daeeb9650024b63ee44f45bd": { + "balance": "1000000000000000000000000000000" + }, + "0xb28c45b98ae43a5e9ee5509c97ea037b5de5d6d9": { + "balance": "1000000000000000000000000000000" + }, + "0xb64989ab32b089da3da103b93e6781d6d5dd10b4": { + "balance": "1000000000000000000000000000000" + }, + "0xb67e6f4a21f93c250fa6ff0cb142bd14dd4ca8eb": { + "balance": "1000000000000000000000000000000" + }, + "0xb70603c505f85130b5b2e73cd82d196dfd7d8b5e": { + "balance": "1000000000000000000000000000000" + }, + "0xb942414cae2a1ab1056657b905845c0ab6b6280a": { + "balance": "1000000000000000000000000000000" + }, + "0xbee0e5c1961d51be9bd670876caa9c90ba7d9016": { + "balance": "1000000000000000000000000000000" + }, + "0xbf2d8cebdeeb8ad8fed7b2a75f35922106f8d75c": { + "balance": "1000000000000000000000000000000" + }, + "0xbf5aa678b969c0871e2fbcf09c3dbb5d5865ac1e": { + "balance": "1000000000000000000000000000000" + }, + "0xc12bcedd9bcad9120150122cd50f39576ecccc08": { + "balance": "1000000000000000000000000000000" + }, + "0xc2d3852f3292acb81bd164dbae5f1e2a87535150": { + "balance": "1000000000000000000000000000000" + }, + "0xc3820490201e94d76b44655d2df713fec29d9795": { + "balance": "1000000000000000000000000000000" + }, + "0xc58744e2eceefd45cc5469f0e0a708ad24ddbbdb": { + "balance": "1000000000000000000000000000000" + }, + "0xc7865200e8e51ba1c8d695f327deed432930f2cc": { + "balance": "1000000000000000000000000000000" + }, + "0xc8e4d709eb3eb335dc69c9fbf2d24d447cb86105": { + "balance": "1000000000000000000000000000000" + }, + "0xc98af661e44c5bf31d2f8bdff4bbf2808ed4e991": { + "balance": "1000000000000000000000000000000" + }, + "0xca4409573a5129a72edf85d6c51e26760fc9c903": { + "balance": "100000000000000000000000" + }, + "0xcc33e23b04b74f7ba8fbe315083182224af973fa": { + "balance": "1000000000000000000000000000000" + }, + "0xce1c62d0a77600fb2f959b4da76fcb9b3b9430a3": { + "balance": "1000000000000000000000000000000" + }, + "0xd1b6c947fb14060b38945584714491592e84875d": { + "balance": "1000000000000000000000000000000" + }, + "0xd23cd6a9ddcc3470300003621bbac1e06a7919d5": { + "balance": "1000000000000000000000000000000" + }, + "0xd2c5b39B4e735C17612Bb5a08FD024ccc5dBCb23": { + "balance": "100000000000000000000000" + }, + "0xd2cd302eb060e375a65d65946692a3ac2d838d35": { + "balance": "1000000000000000000000000000000" + }, + "0xd2e75c41ced8699e3176f6e335355701a2568b7b": { + "balance": "1000000000000000000000000000000" + }, + "0xd3d38f4cb0aeb4c7c2527ddaeec2ab3b910c8528": { + "balance": "1000000000000000000000000000000" + }, + "0xd5b561a27cca5049650a14ab93dbf1a20c0cefc1": { + "balance": "1000000000000000000000000000000" + }, + "0xd90045420b8abc37b3f9304ed2b385fc1b7fa8c5": { + "balance": "1000000000000000000000000000000" + }, + "0xd951bf4cff429062702a7d8699a5f0bf14845d9b": { + "balance": "1000000000000000000000000000000" + }, + "0xdc6a269c58e58a93a22b5df8cdf1af630c47481f": { + "balance": "1000000000000000000000000000000" + }, + "0xdc6d02ef4003a4f2d0ccff65ae1a2d8157fbb23e": { + "balance": "1000000000000000000000000000000" + }, + "0xde14aca36acc62c305a7ee571da37840a408e600": { + "balance": "1000000000000000000000000000000" + }, + "0xdee32ae508cf783f53ab8bc39d878fe323cdfae3": { + "balance": "1000000000000000000000000000000" + }, + "0xe083a100d51fc4f38aae4a3a68404c36ad96c612": { + "balance": "1000000000000000000000000000000" + }, + "0xe1607990ce800407e3c206e58de4917977181d4d": { + "balance": "1000000000000000000000000000000" + }, + "0xe25e5b63dfd4cf59b81eddf64f1195858634b8a6": { + "balance": "1000000000000000000000000000000" + }, + "0xe372377decb3bdc0c7f5272d38ce0ba2a54934fe": { + "balance": "1000000000000000000000000000000" + }, + "0xe3cc6ec63b5652d1594bc63bb293f4e80f76dbdd": { + "balance": "1000000000000000000000000000000" + }, + "0xe3da7c014286258944ab20a31e4d861b4c9262f1": { + "balance": "1000000000000000000000000000000" + }, + "0xe8b57f330d56081c856e618210fbedb414925ff0": { + "balance": "1000000000000000000000000000000" + }, + "0xe91ac72a568e752eb7c9f5235100586ce97c8cc1": { + "balance": "1000000000000000000000000000000" + }, + "0xf184c8c243a178c1748a0af45caedeca476105b4": { + "balance": "1000000000000000000000000000000" + }, + "0xf1a5912ff318aebf312cdb54c75642a9e632703c": { + "balance": "1000000000000000000000000000000" + }, + "0xf2197b153b4c9086fc5410431fbf7960d284c65e": { + "balance": "1000000000000000000000000000000" + }, + "0xf36620e71327f4a55d550d46e030ccf0c728f154": { + "balance": "1000000000000000000000000000000" + }, + "0xf9817fB82fc767aA9A4A97a1901676244b88ce0E": { + "balance": "100000000000000000000000" + }, + "0xfa723938fa8da1a8a2114ad409a11581761ee40d": { + "balance": "1000000000000000000000000000000" + }, + "0xfa7a8c69810eaf16a395d2a93b3ab51efeed2a1c": { + "balance": "1000000000000000000000000000000" + }, + "0xfaa1038074941571524934ba52d312e88b3577f5": { + "balance": "1000000000000000000000000000000" + }, + "0xfe14077c26a507496b7208384d459e21c49c4212": { + "balance": "1000000000000000000000000000000" + }, + "0xfe275c9b5ac792327da509b27eb9614196dfb07d": { + "balance": "1000000000000000000000000000000" + }, + "0xfe2c5aa110fff89361806ea7ee080bfffba0d3dd": { + "balance": "1000000000000000000000000000000" + }, + "0xfe3d4f1fc038f4f756ba44995129cd45c9e0e861": { + "balance": "1000000000000000000000000000000" + }, + "0xfee314cdc84ecfaa675e41b3559c0101e1eba6b8": { + "balance": "1000000000000000000000000000000" + } + }, + "genesis": { + "author": "0x0000000000000000000000000000000000000001", + "difficulty": "0x0", + "extraData": "0x11bbe8db4e347b4e8c937c1c8370e4b5ed33adb3db69cbdb7a38e1e50b1b82fa", + "gasLimit": "0xFFFFFFFFF", + "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000abc", + "nonce": "0x0000000000000042", + "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "timestamp": "0x00" + }, + "params": { + "EIP150ForkBlock": "0x00", + "EIP158ForkBlock": "0x00", + "accountStartNonce": "0x00", + "blockReward": "0x4563918244F40000", + "byzantiumForkBlock": "0x0", + "chainID": "0x12345", + "constantinopleForkBlock": "0x0", + "daoHardforkBlock": "0x0", + "difficultyBoundDivisor": "0x0800", + "durationLimit": "0x0d", + "externalGasDifficulty": "0x01", + "gasLimitBoundDivisor": "0x0400", + "homesteadForkBlock": "0x0", + "maxGasLimit": "0xFFFFFFFFF", + "maximumExtraDataSize": "0x20", + "minGasLimit": "0xFFFFFFFFF", + "minimumDifficulty": "0x0", + "networkID": "12313219", + "tieBreakingGas": false + }, + "sealEngine": "Ethash", + "skaleConfig": { + "nodeInfo": { + "basePort": 1331, + "bindIP": "0.0.0.0", + "collectionDuration": 10, + "collectionQueueSize": 2, + "db-path": "/tmp/test_eth_2_of_4", + "ecdsaKeyName": "", + "httpRpcPort": 1334, + "httpsRpcPort": 1239, + "logLevel": "info", + "logLevelProposal": "info", + "maxCacheSize": 2000, + "maxOpenLeveldbFiles": 25, + "minCacheSize": 1000, + "nodeID": 402, + "nodeName": "Node1", + "rotateAfterBlock": 0, + "testSignatures": true, + "transactionQueueSize": 10000, + "wsRpcPort": 1333, + "wssRpcPort": 1338 + }, + "sChain": { + "EIP1559TransactionsPatchTimestamp": 1, + "contractStorageLimit": 10000000000, + "contractStoragePatchTimestamp": 1, + "contractStorageZeroValuePatchTimestamp": 1, + "correctForkInPowPatchTimestamp": 1, + "emptyBlockIntervalMs": 10000, + "fastConsensusPatchTimestamp": 1, + "flexibleDeploymentPatchTimestamp": 1, + "levelDBReopenIntervalMs": 1, + "multiTransactionMode": false, + "nodes": [ + { + "basePort": 1231, + "ip": "127.0.0.1", + "nodeID": 401, + "publicKey": "", + "schainIndex": 1 + }, + { + "basePort": 1331, + "ip": "127.0.0.1", + "nodeID": 402, + "publicKey": "", + "schainIndex": 2 + }, + { + "basePort": 1431, + "ip": "127.0.0.1", + "nodeID": 403, + "publicKey": "", + "schainIndex": 3 + }, + { + "basePort": 1531, + "ip": "127.0.0.1", + "nodeID": 404, + "publicKey": "", + "schainIndex": 4 + } + ], + "powCheckPatchTimestamp": 1, + "precompiledConfigPatchTimestamp": 1, + "pushZeroPatchTimestamp": 1, + "revertableFSPatchTimestamp": 1, + "schainID": 5, + "schainName": "TestChain", + "schainOwner": "0x907cd0881E50d359bb9Fd120B1A5A143b1C97De6", + "skipInvalidTransactionsPatchTimestamp": 1, + "storageDestructionPatchTimestamp": 1, + "verifyBlsSyncPatchTimestamp": 1, + "verifyDaSigsPatchTimestamp": 1 + } + }, + "unddos": { + "origins": [ + { + "ban_lengthy": 0, + "ban_peak": 0, + "max_calls_per_minute": 1000000000, + "max_calls_per_second": 1000000000, + "max_ws_conn": 65535, + "origin": [ + "*" + ] + } + ] + } +} \ No newline at end of file diff --git a/test/historicstate/configs/test_3_of_16.json b/test/historicstate/configs/test_3_of_16.json new file mode 100644 index 000000000..6d799e82f --- /dev/null +++ b/test/historicstate/configs/test_3_of_16.json @@ -0,0 +1,910 @@ +{ + "accounts": { + "0000000000000000000000000000000000000001": { + "precompiled": { + "linear": { + "base": 3000, + "word": 0 + }, + "name": "ecrecover" + } + }, + "0000000000000000000000000000000000000002": { + "precompiled": { + "linear": { + "base": 60, + "word": 12 + }, + "name": "sha256" + } + }, + "0000000000000000000000000000000000000003": { + "precompiled": { + "linear": { + "base": 600, + "word": 120 + }, + "name": "ripemd160" + } + }, + "0000000000000000000000000000000000000004": { + "precompiled": { + "linear": { + "base": 15, + "word": 3 + }, + "name": "identity" + } + }, + "0000000000000000000000000000000000000005": { + "precompiled": { + "name": "modexp", + "startingBlock": "0x2dc6c0" + } + }, + "0000000000000000000000000000000000000006": { + "precompiled": { + "linear": { + "base": 500, + "word": 0 + }, + "name": "alt_bn128_G1_add", + "startingBlock": "0x2dc6c0" + } + }, + "0000000000000000000000000000000000000007": { + "precompiled": { + "linear": { + "base": 40000, + "word": 0 + }, + "name": "alt_bn128_G1_mul", + "startingBlock": "0x2dc6c0" + } + }, + "0000000000000000000000000000000000000008": { + "precompiled": { + "name": "alt_bn128_pairing_product", + "startingBlock": "0x2dc6c0" + } + }, + "000000000000000000000000000000000000000A": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "readChunk", + "startingBlock": "0x0" + } + }, + "000000000000000000000000000000000000000B": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "createFile", + "restrictAccess": [ + "69362535ec535F0643cBf62D16aDeDCAf32Ee6F7" + ], + "startingBlock": "0x0" + } + }, + "000000000000000000000000000000000000000C": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "uploadChunk", + "startingBlock": "0x0" + } + }, + "000000000000000000000000000000000000000D": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "getFileSize", + "startingBlock": "0x0" + } + }, + "000000000000000000000000000000000000000E": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "deleteFile", + "startingBlock": "0x0" + } + }, + "000000000000000000000000000000000000000F": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "createDirectory", + "startingBlock": "0x0" + } + }, + "0000000000000000000000000000000000000010": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "deleteDirectory", + "startingBlock": "0x0" + } + }, + "0x006d8e49ce0b9eb5646e34a4d91934801b9044fd": { + "balance": "1000000000000000000000000000000" + }, + "0x0150b461b06922a5030784ba888962c28bb1f188": { + "balance": "1000000000000000000000000000000" + }, + "0x03309956988ae70152ae4469daf99b0cac2306c5": { + "balance": "1000000000000000000000000000000" + }, + "0x06104a85a380895b6dd4030113806df2b044905e": { + "balance": "1000000000000000000000000000000" + }, + "0x079cf317ef40b16141784b6fabff812d64f7c0fd": { + "balance": "1000000000000000000000000000000" + }, + "0x0966454f51166c68b73b2865473c8fb2fcdefdd5": { + "balance": "1000000000000000000000000000000" + }, + "0x099452fedc71897880f584b1bc1706efc4e76e36": { + "balance": "1000000000000000000000000000000" + }, + "0x0aa6a44690ef52354e976990292cf9c5cd36ad59": { + "balance": "1000000000000000000000000000000" + }, + "0x0fbbe17a0e5a61ee3e8661f442d7f6b177c49820": { + "balance": "1000000000000000000000000000000" + }, + "0x1239fe658b410dbbac5bbd572035f5041542f9e5": { + "balance": "1000000000000000000000000000000" + }, + "0x12d5d7340a93be7be28ea7a3ae198242f8e1282c": { + "balance": "1000000000000000000000000000000" + }, + "0x137048b9fa4f1234d6519271b2c5ec64f480db0f": { + "balance": "1000000000000000000000000000000" + }, + "0x13867af77a63048e17380e39248ada90521e97e4": { + "balance": "1000000000000000000000000000000" + }, + "0x138ea4bdf0382c2deffd5b0bff0afe59f471467f": { + "balance": "1000000000000000000000000000000" + }, + "0x13d19c55ee0a212249d26b9d741ff6d7f416db01": { + "balance": "1000000000000000000000000000000" + }, + "0x157d38b52196b248e9fe6a2172e32ce2b8c078e6": { + "balance": "1000000000000000000000000000000" + }, + "0x16e8c390f8e576161cfe966f2c3e5dd303eb9039": { + "balance": "1000000000000000000000000000000" + }, + "0x194cb9991d3d94c43e400becf21dfea45e7b3b4c": { + "balance": "1000000000000000000000000000000" + }, + "0x1C9abe4ff0CcECa40fc404c74AB7d4923fEF8901": { + "balance": "100000000000000000000000" + }, + "0x1a66fc89809112c20aa76a993db712fa9e003e4e": { + "balance": "1000000000000000000000000000000" + }, + "0x1f1d6041e12a18cf1202019f146f2fc150915e8d": { + "balance": "1000000000000000000000000000000" + }, + "0x1feaf1671c1f0faf0d44c152f72dc755db932569": { + "balance": "1000000000000000000000000000000" + }, + "0x236bf02dfafaf03851a4e6f5d69052f4884cec32": { + "balance": "1000000000000000000000000000000" + }, + "0x26d88f6a8b659be4165ee53774a057e41b5201c9": { + "balance": "1000000000000000000000000000000" + }, + "0x28353685b0b986a724b92113debb3d8cd9a6b263": { + "balance": "1000000000000000000000000000000" + }, + "0x29d83322219fdfb821459d5fdf796360faf3166a": { + "balance": "1000000000000000000000000000000" + }, + "0x2bee474be207bdbeac83d6672da5ed2fd417eac9": { + "balance": "1000000000000000000000000000000" + }, + "0x2d93455b07bccf38e8d019f7f43a2c2d70b46b4e": { + "balance": "1000000000000000000000000000000" + }, + "0x2f971bd38806c3ca45ae0a125d1267118bf5619c": { + "balance": "1000000000000000000000000000000" + }, + "0x30aaab366dfac8331f3e827495c789cde9b437c0": { + "balance": "1000000000000000000000000000000" + }, + "0x32ea0400dc2d20664cc4744b2fab04ecb709445c": { + "balance": "1000000000000000000000000000000" + }, + "0x3760dc9594ccac0f33ade5cc5371402131696341": { + "balance": "1000000000000000000000000000000" + }, + "0x38855e430611bc179cd777a8704679ffc43921de": { + "balance": "1000000000000000000000000000000" + }, + "0x3a921471a2397644c37c88ef9572c421ab37145d": { + "balance": "1000000000000000000000000000000" + }, + "0x3bcca8a8471d55a1a668bc163c0336e4a57e5c99": { + "balance": "1000000000000000000000000000000" + }, + "0x3d46ee560227c1d73cd6042b47fc8fddd8a06ecb": { + "balance": "1000000000000000000000000000000" + }, + "0x3f5bdf5d4c274c82b8d17aa2810b00d2cf050f24": { + "balance": "1000000000000000000000000000000" + }, + "0x3ffe1c9183e0f97f52a816405a7d2350624ec88b": { + "balance": "1000000000000000000000000000000" + }, + "0x426ec5f07847674aada3856609d8baaa16805d88": { + "balance": "1000000000000000000000000000000" + }, + "0x482d7f53cba6ae73a354533673c48e2dfd560949": { + "balance": "1000000000000000000000000000000" + }, + "0x48acbd6a2724eadcc2a11144ab84b6a617d1a241": { + "balance": "1000000000000000000000000000000" + }, + "0x49ef89840e400026eb5c8d79bd1b0adc152fe86d": { + "balance": "1000000000000000000000000000000" + }, + "0x4bf989fa6572af36b190032505506f1db888357f": { + "balance": "1000000000000000000000000000000" + }, + "0x4cf9b195f7cb5f86694d9b399fe21a5f34616fd3": { + "balance": "1000000000000000000000000000000" + }, + "0x4e9b85904bca60aeb5b916ca86ac622096908427": { + "balance": "1000000000000000000000000000000" + }, + "0x50120c17d7b59200e9b76e89e4e3de2f0cd00090": { + "balance": "1000000000000000000000000000000" + }, + "0x54db355342c35085a1a53184162b2fddd0a43b0f": { + "balance": "1000000000000000000000000000000" + }, + "0x54e228d8fea148cfe2b109b3b152ff21321d09a2": { + "balance": "1000000000000000000000000000000" + }, + "0x5667601b7dcde6f24d06bccc4f291cb06976f4ee": { + "balance": "1000000000000000000000000000000" + }, + "0x57829f2ecca390cd9d1c41f92328bad4d1073bbb": { + "balance": "1000000000000000000000000000000" + }, + "0x5EF25557E2ed6AFfF321B266C93e95A0B4B05AbC": { + "balance": "1000000000000000000000000" + }, + "0x5a3adad4382b3eb1e0c65f2de2845901081039b5": { + "balance": "1000000000000000000000000000000" + }, + "0x5cdb7392efdce502ccc6fba5c3c1dd1653967b4d": { + "balance": "1000000000000000000000000000000" + }, + "0x5d012c13b2854bda8b7b6580e97e52751884f827": { + "balance": "1000000000000000000000000000000" + }, + "0x5d9326c6504833d84f8a0d65ded59b1a6e768ca2": { + "balance": "1000000000000000000000000000000" + }, + "0x60268f799d8f1808e4a32c2eb898e73a8881f6f0": { + "balance": "1000000000000000000000000000000" + }, + "0x605ba4a05d779f9869bd9a10234c22f516766cfe": { + "balance": "1000000000000000000000000000000" + }, + "0x6093f0f2a7b5148b71603ac439adbc4c0e5aa5da": { + "balance": "1000000000000000000000000000000" + }, + "0x6196d135CdDb9d73A0756C1E44b5b02B11acf594": { + "balance": "2000000000000000000000", + "code": "", + "nonce": "5076", + "storage": {} + }, + "0x62712ceccb50f62ca4c5402fff6da9c819c866cf": { + "balance": "1000000000000000000000000000000" + }, + "0x62971de462ea1ec0d3b43a6a85b6fb975e6c6f64": { + "balance": "1000000000000000000000000000000" + }, + "0x62cf32dfb9eb6358dc5deb006aef1d75fb153e5f": { + "balance": "1000000000000000000000000000000" + }, + "0x62d8b22c1d71577829b2fee20a5c3fff43aed0ec": { + "balance": "100000000000000000000000" + }, + "0x6314956b78bb2eaed1c49b3ae71d4d0ec501cfab": { + "balance": "1000000000000000000000000000000" + }, + "0x661bda4daeba3ce9ac2aa30b80d463580f90d31a": { + "balance": "1000000000000000000000000000000" + }, + "0x66c5a87f4a49DD75e970055A265E8dd5C3F8f852": { + "balance": "1000000000000000000000" + }, + "0x66cd465ddcd85504c0d2cfb1728acee994d55a3f": { + "balance": "1000000000000000000000000000000" + }, + "0x68bca79ae7aae796027ff843d2303444da5cf5d8": { + "balance": "1000000000000000000000000000000" + }, + "0x6923877b65e24966efa9efd1207822fa2eaf601a": { + "balance": "1000000000000000000000000000000" + }, + "0x69362535ec535F0643cBf62D16aDeDCAf32Ee6F7": { + "balance": "0", + "code": "0x608060405234801561001057600080fd5b50600436106100b45760003560e01c806379210e8e1161007157806379210e8e1461017757806381a8235a146101a757806385aeeb17146101c35780639a9a5593146101f3578063a99100541461020f578063b57321221461022b576100b4565b806307c6e7d3146100b9578063122f4fba146100d55780631c6ec7a9146101055780631cfe4e3b14610121578063373dedb41461013d57806361e46db51461015b575b600080fd5b6100d360048036036100ce9190810190613cff565b61025b565b005b6100ef60048036036100ea9190810190613cff565b610804565b6040516100fc9190614963565b60405180910390f35b61011f600480360361011a9190810190613cff565b610b43565b005b61013b60048036036101369190810190613cc3565b610f72565b005b610145611190565b6040516101529190614cbe565b60405180910390f35b61017560048036036101709190810190613d94565b611199565b005b610191600480360361018c9190810190613e13565b6113f9565b60405161019e9190614924565b60405180910390f35b6101c160048036036101bc9190810190613cff565b6116f9565b005b6101dd60048036036101d89190810190613cff565b61189e565b6040516101ea9190614941565b60405180910390f35b61020d60048036036102089190810190613d40565b611b9d565b005b61022960048036036102249190810190613cff565b61202c565b005b61024560048036036102409190810190613cff565b612682565b6040516102529190614cbe565b60405180910390f35b6000339050606061026b83612902565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b825181101561037c576000826001018460018403815181106102d557fe5b60200260200101516040516102ea91906148cc565b90815260200160405180910390205411610339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161033090614ade565b60405180910390fd5b8160020183600183038151811061034c57fe5b602002602001015160405161036191906148cc565b908152602001604051809103902091508060010190506102b7565b506060600183511161038e57846103a7565b8260018451038151811061039e57fe5b60200260200101515b9050600082600101826040516103bd91906148e3565b9081526020016040518091039020541161040c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161040390614ade565b60405180910390fd5b6000826002018260405161042091906148e3565b90815260200160405180910390206000018054905014610475576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161046c90614b5e565b60405180910390fd5b60006104818587612b02565b9050806104c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ba90614a7e565b60405180910390fd5b6104cb613888565b836000016001856000018054905003815481106104e457fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156105965780601f1061056b57610100808354040283529160200191610596565b820191906000526020600020905b81548152906001019060200180831161057957829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff1660028111156105e257fe5b60028111156105ed57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561066557602002820191906000526020600020906000905b82829054906101000a900460ff1615158152602001906001019060208260000104928301926001038202915080841161062f5790505b505050505081525050905080846000016001866001018660405161068991906148e3565b90815260200160405180910390205403815481106106a357fe5b906000526020600020906005020160008201518160000190805190602001906106cd9291906138c4565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561071c57fe5b0217905550608082015181600401908051906020019061073d929190613944565b50905050836001018360405161075391906148e3565b90815260200160405180910390205484600101826000015160405161077891906148cc565b9081526020016040518091039020819055506000846001018460405161079e91906148e3565b908152602001604051809103902081905550836000018054809190600190036107c791906139ea565b5083600201836040516107da91906148e3565b9081526020016040518091039020600080820160006107f99190613a1c565b505050505050505050565b600080606061081284612b66565b91509150606061082182612902565b90506000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b82518110156109065760008260010184600184038151811061088b57fe5b60200260200101516040516108a091906148cc565b90815260200160405180910390205414156108c357600095505050505050610b3e565b816002018360018303815181106108d657fe5b60200260200101516040516108eb91906148cc565b9081526020016040518091039020915080600101905061086d565b50606060018351116109185783610931565b8260018451038151811061092857fe5b60200260200101515b90506000826001018260405161094791906148e3565b908152602001604051809103902054141561096a57600095505050505050610b3e565b610972613888565b826000016001846001018460405161098a91906148e3565b90815260200160405180910390205403815481106109a457fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610a565780601f10610a2b57610100808354040283529160200191610a56565b820191906000526020600020905b815481529060010190602001808311610a3957829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115610aa257fe5b6002811115610aad57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015610b2557602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411610aef5790505b5050505050815250509050806060015196505050505050505b919050565b600160009054906101000a900460ff16610b85576120006002819055506210000060038190555060018060006101000a81548160ff0219169083151502179055505b6000815111610bc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc090614ade565b60405180910390fd5b60003390506060610bd983612902565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015610cea57600082600101846001840381518110610c4357fe5b6020026020010151604051610c5891906148cc565b90815260200160405180910390205411610ca7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9e90614ade565b60405180910390fd5b81600201836001830381518110610cba57fe5b6020026020010151604051610ccf91906148cc565b90815260200160405180910390209150806001019050610c25565b50600254816000018054905010610d36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2d90614bfe565b60405180910390fd5b60606001835111610d475784610d60565b82600184510381518110610d5757fe5b60200260200101515b905060008260010182604051610d7691906148e3565b90815260200160405180910390205414610dc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbc90614c3e565b60405180910390fd5b610dce81612ee8565b610e0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0490614afe565b60405180910390fd5b6000610e198587612fc9565b905080610e5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e529061499e565b60405180910390fd5b610e63613888565b82816000018190525060008160200190151590811515815250508360000181908060018154018082558091505090600182039060005260206000209060050201600090919290919091506000820151816000019080519060200190610ec99291906138c4565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff02191690836002811115610f1857fe5b02179055506080820151816004019080519060200190610f39929190613944565b5050505083600001805490508460010184604051610f5791906148e3565b90815260200160405180910390208190555050505050505050565b610f7a61302d565b73ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161480610fdf57503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614155b61101e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101590614a5e565b60405180910390fd5b80600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411156110a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109790614b3e565b60405180910390fd5b600054600754820111156110e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e0906149be565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460076000828254039250508190555080600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550806007600082825401925050819055505050565b60008054905090565b600033905060006111aa82866130c6565b9050600160028111156111b957fe5b8160030160009054906101000a900460ff1660028111156111d657fe5b14611216576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120d90614c1e565b60405180910390fd5b6000600354858161122357fe5b061480156112345750806002015484105b611273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126a9061497e565b60405180910390fd5b600354848260020154031080156112905750838160020154038351145b8061129d57506003548351145b6112dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d390614a1e565b60405180910390fd5b600015158160040160035486816112ef57fe5b04815481106112fa57fe5b90600052602060002090602091828204019190069054906101000a900460ff1615151461135c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611353906149fe565b60405180910390fd5b600061136a838787876132c5565b9050806113ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a390614b1e565b60405180910390fd5b60018260040160035487816113bd57fe5b04815481106113c857fe5b90600052602060002090602091828204019190066101000a81548160ff021916908315150217905550505050505050565b611401613a40565b6000606061140e86612b66565b9150915061141a613888565b61142483836130c6565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156114c85780601f1061149d576101008083540402835291602001916114c8565b820191906000526020600020905b8154815290600101906020018083116114ab57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561151457fe5b600281111561151f57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561159757602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116115615790505b50505050508152505090506002808111156115ae57fe5b816060015160028111156115be57fe5b146115fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f590614c9e565b60405180910390fd5b60035485111580156116105750600085115b61164f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164690614a1e565b60405180910390fd5b80604001518587011115611698576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168f9061497e565b60405180910390fd5b60006116a684848989613376565b8096508192505050806116ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e590614b9e565b60405180910390fd5b505050509392505050565b6000339050600061170a82846130c6565b90506001600281111561171957fe5b8160030160009054906101000a900460ff16600281111561173657fe5b14611776576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176d90614c1e565b60405180910390fd5b60006001905060008260040180549050905060008090505b818110156117e157600015158460040182815481106117a957fe5b90600052602060002090602091828204019190069054906101000a900460ff16151514156117d657600092505b80600101905061178e565b5081611822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181990614b7e565b60405180910390fd5b60028360030160006101000a81548160ff0219169083600281111561184357fe5b021790555060006118548587613409565b905080611896576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188d906149de565b60405180910390fd5b505050505050565b6060600060606118ad84612b66565b9150915060606118bc82612902565b90506000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008090505b82518110156119c65760008260010184838151811061192257fe5b602002602001015160405161193791906148cc565b90815260200160405180910390205411611986576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197d90614ade565b60405180910390fd5b8160020183828151811061199657fe5b60200260200101516040516119ab91906148cc565b90815260200160405180910390209150806001019050611907565b5080600001805480602002602001604051908101604052809291908181526020016000905b82821015611b8e57838290600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611aa75780601f10611a7c57610100808354040283529160200191611aa7565b820191906000526020600020905b815481529060010190602001808311611a8a57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115611af357fe5b6002811115611afe57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015611b7657602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411611b405790505b505050505081525050815260200190600101906119eb565b50505050945050505050919050565b600160009054906101000a900460ff16611bdf576120006002819055506210000060038190555060018060006101000a81548160ff0219169083151502179055505b60003390506305f5e100821115611c2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2290614bde565b60405180910390fd5b6060611c3684612902565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015611d4757600082600101846001840381518110611ca057fe5b6020026020010151604051611cb591906148cc565b90815260200160405180910390205411611d04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cfb90614ade565b60405180910390fd5b81600201836001830381518110611d1757fe5b6020026020010151604051611d2c91906148cc565b90815260200160405180910390209150806001019050611c82565b5060606001835111611d595785611d72565b82600184510381518110611d6957fe5b60200260200101515b905060008260010182604051611d8891906148e3565b90815260200160405180910390205414611dd7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dce90614c3e565b60405180910390fd5b611de081612ee8565b611e1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1690614bbe565b60405180910390fd5b6000611e2c85888861346d565b905080611e6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6590614c7e565b60405180910390fd5b6060600354600160035489010381611e8257fe5b04604051908082528060200260200182016040528015611eb15781602001602082028038833980820191505090505b509050836000016040518060a0016040528085815260200160011515815260200189815260200160016002811115611ee557fe5b815260200183815250908060018154018082558091505090600182039060005260206000209060050201600090919290919091506000820151816000019080519060200190611f359291906138c4565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff02191690836002811115611f8457fe5b02179055506080820151816004019080519060200190611fa5929190613944565b5050505083600001805490508460010184604051611fc391906148e3565b90815260200160405180910390208190555086600560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505050505050505050565b6000339050612039613888565b61204382846130c6565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156120e75780601f106120bc576101008083540402835291602001916120e7565b820191906000526020600020905b8154815290600101906020018083116120ca57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561213357fe5b600281111561213e57fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156121b657602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116121805790505b5050505050815250509050600060028111156121ce57fe5b816060015160028111156121de57fe5b141561221f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221690614a3e565b60405180910390fd5b600061222b83856134da565b90508061226d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226490614a9e565b60405180910390fd5b606061227885612902565b90506000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b825181101561231057816002018360018303815181106122e057fe5b60200260200101516040516122f591906148cc565b908152602001604051809103902091508060010190506122c4565b506000600182600101866000015160405161232b91906148cc565b908152602001604051809103902054039050612345613888565b8260000160018460000180549050038154811061235e57fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156124105780601f106123e557610100808354040283529160200191612410565b820191906000526020600020905b8154815290600101906020018083116123f357829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561245c57fe5b600281111561246757fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156124df57602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116124a95790505b5050505050815250509050808360000183815481106124fa57fe5b906000526020600020906005020160008201518160000190805190602001906125249291906138c4565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561257357fe5b02179055506080820151816004019080519060200190612594929190613944565b50905050826000018054809190600190036125af91906139ea565b508260010186600001516040516125c691906148cc565b9081526020016040518091039020548360010182600001516040516125eb91906148cc565b908152602001604051809103902081905550600083600101876000015160405161261591906148cc565b9081526020016040518091039020819055508560400151600560008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505050505050505050565b600080606061269084612b66565b9150915061269c613888565b6126a683836130c6565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561274a5780601f1061271f5761010080835404028352916020019161274a565b820191906000526020600020905b81548152906001019060200180831161272d57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561279657fe5b60028111156127a157fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561281957602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116127e35790505b50505050508152505090506001600281111561283157fe5b8160600151600281111561284157fe5b1480612866575060028081111561285457fe5b8160600151600281111561286457fe5b145b6128a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161289c90614c1e565b60405180910390fd5b60006128b1848461353e565b8096508192505050806128f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128f090614c5e565b60405180910390fd5b50505050919050565b606061290c613a65565b612915836135a7565b905061291f613a65565b61295d6040518060400160405280600181526020017f2f000000000000000000000000000000000000000000000000000000000000008152506135a7565b90506060600161297683856135d590919063ffffffff16565b016040519080825280602002602001820160405280156129aa57816020015b60608152602001906001900390816129955790505b50905060008090505b81518110156129fb576129d76129d2848661364a90919063ffffffff16565b613664565b8282815181106129e357fe5b602002602001018190525080806001019150506129b3565b50600081600183510381518110612a0e57fe5b6020026020010151511415612a795780600182510381518110612a2d57fe5b6020026020010160608152506001815103604051908082528060200260200182016040528015612a7157816020015b6060815260200190600190039081612a5c5790505b509350612ab2565b8051604051908082528060200260200182016040528015612aae57816020015b6060815260200190600190039081612a995790505b5093505b60008090505b8451811015612af957818181518110612acd57fe5b6020026020010151858281518110612ae157fe5b60200260200101819052508080600101915050612ab8565b50505050919050565b60008060016020601f85510181612b1557fe5b040190506040518481526020810160005b83811015612b47578060200286015181602002830152806001019050612b26565b50602082602085026040018460006010600019f1935050505092915050565b6000606060006028905080845111612bb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612baa90614abe565b60405180910390fd5b6060816040519080825280601f01601f191660200182016040528015612be85781602001600182028038833980820191505090505b50905060008090505b82811015612c5857858181518110612c0557fe5b602001015160f81c60f81b828281518110612c1c57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050612bf1565b50600080905060008090505b83811015612d87576000838281518110612c7a57fe5b602001015160f81c60f81b60f81c60ff16905060308110158015612c9f575060398111155b80612cb8575060418110158015612cb75750605a8111155b5b80612cd1575060618110158015612cd0575060668111155b5b612d10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d0790614abe565b60405180910390fd5b60308110158015612d22575060398111155b15612d335760308103601084020192505b60418110158015612d455750605a8111155b15612d565760378103601084020192505b60618110158015612d68575060668111155b15612d795760578103601084020192505b508080600101915050612c64565b508094507f2f00000000000000000000000000000000000000000000000000000000000000868481518110612db857fe5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612e25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e1c90614abe565b60405180910390fd5b6000600184885103039050806040519080825280601f01601f191660200182016040528015612e635781602001600182028038833980820191505090505b50945060008090505b81811015612ede5760008860018784010181518110612e8757fe5b602001015160f81c60f81b905080878381518110612ea157fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350508080600101915050612e6c565b5050505050915091565b6000604051602001612ef99061490f565b6040516020818303038152906040528051906020012082604051602001612f2091906148e3565b604051602081830303815290604052805190602001201480612f8b5750604051602001612f4c906148fa565b6040516020818303038152906040528051906020012082604051602001612f7391906148e3565b60405160208183030381529060405280519060200120145b80612f97575060008251145b15612fa55760009050612fc4565b60008251905060ff811115612fbe576000915050612fc4565b60019150505b919050565b60008060016020601f85510181612fdc57fe5b040190506040518481526020810160005b8381101561300e578060200286015181602002830152806001019050612fed565b5060208260208502604001846000600f600019f1935050505092915050565b600073d2001000000000000000000000000000000000d273ffffffffffffffffffffffffffffffffffffffff166383e781fe6040518163ffffffff1660e01b815260040160206040518083038186803b15801561308957600080fd5b505afa15801561309d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506130c19190810190613c9a565b905090565b600060606130d383612902565b90506000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b82518110156131e45760008260010184600184038151811061313d57fe5b602002602001015160405161315291906148cc565b908152602001604051809103902054116131a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161319890614ade565b60405180910390fd5b816002018360018303815181106131b457fe5b60200260200101516040516131c991906148cc565b9081526020016040518091039020915080600101905061311f565b50606060018351116131f6578461320f565b8260018451038151811061320657fe5b60200260200101515b90506000826001018260405161322591906148e3565b90815260200160405180910390205411613274576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161326b90614ade565b60405180910390fd5b6000826000016001846001018460405161328e91906148e3565b90815260200160405180910390205403815481106132a857fe5b906000526020600020906005020190508094505050505092915050565b60008060016020601f855101816132d857fe5b04019050600060016020601f885101816132ee57fe5b040190506040518781526020810160005b838110156133205780602002890151816020028301528060010190506132ff565b50868360200282015260005b84811015613352578060200287015181856001010160200283015280600101905061332c565b50602082848601602002606001846000600c600019f1945050505050949350505050565b6000613380613a40565b600060016020601f8851018161339257fe5b0401905060006020601f8601816133a557fe5b0490506040518881526020810160005b848110156133d657806020028a0151816020028301528060010190506133b5565b5083602002810188815287816020015283602002868660030160200285600a600019fa9650505050505094509492505050565b60008060016020601f8551018161341c57fe5b040190506040518481526020810160005b8381101561344e57806020028601518160200283015280600101905061342d565b50602082602085026040018460006011600019f1935050505092915050565b60008060016020601f8651018161348057fe5b040190506040518581526020810160005b838110156134b2578060200287015181602002830152806001019050613491565b50846020840282015260208260208502604001846000600b600019f193505050509392505050565b60008060016020601f855101816134ed57fe5b040190506040518481526020810160005b8381101561351f5780602002860151816020028301528060010190506134fe565b5060208260208502604001846000600e600019f1935050505092915050565b600080600060016020601f8651018161355357fe5b040190506040518581526020810160005b83811015613585578060200287015181602002830152806001019050613564565b506020826020850260200184600d600019fa9450815193505050509250929050565b6135af613a65565b600060208301905060405180604001604052808451815260200182815250915050919050565b60008082600001516135f985600001518660200151866000015187602001516136c6565b0190505b83600001518460200151018111613643578180600101925050826000015161363b8560200151830386600001510383866000015187602001516136c6565b0190506135fd565b5092915050565b613652613a65565b61365d8383836137a1565b5092915050565b60608082600001516040519080825280601f01601f19166020018201604052801561369e5781602001600182028038833980820191505090505b50905060006020820190506136bc818560200151866000015161383f565b8192505050919050565b6000808490506000868511613791576020851161374b57600060018660200360080260020a031960001b905060008186511690506000878a8a0103905060008386511690505b82811461373d5781861061372a578a8a019650505050505050613799565b858060010196505083865116905061370c565b859650505050505050613799565b60008585209050600091505b858803821161378f57600086842090508082141561377b5783945050505050613799565b600184019350508180600101925050613757565b505b868601925050505b949350505050565b6137a9613a65565b60006137c785600001518660200151866000015187602001516136c6565b90508460200151836020018181525050846020015181038360000181815250508460000151856020015101811415613809576000856000018181525050613834565b8360000151836000015101856000018181510391508181525050836000015181018560200181815250505b829150509392505050565b5b602081106138635781518352602083019250602082019150602081039050613840565b60006001826020036101000a0390508019835116818551168181178652505050505050565b6040518060a001604052806060815260200160001515815260200160008152602001600060028111156138b757fe5b8152602001606081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061390557805160ff1916838001178555613933565b82800160010185558215613933579182015b82811115613932578251825591602001919060010190613917565b5b5090506139409190613a7f565b5090565b82805482825590600052602060002090601f016020900481019282156139d95791602002820160005b838211156139aa57835183826101000a81548160ff021916908315150217905550926020019260010160208160000104928301926001030261396d565b80156139d75782816101000a81549060ff02191690556001016020816000010492830192600103026139aa565b505b5090506139e69190613aa4565b5090565b815481835581811115613a1757600502816005028360005260206000209182019101613a169190613ad4565b5b505050565b5080546000825560050290600052602060002090810190613a3d9190613ad4565b50565b6040518062100000016040528061800090602082028038833980820191505090505090565b604051806040016040528060008152602001600081525090565b613aa191905b80821115613a9d576000816000905550600101613a85565b5090565b90565b613ad191905b80821115613acd57600081816101000a81549060ff021916905550600101613aaa565b5090565b90565b613b4091905b80821115613b3c5760008082016000613af39190613b43565b6001820160006101000a81549060ff021916905560028201600090556003820160006101000a81549060ff0219169055600482016000613b339190613b8b565b50600501613ada565b5090565b90565b50805460018160011615610100020316600290046000825580601f10613b695750613b88565b601f016020900490600052602060002090810190613b879190613a7f565b5b50565b50805460008255601f016020900490600052602060002090810190613bb09190613a7f565b50565b600081359050613bc281614f18565b92915050565b600081519050613bd781614f18565b92915050565b600082601f830112613bee57600080fd5b8135613c01613bfc82614d06565b614cd9565b91508082526020830160208301858383011115613c1d57600080fd5b613c28838284614eb8565b50505092915050565b600082601f830112613c4257600080fd5b8135613c55613c5082614d32565b614cd9565b91508082526020830160208301858383011115613c7157600080fd5b613c7c838284614eb8565b50505092915050565b600081359050613c9481614f2f565b92915050565b600060208284031215613cac57600080fd5b6000613cba84828501613bc8565b91505092915050565b60008060408385031215613cd657600080fd5b6000613ce485828601613bb3565b9250506020613cf585828601613c85565b9150509250929050565b600060208284031215613d1157600080fd5b600082013567ffffffffffffffff811115613d2b57600080fd5b613d3784828501613c31565b91505092915050565b60008060408385031215613d5357600080fd5b600083013567ffffffffffffffff811115613d6d57600080fd5b613d7985828601613c31565b9250506020613d8a85828601613c85565b9150509250929050565b600080600060608486031215613da957600080fd5b600084013567ffffffffffffffff811115613dc357600080fd5b613dcf86828701613c31565b9350506020613de086828701613c85565b925050604084013567ffffffffffffffff811115613dfd57600080fd5b613e0986828701613bdd565b9150509250925092565b600080600060608486031215613e2857600080fd5b600084013567ffffffffffffffff811115613e4257600080fd5b613e4e86828701613c31565b9350506020613e5f86828701613c85565b9250506040613e7086828701613c85565b9150509250925092565b6000613e868383613fe8565b60208301905092915050565b6000613e9e8383613ff7565b60208301905092915050565b6000613eb68383614831565b905092915050565b6000613ec982614d88565b613ed38185614de7565b9350613ede83614d5e565b8060005b83811015613f0f578151613ef68882613e7a565b9750613f0183614dc0565b925050600181019050613ee2565b5085935050505092915050565b613f2581614d93565b613f2f8184614df8565b9250613f3a82614d6e565b8060005b83811015613f6b578151613f528782613e92565b9650613f5d83614dcd565b925050600181019050613f3e565b505050505050565b6000613f7e82614d9f565b613f888185614e03565b935083602082028501613f9a85614d78565b8060005b85811015613fd65784840389528151613fb78582613eaa565b9450613fc283614dda565b925060208a01995050600181019050613f9e565b50829750879550505050505092915050565b613ff181614e53565b82525050565b61400081614e5f565b82525050565b61400f81614ea6565b82525050565b61401e81614ea6565b82525050565b600061402f82614db5565b6140398185614e36565b9350614049818560208601614ec7565b80840191505092915050565b600061406082614daa565b61406a8185614e14565b935061407a818560208601614ec7565b61408381614efa565b840191505092915050565b600061409982614daa565b6140a38185614e36565b93506140b3818560208601614ec7565b80840191505092915050565b60006140cc601883614e25565b91507f496e636f7272656374206368756e6b20706f736974696f6e00000000000000006000830152602082019050919050565b600061410c601583614e25565b91507f4469726563746f7279206e6f74206372656174656400000000000000000000006000830152602082019050919050565b600061414c602483614e25565b91507f4e6f7420656e6f756768206d656d6f727920696e207468652046696c6573746f60008301527f72616765000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006141b2601b83614e25565b91507f48617368206861736e2774206265656e2063616c63756c6174656400000000006000830152602082019050919050565b60006141f2601983614e25565b91507f4368756e6b20697320616c72656164792075706c6f61646564000000000000006000830152602082019050919050565b6000614232601683614e25565b91507f496e636f7272656374206368756e6b206c656e677468000000000000000000006000830152602082019050919050565b6000614272600f83614e25565b91507f46696c65206e6f742065786973747300000000000000000000000000000000006000830152602082019050919050565b60006142b2600e83614e25565b91507f496e76616c69642073656e6465720000000000000000000000000000000000006000830152602082019050919050565b60006142f2601883614e25565b91507f4469726563746f7279206973206e6f742064656c6574656400000000000000006000830152602082019050919050565b6000614332601083614e25565b91507f46696c65206e6f742064656c65746564000000000000000000000000000000006000830152602082019050919050565b6000614372601383614e25565b91507f496e76616c69642073746f7261676550617468000000000000000000000000006000830152602082019050919050565b60006143b2600c83614e25565b91507f496e76616c6964207061746800000000000000000000000000000000000000006000830152602082019050919050565b60006143f2600183614e36565b91507f2e000000000000000000000000000000000000000000000000000000000000006000830152600182019050919050565b6000614432601683614e25565b91507f496e76616c6964206469726563746f7279206e616d65000000000000000000006000830152602082019050919050565b6000614472601583614e25565b91507f4368756e6b207761736e27742075706c6f6164656400000000000000000000006000830152602082019050919050565b60006144b2602683614e25565b91507f436f756c64206e6f742072657365727665206c657373207468616e207573656460008301527f20737061636500000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614518601683614e25565b91507f4469726563746f7279206973206e6f7420656d707479000000000000000000006000830152602082019050919050565b6000614558602383614e25565b91507f46696c65206861736e2774206265656e2075706c6f6164656420636f7272656360008301527f746c7900000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006145be601183614e25565b91507f4368756e6b207761736e277420726561640000000000000000000000000000006000830152602082019050919050565b60006145fe601883614e25565b91507f46696c656e616d652073686f756c64206265203c2032353600000000000000006000830152602082019050919050565b600061463e601f83614e25565b91507f46696c652073686f756c64206265206c657373207468616e20313030204d42006000830152602082019050919050565b600061467e600283614e36565b91507f2e2e0000000000000000000000000000000000000000000000000000000000006000830152600282019050919050565b60006146be601183614e25565b91507f4469726563746f72792069732066756c6c0000000000000000000000000000006000830152602082019050919050565b60006146fe600e83614e25565b91507f46696c65206e6f7420666f756e640000000000000000000000000000000000006000830152602082019050919050565b600061473e601883614e25565b91507f46696c65206f72206469726563746f72792065786973747300000000000000006000830152602082019050919050565b600061477e601883614e25565b91507f45564d206572726f7220696e2067657446696c6553697a6500000000000000006000830152602082019050919050565b60006147be601083614e25565b91507f46696c65206e6f742063726561746564000000000000000000000000000000006000830152602082019050919050565b60006147fe601983614e25565b91507f46696c65206861736e2774206265656e2075706c6f61646564000000000000006000830152602082019050919050565b600060a083016000830151848203600086015261484e8282614055565b91505060208301516148636020860182613fe8565b50604083015161487660408601826148ae565b5060608301516148896060860182614006565b50608083015184820360808601526148a18282613ebe565b9150508091505092915050565b6148b781614e9c565b82525050565b6148c681614e9c565b82525050565b60006148d8828461408e565b915081905092915050565b60006148ef8284614024565b915081905092915050565b6000614905826143e5565b9150819050919050565b600061491a82614671565b9150819050919050565b6000621000008201905061493b6000830184613f1c565b92915050565b6000602082019050818103600083015261495b8184613f73565b905092915050565b60006020820190506149786000830184614015565b92915050565b60006020820190508181036000830152614997816140bf565b9050919050565b600060208201905081810360008301526149b7816140ff565b9050919050565b600060208201905081810360008301526149d78161413f565b9050919050565b600060208201905081810360008301526149f7816141a5565b9050919050565b60006020820190508181036000830152614a17816141e5565b9050919050565b60006020820190508181036000830152614a3781614225565b9050919050565b60006020820190508181036000830152614a5781614265565b9050919050565b60006020820190508181036000830152614a77816142a5565b9050919050565b60006020820190508181036000830152614a97816142e5565b9050919050565b60006020820190508181036000830152614ab781614325565b9050919050565b60006020820190508181036000830152614ad781614365565b9050919050565b60006020820190508181036000830152614af7816143a5565b9050919050565b60006020820190508181036000830152614b1781614425565b9050919050565b60006020820190508181036000830152614b3781614465565b9050919050565b60006020820190508181036000830152614b57816144a5565b9050919050565b60006020820190508181036000830152614b778161450b565b9050919050565b60006020820190508181036000830152614b978161454b565b9050919050565b60006020820190508181036000830152614bb7816145b1565b9050919050565b60006020820190508181036000830152614bd7816145f1565b9050919050565b60006020820190508181036000830152614bf781614631565b9050919050565b60006020820190508181036000830152614c17816146b1565b9050919050565b60006020820190508181036000830152614c37816146f1565b9050919050565b60006020820190508181036000830152614c5781614731565b9050919050565b60006020820190508181036000830152614c7781614771565b9050919050565b60006020820190508181036000830152614c97816147b1565b9050919050565b60006020820190508181036000830152614cb7816147f1565b9050919050565b6000602082019050614cd360008301846148bd565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614cfc57600080fd5b8060405250919050565b600067ffffffffffffffff821115614d1d57600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614d4957600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050919050565b6000819050602082019050919050565b600081519050919050565b60006180009050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614e4c82614e7c565b9050919050565b60008115159050919050565b6000819050919050565b6000819050614e7782614f0b565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000614eb182614e69565b9050919050565b82818337600083830152505050565b60005b83811015614ee5578082015181840152602081019050614eca565b83811115614ef4576000848401525b50505050565b6000601f19601f8301169050919050565b60038110614f1557fe5b50565b614f2181614e41565b8114614f2c57600080fd5b50565b614f3881614e9c565b8114614f4357600080fd5b5056fea365627a7a723158202ae226b25ad72f9cff2d74c6dc7bcfb78530ab1d2438f48a8dab67499b37a8e56c6578706572696d656e74616cf564736f6c634300050d0040", + "nonce": "0", + "storage": { + "0x0": "2868903936" + } + }, + "0x69362535ec535F0643cBf62D16aDeDCAf32Ee6F8": { + "balance": "0", + "code": "0x608060405234801561001057600080fd5b50600436106100b45760003560e01c806379210e8e1161007157806379210e8e1461017757806381a8235a146101a757806385aeeb17146101c35780639a9a5593146101f3578063a99100541461020f578063b57321221461022b576100b4565b806307c6e7d3146100b9578063122f4fba146100d55780631c6ec7a9146101055780631cfe4e3b14610121578063373dedb41461013d57806361e46db51461015b575b600080fd5b6100d360048036036100ce9190810190613e0d565b61025b565b005b6100ef60048036036100ea9190810190613e0d565b610804565b6040516100fc9190614ab1565b60405180910390f35b61011f600480360361011a9190810190613e0d565b610b43565b005b61013b60048036036101369190810190613dd1565b610f72565b005b610145611190565b6040516101529190614e2c565b60405180910390f35b61017560048036036101709190810190613ea2565b611199565b005b610191600480360361018c9190810190613f21565b6113f9565b60405161019e9190614a72565b60405180910390f35b6101c160048036036101bc9190810190613e0d565b6116f9565b005b6101dd60048036036101d89190810190613e0d565b61189e565b6040516101ea9190614a8f565b60405180910390f35b61020d60048036036102089190810190613e4e565b611b9d565b005b61022960048036036102249190810190613e0d565b61213a565b005b61024560048036036102409190810190613e0d565b612790565b6040516102529190614e2c565b60405180910390f35b6000339050606061026b83612a10565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b825181101561037c576000826001018460018403815181106102d557fe5b60200260200101516040516102ea9190614a1a565b90815260200160405180910390205411610339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161033090614c2c565b60405180910390fd5b8160020183600183038151811061034c57fe5b60200260200101516040516103619190614a1a565b908152602001604051809103902091508060010190506102b7565b506060600183511161038e57846103a7565b8260018451038151811061039e57fe5b60200260200101515b9050600082600101826040516103bd9190614a31565b9081526020016040518091039020541161040c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161040390614c2c565b60405180910390fd5b600082600201826040516104209190614a31565b90815260200160405180910390206000018054905014610475576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161046c90614cac565b60405180910390fd5b60006104818587612c10565b9050806104c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ba90614bcc565b60405180910390fd5b6104cb613996565b836000016001856000018054905003815481106104e457fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156105965780601f1061056b57610100808354040283529160200191610596565b820191906000526020600020905b81548152906001019060200180831161057957829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff1660028111156105e257fe5b60028111156105ed57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561066557602002820191906000526020600020906000905b82829054906101000a900460ff1615158152602001906001019060208260000104928301926001038202915080841161062f5790505b50505050508152505090508084600001600186600101866040516106899190614a31565b90815260200160405180910390205403815481106106a357fe5b906000526020600020906005020160008201518160000190805190602001906106cd9291906139d2565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561071c57fe5b0217905550608082015181600401908051906020019061073d929190613a52565b5090505083600101836040516107539190614a31565b9081526020016040518091039020548460010182600001516040516107789190614a1a565b9081526020016040518091039020819055506000846001018460405161079e9190614a31565b908152602001604051809103902081905550836000018054809190600190036107c79190613af8565b5083600201836040516107da9190614a31565b9081526020016040518091039020600080820160006107f99190613b2a565b505050505050505050565b600080606061081284612c74565b91509150606061082182612a10565b90506000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b82518110156109065760008260010184600184038151811061088b57fe5b60200260200101516040516108a09190614a1a565b90815260200160405180910390205414156108c357600095505050505050610b3e565b816002018360018303815181106108d657fe5b60200260200101516040516108eb9190614a1a565b9081526020016040518091039020915080600101905061086d565b50606060018351116109185783610931565b8260018451038151811061092857fe5b60200260200101515b9050600082600101826040516109479190614a31565b908152602001604051809103902054141561096a57600095505050505050610b3e565b610972613996565b826000016001846001018460405161098a9190614a31565b90815260200160405180910390205403815481106109a457fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610a565780601f10610a2b57610100808354040283529160200191610a56565b820191906000526020600020905b815481529060010190602001808311610a3957829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115610aa257fe5b6002811115610aad57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015610b2557602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411610aef5790505b5050505050815250509050806060015196505050505050505b919050565b600160009054906101000a900460ff16610b85576120006002819055506210000060038190555060018060006101000a81548160ff0219169083151502179055505b6000815111610bc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc090614c2c565b60405180910390fd5b60003390506060610bd983612a10565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015610cea57600082600101846001840381518110610c4357fe5b6020026020010151604051610c589190614a1a565b90815260200160405180910390205411610ca7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9e90614c2c565b60405180910390fd5b81600201836001830381518110610cba57fe5b6020026020010151604051610ccf9190614a1a565b90815260200160405180910390209150806001019050610c25565b50600254816000018054905010610d36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2d90614d4c565b60405180910390fd5b60606001835111610d475784610d60565b82600184510381518110610d5757fe5b60200260200101515b905060008260010182604051610d769190614a31565b90815260200160405180910390205414610dc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbc90614d8c565b60405180910390fd5b610dce81612ff6565b610e0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0490614c4c565b60405180910390fd5b6000610e1985876130d7565b905080610e5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5290614aec565b60405180910390fd5b610e63613996565b82816000018190525060008160200190151590811515815250508360000181908060018154018082558091505090600182039060005260206000209060050201600090919290919091506000820151816000019080519060200190610ec99291906139d2565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff02191690836002811115610f1857fe5b02179055506080820151816004019080519060200190610f39929190613a52565b5050505083600001805490508460010184604051610f579190614a31565b90815260200160405180910390208190555050505050505050565b610f7a61313b565b73ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161480610fdf57503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614155b61101e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101590614bac565b60405180910390fd5b80600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411156110a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109790614c8c565b60405180910390fd5b600054600754820111156110e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e090614b0c565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460076000828254039250508190555080600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550806007600082825401925050819055505050565b60008054905090565b600033905060006111aa82866131d4565b9050600160028111156111b957fe5b8160030160009054906101000a900460ff1660028111156111d657fe5b14611216576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120d90614d6c565b60405180910390fd5b6000600354858161122357fe5b061480156112345750806002015484105b611273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126a90614acc565b60405180910390fd5b600354848260020154031080156112905750838160020154038351145b8061129d57506003548351145b6112dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d390614b6c565b60405180910390fd5b600015158160040160035486816112ef57fe5b04815481106112fa57fe5b90600052602060002090602091828204019190069054906101000a900460ff1615151461135c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135390614b4c565b60405180910390fd5b600061136a838787876133d3565b9050806113ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a390614c6c565b60405180910390fd5b60018260040160035487816113bd57fe5b04815481106113c857fe5b90600052602060002090602091828204019190066101000a81548160ff021916908315150217905550505050505050565b611401613b4e565b6000606061140e86612c74565b9150915061141a613996565b61142483836131d4565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156114c85780601f1061149d576101008083540402835291602001916114c8565b820191906000526020600020905b8154815290600101906020018083116114ab57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561151457fe5b600281111561151f57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561159757602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116115615790505b50505050508152505090506002808111156115ae57fe5b816060015160028111156115be57fe5b146115fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f590614e0c565b60405180910390fd5b60035485111580156116105750600085115b61164f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164690614b6c565b60405180910390fd5b80604001518587011115611698576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168f90614acc565b60405180910390fd5b60006116a684848989613484565b8096508192505050806116ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e590614cec565b60405180910390fd5b505050509392505050565b6000339050600061170a82846131d4565b90506001600281111561171957fe5b8160030160009054906101000a900460ff16600281111561173657fe5b14611776576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176d90614d6c565b60405180910390fd5b60006001905060008260040180549050905060008090505b818110156117e157600015158460040182815481106117a957fe5b90600052602060002090602091828204019190069054906101000a900460ff16151514156117d657600092505b80600101905061178e565b5081611822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181990614ccc565b60405180910390fd5b60028360030160006101000a81548160ff0219169083600281111561184357fe5b021790555060006118548587613517565b905080611896576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188d90614b2c565b60405180910390fd5b505050505050565b6060600060606118ad84612c74565b9150915060606118bc82612a10565b90506000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008090505b82518110156119c65760008260010184838151811061192257fe5b60200260200101516040516119379190614a1a565b90815260200160405180910390205411611986576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197d90614c2c565b60405180910390fd5b8160020183828151811061199657fe5b60200260200101516040516119ab9190614a1a565b90815260200160405180910390209150806001019050611907565b5080600001805480602002602001604051908101604052809291908181526020016000905b82821015611b8e57838290600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611aa75780601f10611a7c57610100808354040283529160200191611aa7565b820191906000526020600020905b815481529060010190602001808311611a8a57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115611af357fe5b6002811115611afe57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015611b7657602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411611b405790505b505050505081525050815260200190600101906119eb565b50505050945050505050919050565b600160009054906101000a900460ff16611bdf576120006002819055506210000060038190555060018060006101000a81548160ff0219169083151502179055505b60003390506305f5e100821115611c2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2290614d2c565b60405180910390fd5b600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205483011115611cee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce590614dac565b60405180910390fd5b6060611cf984612a10565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015611e0a57600082600101846001840381518110611d6357fe5b6020026020010151604051611d789190614a1a565b90815260200160405180910390205411611dc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dbe90614c2c565b60405180910390fd5b81600201836001830381518110611dda57fe5b6020026020010151604051611def9190614a1a565b90815260200160405180910390209150806001019050611d45565b50600254816000018054905010611e56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4d90614d4c565b60405180910390fd5b60606001835111611e675785611e80565b82600184510381518110611e7757fe5b60200260200101515b905060008260010182604051611e969190614a31565b90815260200160405180910390205414611ee5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611edc90614d8c565b60405180910390fd5b611eee81612ff6565b611f2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2490614d0c565b60405180910390fd5b6000611f3a85888861357b565b905080611f7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7390614dec565b60405180910390fd5b6060600354600160035489010381611f9057fe5b04604051908082528060200260200182016040528015611fbf5781602001602082028038833980820191505090505b509050836000016040518060a0016040528085815260200160011515815260200189815260200160016002811115611ff357fe5b8152602001838152509080600181540180825580915050906001820390600052602060002090600502016000909192909190915060008201518160000190805190602001906120439291906139d2565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561209257fe5b021790555060808201518160040190805190602001906120b3929190613a52565b50505050836000018054905084600101846040516120d19190614a31565b90815260200160405180910390208190555086600560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505050505050505050565b6000339050612147613996565b61215182846131d4565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156121f55780601f106121ca576101008083540402835291602001916121f5565b820191906000526020600020905b8154815290600101906020018083116121d857829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561224157fe5b600281111561224c57fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156122c457602002820191906000526020600020906000905b82829054906101000a900460ff1615158152602001906001019060208260000104928301926001038202915080841161228e5790505b5050505050815250509050600060028111156122dc57fe5b816060015160028111156122ec57fe5b141561232d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232490614b8c565b60405180910390fd5b600061233983856135e8565b90508061237b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161237290614bec565b60405180910390fd5b606061238685612a10565b90506000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b825181101561241e57816002018360018303815181106123ee57fe5b60200260200101516040516124039190614a1a565b908152602001604051809103902091508060010190506123d2565b50600060018260010186600001516040516124399190614a1a565b908152602001604051809103902054039050612453613996565b8260000160018460000180549050038154811061246c57fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561251e5780601f106124f35761010080835404028352916020019161251e565b820191906000526020600020905b81548152906001019060200180831161250157829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561256a57fe5b600281111561257557fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156125ed57602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116125b75790505b50505050508152505090508083600001838154811061260857fe5b906000526020600020906005020160008201518160000190805190602001906126329291906139d2565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561268157fe5b021790555060808201518160040190805190602001906126a2929190613a52565b50905050826000018054809190600190036126bd9190613af8565b508260010186600001516040516126d49190614a1a565b9081526020016040518091039020548360010182600001516040516126f99190614a1a565b90815260200160405180910390208190555060008360010187600001516040516127239190614a1a565b9081526020016040518091039020819055508560400151600560008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505050505050505050565b600080606061279e84612c74565b915091506127aa613996565b6127b483836131d4565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156128585780601f1061282d57610100808354040283529160200191612858565b820191906000526020600020905b81548152906001019060200180831161283b57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff1660028111156128a457fe5b60028111156128af57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561292757602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116128f15790505b50505050508152505090506001600281111561293f57fe5b8160600151600281111561294f57fe5b1480612974575060028081111561296257fe5b8160600151600281111561297257fe5b145b6129b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129aa90614d6c565b60405180910390fd5b60006129bf848461364c565b809650819250505080612a07576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129fe90614dcc565b60405180910390fd5b50505050919050565b6060612a1a613b73565b612a23836136b5565b9050612a2d613b73565b612a6b6040518060400160405280600181526020017f2f000000000000000000000000000000000000000000000000000000000000008152506136b5565b905060606001612a8483856136e390919063ffffffff16565b01604051908082528060200260200182016040528015612ab857816020015b6060815260200190600190039081612aa35790505b50905060008090505b8151811015612b0957612ae5612ae0848661375890919063ffffffff16565b613772565b828281518110612af157fe5b60200260200101819052508080600101915050612ac1565b50600081600183510381518110612b1c57fe5b6020026020010151511415612b875780600182510381518110612b3b57fe5b6020026020010160608152506001815103604051908082528060200260200182016040528015612b7f57816020015b6060815260200190600190039081612b6a5790505b509350612bc0565b8051604051908082528060200260200182016040528015612bbc57816020015b6060815260200190600190039081612ba75790505b5093505b60008090505b8451811015612c0757818181518110612bdb57fe5b6020026020010151858281518110612bef57fe5b60200260200101819052508080600101915050612bc6565b50505050919050565b60008060016020601f85510181612c2357fe5b040190506040518481526020810160005b83811015612c55578060200286015181602002830152806001019050612c34565b50602082602085026040018460006010600019f1935050505092915050565b6000606060006028905080845111612cc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cb890614c0c565b60405180910390fd5b6060816040519080825280601f01601f191660200182016040528015612cf65781602001600182028038833980820191505090505b50905060008090505b82811015612d6657858181518110612d1357fe5b602001015160f81c60f81b828281518110612d2a57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050612cff565b50600080905060008090505b83811015612e95576000838281518110612d8857fe5b602001015160f81c60f81b60f81c60ff16905060308110158015612dad575060398111155b80612dc6575060418110158015612dc55750605a8111155b5b80612ddf575060618110158015612dde575060668111155b5b612e1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e1590614c0c565b60405180910390fd5b60308110158015612e30575060398111155b15612e415760308103601084020192505b60418110158015612e535750605a8111155b15612e645760378103601084020192505b60618110158015612e76575060668111155b15612e875760578103601084020192505b508080600101915050612d72565b508094507f2f00000000000000000000000000000000000000000000000000000000000000868481518110612ec657fe5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612f33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f2a90614c0c565b60405180910390fd5b6000600184885103039050806040519080825280601f01601f191660200182016040528015612f715781602001600182028038833980820191505090505b50945060008090505b81811015612fec5760008860018784010181518110612f9557fe5b602001015160f81c60f81b905080878381518110612faf57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350508080600101915050612f7a565b5050505050915091565b600060405160200161300790614a5d565b604051602081830303815290604052805190602001208260405160200161302e9190614a31565b604051602081830303815290604052805190602001201480613099575060405160200161305a90614a48565b60405160208183030381529060405280519060200120826040516020016130819190614a31565b60405160208183030381529060405280519060200120145b806130a5575060008251145b156130b357600090506130d2565b60008251905060ff8111156130cc5760009150506130d2565b60019150505b919050565b60008060016020601f855101816130ea57fe5b040190506040518481526020810160005b8381101561311c5780602002860151816020028301528060010190506130fb565b5060208260208502604001846000600f600019f1935050505092915050565b600073d2001000000000000000000000000000000000d273ffffffffffffffffffffffffffffffffffffffff166383e781fe6040518163ffffffff1660e01b815260040160206040518083038186803b15801561319757600080fd5b505afa1580156131ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506131cf9190810190613da8565b905090565b600060606131e183612a10565b90506000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b82518110156132f25760008260010184600184038151811061324b57fe5b60200260200101516040516132609190614a1a565b908152602001604051809103902054116132af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132a690614c2c565b60405180910390fd5b816002018360018303815181106132c257fe5b60200260200101516040516132d79190614a1a565b9081526020016040518091039020915080600101905061322d565b5060606001835111613304578461331d565b8260018451038151811061331457fe5b60200260200101515b9050600082600101826040516133339190614a31565b90815260200160405180910390205411613382576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161337990614c2c565b60405180910390fd5b6000826000016001846001018460405161339c9190614a31565b90815260200160405180910390205403815481106133b657fe5b906000526020600020906005020190508094505050505092915050565b60008060016020601f855101816133e657fe5b04019050600060016020601f885101816133fc57fe5b040190506040518781526020810160005b8381101561342e57806020028901518160200283015280600101905061340d565b50868360200282015260005b84811015613460578060200287015181856001010160200283015280600101905061343a565b50602082848601602002606001846000600c600019f1945050505050949350505050565b600061348e613b4e565b600060016020601f885101816134a057fe5b0401905060006020601f8601816134b357fe5b0490506040518881526020810160005b848110156134e457806020028a0151816020028301528060010190506134c3565b5083602002810188815287816020015283602002868660030160200285600a600019fa9650505050505094509492505050565b60008060016020601f8551018161352a57fe5b040190506040518481526020810160005b8381101561355c57806020028601518160200283015280600101905061353b565b50602082602085026040018460006011600019f1935050505092915050565b60008060016020601f8651018161358e57fe5b040190506040518581526020810160005b838110156135c057806020028701518160200283015280600101905061359f565b50846020840282015260208260208502604001846000600b600019f193505050509392505050565b60008060016020601f855101816135fb57fe5b040190506040518481526020810160005b8381101561362d57806020028601518160200283015280600101905061360c565b5060208260208502604001846000600e600019f1935050505092915050565b600080600060016020601f8651018161366157fe5b040190506040518581526020810160005b83811015613693578060200287015181602002830152806001019050613672565b506020826020850260200184600d600019fa9450815193505050509250929050565b6136bd613b73565b600060208301905060405180604001604052808451815260200182815250915050919050565b600080826000015161370785600001518660200151866000015187602001516137d4565b0190505b8360000151846020015101811161375157818060010192505082600001516137498560200151830386600001510383866000015187602001516137d4565b01905061370b565b5092915050565b613760613b73565b61376b8383836138af565b5092915050565b60608082600001516040519080825280601f01601f1916602001820160405280156137ac5781602001600182028038833980820191505090505b50905060006020820190506137ca818560200151866000015161394d565b8192505050919050565b600080849050600086851161389f576020851161385957600060018660200360080260020a031960001b905060008186511690506000878a8a0103905060008386511690505b82811461384b57818610613838578a8a0196505050505050506138a7565b858060010196505083865116905061381a565b8596505050505050506138a7565b60008585209050600091505b858803821161389d57600086842090508082141561388957839450505050506138a7565b600184019350508180600101925050613865565b505b868601925050505b949350505050565b6138b7613b73565b60006138d585600001518660200151866000015187602001516137d4565b90508460200151836020018181525050846020015181038360000181815250508460000151856020015101811415613917576000856000018181525050613942565b8360000151836000015101856000018181510391508181525050836000015181018560200181815250505b829150509392505050565b5b60208110613971578151835260208301925060208201915060208103905061394e565b60006001826020036101000a0390508019835116818551168181178652505050505050565b6040518060a001604052806060815260200160001515815260200160008152602001600060028111156139c557fe5b8152602001606081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613a1357805160ff1916838001178555613a41565b82800160010185558215613a41579182015b82811115613a40578251825591602001919060010190613a25565b5b509050613a4e9190613b8d565b5090565b82805482825590600052602060002090601f01602090048101928215613ae75791602002820160005b83821115613ab857835183826101000a81548160ff0219169083151502179055509260200192600101602081600001049283019260010302613a7b565b8015613ae55782816101000a81549060ff0219169055600101602081600001049283019260010302613ab8565b505b509050613af49190613bb2565b5090565b815481835581811115613b2557600502816005028360005260206000209182019101613b249190613be2565b5b505050565b5080546000825560050290600052602060002090810190613b4b9190613be2565b50565b6040518062100000016040528061800090602082028038833980820191505090505090565b604051806040016040528060008152602001600081525090565b613baf91905b80821115613bab576000816000905550600101613b93565b5090565b90565b613bdf91905b80821115613bdb57600081816101000a81549060ff021916905550600101613bb8565b5090565b90565b613c4e91905b80821115613c4a5760008082016000613c019190613c51565b6001820160006101000a81549060ff021916905560028201600090556003820160006101000a81549060ff0219169055600482016000613c419190613c99565b50600501613be8565b5090565b90565b50805460018160011615610100020316600290046000825580601f10613c775750613c96565b601f016020900490600052602060002090810190613c959190613b8d565b5b50565b50805460008255601f016020900490600052602060002090810190613cbe9190613b8d565b50565b600081359050613cd081615086565b92915050565b600081519050613ce581615086565b92915050565b600082601f830112613cfc57600080fd5b8135613d0f613d0a82614e74565b614e47565b91508082526020830160208301858383011115613d2b57600080fd5b613d36838284615026565b50505092915050565b600082601f830112613d5057600080fd5b8135613d63613d5e82614ea0565b614e47565b91508082526020830160208301858383011115613d7f57600080fd5b613d8a838284615026565b50505092915050565b600081359050613da28161509d565b92915050565b600060208284031215613dba57600080fd5b6000613dc884828501613cd6565b91505092915050565b60008060408385031215613de457600080fd5b6000613df285828601613cc1565b9250506020613e0385828601613d93565b9150509250929050565b600060208284031215613e1f57600080fd5b600082013567ffffffffffffffff811115613e3957600080fd5b613e4584828501613d3f565b91505092915050565b60008060408385031215613e6157600080fd5b600083013567ffffffffffffffff811115613e7b57600080fd5b613e8785828601613d3f565b9250506020613e9885828601613d93565b9150509250929050565b600080600060608486031215613eb757600080fd5b600084013567ffffffffffffffff811115613ed157600080fd5b613edd86828701613d3f565b9350506020613eee86828701613d93565b925050604084013567ffffffffffffffff811115613f0b57600080fd5b613f1786828701613ceb565b9150509250925092565b600080600060608486031215613f3657600080fd5b600084013567ffffffffffffffff811115613f5057600080fd5b613f5c86828701613d3f565b9350506020613f6d86828701613d93565b9250506040613f7e86828701613d93565b9150509250925092565b6000613f9483836140f6565b60208301905092915050565b6000613fac8383614105565b60208301905092915050565b6000613fc4838361497f565b905092915050565b6000613fd782614ef6565b613fe18185614f55565b9350613fec83614ecc565b8060005b8381101561401d5781516140048882613f88565b975061400f83614f2e565b925050600181019050613ff0565b5085935050505092915050565b61403381614f01565b61403d8184614f66565b925061404882614edc565b8060005b838110156140795781516140608782613fa0565b965061406b83614f3b565b92505060018101905061404c565b505050505050565b600061408c82614f0d565b6140968185614f71565b9350836020820285016140a885614ee6565b8060005b858110156140e457848403895281516140c58582613fb8565b94506140d083614f48565b925060208a019950506001810190506140ac565b50829750879550505050505092915050565b6140ff81614fc1565b82525050565b61410e81614fcd565b82525050565b61411d81615014565b82525050565b61412c81615014565b82525050565b600061413d82614f23565b6141478185614fa4565b9350614157818560208601615035565b80840191505092915050565b600061416e82614f18565b6141788185614f82565b9350614188818560208601615035565b61419181615068565b840191505092915050565b60006141a782614f18565b6141b18185614fa4565b93506141c1818560208601615035565b80840191505092915050565b60006141da601883614f93565b91507f496e636f7272656374206368756e6b20706f736974696f6e00000000000000006000830152602082019050919050565b600061421a601583614f93565b91507f4469726563746f7279206e6f74206372656174656400000000000000000000006000830152602082019050919050565b600061425a602483614f93565b91507f4e6f7420656e6f756768206d656d6f727920696e207468652046696c6573746f60008301527f72616765000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006142c0601b83614f93565b91507f48617368206861736e2774206265656e2063616c63756c6174656400000000006000830152602082019050919050565b6000614300601983614f93565b91507f4368756e6b20697320616c72656164792075706c6f61646564000000000000006000830152602082019050919050565b6000614340601683614f93565b91507f496e636f7272656374206368756e6b206c656e677468000000000000000000006000830152602082019050919050565b6000614380600f83614f93565b91507f46696c65206e6f742065786973747300000000000000000000000000000000006000830152602082019050919050565b60006143c0600e83614f93565b91507f496e76616c69642073656e6465720000000000000000000000000000000000006000830152602082019050919050565b6000614400601883614f93565b91507f4469726563746f7279206973206e6f742064656c6574656400000000000000006000830152602082019050919050565b6000614440601083614f93565b91507f46696c65206e6f742064656c65746564000000000000000000000000000000006000830152602082019050919050565b6000614480601383614f93565b91507f496e76616c69642073746f7261676550617468000000000000000000000000006000830152602082019050919050565b60006144c0600c83614f93565b91507f496e76616c6964207061746800000000000000000000000000000000000000006000830152602082019050919050565b6000614500600183614fa4565b91507f2e000000000000000000000000000000000000000000000000000000000000006000830152600182019050919050565b6000614540601683614f93565b91507f496e76616c6964206469726563746f7279206e616d65000000000000000000006000830152602082019050919050565b6000614580601583614f93565b91507f4368756e6b207761736e27742075706c6f6164656400000000000000000000006000830152602082019050919050565b60006145c0602683614f93565b91507f436f756c64206e6f742072657365727665206c657373207468616e207573656460008301527f20737061636500000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614626601683614f93565b91507f4469726563746f7279206973206e6f7420656d707479000000000000000000006000830152602082019050919050565b6000614666602383614f93565b91507f46696c65206861736e2774206265656e2075706c6f6164656420636f7272656360008301527f746c7900000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006146cc601183614f93565b91507f4368756e6b207761736e277420726561640000000000000000000000000000006000830152602082019050919050565b600061470c601883614f93565b91507f46696c656e616d652073686f756c64206265203c2032353600000000000000006000830152602082019050919050565b600061474c601f83614f93565b91507f46696c652073686f756c64206265206c657373207468616e20313030204d42006000830152602082019050919050565b600061478c600283614fa4565b91507f2e2e0000000000000000000000000000000000000000000000000000000000006000830152600282019050919050565b60006147cc601183614f93565b91507f4469726563746f72792069732066756c6c0000000000000000000000000000006000830152602082019050919050565b600061480c600e83614f93565b91507f46696c65206e6f7420666f756e640000000000000000000000000000000000006000830152602082019050919050565b600061484c601883614f93565b91507f46696c65206f72206469726563746f72792065786973747300000000000000006000830152602082019050919050565b600061488c601983614f93565b91507f4e6f7420656e6f756768207265736572766564207370616365000000000000006000830152602082019050919050565b60006148cc601883614f93565b91507f45564d206572726f7220696e2067657446696c6553697a6500000000000000006000830152602082019050919050565b600061490c601083614f93565b91507f46696c65206e6f742063726561746564000000000000000000000000000000006000830152602082019050919050565b600061494c601983614f93565b91507f46696c65206861736e2774206265656e2075706c6f61646564000000000000006000830152602082019050919050565b600060a083016000830151848203600086015261499c8282614163565b91505060208301516149b160208601826140f6565b5060408301516149c460408601826149fc565b5060608301516149d76060860182614114565b50608083015184820360808601526149ef8282613fcc565b9150508091505092915050565b614a058161500a565b82525050565b614a148161500a565b82525050565b6000614a26828461419c565b915081905092915050565b6000614a3d8284614132565b915081905092915050565b6000614a53826144f3565b9150819050919050565b6000614a688261477f565b9150819050919050565b60006210000082019050614a89600083018461402a565b92915050565b60006020820190508181036000830152614aa98184614081565b905092915050565b6000602082019050614ac66000830184614123565b92915050565b60006020820190508181036000830152614ae5816141cd565b9050919050565b60006020820190508181036000830152614b058161420d565b9050919050565b60006020820190508181036000830152614b258161424d565b9050919050565b60006020820190508181036000830152614b45816142b3565b9050919050565b60006020820190508181036000830152614b65816142f3565b9050919050565b60006020820190508181036000830152614b8581614333565b9050919050565b60006020820190508181036000830152614ba581614373565b9050919050565b60006020820190508181036000830152614bc5816143b3565b9050919050565b60006020820190508181036000830152614be5816143f3565b9050919050565b60006020820190508181036000830152614c0581614433565b9050919050565b60006020820190508181036000830152614c2581614473565b9050919050565b60006020820190508181036000830152614c45816144b3565b9050919050565b60006020820190508181036000830152614c6581614533565b9050919050565b60006020820190508181036000830152614c8581614573565b9050919050565b60006020820190508181036000830152614ca5816145b3565b9050919050565b60006020820190508181036000830152614cc581614619565b9050919050565b60006020820190508181036000830152614ce581614659565b9050919050565b60006020820190508181036000830152614d05816146bf565b9050919050565b60006020820190508181036000830152614d25816146ff565b9050919050565b60006020820190508181036000830152614d458161473f565b9050919050565b60006020820190508181036000830152614d65816147bf565b9050919050565b60006020820190508181036000830152614d85816147ff565b9050919050565b60006020820190508181036000830152614da58161483f565b9050919050565b60006020820190508181036000830152614dc58161487f565b9050919050565b60006020820190508181036000830152614de5816148bf565b9050919050565b60006020820190508181036000830152614e05816148ff565b9050919050565b60006020820190508181036000830152614e258161493f565b9050919050565b6000602082019050614e416000830184614a0b565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614e6a57600080fd5b8060405250919050565b600067ffffffffffffffff821115614e8b57600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614eb757600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050919050565b6000819050602082019050919050565b600081519050919050565b60006180009050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614fba82614fea565b9050919050565b60008115159050919050565b6000819050919050565b6000819050614fe582615079565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061501f82614fd7565b9050919050565b82818337600083830152505050565b60005b83811015615053578082015181840152602081019050615038565b83811115615062576000848401525b50505050565b6000601f19601f8301169050919050565b6003811061508357fe5b50565b61508f81614faf565b811461509a57600080fd5b50565b6150a68161500a565b81146150b157600080fd5b5056fea365627a7a72315820314a90e541327f2678eaf7815f54348c3702e4fa45cdf1d5595b378d08af86896c6578706572696d656e74616cf564736f6c634300050d0040", + "nonce": "0", + "storage": { + "0x0": "2868903936" + } + }, + "0x69bfcdcb98c9562e0a2faee3ecdfd65e8a0adb19": { + "balance": "1000000000000000000000000000000" + }, + "0x6a37ad7dceec4595eea9f03b82d2710e738343ac": { + "balance": "1000000000000000000000000000000" + }, + "0x6b806862a977a0e22ed1752f858e5332647121c8": { + "balance": "1000000000000000000000000000000" + }, + "0x6c0ef9084a57df13c175afea32ea47a510c5506e": { + "balance": "1000000000000000000000000000000" + }, + "0x6cd5e637266e18d3e888ee99451eb828c6b491f4": { + "balance": "1000000000000000000000000000000" + }, + "0x6d0d7f0ff51917bd84a5f7270d31a894282aaf4b": { + "balance": "1000000000000000000000000000000" + }, + "0x6d8092cb926daf29236f866cd31c327ff73323d1": { + "balance": "1000000000000000000000000000000" + }, + "0x6d80aAC61F6d92c7F4A3c412850474ba963B698E": { + "balance": "1000000000000000000000" + }, + "0x6fec280c0ab320715b17d70e8b02c2d4141c1372": { + "balance": "1000000000000000000000000000000" + }, + "0x733ad609ef2e742334d96266fbc13733f1cf5e4a": { + "balance": "1000000000000000000000000000000" + }, + "0x7525198d8cd1121d57358a0b0ed037e924581a76": { + "balance": "1000000000000000000000000000000" + }, + "0x765708943c3b791563d1e3f0533b6d7e7d769e4d": { + "balance": "1000000000000000000000000000000" + }, + "0x7685d04f0b7657017b77efa004a14ff9f022acab": { + "balance": "1000000000000000000000000000000" + }, + "0x76b545cb6a2fc671f741950eeb27627e69a1e69b": { + "balance": "1000000000000000000000000000000" + }, + "0x77a0bc73442d3d9cb993e8d9752f95babf0ccaa6": { + "balance": "1000000000000000000000000000000" + }, + "0x7a89A6c323FaCfF0ADeF7EEF3e491aD4044d0592": { + "balance": "100000000000000000000000" + }, + "0x7e7E68F04D1799Fa25C8cff57314c8a5d3942e69": { + "balance": "1000000000000000000000000" + }, + "0x811d701d14539d190a8593fe901eafe8eff511f5": { + "balance": "1000000000000000000000000000000" + }, + "0x81dcbd71da28fafb9ca99ff5a22bfcebba84fecc": { + "balance": "100000000000000000000000" + }, + "0x83c1479d2a32d9ed9fa699289b6c2db56b7cd045": { + "balance": "1000000000000000000000000000000" + }, + "0x85b33f0853ab8eaa4e602bdfd724d44bc2731e90": { + "balance": "1000000000000000000000000000000" + }, + "0x863f816036e3cbba90855196c9d1e339fcff1650": { + "balance": "1000000000000000000000000000000" + }, + "0x87ea381878572d63b3453033d7540abddd191186": { + "balance": "1000000000000000000000000000000" + }, + "0x88fd5e01078629cc194c933d9631b9448fe10b1d": { + "balance": "1000000000000000000000000000000" + }, + "0x8945e48bd056f45c8b57f9025d2674bb03a24035": { + "balance": "1000000000000000000000000000000" + }, + "0x8a920edc1021ce76c22774e0e83723a6e51c2439": { + "balance": "1000000000000000000000000000000" + }, + "0x8e6081e272c8f4d49f5b29157b52f68cbd6307ad": { + "balance": "1000000000000000000000000000000" + }, + "0x8fe24dbbf9884bd458d8cfac528b4ad70e82497d": { + "balance": "1000000000000000000000000000000" + }, + "0x90431f3f75b26657f74abbb5c759b12e78f916cc": { + "balance": "1000000000000000000000000000000" + }, + "0x907cd0881E50d359bb9Fd120B1A5A143b1C97De6": { + "balance": "1000000000000000000000000000000000000000000000000000000000" + }, + "0x94c6e5746971d6aebeaa42cbbe2feca0f6b5b24f": { + "balance": "1000000000000000000000000000000" + }, + "0x96672f9e982936e1904b15c948cc81bf18027db6": { + "balance": "1000000000000000000000000000000" + }, + "0x97b921ba45e0aa8830701aa62050a83ee00a1bb8": { + "balance": "1000000000000000000000000000000" + }, + "0x98e50c97baf98dc6a81bdb95067339a269a36fc1": { + "balance": "1000000000000000000000000000000" + }, + "0x9b77f28285a49601169a33332f08aa309d97edd0": { + "balance": "1000000000000000000000000000000" + }, + "0x9f62f4215cd277ca40dede101b4ccb29290de6bb": { + "balance": "1000000000000000000000000000000" + }, + "0xD1001000000000000000000000000000000000D1": { + "balance": "0", + "code": "0x608060405260043610603f576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680636d4ce63c146044575b600080fd5b348015604f57600080fd5b506056606c565b6040518082815260200191505060405180910390f35b60006001600060048152602001908152602001600020600060098152602001908152602001600020600101549050905600a165627a7a723058208fe64219becc0bcab1c8f854f05804ebb6bb555da5dbc49e8f7021c31d77636a0029", + "nonce": "0", + "storage": { + "0x3b4da637a1b0e6dbfc6795f2b7f0cb29eebb91b3af4dcc335e1633f6b4af810b": "1111" + } + }, + "0xD3001000000000000000000000000000000000D3": { + "balance": "0", + "code": "0x60806040526004361061007b5760003560e01c80639623609d1161004e5780639623609d1461013657806399a88ec4146101f5578063f2fde38b14610230578063f3b7dead146102635761007b565b8063204e1c7a14610080578063715018a6146100cf5780637eff275e146100e65780638da5cb5b14610121575b600080fd5b34801561008c57600080fd5b506100b3600480360360208110156100a357600080fd5b50356001600160a01b0316610296565b604080516001600160a01b039092168252519081900360200190f35b3480156100db57600080fd5b506100e4610328565b005b3480156100f257600080fd5b506100e46004803603604081101561010957600080fd5b506001600160a01b03813581169160200135166103ca565b34801561012d57600080fd5b506100b3610496565b6100e46004803603606081101561014c57600080fd5b6001600160a01b03823581169260208101359091169181019060608101604082013564010000000081111561018057600080fd5b82018360208201111561019257600080fd5b803590602001918460018302840111640100000000831117156101b457600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506104a5945050505050565b34801561020157600080fd5b506100e46004803603604081101561021857600080fd5b506001600160a01b03813581169160200135166105dd565b34801561023c57600080fd5b506100e46004803603602081101561025357600080fd5b50356001600160a01b031661068d565b34801561026f57600080fd5b506100b36004803603602081101561028657600080fd5b50356001600160a01b0316610785565b6000806060836001600160a01b03166040518080635c60da1b60e01b8152506004019050600060405180830381855afa9150503d80600081146102f5576040519150601f19603f3d011682016040523d82523d6000602084013e6102fa565b606091505b50915091508161030957600080fd5b80806020019051602081101561031e57600080fd5b5051949350505050565b6103306107e4565b6000546001600160a01b03908116911614610380576040805162461bcd60e51b8152602060048201819052602482015260008051602061080f833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6103d26107e4565b6000546001600160a01b03908116911614610422576040805162461bcd60e51b8152602060048201819052602482015260008051602061080f833981519152604482015290519081900360640190fd5b816001600160a01b0316638f283970826040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050600060405180830381600087803b15801561047a57600080fd5b505af115801561048e573d6000803e3d6000fd5b505050505050565b6000546001600160a01b031690565b6104ad6107e4565b6000546001600160a01b039081169116146104fd576040805162461bcd60e51b8152602060048201819052602482015260008051602061080f833981519152604482015290519081900360640190fd5b826001600160a01b0316634f1ef2863484846040518463ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561057357818101518382015260200161055b565b50505050905090810190601f1680156105a05780820380516001836020036101000a031916815260200191505b5093505050506000604051808303818588803b1580156105bf57600080fd5b505af11580156105d3573d6000803e3d6000fd5b5050505050505050565b6105e56107e4565b6000546001600160a01b03908116911614610635576040805162461bcd60e51b8152602060048201819052602482015260008051602061080f833981519152604482015290519081900360640190fd5b816001600160a01b0316633659cfe6826040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050600060405180830381600087803b15801561047a57600080fd5b6106956107e4565b6000546001600160a01b039081169116146106e5576040805162461bcd60e51b8152602060048201819052602482015260008051602061080f833981519152604482015290519081900360640190fd5b6001600160a01b03811661072a5760405162461bcd60e51b81526004018080602001828103825260268152602001806107e96026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000806060836001600160a01b031660405180806303e1469160e61b8152506004019050600060405180830381855afa9150503d80600081146102f5576040519150601f19603f3d011682016040523d82523d6000602084013e6102fa565b339056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a26469706673582212201d968ac32bef5562c6b4f1bd5d2f2a74c14d07ce008ca6fdc5a3bd0f5fc265f564736f6c63430006080033", + "nonce": "0", + "storage": { + "0x0": "0x907cd0881E50d359bb9Fd120B1A5A143b1C97De6" + } + }, + "0xD3002000000000000000000000000000000000D3": { + "balance": "0", + "code": "0x60806040526004361061004e5760003560e01c80633659cfe6146100655780634f1ef286146100985780635c60da1b146101185780638f28397014610149578063f851a4401461017c5761005d565b3661005d5761005b610191565b005b61005b610191565b34801561007157600080fd5b5061005b6004803603602081101561008857600080fd5b50356001600160a01b03166101ab565b61005b600480360360408110156100ae57600080fd5b6001600160a01b0382351691908101906040810160208201356401000000008111156100d957600080fd5b8201836020820111156100eb57600080fd5b8035906020019184600183028401116401000000008311171561010d57600080fd5b5090925090506101e5565b34801561012457600080fd5b5061012d610292565b604080516001600160a01b039092168252519081900360200190f35b34801561015557600080fd5b5061005b6004803603602081101561016c57600080fd5b50356001600160a01b03166102cf565b34801561018857600080fd5b5061012d610389565b6101996103ba565b6101a96101a461041a565b61043f565b565b6101b3610463565b6001600160a01b0316336001600160a01b031614156101da576101d581610488565b6101e2565b6101e2610191565b50565b6101ed610463565b6001600160a01b0316336001600160a01b031614156102855761020f83610488565b6000836001600160a01b031683836040518083838082843760405192019450600093509091505080830381855af49150503d806000811461026c576040519150601f19603f3d011682016040523d82523d6000602084013e610271565b606091505b505090508061027f57600080fd5b5061028d565b61028d610191565b505050565b600061029c610463565b6001600160a01b0316336001600160a01b031614156102c4576102bd61041a565b90506102cc565b6102cc610191565b90565b6102d7610463565b6001600160a01b0316336001600160a01b031614156101da576001600160a01b0381166103355760405162461bcd60e51b81526004018080602001828103825260368152602001806105876036913960400191505060405180910390fd5b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f61035e610463565b604080516001600160a01b03928316815291841660208301528051918290030190a16101d5816104c8565b6000610393610463565b6001600160a01b0316336001600160a01b031614156102c4576102bd610463565b3b151590565b6103c2610463565b6001600160a01b0316336001600160a01b031614156104125760405162461bcd60e51b81526004018080602001828103825260328152602001806105556032913960400191505060405180910390fd5b6101a96101a9565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b3660008037600080366000845af43d6000803e80801561045e573d6000f35b3d6000fd5b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b610491816104ec565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610355565b6104f5816103b4565b6105305760405162461bcd60e51b815260040180806020018281038252603b8152602001806105bd603b913960400191505060405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5556fe43616e6e6f742063616c6c2066616c6c6261636b2066756e6374696f6e2066726f6d207468652070726f78792061646d696e43616e6e6f74206368616e6765207468652061646d696e206f6620612070726f787920746f20746865207a65726f206164647265737343616e6e6f742073657420612070726f787920696d706c656d656e746174696f6e20746f2061206e6f6e2d636f6e74726163742061646472657373a26469706673582212206e221e2a3547bd97244b05ed46430b1b078ba097cb2a4e25ec3d79cf9ac9f02c64736f6c63430006080033", + "nonce": "0", + "storage": { + "0x0": "1000000", + "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0xD3003000000000000000000000000000000000D3", + "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "0xD3001000000000000000000000000000000000D3" + } + }, + "0xD3003000000000000000000000000000000000D3": { + "balance": "0", + "code": "0x608060405234801561001057600080fd5b50600436106100b45760003560e01c806379210e8e1161007157806379210e8e1461017757806381a8235a146101a757806385aeeb17146101c35780639a9a5593146101f3578063a99100541461020f578063b57321221461022b576100b4565b806307c6e7d3146100b9578063122f4fba146100d55780631c6ec7a9146101055780631cfe4e3b14610121578063373dedb41461013d57806361e46db51461015b575b600080fd5b6100d360048036036100ce9190810190613e94565b61025b565b005b6100ef60048036036100ea9190810190613e94565b610862565b6040516100fc9190614b38565b60405180910390f35b61011f600480360361011a9190810190613e94565b610ba1565b005b61013b60048036036101369190810190613e58565b610fce565b005b6101456111ec565b6040516101529190614eb3565b60405180910390f35b61017560048036036101709190810190613f29565b6111f6565b005b610191600480360361018c9190810190613fa8565b611456565b60405161019e9190614af9565b60405180910390f35b6101c160048036036101bc9190810190613e94565b611756565b005b6101dd60048036036101d89190810190613e94565b6118fb565b6040516101ea9190614b16565b60405180910390f35b61020d60048036036102089190810190613ed5565b611bfa565b005b61022960048036036102249190810190613e94565b612195565b005b61024560048036036102409190810190613e94565b612849565b6040516102529190614eb3565b60405180910390f35b6000339050606061026b83612ac9565b90506000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b825181101561037c576000826001018460018403815181106102d557fe5b60200260200101516040516102ea9190614aa1565b90815260200160405180910390205411610339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161033090614cb3565b60405180910390fd5b8160020183600183038151811061034c57fe5b60200260200101516040516103619190614aa1565b908152602001604051809103902091508060010190506102b7565b506060600183511161038e57846103a7565b8260018451038151811061039e57fe5b60200260200101515b9050600082600101826040516103bd9190614ab8565b9081526020016040518091039020541161040c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161040390614cb3565b60405180910390fd5b600082600201826040516104209190614ab8565b90815260200160405180910390206000018054905014610475576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161046c90614d33565b60405180910390fd5b60006104818587612cc9565b9050806104c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ba90614c53565b60405180910390fd5b6104cb613a4f565b836000016001856000018054905003815481106104e457fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156105965780601f1061056b57610100808354040283529160200191610596565b820191906000526020600020905b81548152906001019060200180831161057957829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff1660028111156105e257fe5b60028111156105ed57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561066557602002820191906000526020600020906000905b82829054906101000a900460ff1615158152602001906001019060208260000104928301926001038202915080841161062f5790505b50505050508152505090508084600001600186600101866040516106899190614ab8565b90815260200160405180910390205403815481106106a357fe5b906000526020600020906005020160008201518160000190805190602001906106cd929190613a8b565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561071c57fe5b0217905550608082015181600401908051906020019061073d929190613b0b565b5090505083600101836040516107539190614ab8565b9081526020016040518091039020548460010182600001516040516107789190614aa1565b9081526020016040518091039020819055506000846001018460405161079e9190614ab8565b908152602001604051809103902081905550836000018054806107bd57fe5b6001900381819060005260206000209060050201600080820160006107e29190613bb1565b6001820160006101000a81549060ff021916905560028201600090556003820160006101000a81549060ff02191690556004820160006108229190613bf9565b5050905583600201836040516108389190614ab8565b9081526020016040518091039020600080820160006108579190613c21565b505050505050505050565b600080606061087084612d2d565b91509150606061087f82612ac9565b90506000600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015610964576000826001018460018403815181106108e957fe5b60200260200101516040516108fe9190614aa1565b908152602001604051809103902054141561092157600095505050505050610b9c565b8160020183600183038151811061093457fe5b60200260200101516040516109499190614aa1565b908152602001604051809103902091508060010190506108cb565b5060606001835111610976578361098f565b8260018451038151811061098657fe5b60200260200101515b9050600082600101826040516109a59190614ab8565b90815260200160405180910390205414156109c857600095505050505050610b9c565b6109d0613a4f565b82600001600184600101846040516109e89190614ab8565b9081526020016040518091039020540381548110610a0257fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610ab45780601f10610a8957610100808354040283529160200191610ab4565b820191906000526020600020905b815481529060010190602001808311610a9757829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115610b0057fe5b6002811115610b0b57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015610b8357602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411610b4d5790505b5050505050815250509050806060015196505050505050505b919050565b600360009054906101000a900460ff16610be457612000600481905550621000006005819055506001600360006101000a81548160ff0219169083151502179055505b6000815111610c28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1f90614cb3565b60405180910390fd5b60003390506060610c3883612ac9565b90506000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015610d4957600082600101846001840381518110610ca257fe5b6020026020010151604051610cb79190614aa1565b90815260200160405180910390205411610d06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cfd90614cb3565b60405180910390fd5b81600201836001830381518110610d1957fe5b6020026020010151604051610d2e9190614aa1565b90815260200160405180910390209150806001019050610c84565b50600454816000018054905010610d95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8c90614dd3565b60405180910390fd5b60606001835111610da65784610dbf565b82600184510381518110610db657fe5b60200260200101515b905060008260010182604051610dd59190614ab8565b90815260200160405180910390205414610e24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1b90614e13565b60405180910390fd5b610e2d816130af565b610e6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6390614cd3565b60405180910390fd5b6000610e788587613190565b905080610eba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb190614b73565b60405180910390fd5b610ec2613a4f565b8281600001819052506000816020019015159081151581525050836000018190806001815401808255809150506001900390600052602060002090600502016000909190919091506000820151816000019080519060200190610f26929190613a8b565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff02191690836002811115610f7557fe5b02179055506080820151816004019080519060200190610f96929190613b0b565b50505083600001805490508460010184604051610fb39190614ab8565b90815260200160405180910390208190555050505050505050565b610fd66131f4565b73ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16148061103b57503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614155b61107a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107190614c33565b60405180910390fd5b80600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411156110fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f390614d13565b60405180910390fd5b60025460095482011115611145576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113c90614b93565b60405180910390fd5b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460096000828254039250508190555080600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550806009600082825401925050819055505050565b6000600254905090565b60003390506000611207828661328d565b90506001600281111561121657fe5b8160030160009054906101000a900460ff16600281111561123357fe5b14611273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126a90614df3565b60405180910390fd5b6000600554858161128057fe5b061480156112915750806002015484105b6112d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c790614b53565b60405180910390fd5b600554848260020154031080156112ed5750838160020154038351145b806112fa57506005548351145b611339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133090614bf3565b60405180910390fd5b6000151581600401600554868161134c57fe5b048154811061135757fe5b90600052602060002090602091828204019190069054906101000a900460ff161515146113b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b090614bd3565b60405180910390fd5b60006113c78387878761348c565b905080611409576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140090614cf3565b60405180910390fd5b600182600401600554878161141a57fe5b048154811061142557fe5b90600052602060002090602091828204019190066101000a81548160ff021916908315150217905550505050505050565b61145e613c45565b6000606061146b86612d2d565b91509150611477613a4f565b611481838361328d565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156115255780601f106114fa57610100808354040283529160200191611525565b820191906000526020600020905b81548152906001019060200180831161150857829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561157157fe5b600281111561157c57fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156115f457602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116115be5790505b505050505081525050905060028081111561160b57fe5b8160600151600281111561161b57fe5b1461165b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165290614e93565b60405180910390fd5b600554851115801561166d5750600085115b6116ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a390614bf3565b60405180910390fd5b806040015185870111156116f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ec90614b53565b60405180910390fd5b60006117038484898961353d565b80965081925050508061174b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174290614d73565b60405180910390fd5b505050509392505050565b60003390506000611767828461328d565b90506001600281111561177657fe5b8160030160009054906101000a900460ff16600281111561179357fe5b146117d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ca90614df3565b60405180910390fd5b60006001905060008260040180549050905060008090505b8181101561183e576000151584600401828154811061180657fe5b90600052602060002090602091828204019190069054906101000a900460ff161515141561183357600092505b8060010190506117eb565b508161187f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187690614d53565b60405180910390fd5b60028360030160006101000a81548160ff021916908360028111156118a057fe5b021790555060006118b185876135d0565b9050806118f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ea90614bb3565b60405180910390fd5b505050505050565b60606000606061190a84612d2d565b91509150606061191982612ac9565b90506000600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008090505b8251811015611a235760008260010184838151811061197f57fe5b60200260200101516040516119949190614aa1565b908152602001604051809103902054116119e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119da90614cb3565b60405180910390fd5b816002018382815181106119f357fe5b6020026020010151604051611a089190614aa1565b90815260200160405180910390209150806001019050611964565b5080600001805480602002602001604051908101604052809291908181526020016000905b82821015611beb57838290600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611b045780601f10611ad957610100808354040283529160200191611b04565b820191906000526020600020905b815481529060010190602001808311611ae757829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115611b5057fe5b6002811115611b5b57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015611bd357602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411611b9d5790505b50505050508152505081526020019060010190611a48565b50505050945050505050919050565b600360009054906101000a900460ff16611c3d57612000600481905550621000006005819055506001600360006101000a81548160ff0219169083151502179055505b60003390506305f5e100821115611c89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8090614db3565b60405180910390fd5b600660008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205483011115611d4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4390614e33565b60405180910390fd5b6060611d5784612ac9565b90506000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015611e6857600082600101846001840381518110611dc157fe5b6020026020010151604051611dd69190614aa1565b90815260200160405180910390205411611e25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1c90614cb3565b60405180910390fd5b81600201836001830381518110611e3857fe5b6020026020010151604051611e4d9190614aa1565b90815260200160405180910390209150806001019050611da3565b50600454816000018054905010611eb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eab90614dd3565b60405180910390fd5b60606001835111611ec55785611ede565b82600184510381518110611ed557fe5b60200260200101515b905060008260010182604051611ef49190614ab8565b90815260200160405180910390205414611f43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3a90614e13565b60405180910390fd5b611f4c816130af565b611f8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8290614d93565b60405180910390fd5b6000611f98858888613634565b905080611fda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd190614e73565b60405180910390fd5b6060600554600160055489010381611fee57fe5b0460405190808252806020026020018201604052801561201d5781602001602082028038833980820191505090505b509050836000016040518060a001604052808581526020016001151581526020018981526020016001600281111561205157fe5b8152602001838152509080600181540180825580915050600190039060005260206000209060050201600090919091909150600082015181600001908051906020019061209f929190613a8b565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff021916908360028111156120ee57fe5b0217905550608082015181600401908051906020019061210f929190613b0b565b5050508360000180549050846001018460405161212c9190614ab8565b90815260200160405180910390208190555086600760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505050505050505050565b60003390506121a2613a4f565b6121ac828461328d565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156122505780601f1061222557610100808354040283529160200191612250565b820191906000526020600020905b81548152906001019060200180831161223357829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561229c57fe5b60028111156122a757fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561231f57602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116122e95790505b50505050508152505090506000600281111561233757fe5b8160600151600281111561234757fe5b1415612388576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161237f90614c13565b60405180910390fd5b600061239483856136a1565b9050806123d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123cd90614c73565b60405180910390fd5b60606123e185612ac9565b90506000600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015612479578160020183600183038151811061244957fe5b602002602001015160405161245e9190614aa1565b9081526020016040518091039020915080600101905061242d565b50600060018260010186600001516040516124949190614aa1565b9081526020016040518091039020540390506124ae613a4f565b826000016001846000018054905003815481106124c757fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156125795780601f1061254e57610100808354040283529160200191612579565b820191906000526020600020905b81548152906001019060200180831161255c57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff1660028111156125c557fe5b60028111156125d057fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561264857602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116126125790505b50505050508152505090508083600001838154811061266357fe5b9060005260206000209060050201600082015181600001908051906020019061268d929190613a8b565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff021916908360028111156126dc57fe5b021790555060808201518160040190805190602001906126fd929190613b0b565b509050508260000180548061270e57fe5b6001900381819060005260206000209060050201600080820160006127339190613bb1565b6001820160006101000a81549060ff021916905560028201600090556003820160006101000a81549060ff02191690556004820160006127739190613bf9565b5050905582600101866000015160405161278d9190614aa1565b9081526020016040518091039020548360010182600001516040516127b29190614aa1565b90815260200160405180910390208190555060008360010187600001516040516127dc9190614aa1565b9081526020016040518091039020819055508560400151600760008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505050505050505050565b600080606061285784612d2d565b91509150612863613a4f565b61286d838361328d565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156129115780601f106128e657610100808354040283529160200191612911565b820191906000526020600020905b8154815290600101906020018083116128f457829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561295d57fe5b600281111561296857fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156129e057602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116129aa5790505b5050505050815250509050600160028111156129f857fe5b81606001516002811115612a0857fe5b1480612a2d5750600280811115612a1b57fe5b81606001516002811115612a2b57fe5b145b612a6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a6390614df3565b60405180910390fd5b6000612a788484613705565b809650819250505080612ac0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ab790614e53565b60405180910390fd5b50505050919050565b6060612ad3613c6a565b612adc8361376e565b9050612ae6613c6a565b612b246040518060400160405280600181526020017f2f0000000000000000000000000000000000000000000000000000000000000081525061376e565b905060606001612b3d838561379c90919063ffffffff16565b01604051908082528060200260200182016040528015612b7157816020015b6060815260200190600190039081612b5c5790505b50905060008090505b8151811015612bc257612b9e612b99848661381190919063ffffffff16565b61382b565b828281518110612baa57fe5b60200260200101819052508080600101915050612b7a565b50600081600183510381518110612bd557fe5b6020026020010151511415612c405780600182510381518110612bf457fe5b6020026020010160608152506001815103604051908082528060200260200182016040528015612c3857816020015b6060815260200190600190039081612c235790505b509350612c79565b8051604051908082528060200260200182016040528015612c7557816020015b6060815260200190600190039081612c605790505b5093505b60008090505b8451811015612cc057818181518110612c9457fe5b6020026020010151858281518110612ca857fe5b60200260200101819052508080600101915050612c7f565b50505050919050565b60008060016020601f85510181612cdc57fe5b040190506040518481526020810160005b83811015612d0e578060200286015181602002830152806001019050612ced565b50602082602085026040018460006010600019f1935050505092915050565b6000606060006028905080845111612d7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d7190614c93565b60405180910390fd5b6060816040519080825280601f01601f191660200182016040528015612daf5781602001600182028038833980820191505090505b50905060008090505b82811015612e1f57858181518110612dcc57fe5b602001015160f81c60f81b828281518110612de357fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050612db8565b50600080905060008090505b83811015612f4e576000838281518110612e4157fe5b602001015160f81c60f81b60f81c60ff16905060308110158015612e66575060398111155b80612e7f575060418110158015612e7e5750605a8111155b5b80612e98575060618110158015612e97575060668111155b5b612ed7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ece90614c93565b60405180910390fd5b60308110158015612ee9575060398111155b15612efa5760308103601084020192505b60418110158015612f0c5750605a8111155b15612f1d5760378103601084020192505b60618110158015612f2f575060668111155b15612f405760578103601084020192505b508080600101915050612e2b565b508094507f2f00000000000000000000000000000000000000000000000000000000000000868481518110612f7f57fe5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612fec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fe390614c93565b60405180910390fd5b6000600184885103039050806040519080825280601f01601f19166020018201604052801561302a5781602001600182028038833980820191505090505b50945060008090505b818110156130a5576000886001878401018151811061304e57fe5b602001015160f81c60f81b90508087838151811061306857fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350508080600101915050613033565b5050505050915091565b60006040516020016130c090614ae4565b60405160208183030381529060405280519060200120826040516020016130e79190614ab8565b604051602081830303815290604052805190602001201480613152575060405160200161311390614acf565b604051602081830303815290604052805190602001208260405160200161313a9190614ab8565b60405160208183030381529060405280519060200120145b8061315e575060008251145b1561316c576000905061318b565b60008251905060ff81111561318557600091505061318b565b60019150505b919050565b60008060016020601f855101816131a357fe5b040190506040518481526020810160005b838110156131d55780602002860151816020028301528060010190506131b4565b5060208260208502604001846000600f600019f1935050505092915050565b600073d2001000000000000000000000000000000000d273ffffffffffffffffffffffffffffffffffffffff166383e781fe6040518163ffffffff1660e01b815260040160206040518083038186803b15801561325057600080fd5b505afa158015613264573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506132889190810190613e2f565b905090565b6000606061329a83612ac9565b90506000600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b82518110156133ab5760008260010184600184038151811061330457fe5b60200260200101516040516133199190614aa1565b90815260200160405180910390205411613368576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161335f90614cb3565b60405180910390fd5b8160020183600183038151811061337b57fe5b60200260200101516040516133909190614aa1565b908152602001604051809103902091508060010190506132e6565b50606060018351116133bd57846133d6565b826001845103815181106133cd57fe5b60200260200101515b9050600082600101826040516133ec9190614ab8565b9081526020016040518091039020541161343b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161343290614cb3565b60405180910390fd5b600082600001600184600101846040516134559190614ab8565b908152602001604051809103902054038154811061346f57fe5b906000526020600020906005020190508094505050505092915050565b60008060016020601f8551018161349f57fe5b04019050600060016020601f885101816134b557fe5b040190506040518781526020810160005b838110156134e75780602002890151816020028301528060010190506134c6565b50868360200282015260005b8481101561351957806020028701518185600101016020028301528060010190506134f3565b50602082848601602002606001846000600c600019f1945050505050949350505050565b6000613547613c45565b600060016020601f8851018161355957fe5b0401905060006020601f86018161356c57fe5b0490506040518881526020810160005b8481101561359d57806020028a01518160200283015280600101905061357c565b5083602002810188815287816020015283602002868660030160200285600a600019fa9650505050505094509492505050565b60008060016020601f855101816135e357fe5b040190506040518481526020810160005b838110156136155780602002860151816020028301528060010190506135f4565b50602082602085026040018460006011600019f1935050505092915050565b60008060016020601f8651018161364757fe5b040190506040518581526020810160005b83811015613679578060200287015181602002830152806001019050613658565b50846020840282015260208260208502604001846000600b600019f193505050509392505050565b60008060016020601f855101816136b457fe5b040190506040518481526020810160005b838110156136e65780602002860151816020028301528060010190506136c5565b5060208260208502604001846000600e600019f1935050505092915050565b600080600060016020601f8651018161371a57fe5b040190506040518581526020810160005b8381101561374c57806020028701518160200283015280600101905061372b565b506020826020850260200184600d600019fa9450815193505050509250929050565b613776613c6a565b600060208301905060405180604001604052808451815260200182815250915050919050565b60008082600001516137c0856000015186602001518660000151876020015161388d565b0190505b8360000151846020015101811161380a578180600101925050826000015161380285602001518303866000015103838660000151876020015161388d565b0190506137c4565b5092915050565b613819613c6a565b613824838383613968565b5092915050565b60608082600001516040519080825280601f01601f1916602001820160405280156138655781602001600182028038833980820191505090505b50905060006020820190506138838185602001518660000151613a06565b8192505050919050565b6000808490506000868511613958576020851161391257600060018660200360080260020a031960001b905060008186511690506000878a8a0103905060008386511690505b828114613904578186106138f1578a8a019650505050505050613960565b85806001019650508386511690506138d3565b859650505050505050613960565b60008585209050600091505b85880382116139565760008684209050808214156139425783945050505050613960565b60018401935050818060010192505061391e565b505b868601925050505b949350505050565b613970613c6a565b600061398e856000015186602001518660000151876020015161388d565b905084602001518360200181815250508460200151810383600001818152505084600001518560200151018114156139d05760008560000181815250506139fb565b8360000151836000015101856000018181510391508181525050836000015181018560200181815250505b829150509392505050565b5b60208110613a2a5781518352602083019250602082019150602081039050613a07565b60006001826020036101000a0390508019835116818551168181178652505050505050565b6040518060a00160405280606081526020016000151581526020016000815260200160006002811115613a7e57fe5b8152602001606081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613acc57805160ff1916838001178555613afa565b82800160010185558215613afa579182015b82811115613af9578251825591602001919060010190613ade565b5b509050613b079190613c84565b5090565b82805482825590600052602060002090601f01602090048101928215613ba05791602002820160005b83821115613b7157835183826101000a81548160ff0219169083151502179055509260200192600101602081600001049283019260010302613b34565b8015613b9e5782816101000a81549060ff0219169055600101602081600001049283019260010302613b71565b505b509050613bad9190613ca9565b5090565b50805460018160011615610100020316600290046000825580601f10613bd75750613bf6565b601f016020900490600052602060002090810190613bf59190613c84565b5b50565b50805460008255601f016020900490600052602060002090810190613c1e9190613c84565b50565b5080546000825560050290600052602060002090810190613c429190613cd9565b50565b6040518062100000016040528061800090602082028038833980820191505090505090565b604051806040016040528060008152602001600081525090565b613ca691905b80821115613ca2576000816000905550600101613c8a565b5090565b90565b613cd691905b80821115613cd257600081816101000a81549060ff021916905550600101613caf565b5090565b90565b613d4591905b80821115613d415760008082016000613cf89190613bb1565b6001820160006101000a81549060ff021916905560028201600090556003820160006101000a81549060ff0219169055600482016000613d389190613bf9565b50600501613cdf565b5090565b90565b600081359050613d578161510d565b92915050565b600081519050613d6c8161510d565b92915050565b600082601f830112613d8357600080fd5b8135613d96613d9182614efb565b614ece565b91508082526020830160208301858383011115613db257600080fd5b613dbd8382846150ad565b50505092915050565b600082601f830112613dd757600080fd5b8135613dea613de582614f27565b614ece565b91508082526020830160208301858383011115613e0657600080fd5b613e118382846150ad565b50505092915050565b600081359050613e2981615124565b92915050565b600060208284031215613e4157600080fd5b6000613e4f84828501613d5d565b91505092915050565b60008060408385031215613e6b57600080fd5b6000613e7985828601613d48565b9250506020613e8a85828601613e1a565b9150509250929050565b600060208284031215613ea657600080fd5b600082013567ffffffffffffffff811115613ec057600080fd5b613ecc84828501613dc6565b91505092915050565b60008060408385031215613ee857600080fd5b600083013567ffffffffffffffff811115613f0257600080fd5b613f0e85828601613dc6565b9250506020613f1f85828601613e1a565b9150509250929050565b600080600060608486031215613f3e57600080fd5b600084013567ffffffffffffffff811115613f5857600080fd5b613f6486828701613dc6565b9350506020613f7586828701613e1a565b925050604084013567ffffffffffffffff811115613f9257600080fd5b613f9e86828701613d72565b9150509250925092565b600080600060608486031215613fbd57600080fd5b600084013567ffffffffffffffff811115613fd757600080fd5b613fe386828701613dc6565b9350506020613ff486828701613e1a565b925050604061400586828701613e1a565b9150509250925092565b600061401b838361417d565b60208301905092915050565b6000614033838361418c565b60208301905092915050565b600061404b8383614a06565b905092915050565b600061405e82614f7d565b6140688185614fdc565b935061407383614f53565b8060005b838110156140a457815161408b888261400f565b975061409683614fb5565b925050600181019050614077565b5085935050505092915050565b6140ba81614f88565b6140c48184614fed565b92506140cf82614f63565b8060005b838110156141005781516140e78782614027565b96506140f283614fc2565b9250506001810190506140d3565b505050505050565b600061411382614f94565b61411d8185614ff8565b93508360208202850161412f85614f6d565b8060005b8581101561416b578484038952815161414c858261403f565b945061415783614fcf565b925060208a01995050600181019050614133565b50829750879550505050505092915050565b61418681615048565b82525050565b61419581615054565b82525050565b6141a48161509b565b82525050565b6141b38161509b565b82525050565b60006141c482614faa565b6141ce818561502b565b93506141de8185602086016150bc565b80840191505092915050565b60006141f582614f9f565b6141ff8185615009565b935061420f8185602086016150bc565b614218816150ef565b840191505092915050565b600061422e82614f9f565b614238818561502b565b93506142488185602086016150bc565b80840191505092915050565b600061426160188361501a565b91507f496e636f7272656374206368756e6b20706f736974696f6e00000000000000006000830152602082019050919050565b60006142a160158361501a565b91507f4469726563746f7279206e6f74206372656174656400000000000000000000006000830152602082019050919050565b60006142e160248361501a565b91507f4e6f7420656e6f756768206d656d6f727920696e207468652046696c6573746f60008301527f72616765000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614347601b8361501a565b91507f48617368206861736e2774206265656e2063616c63756c6174656400000000006000830152602082019050919050565b600061438760198361501a565b91507f4368756e6b20697320616c72656164792075706c6f61646564000000000000006000830152602082019050919050565b60006143c760168361501a565b91507f496e636f7272656374206368756e6b206c656e677468000000000000000000006000830152602082019050919050565b6000614407600f8361501a565b91507f46696c65206e6f742065786973747300000000000000000000000000000000006000830152602082019050919050565b6000614447600e8361501a565b91507f496e76616c69642073656e6465720000000000000000000000000000000000006000830152602082019050919050565b600061448760188361501a565b91507f4469726563746f7279206973206e6f742064656c6574656400000000000000006000830152602082019050919050565b60006144c760108361501a565b91507f46696c65206e6f742064656c65746564000000000000000000000000000000006000830152602082019050919050565b600061450760138361501a565b91507f496e76616c69642073746f7261676550617468000000000000000000000000006000830152602082019050919050565b6000614547600c8361501a565b91507f496e76616c6964207061746800000000000000000000000000000000000000006000830152602082019050919050565b600061458760018361502b565b91507f2e000000000000000000000000000000000000000000000000000000000000006000830152600182019050919050565b60006145c760168361501a565b91507f496e76616c6964206469726563746f7279206e616d65000000000000000000006000830152602082019050919050565b600061460760158361501a565b91507f4368756e6b207761736e27742075706c6f6164656400000000000000000000006000830152602082019050919050565b600061464760268361501a565b91507f436f756c64206e6f742072657365727665206c657373207468616e207573656460008301527f20737061636500000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006146ad60168361501a565b91507f4469726563746f7279206973206e6f7420656d707479000000000000000000006000830152602082019050919050565b60006146ed60238361501a565b91507f46696c65206861736e2774206265656e2075706c6f6164656420636f7272656360008301527f746c7900000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061475360118361501a565b91507f4368756e6b207761736e277420726561640000000000000000000000000000006000830152602082019050919050565b600061479360188361501a565b91507f46696c656e616d652073686f756c64206265203c2032353600000000000000006000830152602082019050919050565b60006147d3601f8361501a565b91507f46696c652073686f756c64206265206c657373207468616e20313030204d42006000830152602082019050919050565b600061481360028361502b565b91507f2e2e0000000000000000000000000000000000000000000000000000000000006000830152600282019050919050565b600061485360118361501a565b91507f4469726563746f72792069732066756c6c0000000000000000000000000000006000830152602082019050919050565b6000614893600e8361501a565b91507f46696c65206e6f7420666f756e640000000000000000000000000000000000006000830152602082019050919050565b60006148d360188361501a565b91507f46696c65206f72206469726563746f72792065786973747300000000000000006000830152602082019050919050565b600061491360198361501a565b91507f4e6f7420656e6f756768207265736572766564207370616365000000000000006000830152602082019050919050565b600061495360188361501a565b91507f45564d206572726f7220696e2067657446696c6553697a6500000000000000006000830152602082019050919050565b600061499360108361501a565b91507f46696c65206e6f742063726561746564000000000000000000000000000000006000830152602082019050919050565b60006149d360198361501a565b91507f46696c65206861736e2774206265656e2075706c6f61646564000000000000006000830152602082019050919050565b600060a0830160008301518482036000860152614a2382826141ea565b9150506020830151614a38602086018261417d565b506040830151614a4b6040860182614a83565b506060830151614a5e606086018261419b565b5060808301518482036080860152614a768282614053565b9150508091505092915050565b614a8c81615091565b82525050565b614a9b81615091565b82525050565b6000614aad8284614223565b915081905092915050565b6000614ac482846141b9565b915081905092915050565b6000614ada8261457a565b9150819050919050565b6000614aef82614806565b9150819050919050565b60006210000082019050614b1060008301846140b1565b92915050565b60006020820190508181036000830152614b308184614108565b905092915050565b6000602082019050614b4d60008301846141aa565b92915050565b60006020820190508181036000830152614b6c81614254565b9050919050565b60006020820190508181036000830152614b8c81614294565b9050919050565b60006020820190508181036000830152614bac816142d4565b9050919050565b60006020820190508181036000830152614bcc8161433a565b9050919050565b60006020820190508181036000830152614bec8161437a565b9050919050565b60006020820190508181036000830152614c0c816143ba565b9050919050565b60006020820190508181036000830152614c2c816143fa565b9050919050565b60006020820190508181036000830152614c4c8161443a565b9050919050565b60006020820190508181036000830152614c6c8161447a565b9050919050565b60006020820190508181036000830152614c8c816144ba565b9050919050565b60006020820190508181036000830152614cac816144fa565b9050919050565b60006020820190508181036000830152614ccc8161453a565b9050919050565b60006020820190508181036000830152614cec816145ba565b9050919050565b60006020820190508181036000830152614d0c816145fa565b9050919050565b60006020820190508181036000830152614d2c8161463a565b9050919050565b60006020820190508181036000830152614d4c816146a0565b9050919050565b60006020820190508181036000830152614d6c816146e0565b9050919050565b60006020820190508181036000830152614d8c81614746565b9050919050565b60006020820190508181036000830152614dac81614786565b9050919050565b60006020820190508181036000830152614dcc816147c6565b9050919050565b60006020820190508181036000830152614dec81614846565b9050919050565b60006020820190508181036000830152614e0c81614886565b9050919050565b60006020820190508181036000830152614e2c816148c6565b9050919050565b60006020820190508181036000830152614e4c81614906565b9050919050565b60006020820190508181036000830152614e6c81614946565b9050919050565b60006020820190508181036000830152614e8c81614986565b9050919050565b60006020820190508181036000830152614eac816149c6565b9050919050565b6000602082019050614ec86000830184614a92565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614ef157600080fd5b8060405250919050565b600067ffffffffffffffff821115614f1257600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614f3e57600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050919050565b6000819050602082019050919050565b600081519050919050565b60006180009050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061504182615071565b9050919050565b60008115159050919050565b6000819050919050565b600081905061506c82615100565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006150a68261505e565b9050919050565b82818337600083830152505050565b60005b838110156150da5780820151818401526020810190506150bf565b838111156150e9576000848401525b50505050565b6000601f19601f8301169050919050565b6003811061510a57fe5b50565b61511681615036565b811461512157600080fd5b50565b61512d81615091565b811461513857600080fd5b5056fea2646970667358221220a549ad9e778ae8bb3048c0a1805e77745871cc1560637ae1c3ebccb76638d9c464736f6c63430006020033", + "nonce": "0", + "storage": {} + }, + "0xa096b05a489831db893fc53aacc7ed20efb36382": { + "balance": "1000000000000000000000000000000" + }, + "0xa1cd651d99283be60e2a9d2e3bc8a90aedb8244f": { + "balance": "1000000000000000000000000000000" + }, + "0xa2969e82619021ea407338f8bdf7c6f2bd679673": { + "balance": "1000000000000000000000000000000" + }, + "0xa3597b1162b6559cb5e966904b63e762ece756a4": { + "balance": "1000000000000000000000000000000" + }, + "0xa68f946090c600eda6f139783077ee802afeb990": { + "balance": "1000000000000000000000000000000" + }, + "0xa6d50055592cecb795bc1ed3b9ea57ed426b0b7c": { + "balance": "1000000000000000000000000000000" + }, + "0xa7c0789bdeee38c6b59111a789dfb6b815489847": { + "balance": "1000000000000000000000000000000" + }, + "0xa8c813ee806b4c8537ff5f16084d44db18ea9ab1": { + "balance": "1000000000000000000000000000000" + }, + "0xaa6a87bbb74bc1f3cb40c1efb7fc171ee6407560": { + "balance": "1000000000000000000000000000000" + }, + "0xabf920b89f5a2487fdb70be17fd01a99a0602e62": { + "balance": "1000000000000000000000000000000" + }, + "0xac5df92da5171ba24a9618018b4f79494040334b": { + "balance": "1000000000000000000000000000000" + }, + "0xaf97a8318a1a51d5daeeb9650024b63ee44f45bd": { + "balance": "1000000000000000000000000000000" + }, + "0xb28c45b98ae43a5e9ee5509c97ea037b5de5d6d9": { + "balance": "1000000000000000000000000000000" + }, + "0xb64989ab32b089da3da103b93e6781d6d5dd10b4": { + "balance": "1000000000000000000000000000000" + }, + "0xb67e6f4a21f93c250fa6ff0cb142bd14dd4ca8eb": { + "balance": "1000000000000000000000000000000" + }, + "0xb70603c505f85130b5b2e73cd82d196dfd7d8b5e": { + "balance": "1000000000000000000000000000000" + }, + "0xb942414cae2a1ab1056657b905845c0ab6b6280a": { + "balance": "1000000000000000000000000000000" + }, + "0xbee0e5c1961d51be9bd670876caa9c90ba7d9016": { + "balance": "1000000000000000000000000000000" + }, + "0xbf2d8cebdeeb8ad8fed7b2a75f35922106f8d75c": { + "balance": "1000000000000000000000000000000" + }, + "0xbf5aa678b969c0871e2fbcf09c3dbb5d5865ac1e": { + "balance": "1000000000000000000000000000000" + }, + "0xc12bcedd9bcad9120150122cd50f39576ecccc08": { + "balance": "1000000000000000000000000000000" + }, + "0xc2d3852f3292acb81bd164dbae5f1e2a87535150": { + "balance": "1000000000000000000000000000000" + }, + "0xc3820490201e94d76b44655d2df713fec29d9795": { + "balance": "1000000000000000000000000000000" + }, + "0xc58744e2eceefd45cc5469f0e0a708ad24ddbbdb": { + "balance": "1000000000000000000000000000000" + }, + "0xc7865200e8e51ba1c8d695f327deed432930f2cc": { + "balance": "1000000000000000000000000000000" + }, + "0xc8e4d709eb3eb335dc69c9fbf2d24d447cb86105": { + "balance": "1000000000000000000000000000000" + }, + "0xc98af661e44c5bf31d2f8bdff4bbf2808ed4e991": { + "balance": "1000000000000000000000000000000" + }, + "0xca4409573a5129a72edf85d6c51e26760fc9c903": { + "balance": "100000000000000000000000" + }, + "0xcc33e23b04b74f7ba8fbe315083182224af973fa": { + "balance": "1000000000000000000000000000000" + }, + "0xce1c62d0a77600fb2f959b4da76fcb9b3b9430a3": { + "balance": "1000000000000000000000000000000" + }, + "0xd1b6c947fb14060b38945584714491592e84875d": { + "balance": "1000000000000000000000000000000" + }, + "0xd23cd6a9ddcc3470300003621bbac1e06a7919d5": { + "balance": "1000000000000000000000000000000" + }, + "0xd2c5b39B4e735C17612Bb5a08FD024ccc5dBCb23": { + "balance": "100000000000000000000000" + }, + "0xd2cd302eb060e375a65d65946692a3ac2d838d35": { + "balance": "1000000000000000000000000000000" + }, + "0xd2e75c41ced8699e3176f6e335355701a2568b7b": { + "balance": "1000000000000000000000000000000" + }, + "0xd3d38f4cb0aeb4c7c2527ddaeec2ab3b910c8528": { + "balance": "1000000000000000000000000000000" + }, + "0xd5b561a27cca5049650a14ab93dbf1a20c0cefc1": { + "balance": "1000000000000000000000000000000" + }, + "0xd90045420b8abc37b3f9304ed2b385fc1b7fa8c5": { + "balance": "1000000000000000000000000000000" + }, + "0xd951bf4cff429062702a7d8699a5f0bf14845d9b": { + "balance": "1000000000000000000000000000000" + }, + "0xdc6a269c58e58a93a22b5df8cdf1af630c47481f": { + "balance": "1000000000000000000000000000000" + }, + "0xdc6d02ef4003a4f2d0ccff65ae1a2d8157fbb23e": { + "balance": "1000000000000000000000000000000" + }, + "0xde14aca36acc62c305a7ee571da37840a408e600": { + "balance": "1000000000000000000000000000000" + }, + "0xdee32ae508cf783f53ab8bc39d878fe323cdfae3": { + "balance": "1000000000000000000000000000000" + }, + "0xe083a100d51fc4f38aae4a3a68404c36ad96c612": { + "balance": "1000000000000000000000000000000" + }, + "0xe1607990ce800407e3c206e58de4917977181d4d": { + "balance": "1000000000000000000000000000000" + }, + "0xe25e5b63dfd4cf59b81eddf64f1195858634b8a6": { + "balance": "1000000000000000000000000000000" + }, + "0xe372377decb3bdc0c7f5272d38ce0ba2a54934fe": { + "balance": "1000000000000000000000000000000" + }, + "0xe3cc6ec63b5652d1594bc63bb293f4e80f76dbdd": { + "balance": "1000000000000000000000000000000" + }, + "0xe3da7c014286258944ab20a31e4d861b4c9262f1": { + "balance": "1000000000000000000000000000000" + }, + "0xe8b57f330d56081c856e618210fbedb414925ff0": { + "balance": "1000000000000000000000000000000" + }, + "0xe91ac72a568e752eb7c9f5235100586ce97c8cc1": { + "balance": "1000000000000000000000000000000" + }, + "0xf184c8c243a178c1748a0af45caedeca476105b4": { + "balance": "1000000000000000000000000000000" + }, + "0xf1a5912ff318aebf312cdb54c75642a9e632703c": { + "balance": "1000000000000000000000000000000" + }, + "0xf2197b153b4c9086fc5410431fbf7960d284c65e": { + "balance": "1000000000000000000000000000000" + }, + "0xf36620e71327f4a55d550d46e030ccf0c728f154": { + "balance": "1000000000000000000000000000000" + }, + "0xf9817fB82fc767aA9A4A97a1901676244b88ce0E": { + "balance": "100000000000000000000000" + }, + "0xfa723938fa8da1a8a2114ad409a11581761ee40d": { + "balance": "1000000000000000000000000000000" + }, + "0xfa7a8c69810eaf16a395d2a93b3ab51efeed2a1c": { + "balance": "1000000000000000000000000000000" + }, + "0xfaa1038074941571524934ba52d312e88b3577f5": { + "balance": "1000000000000000000000000000000" + }, + "0xfe14077c26a507496b7208384d459e21c49c4212": { + "balance": "1000000000000000000000000000000" + }, + "0xfe275c9b5ac792327da509b27eb9614196dfb07d": { + "balance": "1000000000000000000000000000000" + }, + "0xfe2c5aa110fff89361806ea7ee080bfffba0d3dd": { + "balance": "1000000000000000000000000000000" + }, + "0xfe3d4f1fc038f4f756ba44995129cd45c9e0e861": { + "balance": "1000000000000000000000000000000" + }, + "0xfee314cdc84ecfaa675e41b3559c0101e1eba6b8": { + "balance": "1000000000000000000000000000000" + } + }, + "genesis": { + "author": "0x0000000000000000000000000000000000000001", + "difficulty": "0x0", + "extraData": "0x11bbe8db4e347b4e8c937c1c8370e4b5ed33adb3db69cbdb7a38e1e50b1b82fa", + "gasLimit": "0xFFFFFFFFF", + "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000abc", + "nonce": "0x0000000000000042", + "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "timestamp": "0x00" + }, + "params": { + "EIP150ForkBlock": "0x00", + "EIP158ForkBlock": "0x00", + "accountStartNonce": "0x00", + "blockReward": "0x4563918244F40000", + "byzantiumForkBlock": "0x0", + "chainID": "0x12345", + "constantinopleForkBlock": "0x0", + "daoHardforkBlock": "0x0", + "difficultyBoundDivisor": "0x0800", + "durationLimit": "0x0d", + "externalGasDifficulty": "0x01", + "gasLimitBoundDivisor": "0x0400", + "homesteadForkBlock": "0x0", + "maxGasLimit": "0xFFFFFFFFF", + "maximumExtraDataSize": "0x20", + "minGasLimit": "0xFFFFFFFFF", + "minimumDifficulty": "0x0", + "networkID": "12313219", + "tieBreakingGas": false + }, + "sealEngine": "Ethash", + "skaleConfig": { + "nodeInfo": { + "basePort": 1431, + "bindIP": "0.0.0.0", + "collectionDuration": 10, + "collectionQueueSize": 2, + "db-path": "/tmp/test_eth_3_of_16", + "ecdsaKeyName": "", + "httpRpcPort": 1434, + "httpsRpcPort": 1239, + "logLevel": "info", + "logLevelProposal": "info", + "maxCacheSize": 2000, + "maxOpenLeveldbFiles": 25, + "minCacheSize": 1000, + "nodeID": 1603, + "nodeName": "Node1", + "rotateAfterBlock": 0, + "testSignatures": true, + "transactionQueueSize": 10000, + "wsRpcPort": 1433, + "wssRpcPort": 1438 + }, + "sChain": { + "EIP1559TransactionsPatchTimestamp": 1, + "contractStorageLimit": 10000000000, + "contractStoragePatchTimestamp": 1, + "contractStorageZeroValuePatchTimestamp": 1, + "correctForkInPowPatchTimestamp": 1, + "emptyBlockIntervalMs": 10000, + "fastConsensusPatchTimestamp": 1, + "flexibleDeploymentPatchTimestamp": 1, + "levelDBReopenIntervalMs": 1, + "multiTransactionMode": false, + "nodes": [ + { + "basePort": 1231, + "ip": "127.0.0.1", + "nodeID": 1601, + "publicKey": "", + "schainIndex": 1 + }, + { + "basePort": 1331, + "ip": "127.0.0.1", + "nodeID": 1602, + "publicKey": "", + "schainIndex": 2 + }, + { + "basePort": 1431, + "ip": "127.0.0.1", + "nodeID": 1603, + "publicKey": "", + "schainIndex": 3 + }, + { + "basePort": 1531, + "ip": "127.0.0.1", + "nodeID": 1604, + "publicKey": "", + "schainIndex": 4 + }, + { + "basePort": 1631, + "ip": "127.0.0.1", + "nodeID": 1605, + "publicKey": "", + "schainIndex": 5 + }, + { + "basePort": 1731, + "ip": "127.0.0.1", + "nodeID": 1606, + "publicKey": "", + "schainIndex": 6 + }, + { + "basePort": 1831, + "ip": "127.0.0.1", + "nodeID": 1607, + "publicKey": "", + "schainIndex": 7 + }, + { + "basePort": 1931, + "ip": "127.0.0.1", + "nodeID": 1608, + "publicKey": "", + "schainIndex": 8 + }, + { + "basePort": 2031, + "ip": "127.0.0.1", + "nodeID": 1609, + "publicKey": "", + "schainIndex": 9 + }, + { + "basePort": 2131, + "ip": "127.0.0.1", + "nodeID": 1610, + "publicKey": "", + "schainIndex": 10 + }, + { + "basePort": 2231, + "ip": "127.0.0.1", + "nodeID": 1611, + "publicKey": "", + "schainIndex": 11 + }, + { + "basePort": 2331, + "ip": "127.0.0.1", + "nodeID": 1612, + "publicKey": "", + "schainIndex": 12 + }, + { + "basePort": 2431, + "ip": "127.0.0.1", + "nodeID": 1613, + "publicKey": "", + "schainIndex": 13 + }, + { + "basePort": 2531, + "ip": "127.0.0.1", + "nodeID": 1614, + "publicKey": "", + "schainIndex": 14 + }, + { + "basePort": 2631, + "ip": "127.0.0.1", + "nodeID": 1615, + "publicKey": "", + "schainIndex": 15 + }, + { + "basePort": 2731, + "ip": "127.0.0.1", + "nodeID": 1616, + "publicKey": "", + "schainIndex": 16 + } + ], + "powCheckPatchTimestamp": 1, + "precompiledConfigPatchTimestamp": 1, + "pushZeroPatchTimestamp": 1, + "revertableFSPatchTimestamp": 1, + "schainID": 5, + "schainName": "TestChain", + "schainOwner": "0x907cd0881E50d359bb9Fd120B1A5A143b1C97De6", + "skipInvalidTransactionsPatchTimestamp": 1, + "storageDestructionPatchTimestamp": 1, + "verifyBlsSyncPatchTimestamp": 1, + "verifyDaSigsPatchTimestamp": 1 + } + }, + "unddos": { + "origins": [ + { + "ban_lengthy": 0, + "ban_peak": 0, + "max_calls_per_minute": 1000000000, + "max_calls_per_second": 1000000000, + "max_ws_conn": 65535, + "origin": [ + "*" + ] + } + ] + } +} \ No newline at end of file diff --git a/test/historicstate/configs/test_3_of_4.json b/test/historicstate/configs/test_3_of_4.json new file mode 100644 index 000000000..36580d86c --- /dev/null +++ b/test/historicstate/configs/test_3_of_4.json @@ -0,0 +1,826 @@ +{ + "accounts": { + "0000000000000000000000000000000000000001": { + "precompiled": { + "linear": { + "base": 3000, + "word": 0 + }, + "name": "ecrecover" + } + }, + "0000000000000000000000000000000000000002": { + "precompiled": { + "linear": { + "base": 60, + "word": 12 + }, + "name": "sha256" + } + }, + "0000000000000000000000000000000000000003": { + "precompiled": { + "linear": { + "base": 600, + "word": 120 + }, + "name": "ripemd160" + } + }, + "0000000000000000000000000000000000000004": { + "precompiled": { + "linear": { + "base": 15, + "word": 3 + }, + "name": "identity" + } + }, + "0000000000000000000000000000000000000005": { + "precompiled": { + "name": "modexp", + "startingBlock": "0x2dc6c0" + } + }, + "0000000000000000000000000000000000000006": { + "precompiled": { + "linear": { + "base": 500, + "word": 0 + }, + "name": "alt_bn128_G1_add", + "startingBlock": "0x2dc6c0" + } + }, + "0000000000000000000000000000000000000007": { + "precompiled": { + "linear": { + "base": 40000, + "word": 0 + }, + "name": "alt_bn128_G1_mul", + "startingBlock": "0x2dc6c0" + } + }, + "0000000000000000000000000000000000000008": { + "precompiled": { + "name": "alt_bn128_pairing_product", + "startingBlock": "0x2dc6c0" + } + }, + "000000000000000000000000000000000000000A": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "readChunk", + "startingBlock": "0x0" + } + }, + "000000000000000000000000000000000000000B": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "createFile", + "restrictAccess": [ + "69362535ec535F0643cBf62D16aDeDCAf32Ee6F7" + ], + "startingBlock": "0x0" + } + }, + "000000000000000000000000000000000000000C": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "uploadChunk", + "startingBlock": "0x0" + } + }, + "000000000000000000000000000000000000000D": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "getFileSize", + "startingBlock": "0x0" + } + }, + "000000000000000000000000000000000000000E": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "deleteFile", + "startingBlock": "0x0" + } + }, + "000000000000000000000000000000000000000F": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "createDirectory", + "startingBlock": "0x0" + } + }, + "0000000000000000000000000000000000000010": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "deleteDirectory", + "startingBlock": "0x0" + } + }, + "0x006d8e49ce0b9eb5646e34a4d91934801b9044fd": { + "balance": "1000000000000000000000000000000" + }, + "0x0150b461b06922a5030784ba888962c28bb1f188": { + "balance": "1000000000000000000000000000000" + }, + "0x03309956988ae70152ae4469daf99b0cac2306c5": { + "balance": "1000000000000000000000000000000" + }, + "0x06104a85a380895b6dd4030113806df2b044905e": { + "balance": "1000000000000000000000000000000" + }, + "0x079cf317ef40b16141784b6fabff812d64f7c0fd": { + "balance": "1000000000000000000000000000000" + }, + "0x0966454f51166c68b73b2865473c8fb2fcdefdd5": { + "balance": "1000000000000000000000000000000" + }, + "0x099452fedc71897880f584b1bc1706efc4e76e36": { + "balance": "1000000000000000000000000000000" + }, + "0x0aa6a44690ef52354e976990292cf9c5cd36ad59": { + "balance": "1000000000000000000000000000000" + }, + "0x0fbbe17a0e5a61ee3e8661f442d7f6b177c49820": { + "balance": "1000000000000000000000000000000" + }, + "0x1239fe658b410dbbac5bbd572035f5041542f9e5": { + "balance": "1000000000000000000000000000000" + }, + "0x12d5d7340a93be7be28ea7a3ae198242f8e1282c": { + "balance": "1000000000000000000000000000000" + }, + "0x137048b9fa4f1234d6519271b2c5ec64f480db0f": { + "balance": "1000000000000000000000000000000" + }, + "0x13867af77a63048e17380e39248ada90521e97e4": { + "balance": "1000000000000000000000000000000" + }, + "0x138ea4bdf0382c2deffd5b0bff0afe59f471467f": { + "balance": "1000000000000000000000000000000" + }, + "0x13d19c55ee0a212249d26b9d741ff6d7f416db01": { + "balance": "1000000000000000000000000000000" + }, + "0x157d38b52196b248e9fe6a2172e32ce2b8c078e6": { + "balance": "1000000000000000000000000000000" + }, + "0x16e8c390f8e576161cfe966f2c3e5dd303eb9039": { + "balance": "1000000000000000000000000000000" + }, + "0x194cb9991d3d94c43e400becf21dfea45e7b3b4c": { + "balance": "1000000000000000000000000000000" + }, + "0x1C9abe4ff0CcECa40fc404c74AB7d4923fEF8901": { + "balance": "100000000000000000000000" + }, + "0x1a66fc89809112c20aa76a993db712fa9e003e4e": { + "balance": "1000000000000000000000000000000" + }, + "0x1f1d6041e12a18cf1202019f146f2fc150915e8d": { + "balance": "1000000000000000000000000000000" + }, + "0x1feaf1671c1f0faf0d44c152f72dc755db932569": { + "balance": "1000000000000000000000000000000" + }, + "0x236bf02dfafaf03851a4e6f5d69052f4884cec32": { + "balance": "1000000000000000000000000000000" + }, + "0x26d88f6a8b659be4165ee53774a057e41b5201c9": { + "balance": "1000000000000000000000000000000" + }, + "0x28353685b0b986a724b92113debb3d8cd9a6b263": { + "balance": "1000000000000000000000000000000" + }, + "0x29d83322219fdfb821459d5fdf796360faf3166a": { + "balance": "1000000000000000000000000000000" + }, + "0x2bee474be207bdbeac83d6672da5ed2fd417eac9": { + "balance": "1000000000000000000000000000000" + }, + "0x2d93455b07bccf38e8d019f7f43a2c2d70b46b4e": { + "balance": "1000000000000000000000000000000" + }, + "0x2f971bd38806c3ca45ae0a125d1267118bf5619c": { + "balance": "1000000000000000000000000000000" + }, + "0x30aaab366dfac8331f3e827495c789cde9b437c0": { + "balance": "1000000000000000000000000000000" + }, + "0x32ea0400dc2d20664cc4744b2fab04ecb709445c": { + "balance": "1000000000000000000000000000000" + }, + "0x3760dc9594ccac0f33ade5cc5371402131696341": { + "balance": "1000000000000000000000000000000" + }, + "0x38855e430611bc179cd777a8704679ffc43921de": { + "balance": "1000000000000000000000000000000" + }, + "0x3a921471a2397644c37c88ef9572c421ab37145d": { + "balance": "1000000000000000000000000000000" + }, + "0x3bcca8a8471d55a1a668bc163c0336e4a57e5c99": { + "balance": "1000000000000000000000000000000" + }, + "0x3d46ee560227c1d73cd6042b47fc8fddd8a06ecb": { + "balance": "1000000000000000000000000000000" + }, + "0x3f5bdf5d4c274c82b8d17aa2810b00d2cf050f24": { + "balance": "1000000000000000000000000000000" + }, + "0x3ffe1c9183e0f97f52a816405a7d2350624ec88b": { + "balance": "1000000000000000000000000000000" + }, + "0x426ec5f07847674aada3856609d8baaa16805d88": { + "balance": "1000000000000000000000000000000" + }, + "0x482d7f53cba6ae73a354533673c48e2dfd560949": { + "balance": "1000000000000000000000000000000" + }, + "0x48acbd6a2724eadcc2a11144ab84b6a617d1a241": { + "balance": "1000000000000000000000000000000" + }, + "0x49ef89840e400026eb5c8d79bd1b0adc152fe86d": { + "balance": "1000000000000000000000000000000" + }, + "0x4bf989fa6572af36b190032505506f1db888357f": { + "balance": "1000000000000000000000000000000" + }, + "0x4cf9b195f7cb5f86694d9b399fe21a5f34616fd3": { + "balance": "1000000000000000000000000000000" + }, + "0x4e9b85904bca60aeb5b916ca86ac622096908427": { + "balance": "1000000000000000000000000000000" + }, + "0x50120c17d7b59200e9b76e89e4e3de2f0cd00090": { + "balance": "1000000000000000000000000000000" + }, + "0x54db355342c35085a1a53184162b2fddd0a43b0f": { + "balance": "1000000000000000000000000000000" + }, + "0x54e228d8fea148cfe2b109b3b152ff21321d09a2": { + "balance": "1000000000000000000000000000000" + }, + "0x5667601b7dcde6f24d06bccc4f291cb06976f4ee": { + "balance": "1000000000000000000000000000000" + }, + "0x57829f2ecca390cd9d1c41f92328bad4d1073bbb": { + "balance": "1000000000000000000000000000000" + }, + "0x5EF25557E2ed6AFfF321B266C93e95A0B4B05AbC": { + "balance": "1000000000000000000000000" + }, + "0x5a3adad4382b3eb1e0c65f2de2845901081039b5": { + "balance": "1000000000000000000000000000000" + }, + "0x5cdb7392efdce502ccc6fba5c3c1dd1653967b4d": { + "balance": "1000000000000000000000000000000" + }, + "0x5d012c13b2854bda8b7b6580e97e52751884f827": { + "balance": "1000000000000000000000000000000" + }, + "0x5d9326c6504833d84f8a0d65ded59b1a6e768ca2": { + "balance": "1000000000000000000000000000000" + }, + "0x60268f799d8f1808e4a32c2eb898e73a8881f6f0": { + "balance": "1000000000000000000000000000000" + }, + "0x605ba4a05d779f9869bd9a10234c22f516766cfe": { + "balance": "1000000000000000000000000000000" + }, + "0x6093f0f2a7b5148b71603ac439adbc4c0e5aa5da": { + "balance": "1000000000000000000000000000000" + }, + "0x6196d135CdDb9d73A0756C1E44b5b02B11acf594": { + "balance": "2000000000000000000000", + "code": "", + "nonce": "5076", + "storage": {} + }, + "0x62712ceccb50f62ca4c5402fff6da9c819c866cf": { + "balance": "1000000000000000000000000000000" + }, + "0x62971de462ea1ec0d3b43a6a85b6fb975e6c6f64": { + "balance": "1000000000000000000000000000000" + }, + "0x62cf32dfb9eb6358dc5deb006aef1d75fb153e5f": { + "balance": "1000000000000000000000000000000" + }, + "0x62d8b22c1d71577829b2fee20a5c3fff43aed0ec": { + "balance": "100000000000000000000000" + }, + "0x6314956b78bb2eaed1c49b3ae71d4d0ec501cfab": { + "balance": "1000000000000000000000000000000" + }, + "0x661bda4daeba3ce9ac2aa30b80d463580f90d31a": { + "balance": "1000000000000000000000000000000" + }, + "0x66c5a87f4a49DD75e970055A265E8dd5C3F8f852": { + "balance": "1000000000000000000000" + }, + "0x66cd465ddcd85504c0d2cfb1728acee994d55a3f": { + "balance": "1000000000000000000000000000000" + }, + "0x68bca79ae7aae796027ff843d2303444da5cf5d8": { + "balance": "1000000000000000000000000000000" + }, + "0x6923877b65e24966efa9efd1207822fa2eaf601a": { + "balance": "1000000000000000000000000000000" + }, + "0x69362535ec535F0643cBf62D16aDeDCAf32Ee6F7": { + "balance": "0", + "code": "0x608060405234801561001057600080fd5b50600436106100b45760003560e01c806379210e8e1161007157806379210e8e1461017757806381a8235a146101a757806385aeeb17146101c35780639a9a5593146101f3578063a99100541461020f578063b57321221461022b576100b4565b806307c6e7d3146100b9578063122f4fba146100d55780631c6ec7a9146101055780631cfe4e3b14610121578063373dedb41461013d57806361e46db51461015b575b600080fd5b6100d360048036036100ce9190810190613cff565b61025b565b005b6100ef60048036036100ea9190810190613cff565b610804565b6040516100fc9190614963565b60405180910390f35b61011f600480360361011a9190810190613cff565b610b43565b005b61013b60048036036101369190810190613cc3565b610f72565b005b610145611190565b6040516101529190614cbe565b60405180910390f35b61017560048036036101709190810190613d94565b611199565b005b610191600480360361018c9190810190613e13565b6113f9565b60405161019e9190614924565b60405180910390f35b6101c160048036036101bc9190810190613cff565b6116f9565b005b6101dd60048036036101d89190810190613cff565b61189e565b6040516101ea9190614941565b60405180910390f35b61020d60048036036102089190810190613d40565b611b9d565b005b61022960048036036102249190810190613cff565b61202c565b005b61024560048036036102409190810190613cff565b612682565b6040516102529190614cbe565b60405180910390f35b6000339050606061026b83612902565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b825181101561037c576000826001018460018403815181106102d557fe5b60200260200101516040516102ea91906148cc565b90815260200160405180910390205411610339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161033090614ade565b60405180910390fd5b8160020183600183038151811061034c57fe5b602002602001015160405161036191906148cc565b908152602001604051809103902091508060010190506102b7565b506060600183511161038e57846103a7565b8260018451038151811061039e57fe5b60200260200101515b9050600082600101826040516103bd91906148e3565b9081526020016040518091039020541161040c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161040390614ade565b60405180910390fd5b6000826002018260405161042091906148e3565b90815260200160405180910390206000018054905014610475576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161046c90614b5e565b60405180910390fd5b60006104818587612b02565b9050806104c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ba90614a7e565b60405180910390fd5b6104cb613888565b836000016001856000018054905003815481106104e457fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156105965780601f1061056b57610100808354040283529160200191610596565b820191906000526020600020905b81548152906001019060200180831161057957829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff1660028111156105e257fe5b60028111156105ed57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561066557602002820191906000526020600020906000905b82829054906101000a900460ff1615158152602001906001019060208260000104928301926001038202915080841161062f5790505b505050505081525050905080846000016001866001018660405161068991906148e3565b90815260200160405180910390205403815481106106a357fe5b906000526020600020906005020160008201518160000190805190602001906106cd9291906138c4565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561071c57fe5b0217905550608082015181600401908051906020019061073d929190613944565b50905050836001018360405161075391906148e3565b90815260200160405180910390205484600101826000015160405161077891906148cc565b9081526020016040518091039020819055506000846001018460405161079e91906148e3565b908152602001604051809103902081905550836000018054809190600190036107c791906139ea565b5083600201836040516107da91906148e3565b9081526020016040518091039020600080820160006107f99190613a1c565b505050505050505050565b600080606061081284612b66565b91509150606061082182612902565b90506000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b82518110156109065760008260010184600184038151811061088b57fe5b60200260200101516040516108a091906148cc565b90815260200160405180910390205414156108c357600095505050505050610b3e565b816002018360018303815181106108d657fe5b60200260200101516040516108eb91906148cc565b9081526020016040518091039020915080600101905061086d565b50606060018351116109185783610931565b8260018451038151811061092857fe5b60200260200101515b90506000826001018260405161094791906148e3565b908152602001604051809103902054141561096a57600095505050505050610b3e565b610972613888565b826000016001846001018460405161098a91906148e3565b90815260200160405180910390205403815481106109a457fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610a565780601f10610a2b57610100808354040283529160200191610a56565b820191906000526020600020905b815481529060010190602001808311610a3957829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115610aa257fe5b6002811115610aad57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015610b2557602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411610aef5790505b5050505050815250509050806060015196505050505050505b919050565b600160009054906101000a900460ff16610b85576120006002819055506210000060038190555060018060006101000a81548160ff0219169083151502179055505b6000815111610bc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc090614ade565b60405180910390fd5b60003390506060610bd983612902565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015610cea57600082600101846001840381518110610c4357fe5b6020026020010151604051610c5891906148cc565b90815260200160405180910390205411610ca7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9e90614ade565b60405180910390fd5b81600201836001830381518110610cba57fe5b6020026020010151604051610ccf91906148cc565b90815260200160405180910390209150806001019050610c25565b50600254816000018054905010610d36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2d90614bfe565b60405180910390fd5b60606001835111610d475784610d60565b82600184510381518110610d5757fe5b60200260200101515b905060008260010182604051610d7691906148e3565b90815260200160405180910390205414610dc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbc90614c3e565b60405180910390fd5b610dce81612ee8565b610e0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0490614afe565b60405180910390fd5b6000610e198587612fc9565b905080610e5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e529061499e565b60405180910390fd5b610e63613888565b82816000018190525060008160200190151590811515815250508360000181908060018154018082558091505090600182039060005260206000209060050201600090919290919091506000820151816000019080519060200190610ec99291906138c4565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff02191690836002811115610f1857fe5b02179055506080820151816004019080519060200190610f39929190613944565b5050505083600001805490508460010184604051610f5791906148e3565b90815260200160405180910390208190555050505050505050565b610f7a61302d565b73ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161480610fdf57503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614155b61101e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101590614a5e565b60405180910390fd5b80600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411156110a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109790614b3e565b60405180910390fd5b600054600754820111156110e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e0906149be565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460076000828254039250508190555080600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550806007600082825401925050819055505050565b60008054905090565b600033905060006111aa82866130c6565b9050600160028111156111b957fe5b8160030160009054906101000a900460ff1660028111156111d657fe5b14611216576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120d90614c1e565b60405180910390fd5b6000600354858161122357fe5b061480156112345750806002015484105b611273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126a9061497e565b60405180910390fd5b600354848260020154031080156112905750838160020154038351145b8061129d57506003548351145b6112dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d390614a1e565b60405180910390fd5b600015158160040160035486816112ef57fe5b04815481106112fa57fe5b90600052602060002090602091828204019190069054906101000a900460ff1615151461135c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611353906149fe565b60405180910390fd5b600061136a838787876132c5565b9050806113ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a390614b1e565b60405180910390fd5b60018260040160035487816113bd57fe5b04815481106113c857fe5b90600052602060002090602091828204019190066101000a81548160ff021916908315150217905550505050505050565b611401613a40565b6000606061140e86612b66565b9150915061141a613888565b61142483836130c6565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156114c85780601f1061149d576101008083540402835291602001916114c8565b820191906000526020600020905b8154815290600101906020018083116114ab57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561151457fe5b600281111561151f57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561159757602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116115615790505b50505050508152505090506002808111156115ae57fe5b816060015160028111156115be57fe5b146115fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f590614c9e565b60405180910390fd5b60035485111580156116105750600085115b61164f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164690614a1e565b60405180910390fd5b80604001518587011115611698576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168f9061497e565b60405180910390fd5b60006116a684848989613376565b8096508192505050806116ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e590614b9e565b60405180910390fd5b505050509392505050565b6000339050600061170a82846130c6565b90506001600281111561171957fe5b8160030160009054906101000a900460ff16600281111561173657fe5b14611776576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176d90614c1e565b60405180910390fd5b60006001905060008260040180549050905060008090505b818110156117e157600015158460040182815481106117a957fe5b90600052602060002090602091828204019190069054906101000a900460ff16151514156117d657600092505b80600101905061178e565b5081611822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181990614b7e565b60405180910390fd5b60028360030160006101000a81548160ff0219169083600281111561184357fe5b021790555060006118548587613409565b905080611896576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188d906149de565b60405180910390fd5b505050505050565b6060600060606118ad84612b66565b9150915060606118bc82612902565b90506000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008090505b82518110156119c65760008260010184838151811061192257fe5b602002602001015160405161193791906148cc565b90815260200160405180910390205411611986576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197d90614ade565b60405180910390fd5b8160020183828151811061199657fe5b60200260200101516040516119ab91906148cc565b90815260200160405180910390209150806001019050611907565b5080600001805480602002602001604051908101604052809291908181526020016000905b82821015611b8e57838290600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611aa75780601f10611a7c57610100808354040283529160200191611aa7565b820191906000526020600020905b815481529060010190602001808311611a8a57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115611af357fe5b6002811115611afe57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015611b7657602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411611b405790505b505050505081525050815260200190600101906119eb565b50505050945050505050919050565b600160009054906101000a900460ff16611bdf576120006002819055506210000060038190555060018060006101000a81548160ff0219169083151502179055505b60003390506305f5e100821115611c2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2290614bde565b60405180910390fd5b6060611c3684612902565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015611d4757600082600101846001840381518110611ca057fe5b6020026020010151604051611cb591906148cc565b90815260200160405180910390205411611d04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cfb90614ade565b60405180910390fd5b81600201836001830381518110611d1757fe5b6020026020010151604051611d2c91906148cc565b90815260200160405180910390209150806001019050611c82565b5060606001835111611d595785611d72565b82600184510381518110611d6957fe5b60200260200101515b905060008260010182604051611d8891906148e3565b90815260200160405180910390205414611dd7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dce90614c3e565b60405180910390fd5b611de081612ee8565b611e1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1690614bbe565b60405180910390fd5b6000611e2c85888861346d565b905080611e6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6590614c7e565b60405180910390fd5b6060600354600160035489010381611e8257fe5b04604051908082528060200260200182016040528015611eb15781602001602082028038833980820191505090505b509050836000016040518060a0016040528085815260200160011515815260200189815260200160016002811115611ee557fe5b815260200183815250908060018154018082558091505090600182039060005260206000209060050201600090919290919091506000820151816000019080519060200190611f359291906138c4565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff02191690836002811115611f8457fe5b02179055506080820151816004019080519060200190611fa5929190613944565b5050505083600001805490508460010184604051611fc391906148e3565b90815260200160405180910390208190555086600560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505050505050505050565b6000339050612039613888565b61204382846130c6565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156120e75780601f106120bc576101008083540402835291602001916120e7565b820191906000526020600020905b8154815290600101906020018083116120ca57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561213357fe5b600281111561213e57fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156121b657602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116121805790505b5050505050815250509050600060028111156121ce57fe5b816060015160028111156121de57fe5b141561221f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221690614a3e565b60405180910390fd5b600061222b83856134da565b90508061226d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226490614a9e565b60405180910390fd5b606061227885612902565b90506000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b825181101561231057816002018360018303815181106122e057fe5b60200260200101516040516122f591906148cc565b908152602001604051809103902091508060010190506122c4565b506000600182600101866000015160405161232b91906148cc565b908152602001604051809103902054039050612345613888565b8260000160018460000180549050038154811061235e57fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156124105780601f106123e557610100808354040283529160200191612410565b820191906000526020600020905b8154815290600101906020018083116123f357829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561245c57fe5b600281111561246757fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156124df57602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116124a95790505b5050505050815250509050808360000183815481106124fa57fe5b906000526020600020906005020160008201518160000190805190602001906125249291906138c4565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561257357fe5b02179055506080820151816004019080519060200190612594929190613944565b50905050826000018054809190600190036125af91906139ea565b508260010186600001516040516125c691906148cc565b9081526020016040518091039020548360010182600001516040516125eb91906148cc565b908152602001604051809103902081905550600083600101876000015160405161261591906148cc565b9081526020016040518091039020819055508560400151600560008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505050505050505050565b600080606061269084612b66565b9150915061269c613888565b6126a683836130c6565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561274a5780601f1061271f5761010080835404028352916020019161274a565b820191906000526020600020905b81548152906001019060200180831161272d57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561279657fe5b60028111156127a157fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561281957602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116127e35790505b50505050508152505090506001600281111561283157fe5b8160600151600281111561284157fe5b1480612866575060028081111561285457fe5b8160600151600281111561286457fe5b145b6128a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161289c90614c1e565b60405180910390fd5b60006128b1848461353e565b8096508192505050806128f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128f090614c5e565b60405180910390fd5b50505050919050565b606061290c613a65565b612915836135a7565b905061291f613a65565b61295d6040518060400160405280600181526020017f2f000000000000000000000000000000000000000000000000000000000000008152506135a7565b90506060600161297683856135d590919063ffffffff16565b016040519080825280602002602001820160405280156129aa57816020015b60608152602001906001900390816129955790505b50905060008090505b81518110156129fb576129d76129d2848661364a90919063ffffffff16565b613664565b8282815181106129e357fe5b602002602001018190525080806001019150506129b3565b50600081600183510381518110612a0e57fe5b6020026020010151511415612a795780600182510381518110612a2d57fe5b6020026020010160608152506001815103604051908082528060200260200182016040528015612a7157816020015b6060815260200190600190039081612a5c5790505b509350612ab2565b8051604051908082528060200260200182016040528015612aae57816020015b6060815260200190600190039081612a995790505b5093505b60008090505b8451811015612af957818181518110612acd57fe5b6020026020010151858281518110612ae157fe5b60200260200101819052508080600101915050612ab8565b50505050919050565b60008060016020601f85510181612b1557fe5b040190506040518481526020810160005b83811015612b47578060200286015181602002830152806001019050612b26565b50602082602085026040018460006010600019f1935050505092915050565b6000606060006028905080845111612bb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612baa90614abe565b60405180910390fd5b6060816040519080825280601f01601f191660200182016040528015612be85781602001600182028038833980820191505090505b50905060008090505b82811015612c5857858181518110612c0557fe5b602001015160f81c60f81b828281518110612c1c57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050612bf1565b50600080905060008090505b83811015612d87576000838281518110612c7a57fe5b602001015160f81c60f81b60f81c60ff16905060308110158015612c9f575060398111155b80612cb8575060418110158015612cb75750605a8111155b5b80612cd1575060618110158015612cd0575060668111155b5b612d10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d0790614abe565b60405180910390fd5b60308110158015612d22575060398111155b15612d335760308103601084020192505b60418110158015612d455750605a8111155b15612d565760378103601084020192505b60618110158015612d68575060668111155b15612d795760578103601084020192505b508080600101915050612c64565b508094507f2f00000000000000000000000000000000000000000000000000000000000000868481518110612db857fe5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612e25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e1c90614abe565b60405180910390fd5b6000600184885103039050806040519080825280601f01601f191660200182016040528015612e635781602001600182028038833980820191505090505b50945060008090505b81811015612ede5760008860018784010181518110612e8757fe5b602001015160f81c60f81b905080878381518110612ea157fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350508080600101915050612e6c565b5050505050915091565b6000604051602001612ef99061490f565b6040516020818303038152906040528051906020012082604051602001612f2091906148e3565b604051602081830303815290604052805190602001201480612f8b5750604051602001612f4c906148fa565b6040516020818303038152906040528051906020012082604051602001612f7391906148e3565b60405160208183030381529060405280519060200120145b80612f97575060008251145b15612fa55760009050612fc4565b60008251905060ff811115612fbe576000915050612fc4565b60019150505b919050565b60008060016020601f85510181612fdc57fe5b040190506040518481526020810160005b8381101561300e578060200286015181602002830152806001019050612fed565b5060208260208502604001846000600f600019f1935050505092915050565b600073d2001000000000000000000000000000000000d273ffffffffffffffffffffffffffffffffffffffff166383e781fe6040518163ffffffff1660e01b815260040160206040518083038186803b15801561308957600080fd5b505afa15801561309d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506130c19190810190613c9a565b905090565b600060606130d383612902565b90506000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b82518110156131e45760008260010184600184038151811061313d57fe5b602002602001015160405161315291906148cc565b908152602001604051809103902054116131a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161319890614ade565b60405180910390fd5b816002018360018303815181106131b457fe5b60200260200101516040516131c991906148cc565b9081526020016040518091039020915080600101905061311f565b50606060018351116131f6578461320f565b8260018451038151811061320657fe5b60200260200101515b90506000826001018260405161322591906148e3565b90815260200160405180910390205411613274576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161326b90614ade565b60405180910390fd5b6000826000016001846001018460405161328e91906148e3565b90815260200160405180910390205403815481106132a857fe5b906000526020600020906005020190508094505050505092915050565b60008060016020601f855101816132d857fe5b04019050600060016020601f885101816132ee57fe5b040190506040518781526020810160005b838110156133205780602002890151816020028301528060010190506132ff565b50868360200282015260005b84811015613352578060200287015181856001010160200283015280600101905061332c565b50602082848601602002606001846000600c600019f1945050505050949350505050565b6000613380613a40565b600060016020601f8851018161339257fe5b0401905060006020601f8601816133a557fe5b0490506040518881526020810160005b848110156133d657806020028a0151816020028301528060010190506133b5565b5083602002810188815287816020015283602002868660030160200285600a600019fa9650505050505094509492505050565b60008060016020601f8551018161341c57fe5b040190506040518481526020810160005b8381101561344e57806020028601518160200283015280600101905061342d565b50602082602085026040018460006011600019f1935050505092915050565b60008060016020601f8651018161348057fe5b040190506040518581526020810160005b838110156134b2578060200287015181602002830152806001019050613491565b50846020840282015260208260208502604001846000600b600019f193505050509392505050565b60008060016020601f855101816134ed57fe5b040190506040518481526020810160005b8381101561351f5780602002860151816020028301528060010190506134fe565b5060208260208502604001846000600e600019f1935050505092915050565b600080600060016020601f8651018161355357fe5b040190506040518581526020810160005b83811015613585578060200287015181602002830152806001019050613564565b506020826020850260200184600d600019fa9450815193505050509250929050565b6135af613a65565b600060208301905060405180604001604052808451815260200182815250915050919050565b60008082600001516135f985600001518660200151866000015187602001516136c6565b0190505b83600001518460200151018111613643578180600101925050826000015161363b8560200151830386600001510383866000015187602001516136c6565b0190506135fd565b5092915050565b613652613a65565b61365d8383836137a1565b5092915050565b60608082600001516040519080825280601f01601f19166020018201604052801561369e5781602001600182028038833980820191505090505b50905060006020820190506136bc818560200151866000015161383f565b8192505050919050565b6000808490506000868511613791576020851161374b57600060018660200360080260020a031960001b905060008186511690506000878a8a0103905060008386511690505b82811461373d5781861061372a578a8a019650505050505050613799565b858060010196505083865116905061370c565b859650505050505050613799565b60008585209050600091505b858803821161378f57600086842090508082141561377b5783945050505050613799565b600184019350508180600101925050613757565b505b868601925050505b949350505050565b6137a9613a65565b60006137c785600001518660200151866000015187602001516136c6565b90508460200151836020018181525050846020015181038360000181815250508460000151856020015101811415613809576000856000018181525050613834565b8360000151836000015101856000018181510391508181525050836000015181018560200181815250505b829150509392505050565b5b602081106138635781518352602083019250602082019150602081039050613840565b60006001826020036101000a0390508019835116818551168181178652505050505050565b6040518060a001604052806060815260200160001515815260200160008152602001600060028111156138b757fe5b8152602001606081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061390557805160ff1916838001178555613933565b82800160010185558215613933579182015b82811115613932578251825591602001919060010190613917565b5b5090506139409190613a7f565b5090565b82805482825590600052602060002090601f016020900481019282156139d95791602002820160005b838211156139aa57835183826101000a81548160ff021916908315150217905550926020019260010160208160000104928301926001030261396d565b80156139d75782816101000a81549060ff02191690556001016020816000010492830192600103026139aa565b505b5090506139e69190613aa4565b5090565b815481835581811115613a1757600502816005028360005260206000209182019101613a169190613ad4565b5b505050565b5080546000825560050290600052602060002090810190613a3d9190613ad4565b50565b6040518062100000016040528061800090602082028038833980820191505090505090565b604051806040016040528060008152602001600081525090565b613aa191905b80821115613a9d576000816000905550600101613a85565b5090565b90565b613ad191905b80821115613acd57600081816101000a81549060ff021916905550600101613aaa565b5090565b90565b613b4091905b80821115613b3c5760008082016000613af39190613b43565b6001820160006101000a81549060ff021916905560028201600090556003820160006101000a81549060ff0219169055600482016000613b339190613b8b565b50600501613ada565b5090565b90565b50805460018160011615610100020316600290046000825580601f10613b695750613b88565b601f016020900490600052602060002090810190613b879190613a7f565b5b50565b50805460008255601f016020900490600052602060002090810190613bb09190613a7f565b50565b600081359050613bc281614f18565b92915050565b600081519050613bd781614f18565b92915050565b600082601f830112613bee57600080fd5b8135613c01613bfc82614d06565b614cd9565b91508082526020830160208301858383011115613c1d57600080fd5b613c28838284614eb8565b50505092915050565b600082601f830112613c4257600080fd5b8135613c55613c5082614d32565b614cd9565b91508082526020830160208301858383011115613c7157600080fd5b613c7c838284614eb8565b50505092915050565b600081359050613c9481614f2f565b92915050565b600060208284031215613cac57600080fd5b6000613cba84828501613bc8565b91505092915050565b60008060408385031215613cd657600080fd5b6000613ce485828601613bb3565b9250506020613cf585828601613c85565b9150509250929050565b600060208284031215613d1157600080fd5b600082013567ffffffffffffffff811115613d2b57600080fd5b613d3784828501613c31565b91505092915050565b60008060408385031215613d5357600080fd5b600083013567ffffffffffffffff811115613d6d57600080fd5b613d7985828601613c31565b9250506020613d8a85828601613c85565b9150509250929050565b600080600060608486031215613da957600080fd5b600084013567ffffffffffffffff811115613dc357600080fd5b613dcf86828701613c31565b9350506020613de086828701613c85565b925050604084013567ffffffffffffffff811115613dfd57600080fd5b613e0986828701613bdd565b9150509250925092565b600080600060608486031215613e2857600080fd5b600084013567ffffffffffffffff811115613e4257600080fd5b613e4e86828701613c31565b9350506020613e5f86828701613c85565b9250506040613e7086828701613c85565b9150509250925092565b6000613e868383613fe8565b60208301905092915050565b6000613e9e8383613ff7565b60208301905092915050565b6000613eb68383614831565b905092915050565b6000613ec982614d88565b613ed38185614de7565b9350613ede83614d5e565b8060005b83811015613f0f578151613ef68882613e7a565b9750613f0183614dc0565b925050600181019050613ee2565b5085935050505092915050565b613f2581614d93565b613f2f8184614df8565b9250613f3a82614d6e565b8060005b83811015613f6b578151613f528782613e92565b9650613f5d83614dcd565b925050600181019050613f3e565b505050505050565b6000613f7e82614d9f565b613f888185614e03565b935083602082028501613f9a85614d78565b8060005b85811015613fd65784840389528151613fb78582613eaa565b9450613fc283614dda565b925060208a01995050600181019050613f9e565b50829750879550505050505092915050565b613ff181614e53565b82525050565b61400081614e5f565b82525050565b61400f81614ea6565b82525050565b61401e81614ea6565b82525050565b600061402f82614db5565b6140398185614e36565b9350614049818560208601614ec7565b80840191505092915050565b600061406082614daa565b61406a8185614e14565b935061407a818560208601614ec7565b61408381614efa565b840191505092915050565b600061409982614daa565b6140a38185614e36565b93506140b3818560208601614ec7565b80840191505092915050565b60006140cc601883614e25565b91507f496e636f7272656374206368756e6b20706f736974696f6e00000000000000006000830152602082019050919050565b600061410c601583614e25565b91507f4469726563746f7279206e6f74206372656174656400000000000000000000006000830152602082019050919050565b600061414c602483614e25565b91507f4e6f7420656e6f756768206d656d6f727920696e207468652046696c6573746f60008301527f72616765000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006141b2601b83614e25565b91507f48617368206861736e2774206265656e2063616c63756c6174656400000000006000830152602082019050919050565b60006141f2601983614e25565b91507f4368756e6b20697320616c72656164792075706c6f61646564000000000000006000830152602082019050919050565b6000614232601683614e25565b91507f496e636f7272656374206368756e6b206c656e677468000000000000000000006000830152602082019050919050565b6000614272600f83614e25565b91507f46696c65206e6f742065786973747300000000000000000000000000000000006000830152602082019050919050565b60006142b2600e83614e25565b91507f496e76616c69642073656e6465720000000000000000000000000000000000006000830152602082019050919050565b60006142f2601883614e25565b91507f4469726563746f7279206973206e6f742064656c6574656400000000000000006000830152602082019050919050565b6000614332601083614e25565b91507f46696c65206e6f742064656c65746564000000000000000000000000000000006000830152602082019050919050565b6000614372601383614e25565b91507f496e76616c69642073746f7261676550617468000000000000000000000000006000830152602082019050919050565b60006143b2600c83614e25565b91507f496e76616c6964207061746800000000000000000000000000000000000000006000830152602082019050919050565b60006143f2600183614e36565b91507f2e000000000000000000000000000000000000000000000000000000000000006000830152600182019050919050565b6000614432601683614e25565b91507f496e76616c6964206469726563746f7279206e616d65000000000000000000006000830152602082019050919050565b6000614472601583614e25565b91507f4368756e6b207761736e27742075706c6f6164656400000000000000000000006000830152602082019050919050565b60006144b2602683614e25565b91507f436f756c64206e6f742072657365727665206c657373207468616e207573656460008301527f20737061636500000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614518601683614e25565b91507f4469726563746f7279206973206e6f7420656d707479000000000000000000006000830152602082019050919050565b6000614558602383614e25565b91507f46696c65206861736e2774206265656e2075706c6f6164656420636f7272656360008301527f746c7900000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006145be601183614e25565b91507f4368756e6b207761736e277420726561640000000000000000000000000000006000830152602082019050919050565b60006145fe601883614e25565b91507f46696c656e616d652073686f756c64206265203c2032353600000000000000006000830152602082019050919050565b600061463e601f83614e25565b91507f46696c652073686f756c64206265206c657373207468616e20313030204d42006000830152602082019050919050565b600061467e600283614e36565b91507f2e2e0000000000000000000000000000000000000000000000000000000000006000830152600282019050919050565b60006146be601183614e25565b91507f4469726563746f72792069732066756c6c0000000000000000000000000000006000830152602082019050919050565b60006146fe600e83614e25565b91507f46696c65206e6f7420666f756e640000000000000000000000000000000000006000830152602082019050919050565b600061473e601883614e25565b91507f46696c65206f72206469726563746f72792065786973747300000000000000006000830152602082019050919050565b600061477e601883614e25565b91507f45564d206572726f7220696e2067657446696c6553697a6500000000000000006000830152602082019050919050565b60006147be601083614e25565b91507f46696c65206e6f742063726561746564000000000000000000000000000000006000830152602082019050919050565b60006147fe601983614e25565b91507f46696c65206861736e2774206265656e2075706c6f61646564000000000000006000830152602082019050919050565b600060a083016000830151848203600086015261484e8282614055565b91505060208301516148636020860182613fe8565b50604083015161487660408601826148ae565b5060608301516148896060860182614006565b50608083015184820360808601526148a18282613ebe565b9150508091505092915050565b6148b781614e9c565b82525050565b6148c681614e9c565b82525050565b60006148d8828461408e565b915081905092915050565b60006148ef8284614024565b915081905092915050565b6000614905826143e5565b9150819050919050565b600061491a82614671565b9150819050919050565b6000621000008201905061493b6000830184613f1c565b92915050565b6000602082019050818103600083015261495b8184613f73565b905092915050565b60006020820190506149786000830184614015565b92915050565b60006020820190508181036000830152614997816140bf565b9050919050565b600060208201905081810360008301526149b7816140ff565b9050919050565b600060208201905081810360008301526149d78161413f565b9050919050565b600060208201905081810360008301526149f7816141a5565b9050919050565b60006020820190508181036000830152614a17816141e5565b9050919050565b60006020820190508181036000830152614a3781614225565b9050919050565b60006020820190508181036000830152614a5781614265565b9050919050565b60006020820190508181036000830152614a77816142a5565b9050919050565b60006020820190508181036000830152614a97816142e5565b9050919050565b60006020820190508181036000830152614ab781614325565b9050919050565b60006020820190508181036000830152614ad781614365565b9050919050565b60006020820190508181036000830152614af7816143a5565b9050919050565b60006020820190508181036000830152614b1781614425565b9050919050565b60006020820190508181036000830152614b3781614465565b9050919050565b60006020820190508181036000830152614b57816144a5565b9050919050565b60006020820190508181036000830152614b778161450b565b9050919050565b60006020820190508181036000830152614b978161454b565b9050919050565b60006020820190508181036000830152614bb7816145b1565b9050919050565b60006020820190508181036000830152614bd7816145f1565b9050919050565b60006020820190508181036000830152614bf781614631565b9050919050565b60006020820190508181036000830152614c17816146b1565b9050919050565b60006020820190508181036000830152614c37816146f1565b9050919050565b60006020820190508181036000830152614c5781614731565b9050919050565b60006020820190508181036000830152614c7781614771565b9050919050565b60006020820190508181036000830152614c97816147b1565b9050919050565b60006020820190508181036000830152614cb7816147f1565b9050919050565b6000602082019050614cd360008301846148bd565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614cfc57600080fd5b8060405250919050565b600067ffffffffffffffff821115614d1d57600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614d4957600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050919050565b6000819050602082019050919050565b600081519050919050565b60006180009050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614e4c82614e7c565b9050919050565b60008115159050919050565b6000819050919050565b6000819050614e7782614f0b565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000614eb182614e69565b9050919050565b82818337600083830152505050565b60005b83811015614ee5578082015181840152602081019050614eca565b83811115614ef4576000848401525b50505050565b6000601f19601f8301169050919050565b60038110614f1557fe5b50565b614f2181614e41565b8114614f2c57600080fd5b50565b614f3881614e9c565b8114614f4357600080fd5b5056fea365627a7a723158202ae226b25ad72f9cff2d74c6dc7bcfb78530ab1d2438f48a8dab67499b37a8e56c6578706572696d656e74616cf564736f6c634300050d0040", + "nonce": "0", + "storage": { + "0x0": "2868903936" + } + }, + "0x69362535ec535F0643cBf62D16aDeDCAf32Ee6F8": { + "balance": "0", + "code": "0x608060405234801561001057600080fd5b50600436106100b45760003560e01c806379210e8e1161007157806379210e8e1461017757806381a8235a146101a757806385aeeb17146101c35780639a9a5593146101f3578063a99100541461020f578063b57321221461022b576100b4565b806307c6e7d3146100b9578063122f4fba146100d55780631c6ec7a9146101055780631cfe4e3b14610121578063373dedb41461013d57806361e46db51461015b575b600080fd5b6100d360048036036100ce9190810190613e0d565b61025b565b005b6100ef60048036036100ea9190810190613e0d565b610804565b6040516100fc9190614ab1565b60405180910390f35b61011f600480360361011a9190810190613e0d565b610b43565b005b61013b60048036036101369190810190613dd1565b610f72565b005b610145611190565b6040516101529190614e2c565b60405180910390f35b61017560048036036101709190810190613ea2565b611199565b005b610191600480360361018c9190810190613f21565b6113f9565b60405161019e9190614a72565b60405180910390f35b6101c160048036036101bc9190810190613e0d565b6116f9565b005b6101dd60048036036101d89190810190613e0d565b61189e565b6040516101ea9190614a8f565b60405180910390f35b61020d60048036036102089190810190613e4e565b611b9d565b005b61022960048036036102249190810190613e0d565b61213a565b005b61024560048036036102409190810190613e0d565b612790565b6040516102529190614e2c565b60405180910390f35b6000339050606061026b83612a10565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b825181101561037c576000826001018460018403815181106102d557fe5b60200260200101516040516102ea9190614a1a565b90815260200160405180910390205411610339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161033090614c2c565b60405180910390fd5b8160020183600183038151811061034c57fe5b60200260200101516040516103619190614a1a565b908152602001604051809103902091508060010190506102b7565b506060600183511161038e57846103a7565b8260018451038151811061039e57fe5b60200260200101515b9050600082600101826040516103bd9190614a31565b9081526020016040518091039020541161040c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161040390614c2c565b60405180910390fd5b600082600201826040516104209190614a31565b90815260200160405180910390206000018054905014610475576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161046c90614cac565b60405180910390fd5b60006104818587612c10565b9050806104c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ba90614bcc565b60405180910390fd5b6104cb613996565b836000016001856000018054905003815481106104e457fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156105965780601f1061056b57610100808354040283529160200191610596565b820191906000526020600020905b81548152906001019060200180831161057957829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff1660028111156105e257fe5b60028111156105ed57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561066557602002820191906000526020600020906000905b82829054906101000a900460ff1615158152602001906001019060208260000104928301926001038202915080841161062f5790505b50505050508152505090508084600001600186600101866040516106899190614a31565b90815260200160405180910390205403815481106106a357fe5b906000526020600020906005020160008201518160000190805190602001906106cd9291906139d2565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561071c57fe5b0217905550608082015181600401908051906020019061073d929190613a52565b5090505083600101836040516107539190614a31565b9081526020016040518091039020548460010182600001516040516107789190614a1a565b9081526020016040518091039020819055506000846001018460405161079e9190614a31565b908152602001604051809103902081905550836000018054809190600190036107c79190613af8565b5083600201836040516107da9190614a31565b9081526020016040518091039020600080820160006107f99190613b2a565b505050505050505050565b600080606061081284612c74565b91509150606061082182612a10565b90506000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b82518110156109065760008260010184600184038151811061088b57fe5b60200260200101516040516108a09190614a1a565b90815260200160405180910390205414156108c357600095505050505050610b3e565b816002018360018303815181106108d657fe5b60200260200101516040516108eb9190614a1a565b9081526020016040518091039020915080600101905061086d565b50606060018351116109185783610931565b8260018451038151811061092857fe5b60200260200101515b9050600082600101826040516109479190614a31565b908152602001604051809103902054141561096a57600095505050505050610b3e565b610972613996565b826000016001846001018460405161098a9190614a31565b90815260200160405180910390205403815481106109a457fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610a565780601f10610a2b57610100808354040283529160200191610a56565b820191906000526020600020905b815481529060010190602001808311610a3957829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115610aa257fe5b6002811115610aad57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015610b2557602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411610aef5790505b5050505050815250509050806060015196505050505050505b919050565b600160009054906101000a900460ff16610b85576120006002819055506210000060038190555060018060006101000a81548160ff0219169083151502179055505b6000815111610bc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc090614c2c565b60405180910390fd5b60003390506060610bd983612a10565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015610cea57600082600101846001840381518110610c4357fe5b6020026020010151604051610c589190614a1a565b90815260200160405180910390205411610ca7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9e90614c2c565b60405180910390fd5b81600201836001830381518110610cba57fe5b6020026020010151604051610ccf9190614a1a565b90815260200160405180910390209150806001019050610c25565b50600254816000018054905010610d36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2d90614d4c565b60405180910390fd5b60606001835111610d475784610d60565b82600184510381518110610d5757fe5b60200260200101515b905060008260010182604051610d769190614a31565b90815260200160405180910390205414610dc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbc90614d8c565b60405180910390fd5b610dce81612ff6565b610e0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0490614c4c565b60405180910390fd5b6000610e1985876130d7565b905080610e5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5290614aec565b60405180910390fd5b610e63613996565b82816000018190525060008160200190151590811515815250508360000181908060018154018082558091505090600182039060005260206000209060050201600090919290919091506000820151816000019080519060200190610ec99291906139d2565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff02191690836002811115610f1857fe5b02179055506080820151816004019080519060200190610f39929190613a52565b5050505083600001805490508460010184604051610f579190614a31565b90815260200160405180910390208190555050505050505050565b610f7a61313b565b73ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161480610fdf57503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614155b61101e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101590614bac565b60405180910390fd5b80600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411156110a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109790614c8c565b60405180910390fd5b600054600754820111156110e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e090614b0c565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460076000828254039250508190555080600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550806007600082825401925050819055505050565b60008054905090565b600033905060006111aa82866131d4565b9050600160028111156111b957fe5b8160030160009054906101000a900460ff1660028111156111d657fe5b14611216576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120d90614d6c565b60405180910390fd5b6000600354858161122357fe5b061480156112345750806002015484105b611273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126a90614acc565b60405180910390fd5b600354848260020154031080156112905750838160020154038351145b8061129d57506003548351145b6112dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d390614b6c565b60405180910390fd5b600015158160040160035486816112ef57fe5b04815481106112fa57fe5b90600052602060002090602091828204019190069054906101000a900460ff1615151461135c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135390614b4c565b60405180910390fd5b600061136a838787876133d3565b9050806113ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a390614c6c565b60405180910390fd5b60018260040160035487816113bd57fe5b04815481106113c857fe5b90600052602060002090602091828204019190066101000a81548160ff021916908315150217905550505050505050565b611401613b4e565b6000606061140e86612c74565b9150915061141a613996565b61142483836131d4565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156114c85780601f1061149d576101008083540402835291602001916114c8565b820191906000526020600020905b8154815290600101906020018083116114ab57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561151457fe5b600281111561151f57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561159757602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116115615790505b50505050508152505090506002808111156115ae57fe5b816060015160028111156115be57fe5b146115fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f590614e0c565b60405180910390fd5b60035485111580156116105750600085115b61164f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164690614b6c565b60405180910390fd5b80604001518587011115611698576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168f90614acc565b60405180910390fd5b60006116a684848989613484565b8096508192505050806116ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e590614cec565b60405180910390fd5b505050509392505050565b6000339050600061170a82846131d4565b90506001600281111561171957fe5b8160030160009054906101000a900460ff16600281111561173657fe5b14611776576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176d90614d6c565b60405180910390fd5b60006001905060008260040180549050905060008090505b818110156117e157600015158460040182815481106117a957fe5b90600052602060002090602091828204019190069054906101000a900460ff16151514156117d657600092505b80600101905061178e565b5081611822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181990614ccc565b60405180910390fd5b60028360030160006101000a81548160ff0219169083600281111561184357fe5b021790555060006118548587613517565b905080611896576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188d90614b2c565b60405180910390fd5b505050505050565b6060600060606118ad84612c74565b9150915060606118bc82612a10565b90506000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008090505b82518110156119c65760008260010184838151811061192257fe5b60200260200101516040516119379190614a1a565b90815260200160405180910390205411611986576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197d90614c2c565b60405180910390fd5b8160020183828151811061199657fe5b60200260200101516040516119ab9190614a1a565b90815260200160405180910390209150806001019050611907565b5080600001805480602002602001604051908101604052809291908181526020016000905b82821015611b8e57838290600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611aa75780601f10611a7c57610100808354040283529160200191611aa7565b820191906000526020600020905b815481529060010190602001808311611a8a57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115611af357fe5b6002811115611afe57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015611b7657602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411611b405790505b505050505081525050815260200190600101906119eb565b50505050945050505050919050565b600160009054906101000a900460ff16611bdf576120006002819055506210000060038190555060018060006101000a81548160ff0219169083151502179055505b60003390506305f5e100821115611c2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2290614d2c565b60405180910390fd5b600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205483011115611cee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce590614dac565b60405180910390fd5b6060611cf984612a10565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015611e0a57600082600101846001840381518110611d6357fe5b6020026020010151604051611d789190614a1a565b90815260200160405180910390205411611dc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dbe90614c2c565b60405180910390fd5b81600201836001830381518110611dda57fe5b6020026020010151604051611def9190614a1a565b90815260200160405180910390209150806001019050611d45565b50600254816000018054905010611e56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4d90614d4c565b60405180910390fd5b60606001835111611e675785611e80565b82600184510381518110611e7757fe5b60200260200101515b905060008260010182604051611e969190614a31565b90815260200160405180910390205414611ee5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611edc90614d8c565b60405180910390fd5b611eee81612ff6565b611f2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2490614d0c565b60405180910390fd5b6000611f3a85888861357b565b905080611f7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7390614dec565b60405180910390fd5b6060600354600160035489010381611f9057fe5b04604051908082528060200260200182016040528015611fbf5781602001602082028038833980820191505090505b509050836000016040518060a0016040528085815260200160011515815260200189815260200160016002811115611ff357fe5b8152602001838152509080600181540180825580915050906001820390600052602060002090600502016000909192909190915060008201518160000190805190602001906120439291906139d2565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561209257fe5b021790555060808201518160040190805190602001906120b3929190613a52565b50505050836000018054905084600101846040516120d19190614a31565b90815260200160405180910390208190555086600560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505050505050505050565b6000339050612147613996565b61215182846131d4565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156121f55780601f106121ca576101008083540402835291602001916121f5565b820191906000526020600020905b8154815290600101906020018083116121d857829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561224157fe5b600281111561224c57fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156122c457602002820191906000526020600020906000905b82829054906101000a900460ff1615158152602001906001019060208260000104928301926001038202915080841161228e5790505b5050505050815250509050600060028111156122dc57fe5b816060015160028111156122ec57fe5b141561232d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232490614b8c565b60405180910390fd5b600061233983856135e8565b90508061237b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161237290614bec565b60405180910390fd5b606061238685612a10565b90506000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b825181101561241e57816002018360018303815181106123ee57fe5b60200260200101516040516124039190614a1a565b908152602001604051809103902091508060010190506123d2565b50600060018260010186600001516040516124399190614a1a565b908152602001604051809103902054039050612453613996565b8260000160018460000180549050038154811061246c57fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561251e5780601f106124f35761010080835404028352916020019161251e565b820191906000526020600020905b81548152906001019060200180831161250157829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561256a57fe5b600281111561257557fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156125ed57602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116125b75790505b50505050508152505090508083600001838154811061260857fe5b906000526020600020906005020160008201518160000190805190602001906126329291906139d2565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561268157fe5b021790555060808201518160040190805190602001906126a2929190613a52565b50905050826000018054809190600190036126bd9190613af8565b508260010186600001516040516126d49190614a1a565b9081526020016040518091039020548360010182600001516040516126f99190614a1a565b90815260200160405180910390208190555060008360010187600001516040516127239190614a1a565b9081526020016040518091039020819055508560400151600560008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505050505050505050565b600080606061279e84612c74565b915091506127aa613996565b6127b483836131d4565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156128585780601f1061282d57610100808354040283529160200191612858565b820191906000526020600020905b81548152906001019060200180831161283b57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff1660028111156128a457fe5b60028111156128af57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561292757602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116128f15790505b50505050508152505090506001600281111561293f57fe5b8160600151600281111561294f57fe5b1480612974575060028081111561296257fe5b8160600151600281111561297257fe5b145b6129b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129aa90614d6c565b60405180910390fd5b60006129bf848461364c565b809650819250505080612a07576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129fe90614dcc565b60405180910390fd5b50505050919050565b6060612a1a613b73565b612a23836136b5565b9050612a2d613b73565b612a6b6040518060400160405280600181526020017f2f000000000000000000000000000000000000000000000000000000000000008152506136b5565b905060606001612a8483856136e390919063ffffffff16565b01604051908082528060200260200182016040528015612ab857816020015b6060815260200190600190039081612aa35790505b50905060008090505b8151811015612b0957612ae5612ae0848661375890919063ffffffff16565b613772565b828281518110612af157fe5b60200260200101819052508080600101915050612ac1565b50600081600183510381518110612b1c57fe5b6020026020010151511415612b875780600182510381518110612b3b57fe5b6020026020010160608152506001815103604051908082528060200260200182016040528015612b7f57816020015b6060815260200190600190039081612b6a5790505b509350612bc0565b8051604051908082528060200260200182016040528015612bbc57816020015b6060815260200190600190039081612ba75790505b5093505b60008090505b8451811015612c0757818181518110612bdb57fe5b6020026020010151858281518110612bef57fe5b60200260200101819052508080600101915050612bc6565b50505050919050565b60008060016020601f85510181612c2357fe5b040190506040518481526020810160005b83811015612c55578060200286015181602002830152806001019050612c34565b50602082602085026040018460006010600019f1935050505092915050565b6000606060006028905080845111612cc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cb890614c0c565b60405180910390fd5b6060816040519080825280601f01601f191660200182016040528015612cf65781602001600182028038833980820191505090505b50905060008090505b82811015612d6657858181518110612d1357fe5b602001015160f81c60f81b828281518110612d2a57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050612cff565b50600080905060008090505b83811015612e95576000838281518110612d8857fe5b602001015160f81c60f81b60f81c60ff16905060308110158015612dad575060398111155b80612dc6575060418110158015612dc55750605a8111155b5b80612ddf575060618110158015612dde575060668111155b5b612e1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e1590614c0c565b60405180910390fd5b60308110158015612e30575060398111155b15612e415760308103601084020192505b60418110158015612e535750605a8111155b15612e645760378103601084020192505b60618110158015612e76575060668111155b15612e875760578103601084020192505b508080600101915050612d72565b508094507f2f00000000000000000000000000000000000000000000000000000000000000868481518110612ec657fe5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612f33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f2a90614c0c565b60405180910390fd5b6000600184885103039050806040519080825280601f01601f191660200182016040528015612f715781602001600182028038833980820191505090505b50945060008090505b81811015612fec5760008860018784010181518110612f9557fe5b602001015160f81c60f81b905080878381518110612faf57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350508080600101915050612f7a565b5050505050915091565b600060405160200161300790614a5d565b604051602081830303815290604052805190602001208260405160200161302e9190614a31565b604051602081830303815290604052805190602001201480613099575060405160200161305a90614a48565b60405160208183030381529060405280519060200120826040516020016130819190614a31565b60405160208183030381529060405280519060200120145b806130a5575060008251145b156130b357600090506130d2565b60008251905060ff8111156130cc5760009150506130d2565b60019150505b919050565b60008060016020601f855101816130ea57fe5b040190506040518481526020810160005b8381101561311c5780602002860151816020028301528060010190506130fb565b5060208260208502604001846000600f600019f1935050505092915050565b600073d2001000000000000000000000000000000000d273ffffffffffffffffffffffffffffffffffffffff166383e781fe6040518163ffffffff1660e01b815260040160206040518083038186803b15801561319757600080fd5b505afa1580156131ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506131cf9190810190613da8565b905090565b600060606131e183612a10565b90506000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b82518110156132f25760008260010184600184038151811061324b57fe5b60200260200101516040516132609190614a1a565b908152602001604051809103902054116132af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132a690614c2c565b60405180910390fd5b816002018360018303815181106132c257fe5b60200260200101516040516132d79190614a1a565b9081526020016040518091039020915080600101905061322d565b5060606001835111613304578461331d565b8260018451038151811061331457fe5b60200260200101515b9050600082600101826040516133339190614a31565b90815260200160405180910390205411613382576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161337990614c2c565b60405180910390fd5b6000826000016001846001018460405161339c9190614a31565b90815260200160405180910390205403815481106133b657fe5b906000526020600020906005020190508094505050505092915050565b60008060016020601f855101816133e657fe5b04019050600060016020601f885101816133fc57fe5b040190506040518781526020810160005b8381101561342e57806020028901518160200283015280600101905061340d565b50868360200282015260005b84811015613460578060200287015181856001010160200283015280600101905061343a565b50602082848601602002606001846000600c600019f1945050505050949350505050565b600061348e613b4e565b600060016020601f885101816134a057fe5b0401905060006020601f8601816134b357fe5b0490506040518881526020810160005b848110156134e457806020028a0151816020028301528060010190506134c3565b5083602002810188815287816020015283602002868660030160200285600a600019fa9650505050505094509492505050565b60008060016020601f8551018161352a57fe5b040190506040518481526020810160005b8381101561355c57806020028601518160200283015280600101905061353b565b50602082602085026040018460006011600019f1935050505092915050565b60008060016020601f8651018161358e57fe5b040190506040518581526020810160005b838110156135c057806020028701518160200283015280600101905061359f565b50846020840282015260208260208502604001846000600b600019f193505050509392505050565b60008060016020601f855101816135fb57fe5b040190506040518481526020810160005b8381101561362d57806020028601518160200283015280600101905061360c565b5060208260208502604001846000600e600019f1935050505092915050565b600080600060016020601f8651018161366157fe5b040190506040518581526020810160005b83811015613693578060200287015181602002830152806001019050613672565b506020826020850260200184600d600019fa9450815193505050509250929050565b6136bd613b73565b600060208301905060405180604001604052808451815260200182815250915050919050565b600080826000015161370785600001518660200151866000015187602001516137d4565b0190505b8360000151846020015101811161375157818060010192505082600001516137498560200151830386600001510383866000015187602001516137d4565b01905061370b565b5092915050565b613760613b73565b61376b8383836138af565b5092915050565b60608082600001516040519080825280601f01601f1916602001820160405280156137ac5781602001600182028038833980820191505090505b50905060006020820190506137ca818560200151866000015161394d565b8192505050919050565b600080849050600086851161389f576020851161385957600060018660200360080260020a031960001b905060008186511690506000878a8a0103905060008386511690505b82811461384b57818610613838578a8a0196505050505050506138a7565b858060010196505083865116905061381a565b8596505050505050506138a7565b60008585209050600091505b858803821161389d57600086842090508082141561388957839450505050506138a7565b600184019350508180600101925050613865565b505b868601925050505b949350505050565b6138b7613b73565b60006138d585600001518660200151866000015187602001516137d4565b90508460200151836020018181525050846020015181038360000181815250508460000151856020015101811415613917576000856000018181525050613942565b8360000151836000015101856000018181510391508181525050836000015181018560200181815250505b829150509392505050565b5b60208110613971578151835260208301925060208201915060208103905061394e565b60006001826020036101000a0390508019835116818551168181178652505050505050565b6040518060a001604052806060815260200160001515815260200160008152602001600060028111156139c557fe5b8152602001606081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613a1357805160ff1916838001178555613a41565b82800160010185558215613a41579182015b82811115613a40578251825591602001919060010190613a25565b5b509050613a4e9190613b8d565b5090565b82805482825590600052602060002090601f01602090048101928215613ae75791602002820160005b83821115613ab857835183826101000a81548160ff0219169083151502179055509260200192600101602081600001049283019260010302613a7b565b8015613ae55782816101000a81549060ff0219169055600101602081600001049283019260010302613ab8565b505b509050613af49190613bb2565b5090565b815481835581811115613b2557600502816005028360005260206000209182019101613b249190613be2565b5b505050565b5080546000825560050290600052602060002090810190613b4b9190613be2565b50565b6040518062100000016040528061800090602082028038833980820191505090505090565b604051806040016040528060008152602001600081525090565b613baf91905b80821115613bab576000816000905550600101613b93565b5090565b90565b613bdf91905b80821115613bdb57600081816101000a81549060ff021916905550600101613bb8565b5090565b90565b613c4e91905b80821115613c4a5760008082016000613c019190613c51565b6001820160006101000a81549060ff021916905560028201600090556003820160006101000a81549060ff0219169055600482016000613c419190613c99565b50600501613be8565b5090565b90565b50805460018160011615610100020316600290046000825580601f10613c775750613c96565b601f016020900490600052602060002090810190613c959190613b8d565b5b50565b50805460008255601f016020900490600052602060002090810190613cbe9190613b8d565b50565b600081359050613cd081615086565b92915050565b600081519050613ce581615086565b92915050565b600082601f830112613cfc57600080fd5b8135613d0f613d0a82614e74565b614e47565b91508082526020830160208301858383011115613d2b57600080fd5b613d36838284615026565b50505092915050565b600082601f830112613d5057600080fd5b8135613d63613d5e82614ea0565b614e47565b91508082526020830160208301858383011115613d7f57600080fd5b613d8a838284615026565b50505092915050565b600081359050613da28161509d565b92915050565b600060208284031215613dba57600080fd5b6000613dc884828501613cd6565b91505092915050565b60008060408385031215613de457600080fd5b6000613df285828601613cc1565b9250506020613e0385828601613d93565b9150509250929050565b600060208284031215613e1f57600080fd5b600082013567ffffffffffffffff811115613e3957600080fd5b613e4584828501613d3f565b91505092915050565b60008060408385031215613e6157600080fd5b600083013567ffffffffffffffff811115613e7b57600080fd5b613e8785828601613d3f565b9250506020613e9885828601613d93565b9150509250929050565b600080600060608486031215613eb757600080fd5b600084013567ffffffffffffffff811115613ed157600080fd5b613edd86828701613d3f565b9350506020613eee86828701613d93565b925050604084013567ffffffffffffffff811115613f0b57600080fd5b613f1786828701613ceb565b9150509250925092565b600080600060608486031215613f3657600080fd5b600084013567ffffffffffffffff811115613f5057600080fd5b613f5c86828701613d3f565b9350506020613f6d86828701613d93565b9250506040613f7e86828701613d93565b9150509250925092565b6000613f9483836140f6565b60208301905092915050565b6000613fac8383614105565b60208301905092915050565b6000613fc4838361497f565b905092915050565b6000613fd782614ef6565b613fe18185614f55565b9350613fec83614ecc565b8060005b8381101561401d5781516140048882613f88565b975061400f83614f2e565b925050600181019050613ff0565b5085935050505092915050565b61403381614f01565b61403d8184614f66565b925061404882614edc565b8060005b838110156140795781516140608782613fa0565b965061406b83614f3b565b92505060018101905061404c565b505050505050565b600061408c82614f0d565b6140968185614f71565b9350836020820285016140a885614ee6565b8060005b858110156140e457848403895281516140c58582613fb8565b94506140d083614f48565b925060208a019950506001810190506140ac565b50829750879550505050505092915050565b6140ff81614fc1565b82525050565b61410e81614fcd565b82525050565b61411d81615014565b82525050565b61412c81615014565b82525050565b600061413d82614f23565b6141478185614fa4565b9350614157818560208601615035565b80840191505092915050565b600061416e82614f18565b6141788185614f82565b9350614188818560208601615035565b61419181615068565b840191505092915050565b60006141a782614f18565b6141b18185614fa4565b93506141c1818560208601615035565b80840191505092915050565b60006141da601883614f93565b91507f496e636f7272656374206368756e6b20706f736974696f6e00000000000000006000830152602082019050919050565b600061421a601583614f93565b91507f4469726563746f7279206e6f74206372656174656400000000000000000000006000830152602082019050919050565b600061425a602483614f93565b91507f4e6f7420656e6f756768206d656d6f727920696e207468652046696c6573746f60008301527f72616765000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006142c0601b83614f93565b91507f48617368206861736e2774206265656e2063616c63756c6174656400000000006000830152602082019050919050565b6000614300601983614f93565b91507f4368756e6b20697320616c72656164792075706c6f61646564000000000000006000830152602082019050919050565b6000614340601683614f93565b91507f496e636f7272656374206368756e6b206c656e677468000000000000000000006000830152602082019050919050565b6000614380600f83614f93565b91507f46696c65206e6f742065786973747300000000000000000000000000000000006000830152602082019050919050565b60006143c0600e83614f93565b91507f496e76616c69642073656e6465720000000000000000000000000000000000006000830152602082019050919050565b6000614400601883614f93565b91507f4469726563746f7279206973206e6f742064656c6574656400000000000000006000830152602082019050919050565b6000614440601083614f93565b91507f46696c65206e6f742064656c65746564000000000000000000000000000000006000830152602082019050919050565b6000614480601383614f93565b91507f496e76616c69642073746f7261676550617468000000000000000000000000006000830152602082019050919050565b60006144c0600c83614f93565b91507f496e76616c6964207061746800000000000000000000000000000000000000006000830152602082019050919050565b6000614500600183614fa4565b91507f2e000000000000000000000000000000000000000000000000000000000000006000830152600182019050919050565b6000614540601683614f93565b91507f496e76616c6964206469726563746f7279206e616d65000000000000000000006000830152602082019050919050565b6000614580601583614f93565b91507f4368756e6b207761736e27742075706c6f6164656400000000000000000000006000830152602082019050919050565b60006145c0602683614f93565b91507f436f756c64206e6f742072657365727665206c657373207468616e207573656460008301527f20737061636500000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614626601683614f93565b91507f4469726563746f7279206973206e6f7420656d707479000000000000000000006000830152602082019050919050565b6000614666602383614f93565b91507f46696c65206861736e2774206265656e2075706c6f6164656420636f7272656360008301527f746c7900000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006146cc601183614f93565b91507f4368756e6b207761736e277420726561640000000000000000000000000000006000830152602082019050919050565b600061470c601883614f93565b91507f46696c656e616d652073686f756c64206265203c2032353600000000000000006000830152602082019050919050565b600061474c601f83614f93565b91507f46696c652073686f756c64206265206c657373207468616e20313030204d42006000830152602082019050919050565b600061478c600283614fa4565b91507f2e2e0000000000000000000000000000000000000000000000000000000000006000830152600282019050919050565b60006147cc601183614f93565b91507f4469726563746f72792069732066756c6c0000000000000000000000000000006000830152602082019050919050565b600061480c600e83614f93565b91507f46696c65206e6f7420666f756e640000000000000000000000000000000000006000830152602082019050919050565b600061484c601883614f93565b91507f46696c65206f72206469726563746f72792065786973747300000000000000006000830152602082019050919050565b600061488c601983614f93565b91507f4e6f7420656e6f756768207265736572766564207370616365000000000000006000830152602082019050919050565b60006148cc601883614f93565b91507f45564d206572726f7220696e2067657446696c6553697a6500000000000000006000830152602082019050919050565b600061490c601083614f93565b91507f46696c65206e6f742063726561746564000000000000000000000000000000006000830152602082019050919050565b600061494c601983614f93565b91507f46696c65206861736e2774206265656e2075706c6f61646564000000000000006000830152602082019050919050565b600060a083016000830151848203600086015261499c8282614163565b91505060208301516149b160208601826140f6565b5060408301516149c460408601826149fc565b5060608301516149d76060860182614114565b50608083015184820360808601526149ef8282613fcc565b9150508091505092915050565b614a058161500a565b82525050565b614a148161500a565b82525050565b6000614a26828461419c565b915081905092915050565b6000614a3d8284614132565b915081905092915050565b6000614a53826144f3565b9150819050919050565b6000614a688261477f565b9150819050919050565b60006210000082019050614a89600083018461402a565b92915050565b60006020820190508181036000830152614aa98184614081565b905092915050565b6000602082019050614ac66000830184614123565b92915050565b60006020820190508181036000830152614ae5816141cd565b9050919050565b60006020820190508181036000830152614b058161420d565b9050919050565b60006020820190508181036000830152614b258161424d565b9050919050565b60006020820190508181036000830152614b45816142b3565b9050919050565b60006020820190508181036000830152614b65816142f3565b9050919050565b60006020820190508181036000830152614b8581614333565b9050919050565b60006020820190508181036000830152614ba581614373565b9050919050565b60006020820190508181036000830152614bc5816143b3565b9050919050565b60006020820190508181036000830152614be5816143f3565b9050919050565b60006020820190508181036000830152614c0581614433565b9050919050565b60006020820190508181036000830152614c2581614473565b9050919050565b60006020820190508181036000830152614c45816144b3565b9050919050565b60006020820190508181036000830152614c6581614533565b9050919050565b60006020820190508181036000830152614c8581614573565b9050919050565b60006020820190508181036000830152614ca5816145b3565b9050919050565b60006020820190508181036000830152614cc581614619565b9050919050565b60006020820190508181036000830152614ce581614659565b9050919050565b60006020820190508181036000830152614d05816146bf565b9050919050565b60006020820190508181036000830152614d25816146ff565b9050919050565b60006020820190508181036000830152614d458161473f565b9050919050565b60006020820190508181036000830152614d65816147bf565b9050919050565b60006020820190508181036000830152614d85816147ff565b9050919050565b60006020820190508181036000830152614da58161483f565b9050919050565b60006020820190508181036000830152614dc58161487f565b9050919050565b60006020820190508181036000830152614de5816148bf565b9050919050565b60006020820190508181036000830152614e05816148ff565b9050919050565b60006020820190508181036000830152614e258161493f565b9050919050565b6000602082019050614e416000830184614a0b565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614e6a57600080fd5b8060405250919050565b600067ffffffffffffffff821115614e8b57600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614eb757600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050919050565b6000819050602082019050919050565b600081519050919050565b60006180009050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614fba82614fea565b9050919050565b60008115159050919050565b6000819050919050565b6000819050614fe582615079565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061501f82614fd7565b9050919050565b82818337600083830152505050565b60005b83811015615053578082015181840152602081019050615038565b83811115615062576000848401525b50505050565b6000601f19601f8301169050919050565b6003811061508357fe5b50565b61508f81614faf565b811461509a57600080fd5b50565b6150a68161500a565b81146150b157600080fd5b5056fea365627a7a72315820314a90e541327f2678eaf7815f54348c3702e4fa45cdf1d5595b378d08af86896c6578706572696d656e74616cf564736f6c634300050d0040", + "nonce": "0", + "storage": { + "0x0": "2868903936" + } + }, + "0x69bfcdcb98c9562e0a2faee3ecdfd65e8a0adb19": { + "balance": "1000000000000000000000000000000" + }, + "0x6a37ad7dceec4595eea9f03b82d2710e738343ac": { + "balance": "1000000000000000000000000000000" + }, + "0x6b806862a977a0e22ed1752f858e5332647121c8": { + "balance": "1000000000000000000000000000000" + }, + "0x6c0ef9084a57df13c175afea32ea47a510c5506e": { + "balance": "1000000000000000000000000000000" + }, + "0x6cd5e637266e18d3e888ee99451eb828c6b491f4": { + "balance": "1000000000000000000000000000000" + }, + "0x6d0d7f0ff51917bd84a5f7270d31a894282aaf4b": { + "balance": "1000000000000000000000000000000" + }, + "0x6d8092cb926daf29236f866cd31c327ff73323d1": { + "balance": "1000000000000000000000000000000" + }, + "0x6d80aAC61F6d92c7F4A3c412850474ba963B698E": { + "balance": "1000000000000000000000" + }, + "0x6fec280c0ab320715b17d70e8b02c2d4141c1372": { + "balance": "1000000000000000000000000000000" + }, + "0x733ad609ef2e742334d96266fbc13733f1cf5e4a": { + "balance": "1000000000000000000000000000000" + }, + "0x7525198d8cd1121d57358a0b0ed037e924581a76": { + "balance": "1000000000000000000000000000000" + }, + "0x765708943c3b791563d1e3f0533b6d7e7d769e4d": { + "balance": "1000000000000000000000000000000" + }, + "0x7685d04f0b7657017b77efa004a14ff9f022acab": { + "balance": "1000000000000000000000000000000" + }, + "0x76b545cb6a2fc671f741950eeb27627e69a1e69b": { + "balance": "1000000000000000000000000000000" + }, + "0x77a0bc73442d3d9cb993e8d9752f95babf0ccaa6": { + "balance": "1000000000000000000000000000000" + }, + "0x7a89A6c323FaCfF0ADeF7EEF3e491aD4044d0592": { + "balance": "100000000000000000000000" + }, + "0x7e7E68F04D1799Fa25C8cff57314c8a5d3942e69": { + "balance": "1000000000000000000000000" + }, + "0x811d701d14539d190a8593fe901eafe8eff511f5": { + "balance": "1000000000000000000000000000000" + }, + "0x81dcbd71da28fafb9ca99ff5a22bfcebba84fecc": { + "balance": "100000000000000000000000" + }, + "0x83c1479d2a32d9ed9fa699289b6c2db56b7cd045": { + "balance": "1000000000000000000000000000000" + }, + "0x85b33f0853ab8eaa4e602bdfd724d44bc2731e90": { + "balance": "1000000000000000000000000000000" + }, + "0x863f816036e3cbba90855196c9d1e339fcff1650": { + "balance": "1000000000000000000000000000000" + }, + "0x87ea381878572d63b3453033d7540abddd191186": { + "balance": "1000000000000000000000000000000" + }, + "0x88fd5e01078629cc194c933d9631b9448fe10b1d": { + "balance": "1000000000000000000000000000000" + }, + "0x8945e48bd056f45c8b57f9025d2674bb03a24035": { + "balance": "1000000000000000000000000000000" + }, + "0x8a920edc1021ce76c22774e0e83723a6e51c2439": { + "balance": "1000000000000000000000000000000" + }, + "0x8e6081e272c8f4d49f5b29157b52f68cbd6307ad": { + "balance": "1000000000000000000000000000000" + }, + "0x8fe24dbbf9884bd458d8cfac528b4ad70e82497d": { + "balance": "1000000000000000000000000000000" + }, + "0x90431f3f75b26657f74abbb5c759b12e78f916cc": { + "balance": "1000000000000000000000000000000" + }, + "0x907cd0881E50d359bb9Fd120B1A5A143b1C97De6": { + "balance": "1000000000000000000000000000000000000000000000000000000000" + }, + "0x94c6e5746971d6aebeaa42cbbe2feca0f6b5b24f": { + "balance": "1000000000000000000000000000000" + }, + "0x96672f9e982936e1904b15c948cc81bf18027db6": { + "balance": "1000000000000000000000000000000" + }, + "0x97b921ba45e0aa8830701aa62050a83ee00a1bb8": { + "balance": "1000000000000000000000000000000" + }, + "0x98e50c97baf98dc6a81bdb95067339a269a36fc1": { + "balance": "1000000000000000000000000000000" + }, + "0x9b77f28285a49601169a33332f08aa309d97edd0": { + "balance": "1000000000000000000000000000000" + }, + "0x9f62f4215cd277ca40dede101b4ccb29290de6bb": { + "balance": "1000000000000000000000000000000" + }, + "0xD1001000000000000000000000000000000000D1": { + "balance": "0", + "code": "0x608060405260043610603f576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680636d4ce63c146044575b600080fd5b348015604f57600080fd5b506056606c565b6040518082815260200191505060405180910390f35b60006001600060048152602001908152602001600020600060098152602001908152602001600020600101549050905600a165627a7a723058208fe64219becc0bcab1c8f854f05804ebb6bb555da5dbc49e8f7021c31d77636a0029", + "nonce": "0", + "storage": { + "0x3b4da637a1b0e6dbfc6795f2b7f0cb29eebb91b3af4dcc335e1633f6b4af810b": "1111" + } + }, + "0xD3001000000000000000000000000000000000D3": { + "balance": "0", + "code": "0x60806040526004361061007b5760003560e01c80639623609d1161004e5780639623609d1461013657806399a88ec4146101f5578063f2fde38b14610230578063f3b7dead146102635761007b565b8063204e1c7a14610080578063715018a6146100cf5780637eff275e146100e65780638da5cb5b14610121575b600080fd5b34801561008c57600080fd5b506100b3600480360360208110156100a357600080fd5b50356001600160a01b0316610296565b604080516001600160a01b039092168252519081900360200190f35b3480156100db57600080fd5b506100e4610328565b005b3480156100f257600080fd5b506100e46004803603604081101561010957600080fd5b506001600160a01b03813581169160200135166103ca565b34801561012d57600080fd5b506100b3610496565b6100e46004803603606081101561014c57600080fd5b6001600160a01b03823581169260208101359091169181019060608101604082013564010000000081111561018057600080fd5b82018360208201111561019257600080fd5b803590602001918460018302840111640100000000831117156101b457600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506104a5945050505050565b34801561020157600080fd5b506100e46004803603604081101561021857600080fd5b506001600160a01b03813581169160200135166105dd565b34801561023c57600080fd5b506100e46004803603602081101561025357600080fd5b50356001600160a01b031661068d565b34801561026f57600080fd5b506100b36004803603602081101561028657600080fd5b50356001600160a01b0316610785565b6000806060836001600160a01b03166040518080635c60da1b60e01b8152506004019050600060405180830381855afa9150503d80600081146102f5576040519150601f19603f3d011682016040523d82523d6000602084013e6102fa565b606091505b50915091508161030957600080fd5b80806020019051602081101561031e57600080fd5b5051949350505050565b6103306107e4565b6000546001600160a01b03908116911614610380576040805162461bcd60e51b8152602060048201819052602482015260008051602061080f833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6103d26107e4565b6000546001600160a01b03908116911614610422576040805162461bcd60e51b8152602060048201819052602482015260008051602061080f833981519152604482015290519081900360640190fd5b816001600160a01b0316638f283970826040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050600060405180830381600087803b15801561047a57600080fd5b505af115801561048e573d6000803e3d6000fd5b505050505050565b6000546001600160a01b031690565b6104ad6107e4565b6000546001600160a01b039081169116146104fd576040805162461bcd60e51b8152602060048201819052602482015260008051602061080f833981519152604482015290519081900360640190fd5b826001600160a01b0316634f1ef2863484846040518463ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561057357818101518382015260200161055b565b50505050905090810190601f1680156105a05780820380516001836020036101000a031916815260200191505b5093505050506000604051808303818588803b1580156105bf57600080fd5b505af11580156105d3573d6000803e3d6000fd5b5050505050505050565b6105e56107e4565b6000546001600160a01b03908116911614610635576040805162461bcd60e51b8152602060048201819052602482015260008051602061080f833981519152604482015290519081900360640190fd5b816001600160a01b0316633659cfe6826040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050600060405180830381600087803b15801561047a57600080fd5b6106956107e4565b6000546001600160a01b039081169116146106e5576040805162461bcd60e51b8152602060048201819052602482015260008051602061080f833981519152604482015290519081900360640190fd5b6001600160a01b03811661072a5760405162461bcd60e51b81526004018080602001828103825260268152602001806107e96026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000806060836001600160a01b031660405180806303e1469160e61b8152506004019050600060405180830381855afa9150503d80600081146102f5576040519150601f19603f3d011682016040523d82523d6000602084013e6102fa565b339056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a26469706673582212201d968ac32bef5562c6b4f1bd5d2f2a74c14d07ce008ca6fdc5a3bd0f5fc265f564736f6c63430006080033", + "nonce": "0", + "storage": { + "0x0": "0x907cd0881E50d359bb9Fd120B1A5A143b1C97De6" + } + }, + "0xD3002000000000000000000000000000000000D3": { + "balance": "0", + "code": "0x60806040526004361061004e5760003560e01c80633659cfe6146100655780634f1ef286146100985780635c60da1b146101185780638f28397014610149578063f851a4401461017c5761005d565b3661005d5761005b610191565b005b61005b610191565b34801561007157600080fd5b5061005b6004803603602081101561008857600080fd5b50356001600160a01b03166101ab565b61005b600480360360408110156100ae57600080fd5b6001600160a01b0382351691908101906040810160208201356401000000008111156100d957600080fd5b8201836020820111156100eb57600080fd5b8035906020019184600183028401116401000000008311171561010d57600080fd5b5090925090506101e5565b34801561012457600080fd5b5061012d610292565b604080516001600160a01b039092168252519081900360200190f35b34801561015557600080fd5b5061005b6004803603602081101561016c57600080fd5b50356001600160a01b03166102cf565b34801561018857600080fd5b5061012d610389565b6101996103ba565b6101a96101a461041a565b61043f565b565b6101b3610463565b6001600160a01b0316336001600160a01b031614156101da576101d581610488565b6101e2565b6101e2610191565b50565b6101ed610463565b6001600160a01b0316336001600160a01b031614156102855761020f83610488565b6000836001600160a01b031683836040518083838082843760405192019450600093509091505080830381855af49150503d806000811461026c576040519150601f19603f3d011682016040523d82523d6000602084013e610271565b606091505b505090508061027f57600080fd5b5061028d565b61028d610191565b505050565b600061029c610463565b6001600160a01b0316336001600160a01b031614156102c4576102bd61041a565b90506102cc565b6102cc610191565b90565b6102d7610463565b6001600160a01b0316336001600160a01b031614156101da576001600160a01b0381166103355760405162461bcd60e51b81526004018080602001828103825260368152602001806105876036913960400191505060405180910390fd5b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f61035e610463565b604080516001600160a01b03928316815291841660208301528051918290030190a16101d5816104c8565b6000610393610463565b6001600160a01b0316336001600160a01b031614156102c4576102bd610463565b3b151590565b6103c2610463565b6001600160a01b0316336001600160a01b031614156104125760405162461bcd60e51b81526004018080602001828103825260328152602001806105556032913960400191505060405180910390fd5b6101a96101a9565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b3660008037600080366000845af43d6000803e80801561045e573d6000f35b3d6000fd5b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b610491816104ec565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610355565b6104f5816103b4565b6105305760405162461bcd60e51b815260040180806020018281038252603b8152602001806105bd603b913960400191505060405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5556fe43616e6e6f742063616c6c2066616c6c6261636b2066756e6374696f6e2066726f6d207468652070726f78792061646d696e43616e6e6f74206368616e6765207468652061646d696e206f6620612070726f787920746f20746865207a65726f206164647265737343616e6e6f742073657420612070726f787920696d706c656d656e746174696f6e20746f2061206e6f6e2d636f6e74726163742061646472657373a26469706673582212206e221e2a3547bd97244b05ed46430b1b078ba097cb2a4e25ec3d79cf9ac9f02c64736f6c63430006080033", + "nonce": "0", + "storage": { + "0x0": "1000000", + "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0xD3003000000000000000000000000000000000D3", + "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "0xD3001000000000000000000000000000000000D3" + } + }, + "0xD3003000000000000000000000000000000000D3": { + "balance": "0", + "code": "0x608060405234801561001057600080fd5b50600436106100b45760003560e01c806379210e8e1161007157806379210e8e1461017757806381a8235a146101a757806385aeeb17146101c35780639a9a5593146101f3578063a99100541461020f578063b57321221461022b576100b4565b806307c6e7d3146100b9578063122f4fba146100d55780631c6ec7a9146101055780631cfe4e3b14610121578063373dedb41461013d57806361e46db51461015b575b600080fd5b6100d360048036036100ce9190810190613e94565b61025b565b005b6100ef60048036036100ea9190810190613e94565b610862565b6040516100fc9190614b38565b60405180910390f35b61011f600480360361011a9190810190613e94565b610ba1565b005b61013b60048036036101369190810190613e58565b610fce565b005b6101456111ec565b6040516101529190614eb3565b60405180910390f35b61017560048036036101709190810190613f29565b6111f6565b005b610191600480360361018c9190810190613fa8565b611456565b60405161019e9190614af9565b60405180910390f35b6101c160048036036101bc9190810190613e94565b611756565b005b6101dd60048036036101d89190810190613e94565b6118fb565b6040516101ea9190614b16565b60405180910390f35b61020d60048036036102089190810190613ed5565b611bfa565b005b61022960048036036102249190810190613e94565b612195565b005b61024560048036036102409190810190613e94565b612849565b6040516102529190614eb3565b60405180910390f35b6000339050606061026b83612ac9565b90506000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b825181101561037c576000826001018460018403815181106102d557fe5b60200260200101516040516102ea9190614aa1565b90815260200160405180910390205411610339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161033090614cb3565b60405180910390fd5b8160020183600183038151811061034c57fe5b60200260200101516040516103619190614aa1565b908152602001604051809103902091508060010190506102b7565b506060600183511161038e57846103a7565b8260018451038151811061039e57fe5b60200260200101515b9050600082600101826040516103bd9190614ab8565b9081526020016040518091039020541161040c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161040390614cb3565b60405180910390fd5b600082600201826040516104209190614ab8565b90815260200160405180910390206000018054905014610475576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161046c90614d33565b60405180910390fd5b60006104818587612cc9565b9050806104c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ba90614c53565b60405180910390fd5b6104cb613a4f565b836000016001856000018054905003815481106104e457fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156105965780601f1061056b57610100808354040283529160200191610596565b820191906000526020600020905b81548152906001019060200180831161057957829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff1660028111156105e257fe5b60028111156105ed57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561066557602002820191906000526020600020906000905b82829054906101000a900460ff1615158152602001906001019060208260000104928301926001038202915080841161062f5790505b50505050508152505090508084600001600186600101866040516106899190614ab8565b90815260200160405180910390205403815481106106a357fe5b906000526020600020906005020160008201518160000190805190602001906106cd929190613a8b565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561071c57fe5b0217905550608082015181600401908051906020019061073d929190613b0b565b5090505083600101836040516107539190614ab8565b9081526020016040518091039020548460010182600001516040516107789190614aa1565b9081526020016040518091039020819055506000846001018460405161079e9190614ab8565b908152602001604051809103902081905550836000018054806107bd57fe5b6001900381819060005260206000209060050201600080820160006107e29190613bb1565b6001820160006101000a81549060ff021916905560028201600090556003820160006101000a81549060ff02191690556004820160006108229190613bf9565b5050905583600201836040516108389190614ab8565b9081526020016040518091039020600080820160006108579190613c21565b505050505050505050565b600080606061087084612d2d565b91509150606061087f82612ac9565b90506000600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015610964576000826001018460018403815181106108e957fe5b60200260200101516040516108fe9190614aa1565b908152602001604051809103902054141561092157600095505050505050610b9c565b8160020183600183038151811061093457fe5b60200260200101516040516109499190614aa1565b908152602001604051809103902091508060010190506108cb565b5060606001835111610976578361098f565b8260018451038151811061098657fe5b60200260200101515b9050600082600101826040516109a59190614ab8565b90815260200160405180910390205414156109c857600095505050505050610b9c565b6109d0613a4f565b82600001600184600101846040516109e89190614ab8565b9081526020016040518091039020540381548110610a0257fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610ab45780601f10610a8957610100808354040283529160200191610ab4565b820191906000526020600020905b815481529060010190602001808311610a9757829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115610b0057fe5b6002811115610b0b57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015610b8357602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411610b4d5790505b5050505050815250509050806060015196505050505050505b919050565b600360009054906101000a900460ff16610be457612000600481905550621000006005819055506001600360006101000a81548160ff0219169083151502179055505b6000815111610c28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1f90614cb3565b60405180910390fd5b60003390506060610c3883612ac9565b90506000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015610d4957600082600101846001840381518110610ca257fe5b6020026020010151604051610cb79190614aa1565b90815260200160405180910390205411610d06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cfd90614cb3565b60405180910390fd5b81600201836001830381518110610d1957fe5b6020026020010151604051610d2e9190614aa1565b90815260200160405180910390209150806001019050610c84565b50600454816000018054905010610d95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8c90614dd3565b60405180910390fd5b60606001835111610da65784610dbf565b82600184510381518110610db657fe5b60200260200101515b905060008260010182604051610dd59190614ab8565b90815260200160405180910390205414610e24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1b90614e13565b60405180910390fd5b610e2d816130af565b610e6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6390614cd3565b60405180910390fd5b6000610e788587613190565b905080610eba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb190614b73565b60405180910390fd5b610ec2613a4f565b8281600001819052506000816020019015159081151581525050836000018190806001815401808255809150506001900390600052602060002090600502016000909190919091506000820151816000019080519060200190610f26929190613a8b565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff02191690836002811115610f7557fe5b02179055506080820151816004019080519060200190610f96929190613b0b565b50505083600001805490508460010184604051610fb39190614ab8565b90815260200160405180910390208190555050505050505050565b610fd66131f4565b73ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16148061103b57503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614155b61107a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107190614c33565b60405180910390fd5b80600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411156110fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f390614d13565b60405180910390fd5b60025460095482011115611145576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113c90614b93565b60405180910390fd5b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460096000828254039250508190555080600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550806009600082825401925050819055505050565b6000600254905090565b60003390506000611207828661328d565b90506001600281111561121657fe5b8160030160009054906101000a900460ff16600281111561123357fe5b14611273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126a90614df3565b60405180910390fd5b6000600554858161128057fe5b061480156112915750806002015484105b6112d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c790614b53565b60405180910390fd5b600554848260020154031080156112ed5750838160020154038351145b806112fa57506005548351145b611339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133090614bf3565b60405180910390fd5b6000151581600401600554868161134c57fe5b048154811061135757fe5b90600052602060002090602091828204019190069054906101000a900460ff161515146113b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b090614bd3565b60405180910390fd5b60006113c78387878761348c565b905080611409576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140090614cf3565b60405180910390fd5b600182600401600554878161141a57fe5b048154811061142557fe5b90600052602060002090602091828204019190066101000a81548160ff021916908315150217905550505050505050565b61145e613c45565b6000606061146b86612d2d565b91509150611477613a4f565b611481838361328d565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156115255780601f106114fa57610100808354040283529160200191611525565b820191906000526020600020905b81548152906001019060200180831161150857829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561157157fe5b600281111561157c57fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156115f457602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116115be5790505b505050505081525050905060028081111561160b57fe5b8160600151600281111561161b57fe5b1461165b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165290614e93565b60405180910390fd5b600554851115801561166d5750600085115b6116ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a390614bf3565b60405180910390fd5b806040015185870111156116f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ec90614b53565b60405180910390fd5b60006117038484898961353d565b80965081925050508061174b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174290614d73565b60405180910390fd5b505050509392505050565b60003390506000611767828461328d565b90506001600281111561177657fe5b8160030160009054906101000a900460ff16600281111561179357fe5b146117d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ca90614df3565b60405180910390fd5b60006001905060008260040180549050905060008090505b8181101561183e576000151584600401828154811061180657fe5b90600052602060002090602091828204019190069054906101000a900460ff161515141561183357600092505b8060010190506117eb565b508161187f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187690614d53565b60405180910390fd5b60028360030160006101000a81548160ff021916908360028111156118a057fe5b021790555060006118b185876135d0565b9050806118f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ea90614bb3565b60405180910390fd5b505050505050565b60606000606061190a84612d2d565b91509150606061191982612ac9565b90506000600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008090505b8251811015611a235760008260010184838151811061197f57fe5b60200260200101516040516119949190614aa1565b908152602001604051809103902054116119e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119da90614cb3565b60405180910390fd5b816002018382815181106119f357fe5b6020026020010151604051611a089190614aa1565b90815260200160405180910390209150806001019050611964565b5080600001805480602002602001604051908101604052809291908181526020016000905b82821015611beb57838290600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611b045780601f10611ad957610100808354040283529160200191611b04565b820191906000526020600020905b815481529060010190602001808311611ae757829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115611b5057fe5b6002811115611b5b57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015611bd357602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411611b9d5790505b50505050508152505081526020019060010190611a48565b50505050945050505050919050565b600360009054906101000a900460ff16611c3d57612000600481905550621000006005819055506001600360006101000a81548160ff0219169083151502179055505b60003390506305f5e100821115611c89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8090614db3565b60405180910390fd5b600660008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205483011115611d4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4390614e33565b60405180910390fd5b6060611d5784612ac9565b90506000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015611e6857600082600101846001840381518110611dc157fe5b6020026020010151604051611dd69190614aa1565b90815260200160405180910390205411611e25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1c90614cb3565b60405180910390fd5b81600201836001830381518110611e3857fe5b6020026020010151604051611e4d9190614aa1565b90815260200160405180910390209150806001019050611da3565b50600454816000018054905010611eb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eab90614dd3565b60405180910390fd5b60606001835111611ec55785611ede565b82600184510381518110611ed557fe5b60200260200101515b905060008260010182604051611ef49190614ab8565b90815260200160405180910390205414611f43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3a90614e13565b60405180910390fd5b611f4c816130af565b611f8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8290614d93565b60405180910390fd5b6000611f98858888613634565b905080611fda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd190614e73565b60405180910390fd5b6060600554600160055489010381611fee57fe5b0460405190808252806020026020018201604052801561201d5781602001602082028038833980820191505090505b509050836000016040518060a001604052808581526020016001151581526020018981526020016001600281111561205157fe5b8152602001838152509080600181540180825580915050600190039060005260206000209060050201600090919091909150600082015181600001908051906020019061209f929190613a8b565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff021916908360028111156120ee57fe5b0217905550608082015181600401908051906020019061210f929190613b0b565b5050508360000180549050846001018460405161212c9190614ab8565b90815260200160405180910390208190555086600760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505050505050505050565b60003390506121a2613a4f565b6121ac828461328d565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156122505780601f1061222557610100808354040283529160200191612250565b820191906000526020600020905b81548152906001019060200180831161223357829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561229c57fe5b60028111156122a757fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561231f57602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116122e95790505b50505050508152505090506000600281111561233757fe5b8160600151600281111561234757fe5b1415612388576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161237f90614c13565b60405180910390fd5b600061239483856136a1565b9050806123d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123cd90614c73565b60405180910390fd5b60606123e185612ac9565b90506000600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015612479578160020183600183038151811061244957fe5b602002602001015160405161245e9190614aa1565b9081526020016040518091039020915080600101905061242d565b50600060018260010186600001516040516124949190614aa1565b9081526020016040518091039020540390506124ae613a4f565b826000016001846000018054905003815481106124c757fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156125795780601f1061254e57610100808354040283529160200191612579565b820191906000526020600020905b81548152906001019060200180831161255c57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff1660028111156125c557fe5b60028111156125d057fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561264857602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116126125790505b50505050508152505090508083600001838154811061266357fe5b9060005260206000209060050201600082015181600001908051906020019061268d929190613a8b565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff021916908360028111156126dc57fe5b021790555060808201518160040190805190602001906126fd929190613b0b565b509050508260000180548061270e57fe5b6001900381819060005260206000209060050201600080820160006127339190613bb1565b6001820160006101000a81549060ff021916905560028201600090556003820160006101000a81549060ff02191690556004820160006127739190613bf9565b5050905582600101866000015160405161278d9190614aa1565b9081526020016040518091039020548360010182600001516040516127b29190614aa1565b90815260200160405180910390208190555060008360010187600001516040516127dc9190614aa1565b9081526020016040518091039020819055508560400151600760008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505050505050505050565b600080606061285784612d2d565b91509150612863613a4f565b61286d838361328d565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156129115780601f106128e657610100808354040283529160200191612911565b820191906000526020600020905b8154815290600101906020018083116128f457829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561295d57fe5b600281111561296857fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156129e057602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116129aa5790505b5050505050815250509050600160028111156129f857fe5b81606001516002811115612a0857fe5b1480612a2d5750600280811115612a1b57fe5b81606001516002811115612a2b57fe5b145b612a6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a6390614df3565b60405180910390fd5b6000612a788484613705565b809650819250505080612ac0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ab790614e53565b60405180910390fd5b50505050919050565b6060612ad3613c6a565b612adc8361376e565b9050612ae6613c6a565b612b246040518060400160405280600181526020017f2f0000000000000000000000000000000000000000000000000000000000000081525061376e565b905060606001612b3d838561379c90919063ffffffff16565b01604051908082528060200260200182016040528015612b7157816020015b6060815260200190600190039081612b5c5790505b50905060008090505b8151811015612bc257612b9e612b99848661381190919063ffffffff16565b61382b565b828281518110612baa57fe5b60200260200101819052508080600101915050612b7a565b50600081600183510381518110612bd557fe5b6020026020010151511415612c405780600182510381518110612bf457fe5b6020026020010160608152506001815103604051908082528060200260200182016040528015612c3857816020015b6060815260200190600190039081612c235790505b509350612c79565b8051604051908082528060200260200182016040528015612c7557816020015b6060815260200190600190039081612c605790505b5093505b60008090505b8451811015612cc057818181518110612c9457fe5b6020026020010151858281518110612ca857fe5b60200260200101819052508080600101915050612c7f565b50505050919050565b60008060016020601f85510181612cdc57fe5b040190506040518481526020810160005b83811015612d0e578060200286015181602002830152806001019050612ced565b50602082602085026040018460006010600019f1935050505092915050565b6000606060006028905080845111612d7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d7190614c93565b60405180910390fd5b6060816040519080825280601f01601f191660200182016040528015612daf5781602001600182028038833980820191505090505b50905060008090505b82811015612e1f57858181518110612dcc57fe5b602001015160f81c60f81b828281518110612de357fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050612db8565b50600080905060008090505b83811015612f4e576000838281518110612e4157fe5b602001015160f81c60f81b60f81c60ff16905060308110158015612e66575060398111155b80612e7f575060418110158015612e7e5750605a8111155b5b80612e98575060618110158015612e97575060668111155b5b612ed7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ece90614c93565b60405180910390fd5b60308110158015612ee9575060398111155b15612efa5760308103601084020192505b60418110158015612f0c5750605a8111155b15612f1d5760378103601084020192505b60618110158015612f2f575060668111155b15612f405760578103601084020192505b508080600101915050612e2b565b508094507f2f00000000000000000000000000000000000000000000000000000000000000868481518110612f7f57fe5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612fec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fe390614c93565b60405180910390fd5b6000600184885103039050806040519080825280601f01601f19166020018201604052801561302a5781602001600182028038833980820191505090505b50945060008090505b818110156130a5576000886001878401018151811061304e57fe5b602001015160f81c60f81b90508087838151811061306857fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350508080600101915050613033565b5050505050915091565b60006040516020016130c090614ae4565b60405160208183030381529060405280519060200120826040516020016130e79190614ab8565b604051602081830303815290604052805190602001201480613152575060405160200161311390614acf565b604051602081830303815290604052805190602001208260405160200161313a9190614ab8565b60405160208183030381529060405280519060200120145b8061315e575060008251145b1561316c576000905061318b565b60008251905060ff81111561318557600091505061318b565b60019150505b919050565b60008060016020601f855101816131a357fe5b040190506040518481526020810160005b838110156131d55780602002860151816020028301528060010190506131b4565b5060208260208502604001846000600f600019f1935050505092915050565b600073d2001000000000000000000000000000000000d273ffffffffffffffffffffffffffffffffffffffff166383e781fe6040518163ffffffff1660e01b815260040160206040518083038186803b15801561325057600080fd5b505afa158015613264573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506132889190810190613e2f565b905090565b6000606061329a83612ac9565b90506000600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b82518110156133ab5760008260010184600184038151811061330457fe5b60200260200101516040516133199190614aa1565b90815260200160405180910390205411613368576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161335f90614cb3565b60405180910390fd5b8160020183600183038151811061337b57fe5b60200260200101516040516133909190614aa1565b908152602001604051809103902091508060010190506132e6565b50606060018351116133bd57846133d6565b826001845103815181106133cd57fe5b60200260200101515b9050600082600101826040516133ec9190614ab8565b9081526020016040518091039020541161343b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161343290614cb3565b60405180910390fd5b600082600001600184600101846040516134559190614ab8565b908152602001604051809103902054038154811061346f57fe5b906000526020600020906005020190508094505050505092915050565b60008060016020601f8551018161349f57fe5b04019050600060016020601f885101816134b557fe5b040190506040518781526020810160005b838110156134e75780602002890151816020028301528060010190506134c6565b50868360200282015260005b8481101561351957806020028701518185600101016020028301528060010190506134f3565b50602082848601602002606001846000600c600019f1945050505050949350505050565b6000613547613c45565b600060016020601f8851018161355957fe5b0401905060006020601f86018161356c57fe5b0490506040518881526020810160005b8481101561359d57806020028a01518160200283015280600101905061357c565b5083602002810188815287816020015283602002868660030160200285600a600019fa9650505050505094509492505050565b60008060016020601f855101816135e357fe5b040190506040518481526020810160005b838110156136155780602002860151816020028301528060010190506135f4565b50602082602085026040018460006011600019f1935050505092915050565b60008060016020601f8651018161364757fe5b040190506040518581526020810160005b83811015613679578060200287015181602002830152806001019050613658565b50846020840282015260208260208502604001846000600b600019f193505050509392505050565b60008060016020601f855101816136b457fe5b040190506040518481526020810160005b838110156136e65780602002860151816020028301528060010190506136c5565b5060208260208502604001846000600e600019f1935050505092915050565b600080600060016020601f8651018161371a57fe5b040190506040518581526020810160005b8381101561374c57806020028701518160200283015280600101905061372b565b506020826020850260200184600d600019fa9450815193505050509250929050565b613776613c6a565b600060208301905060405180604001604052808451815260200182815250915050919050565b60008082600001516137c0856000015186602001518660000151876020015161388d565b0190505b8360000151846020015101811161380a578180600101925050826000015161380285602001518303866000015103838660000151876020015161388d565b0190506137c4565b5092915050565b613819613c6a565b613824838383613968565b5092915050565b60608082600001516040519080825280601f01601f1916602001820160405280156138655781602001600182028038833980820191505090505b50905060006020820190506138838185602001518660000151613a06565b8192505050919050565b6000808490506000868511613958576020851161391257600060018660200360080260020a031960001b905060008186511690506000878a8a0103905060008386511690505b828114613904578186106138f1578a8a019650505050505050613960565b85806001019650508386511690506138d3565b859650505050505050613960565b60008585209050600091505b85880382116139565760008684209050808214156139425783945050505050613960565b60018401935050818060010192505061391e565b505b868601925050505b949350505050565b613970613c6a565b600061398e856000015186602001518660000151876020015161388d565b905084602001518360200181815250508460200151810383600001818152505084600001518560200151018114156139d05760008560000181815250506139fb565b8360000151836000015101856000018181510391508181525050836000015181018560200181815250505b829150509392505050565b5b60208110613a2a5781518352602083019250602082019150602081039050613a07565b60006001826020036101000a0390508019835116818551168181178652505050505050565b6040518060a00160405280606081526020016000151581526020016000815260200160006002811115613a7e57fe5b8152602001606081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613acc57805160ff1916838001178555613afa565b82800160010185558215613afa579182015b82811115613af9578251825591602001919060010190613ade565b5b509050613b079190613c84565b5090565b82805482825590600052602060002090601f01602090048101928215613ba05791602002820160005b83821115613b7157835183826101000a81548160ff0219169083151502179055509260200192600101602081600001049283019260010302613b34565b8015613b9e5782816101000a81549060ff0219169055600101602081600001049283019260010302613b71565b505b509050613bad9190613ca9565b5090565b50805460018160011615610100020316600290046000825580601f10613bd75750613bf6565b601f016020900490600052602060002090810190613bf59190613c84565b5b50565b50805460008255601f016020900490600052602060002090810190613c1e9190613c84565b50565b5080546000825560050290600052602060002090810190613c429190613cd9565b50565b6040518062100000016040528061800090602082028038833980820191505090505090565b604051806040016040528060008152602001600081525090565b613ca691905b80821115613ca2576000816000905550600101613c8a565b5090565b90565b613cd691905b80821115613cd257600081816101000a81549060ff021916905550600101613caf565b5090565b90565b613d4591905b80821115613d415760008082016000613cf89190613bb1565b6001820160006101000a81549060ff021916905560028201600090556003820160006101000a81549060ff0219169055600482016000613d389190613bf9565b50600501613cdf565b5090565b90565b600081359050613d578161510d565b92915050565b600081519050613d6c8161510d565b92915050565b600082601f830112613d8357600080fd5b8135613d96613d9182614efb565b614ece565b91508082526020830160208301858383011115613db257600080fd5b613dbd8382846150ad565b50505092915050565b600082601f830112613dd757600080fd5b8135613dea613de582614f27565b614ece565b91508082526020830160208301858383011115613e0657600080fd5b613e118382846150ad565b50505092915050565b600081359050613e2981615124565b92915050565b600060208284031215613e4157600080fd5b6000613e4f84828501613d5d565b91505092915050565b60008060408385031215613e6b57600080fd5b6000613e7985828601613d48565b9250506020613e8a85828601613e1a565b9150509250929050565b600060208284031215613ea657600080fd5b600082013567ffffffffffffffff811115613ec057600080fd5b613ecc84828501613dc6565b91505092915050565b60008060408385031215613ee857600080fd5b600083013567ffffffffffffffff811115613f0257600080fd5b613f0e85828601613dc6565b9250506020613f1f85828601613e1a565b9150509250929050565b600080600060608486031215613f3e57600080fd5b600084013567ffffffffffffffff811115613f5857600080fd5b613f6486828701613dc6565b9350506020613f7586828701613e1a565b925050604084013567ffffffffffffffff811115613f9257600080fd5b613f9e86828701613d72565b9150509250925092565b600080600060608486031215613fbd57600080fd5b600084013567ffffffffffffffff811115613fd757600080fd5b613fe386828701613dc6565b9350506020613ff486828701613e1a565b925050604061400586828701613e1a565b9150509250925092565b600061401b838361417d565b60208301905092915050565b6000614033838361418c565b60208301905092915050565b600061404b8383614a06565b905092915050565b600061405e82614f7d565b6140688185614fdc565b935061407383614f53565b8060005b838110156140a457815161408b888261400f565b975061409683614fb5565b925050600181019050614077565b5085935050505092915050565b6140ba81614f88565b6140c48184614fed565b92506140cf82614f63565b8060005b838110156141005781516140e78782614027565b96506140f283614fc2565b9250506001810190506140d3565b505050505050565b600061411382614f94565b61411d8185614ff8565b93508360208202850161412f85614f6d565b8060005b8581101561416b578484038952815161414c858261403f565b945061415783614fcf565b925060208a01995050600181019050614133565b50829750879550505050505092915050565b61418681615048565b82525050565b61419581615054565b82525050565b6141a48161509b565b82525050565b6141b38161509b565b82525050565b60006141c482614faa565b6141ce818561502b565b93506141de8185602086016150bc565b80840191505092915050565b60006141f582614f9f565b6141ff8185615009565b935061420f8185602086016150bc565b614218816150ef565b840191505092915050565b600061422e82614f9f565b614238818561502b565b93506142488185602086016150bc565b80840191505092915050565b600061426160188361501a565b91507f496e636f7272656374206368756e6b20706f736974696f6e00000000000000006000830152602082019050919050565b60006142a160158361501a565b91507f4469726563746f7279206e6f74206372656174656400000000000000000000006000830152602082019050919050565b60006142e160248361501a565b91507f4e6f7420656e6f756768206d656d6f727920696e207468652046696c6573746f60008301527f72616765000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614347601b8361501a565b91507f48617368206861736e2774206265656e2063616c63756c6174656400000000006000830152602082019050919050565b600061438760198361501a565b91507f4368756e6b20697320616c72656164792075706c6f61646564000000000000006000830152602082019050919050565b60006143c760168361501a565b91507f496e636f7272656374206368756e6b206c656e677468000000000000000000006000830152602082019050919050565b6000614407600f8361501a565b91507f46696c65206e6f742065786973747300000000000000000000000000000000006000830152602082019050919050565b6000614447600e8361501a565b91507f496e76616c69642073656e6465720000000000000000000000000000000000006000830152602082019050919050565b600061448760188361501a565b91507f4469726563746f7279206973206e6f742064656c6574656400000000000000006000830152602082019050919050565b60006144c760108361501a565b91507f46696c65206e6f742064656c65746564000000000000000000000000000000006000830152602082019050919050565b600061450760138361501a565b91507f496e76616c69642073746f7261676550617468000000000000000000000000006000830152602082019050919050565b6000614547600c8361501a565b91507f496e76616c6964207061746800000000000000000000000000000000000000006000830152602082019050919050565b600061458760018361502b565b91507f2e000000000000000000000000000000000000000000000000000000000000006000830152600182019050919050565b60006145c760168361501a565b91507f496e76616c6964206469726563746f7279206e616d65000000000000000000006000830152602082019050919050565b600061460760158361501a565b91507f4368756e6b207761736e27742075706c6f6164656400000000000000000000006000830152602082019050919050565b600061464760268361501a565b91507f436f756c64206e6f742072657365727665206c657373207468616e207573656460008301527f20737061636500000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006146ad60168361501a565b91507f4469726563746f7279206973206e6f7420656d707479000000000000000000006000830152602082019050919050565b60006146ed60238361501a565b91507f46696c65206861736e2774206265656e2075706c6f6164656420636f7272656360008301527f746c7900000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061475360118361501a565b91507f4368756e6b207761736e277420726561640000000000000000000000000000006000830152602082019050919050565b600061479360188361501a565b91507f46696c656e616d652073686f756c64206265203c2032353600000000000000006000830152602082019050919050565b60006147d3601f8361501a565b91507f46696c652073686f756c64206265206c657373207468616e20313030204d42006000830152602082019050919050565b600061481360028361502b565b91507f2e2e0000000000000000000000000000000000000000000000000000000000006000830152600282019050919050565b600061485360118361501a565b91507f4469726563746f72792069732066756c6c0000000000000000000000000000006000830152602082019050919050565b6000614893600e8361501a565b91507f46696c65206e6f7420666f756e640000000000000000000000000000000000006000830152602082019050919050565b60006148d360188361501a565b91507f46696c65206f72206469726563746f72792065786973747300000000000000006000830152602082019050919050565b600061491360198361501a565b91507f4e6f7420656e6f756768207265736572766564207370616365000000000000006000830152602082019050919050565b600061495360188361501a565b91507f45564d206572726f7220696e2067657446696c6553697a6500000000000000006000830152602082019050919050565b600061499360108361501a565b91507f46696c65206e6f742063726561746564000000000000000000000000000000006000830152602082019050919050565b60006149d360198361501a565b91507f46696c65206861736e2774206265656e2075706c6f61646564000000000000006000830152602082019050919050565b600060a0830160008301518482036000860152614a2382826141ea565b9150506020830151614a38602086018261417d565b506040830151614a4b6040860182614a83565b506060830151614a5e606086018261419b565b5060808301518482036080860152614a768282614053565b9150508091505092915050565b614a8c81615091565b82525050565b614a9b81615091565b82525050565b6000614aad8284614223565b915081905092915050565b6000614ac482846141b9565b915081905092915050565b6000614ada8261457a565b9150819050919050565b6000614aef82614806565b9150819050919050565b60006210000082019050614b1060008301846140b1565b92915050565b60006020820190508181036000830152614b308184614108565b905092915050565b6000602082019050614b4d60008301846141aa565b92915050565b60006020820190508181036000830152614b6c81614254565b9050919050565b60006020820190508181036000830152614b8c81614294565b9050919050565b60006020820190508181036000830152614bac816142d4565b9050919050565b60006020820190508181036000830152614bcc8161433a565b9050919050565b60006020820190508181036000830152614bec8161437a565b9050919050565b60006020820190508181036000830152614c0c816143ba565b9050919050565b60006020820190508181036000830152614c2c816143fa565b9050919050565b60006020820190508181036000830152614c4c8161443a565b9050919050565b60006020820190508181036000830152614c6c8161447a565b9050919050565b60006020820190508181036000830152614c8c816144ba565b9050919050565b60006020820190508181036000830152614cac816144fa565b9050919050565b60006020820190508181036000830152614ccc8161453a565b9050919050565b60006020820190508181036000830152614cec816145ba565b9050919050565b60006020820190508181036000830152614d0c816145fa565b9050919050565b60006020820190508181036000830152614d2c8161463a565b9050919050565b60006020820190508181036000830152614d4c816146a0565b9050919050565b60006020820190508181036000830152614d6c816146e0565b9050919050565b60006020820190508181036000830152614d8c81614746565b9050919050565b60006020820190508181036000830152614dac81614786565b9050919050565b60006020820190508181036000830152614dcc816147c6565b9050919050565b60006020820190508181036000830152614dec81614846565b9050919050565b60006020820190508181036000830152614e0c81614886565b9050919050565b60006020820190508181036000830152614e2c816148c6565b9050919050565b60006020820190508181036000830152614e4c81614906565b9050919050565b60006020820190508181036000830152614e6c81614946565b9050919050565b60006020820190508181036000830152614e8c81614986565b9050919050565b60006020820190508181036000830152614eac816149c6565b9050919050565b6000602082019050614ec86000830184614a92565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614ef157600080fd5b8060405250919050565b600067ffffffffffffffff821115614f1257600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614f3e57600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050919050565b6000819050602082019050919050565b600081519050919050565b60006180009050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061504182615071565b9050919050565b60008115159050919050565b6000819050919050565b600081905061506c82615100565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006150a68261505e565b9050919050565b82818337600083830152505050565b60005b838110156150da5780820151818401526020810190506150bf565b838111156150e9576000848401525b50505050565b6000601f19601f8301169050919050565b6003811061510a57fe5b50565b61511681615036565b811461512157600080fd5b50565b61512d81615091565b811461513857600080fd5b5056fea2646970667358221220a549ad9e778ae8bb3048c0a1805e77745871cc1560637ae1c3ebccb76638d9c464736f6c63430006020033", + "nonce": "0", + "storage": {} + }, + "0xa096b05a489831db893fc53aacc7ed20efb36382": { + "balance": "1000000000000000000000000000000" + }, + "0xa1cd651d99283be60e2a9d2e3bc8a90aedb8244f": { + "balance": "1000000000000000000000000000000" + }, + "0xa2969e82619021ea407338f8bdf7c6f2bd679673": { + "balance": "1000000000000000000000000000000" + }, + "0xa3597b1162b6559cb5e966904b63e762ece756a4": { + "balance": "1000000000000000000000000000000" + }, + "0xa68f946090c600eda6f139783077ee802afeb990": { + "balance": "1000000000000000000000000000000" + }, + "0xa6d50055592cecb795bc1ed3b9ea57ed426b0b7c": { + "balance": "1000000000000000000000000000000" + }, + "0xa7c0789bdeee38c6b59111a789dfb6b815489847": { + "balance": "1000000000000000000000000000000" + }, + "0xa8c813ee806b4c8537ff5f16084d44db18ea9ab1": { + "balance": "1000000000000000000000000000000" + }, + "0xaa6a87bbb74bc1f3cb40c1efb7fc171ee6407560": { + "balance": "1000000000000000000000000000000" + }, + "0xabf920b89f5a2487fdb70be17fd01a99a0602e62": { + "balance": "1000000000000000000000000000000" + }, + "0xac5df92da5171ba24a9618018b4f79494040334b": { + "balance": "1000000000000000000000000000000" + }, + "0xaf97a8318a1a51d5daeeb9650024b63ee44f45bd": { + "balance": "1000000000000000000000000000000" + }, + "0xb28c45b98ae43a5e9ee5509c97ea037b5de5d6d9": { + "balance": "1000000000000000000000000000000" + }, + "0xb64989ab32b089da3da103b93e6781d6d5dd10b4": { + "balance": "1000000000000000000000000000000" + }, + "0xb67e6f4a21f93c250fa6ff0cb142bd14dd4ca8eb": { + "balance": "1000000000000000000000000000000" + }, + "0xb70603c505f85130b5b2e73cd82d196dfd7d8b5e": { + "balance": "1000000000000000000000000000000" + }, + "0xb942414cae2a1ab1056657b905845c0ab6b6280a": { + "balance": "1000000000000000000000000000000" + }, + "0xbee0e5c1961d51be9bd670876caa9c90ba7d9016": { + "balance": "1000000000000000000000000000000" + }, + "0xbf2d8cebdeeb8ad8fed7b2a75f35922106f8d75c": { + "balance": "1000000000000000000000000000000" + }, + "0xbf5aa678b969c0871e2fbcf09c3dbb5d5865ac1e": { + "balance": "1000000000000000000000000000000" + }, + "0xc12bcedd9bcad9120150122cd50f39576ecccc08": { + "balance": "1000000000000000000000000000000" + }, + "0xc2d3852f3292acb81bd164dbae5f1e2a87535150": { + "balance": "1000000000000000000000000000000" + }, + "0xc3820490201e94d76b44655d2df713fec29d9795": { + "balance": "1000000000000000000000000000000" + }, + "0xc58744e2eceefd45cc5469f0e0a708ad24ddbbdb": { + "balance": "1000000000000000000000000000000" + }, + "0xc7865200e8e51ba1c8d695f327deed432930f2cc": { + "balance": "1000000000000000000000000000000" + }, + "0xc8e4d709eb3eb335dc69c9fbf2d24d447cb86105": { + "balance": "1000000000000000000000000000000" + }, + "0xc98af661e44c5bf31d2f8bdff4bbf2808ed4e991": { + "balance": "1000000000000000000000000000000" + }, + "0xca4409573a5129a72edf85d6c51e26760fc9c903": { + "balance": "100000000000000000000000" + }, + "0xcc33e23b04b74f7ba8fbe315083182224af973fa": { + "balance": "1000000000000000000000000000000" + }, + "0xce1c62d0a77600fb2f959b4da76fcb9b3b9430a3": { + "balance": "1000000000000000000000000000000" + }, + "0xd1b6c947fb14060b38945584714491592e84875d": { + "balance": "1000000000000000000000000000000" + }, + "0xd23cd6a9ddcc3470300003621bbac1e06a7919d5": { + "balance": "1000000000000000000000000000000" + }, + "0xd2c5b39B4e735C17612Bb5a08FD024ccc5dBCb23": { + "balance": "100000000000000000000000" + }, + "0xd2cd302eb060e375a65d65946692a3ac2d838d35": { + "balance": "1000000000000000000000000000000" + }, + "0xd2e75c41ced8699e3176f6e335355701a2568b7b": { + "balance": "1000000000000000000000000000000" + }, + "0xd3d38f4cb0aeb4c7c2527ddaeec2ab3b910c8528": { + "balance": "1000000000000000000000000000000" + }, + "0xd5b561a27cca5049650a14ab93dbf1a20c0cefc1": { + "balance": "1000000000000000000000000000000" + }, + "0xd90045420b8abc37b3f9304ed2b385fc1b7fa8c5": { + "balance": "1000000000000000000000000000000" + }, + "0xd951bf4cff429062702a7d8699a5f0bf14845d9b": { + "balance": "1000000000000000000000000000000" + }, + "0xdc6a269c58e58a93a22b5df8cdf1af630c47481f": { + "balance": "1000000000000000000000000000000" + }, + "0xdc6d02ef4003a4f2d0ccff65ae1a2d8157fbb23e": { + "balance": "1000000000000000000000000000000" + }, + "0xde14aca36acc62c305a7ee571da37840a408e600": { + "balance": "1000000000000000000000000000000" + }, + "0xdee32ae508cf783f53ab8bc39d878fe323cdfae3": { + "balance": "1000000000000000000000000000000" + }, + "0xe083a100d51fc4f38aae4a3a68404c36ad96c612": { + "balance": "1000000000000000000000000000000" + }, + "0xe1607990ce800407e3c206e58de4917977181d4d": { + "balance": "1000000000000000000000000000000" + }, + "0xe25e5b63dfd4cf59b81eddf64f1195858634b8a6": { + "balance": "1000000000000000000000000000000" + }, + "0xe372377decb3bdc0c7f5272d38ce0ba2a54934fe": { + "balance": "1000000000000000000000000000000" + }, + "0xe3cc6ec63b5652d1594bc63bb293f4e80f76dbdd": { + "balance": "1000000000000000000000000000000" + }, + "0xe3da7c014286258944ab20a31e4d861b4c9262f1": { + "balance": "1000000000000000000000000000000" + }, + "0xe8b57f330d56081c856e618210fbedb414925ff0": { + "balance": "1000000000000000000000000000000" + }, + "0xe91ac72a568e752eb7c9f5235100586ce97c8cc1": { + "balance": "1000000000000000000000000000000" + }, + "0xf184c8c243a178c1748a0af45caedeca476105b4": { + "balance": "1000000000000000000000000000000" + }, + "0xf1a5912ff318aebf312cdb54c75642a9e632703c": { + "balance": "1000000000000000000000000000000" + }, + "0xf2197b153b4c9086fc5410431fbf7960d284c65e": { + "balance": "1000000000000000000000000000000" + }, + "0xf36620e71327f4a55d550d46e030ccf0c728f154": { + "balance": "1000000000000000000000000000000" + }, + "0xf9817fB82fc767aA9A4A97a1901676244b88ce0E": { + "balance": "100000000000000000000000" + }, + "0xfa723938fa8da1a8a2114ad409a11581761ee40d": { + "balance": "1000000000000000000000000000000" + }, + "0xfa7a8c69810eaf16a395d2a93b3ab51efeed2a1c": { + "balance": "1000000000000000000000000000000" + }, + "0xfaa1038074941571524934ba52d312e88b3577f5": { + "balance": "1000000000000000000000000000000" + }, + "0xfe14077c26a507496b7208384d459e21c49c4212": { + "balance": "1000000000000000000000000000000" + }, + "0xfe275c9b5ac792327da509b27eb9614196dfb07d": { + "balance": "1000000000000000000000000000000" + }, + "0xfe2c5aa110fff89361806ea7ee080bfffba0d3dd": { + "balance": "1000000000000000000000000000000" + }, + "0xfe3d4f1fc038f4f756ba44995129cd45c9e0e861": { + "balance": "1000000000000000000000000000000" + }, + "0xfee314cdc84ecfaa675e41b3559c0101e1eba6b8": { + "balance": "1000000000000000000000000000000" + } + }, + "genesis": { + "author": "0x0000000000000000000000000000000000000001", + "difficulty": "0x0", + "extraData": "0x11bbe8db4e347b4e8c937c1c8370e4b5ed33adb3db69cbdb7a38e1e50b1b82fa", + "gasLimit": "0xFFFFFFFFF", + "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000abc", + "nonce": "0x0000000000000042", + "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "timestamp": "0x00" + }, + "params": { + "EIP150ForkBlock": "0x00", + "EIP158ForkBlock": "0x00", + "accountStartNonce": "0x00", + "blockReward": "0x4563918244F40000", + "byzantiumForkBlock": "0x0", + "chainID": "0x12345", + "constantinopleForkBlock": "0x0", + "daoHardforkBlock": "0x0", + "difficultyBoundDivisor": "0x0800", + "durationLimit": "0x0d", + "externalGasDifficulty": "0x01", + "gasLimitBoundDivisor": "0x0400", + "homesteadForkBlock": "0x0", + "maxGasLimit": "0xFFFFFFFFF", + "maximumExtraDataSize": "0x20", + "minGasLimit": "0xFFFFFFFFF", + "minimumDifficulty": "0x0", + "networkID": "12313219", + "tieBreakingGas": false + }, + "sealEngine": "Ethash", + "skaleConfig": { + "nodeInfo": { + "basePort": 1431, + "bindIP": "0.0.0.0", + "collectionDuration": 10, + "collectionQueueSize": 2, + "db-path": "/tmp/test_eth_3_of_4", + "ecdsaKeyName": "", + "httpRpcPort": 1434, + "httpsRpcPort": 1239, + "logLevel": "info", + "logLevelProposal": "info", + "maxCacheSize": 2000, + "maxOpenLeveldbFiles": 25, + "minCacheSize": 1000, + "nodeID": 403, + "nodeName": "Node1", + "rotateAfterBlock": 0, + "testSignatures": true, + "transactionQueueSize": 10000, + "wsRpcPort": 1433, + "wssRpcPort": 1438 + }, + "sChain": { + "EIP1559TransactionsPatchTimestamp": 1, + "contractStorageLimit": 10000000000, + "contractStoragePatchTimestamp": 1, + "contractStorageZeroValuePatchTimestamp": 1, + "correctForkInPowPatchTimestamp": 1, + "emptyBlockIntervalMs": 10000, + "fastConsensusPatchTimestamp": 1, + "flexibleDeploymentPatchTimestamp": 1, + "levelDBReopenIntervalMs": 1, + "multiTransactionMode": false, + "nodes": [ + { + "basePort": 1231, + "ip": "127.0.0.1", + "nodeID": 401, + "publicKey": "", + "schainIndex": 1 + }, + { + "basePort": 1331, + "ip": "127.0.0.1", + "nodeID": 402, + "publicKey": "", + "schainIndex": 2 + }, + { + "basePort": 1431, + "ip": "127.0.0.1", + "nodeID": 403, + "publicKey": "", + "schainIndex": 3 + }, + { + "basePort": 1531, + "ip": "127.0.0.1", + "nodeID": 404, + "publicKey": "", + "schainIndex": 4 + } + ], + "powCheckPatchTimestamp": 1, + "precompiledConfigPatchTimestamp": 1, + "pushZeroPatchTimestamp": 1, + "revertableFSPatchTimestamp": 1, + "schainID": 5, + "schainName": "TestChain", + "schainOwner": "0x907cd0881E50d359bb9Fd120B1A5A143b1C97De6", + "skipInvalidTransactionsPatchTimestamp": 1, + "storageDestructionPatchTimestamp": 1, + "verifyBlsSyncPatchTimestamp": 1, + "verifyDaSigsPatchTimestamp": 1 + } + }, + "unddos": { + "origins": [ + { + "ban_lengthy": 0, + "ban_peak": 0, + "max_calls_per_minute": 1000000000, + "max_calls_per_second": 1000000000, + "max_ws_conn": 65535, + "origin": [ + "*" + ] + } + ] + } +} \ No newline at end of file diff --git a/test/historicstate/configs/test_4_of_16.json b/test/historicstate/configs/test_4_of_16.json new file mode 100644 index 000000000..250d58e14 --- /dev/null +++ b/test/historicstate/configs/test_4_of_16.json @@ -0,0 +1,910 @@ +{ + "accounts": { + "0000000000000000000000000000000000000001": { + "precompiled": { + "linear": { + "base": 3000, + "word": 0 + }, + "name": "ecrecover" + } + }, + "0000000000000000000000000000000000000002": { + "precompiled": { + "linear": { + "base": 60, + "word": 12 + }, + "name": "sha256" + } + }, + "0000000000000000000000000000000000000003": { + "precompiled": { + "linear": { + "base": 600, + "word": 120 + }, + "name": "ripemd160" + } + }, + "0000000000000000000000000000000000000004": { + "precompiled": { + "linear": { + "base": 15, + "word": 3 + }, + "name": "identity" + } + }, + "0000000000000000000000000000000000000005": { + "precompiled": { + "name": "modexp", + "startingBlock": "0x2dc6c0" + } + }, + "0000000000000000000000000000000000000006": { + "precompiled": { + "linear": { + "base": 500, + "word": 0 + }, + "name": "alt_bn128_G1_add", + "startingBlock": "0x2dc6c0" + } + }, + "0000000000000000000000000000000000000007": { + "precompiled": { + "linear": { + "base": 40000, + "word": 0 + }, + "name": "alt_bn128_G1_mul", + "startingBlock": "0x2dc6c0" + } + }, + "0000000000000000000000000000000000000008": { + "precompiled": { + "name": "alt_bn128_pairing_product", + "startingBlock": "0x2dc6c0" + } + }, + "000000000000000000000000000000000000000A": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "readChunk", + "startingBlock": "0x0" + } + }, + "000000000000000000000000000000000000000B": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "createFile", + "restrictAccess": [ + "69362535ec535F0643cBf62D16aDeDCAf32Ee6F7" + ], + "startingBlock": "0x0" + } + }, + "000000000000000000000000000000000000000C": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "uploadChunk", + "startingBlock": "0x0" + } + }, + "000000000000000000000000000000000000000D": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "getFileSize", + "startingBlock": "0x0" + } + }, + "000000000000000000000000000000000000000E": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "deleteFile", + "startingBlock": "0x0" + } + }, + "000000000000000000000000000000000000000F": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "createDirectory", + "startingBlock": "0x0" + } + }, + "0000000000000000000000000000000000000010": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "deleteDirectory", + "startingBlock": "0x0" + } + }, + "0x006d8e49ce0b9eb5646e34a4d91934801b9044fd": { + "balance": "1000000000000000000000000000000" + }, + "0x0150b461b06922a5030784ba888962c28bb1f188": { + "balance": "1000000000000000000000000000000" + }, + "0x03309956988ae70152ae4469daf99b0cac2306c5": { + "balance": "1000000000000000000000000000000" + }, + "0x06104a85a380895b6dd4030113806df2b044905e": { + "balance": "1000000000000000000000000000000" + }, + "0x079cf317ef40b16141784b6fabff812d64f7c0fd": { + "balance": "1000000000000000000000000000000" + }, + "0x0966454f51166c68b73b2865473c8fb2fcdefdd5": { + "balance": "1000000000000000000000000000000" + }, + "0x099452fedc71897880f584b1bc1706efc4e76e36": { + "balance": "1000000000000000000000000000000" + }, + "0x0aa6a44690ef52354e976990292cf9c5cd36ad59": { + "balance": "1000000000000000000000000000000" + }, + "0x0fbbe17a0e5a61ee3e8661f442d7f6b177c49820": { + "balance": "1000000000000000000000000000000" + }, + "0x1239fe658b410dbbac5bbd572035f5041542f9e5": { + "balance": "1000000000000000000000000000000" + }, + "0x12d5d7340a93be7be28ea7a3ae198242f8e1282c": { + "balance": "1000000000000000000000000000000" + }, + "0x137048b9fa4f1234d6519271b2c5ec64f480db0f": { + "balance": "1000000000000000000000000000000" + }, + "0x13867af77a63048e17380e39248ada90521e97e4": { + "balance": "1000000000000000000000000000000" + }, + "0x138ea4bdf0382c2deffd5b0bff0afe59f471467f": { + "balance": "1000000000000000000000000000000" + }, + "0x13d19c55ee0a212249d26b9d741ff6d7f416db01": { + "balance": "1000000000000000000000000000000" + }, + "0x157d38b52196b248e9fe6a2172e32ce2b8c078e6": { + "balance": "1000000000000000000000000000000" + }, + "0x16e8c390f8e576161cfe966f2c3e5dd303eb9039": { + "balance": "1000000000000000000000000000000" + }, + "0x194cb9991d3d94c43e400becf21dfea45e7b3b4c": { + "balance": "1000000000000000000000000000000" + }, + "0x1C9abe4ff0CcECa40fc404c74AB7d4923fEF8901": { + "balance": "100000000000000000000000" + }, + "0x1a66fc89809112c20aa76a993db712fa9e003e4e": { + "balance": "1000000000000000000000000000000" + }, + "0x1f1d6041e12a18cf1202019f146f2fc150915e8d": { + "balance": "1000000000000000000000000000000" + }, + "0x1feaf1671c1f0faf0d44c152f72dc755db932569": { + "balance": "1000000000000000000000000000000" + }, + "0x236bf02dfafaf03851a4e6f5d69052f4884cec32": { + "balance": "1000000000000000000000000000000" + }, + "0x26d88f6a8b659be4165ee53774a057e41b5201c9": { + "balance": "1000000000000000000000000000000" + }, + "0x28353685b0b986a724b92113debb3d8cd9a6b263": { + "balance": "1000000000000000000000000000000" + }, + "0x29d83322219fdfb821459d5fdf796360faf3166a": { + "balance": "1000000000000000000000000000000" + }, + "0x2bee474be207bdbeac83d6672da5ed2fd417eac9": { + "balance": "1000000000000000000000000000000" + }, + "0x2d93455b07bccf38e8d019f7f43a2c2d70b46b4e": { + "balance": "1000000000000000000000000000000" + }, + "0x2f971bd38806c3ca45ae0a125d1267118bf5619c": { + "balance": "1000000000000000000000000000000" + }, + "0x30aaab366dfac8331f3e827495c789cde9b437c0": { + "balance": "1000000000000000000000000000000" + }, + "0x32ea0400dc2d20664cc4744b2fab04ecb709445c": { + "balance": "1000000000000000000000000000000" + }, + "0x3760dc9594ccac0f33ade5cc5371402131696341": { + "balance": "1000000000000000000000000000000" + }, + "0x38855e430611bc179cd777a8704679ffc43921de": { + "balance": "1000000000000000000000000000000" + }, + "0x3a921471a2397644c37c88ef9572c421ab37145d": { + "balance": "1000000000000000000000000000000" + }, + "0x3bcca8a8471d55a1a668bc163c0336e4a57e5c99": { + "balance": "1000000000000000000000000000000" + }, + "0x3d46ee560227c1d73cd6042b47fc8fddd8a06ecb": { + "balance": "1000000000000000000000000000000" + }, + "0x3f5bdf5d4c274c82b8d17aa2810b00d2cf050f24": { + "balance": "1000000000000000000000000000000" + }, + "0x3ffe1c9183e0f97f52a816405a7d2350624ec88b": { + "balance": "1000000000000000000000000000000" + }, + "0x426ec5f07847674aada3856609d8baaa16805d88": { + "balance": "1000000000000000000000000000000" + }, + "0x482d7f53cba6ae73a354533673c48e2dfd560949": { + "balance": "1000000000000000000000000000000" + }, + "0x48acbd6a2724eadcc2a11144ab84b6a617d1a241": { + "balance": "1000000000000000000000000000000" + }, + "0x49ef89840e400026eb5c8d79bd1b0adc152fe86d": { + "balance": "1000000000000000000000000000000" + }, + "0x4bf989fa6572af36b190032505506f1db888357f": { + "balance": "1000000000000000000000000000000" + }, + "0x4cf9b195f7cb5f86694d9b399fe21a5f34616fd3": { + "balance": "1000000000000000000000000000000" + }, + "0x4e9b85904bca60aeb5b916ca86ac622096908427": { + "balance": "1000000000000000000000000000000" + }, + "0x50120c17d7b59200e9b76e89e4e3de2f0cd00090": { + "balance": "1000000000000000000000000000000" + }, + "0x54db355342c35085a1a53184162b2fddd0a43b0f": { + "balance": "1000000000000000000000000000000" + }, + "0x54e228d8fea148cfe2b109b3b152ff21321d09a2": { + "balance": "1000000000000000000000000000000" + }, + "0x5667601b7dcde6f24d06bccc4f291cb06976f4ee": { + "balance": "1000000000000000000000000000000" + }, + "0x57829f2ecca390cd9d1c41f92328bad4d1073bbb": { + "balance": "1000000000000000000000000000000" + }, + "0x5EF25557E2ed6AFfF321B266C93e95A0B4B05AbC": { + "balance": "1000000000000000000000000" + }, + "0x5a3adad4382b3eb1e0c65f2de2845901081039b5": { + "balance": "1000000000000000000000000000000" + }, + "0x5cdb7392efdce502ccc6fba5c3c1dd1653967b4d": { + "balance": "1000000000000000000000000000000" + }, + "0x5d012c13b2854bda8b7b6580e97e52751884f827": { + "balance": "1000000000000000000000000000000" + }, + "0x5d9326c6504833d84f8a0d65ded59b1a6e768ca2": { + "balance": "1000000000000000000000000000000" + }, + "0x60268f799d8f1808e4a32c2eb898e73a8881f6f0": { + "balance": "1000000000000000000000000000000" + }, + "0x605ba4a05d779f9869bd9a10234c22f516766cfe": { + "balance": "1000000000000000000000000000000" + }, + "0x6093f0f2a7b5148b71603ac439adbc4c0e5aa5da": { + "balance": "1000000000000000000000000000000" + }, + "0x6196d135CdDb9d73A0756C1E44b5b02B11acf594": { + "balance": "2000000000000000000000", + "code": "", + "nonce": "5076", + "storage": {} + }, + "0x62712ceccb50f62ca4c5402fff6da9c819c866cf": { + "balance": "1000000000000000000000000000000" + }, + "0x62971de462ea1ec0d3b43a6a85b6fb975e6c6f64": { + "balance": "1000000000000000000000000000000" + }, + "0x62cf32dfb9eb6358dc5deb006aef1d75fb153e5f": { + "balance": "1000000000000000000000000000000" + }, + "0x62d8b22c1d71577829b2fee20a5c3fff43aed0ec": { + "balance": "100000000000000000000000" + }, + "0x6314956b78bb2eaed1c49b3ae71d4d0ec501cfab": { + "balance": "1000000000000000000000000000000" + }, + "0x661bda4daeba3ce9ac2aa30b80d463580f90d31a": { + "balance": "1000000000000000000000000000000" + }, + "0x66c5a87f4a49DD75e970055A265E8dd5C3F8f852": { + "balance": "1000000000000000000000" + }, + "0x66cd465ddcd85504c0d2cfb1728acee994d55a3f": { + "balance": "1000000000000000000000000000000" + }, + "0x68bca79ae7aae796027ff843d2303444da5cf5d8": { + "balance": "1000000000000000000000000000000" + }, + "0x6923877b65e24966efa9efd1207822fa2eaf601a": { + "balance": "1000000000000000000000000000000" + }, + "0x69362535ec535F0643cBf62D16aDeDCAf32Ee6F7": { + "balance": "0", + "code": "0x608060405234801561001057600080fd5b50600436106100b45760003560e01c806379210e8e1161007157806379210e8e1461017757806381a8235a146101a757806385aeeb17146101c35780639a9a5593146101f3578063a99100541461020f578063b57321221461022b576100b4565b806307c6e7d3146100b9578063122f4fba146100d55780631c6ec7a9146101055780631cfe4e3b14610121578063373dedb41461013d57806361e46db51461015b575b600080fd5b6100d360048036036100ce9190810190613cff565b61025b565b005b6100ef60048036036100ea9190810190613cff565b610804565b6040516100fc9190614963565b60405180910390f35b61011f600480360361011a9190810190613cff565b610b43565b005b61013b60048036036101369190810190613cc3565b610f72565b005b610145611190565b6040516101529190614cbe565b60405180910390f35b61017560048036036101709190810190613d94565b611199565b005b610191600480360361018c9190810190613e13565b6113f9565b60405161019e9190614924565b60405180910390f35b6101c160048036036101bc9190810190613cff565b6116f9565b005b6101dd60048036036101d89190810190613cff565b61189e565b6040516101ea9190614941565b60405180910390f35b61020d60048036036102089190810190613d40565b611b9d565b005b61022960048036036102249190810190613cff565b61202c565b005b61024560048036036102409190810190613cff565b612682565b6040516102529190614cbe565b60405180910390f35b6000339050606061026b83612902565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b825181101561037c576000826001018460018403815181106102d557fe5b60200260200101516040516102ea91906148cc565b90815260200160405180910390205411610339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161033090614ade565b60405180910390fd5b8160020183600183038151811061034c57fe5b602002602001015160405161036191906148cc565b908152602001604051809103902091508060010190506102b7565b506060600183511161038e57846103a7565b8260018451038151811061039e57fe5b60200260200101515b9050600082600101826040516103bd91906148e3565b9081526020016040518091039020541161040c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161040390614ade565b60405180910390fd5b6000826002018260405161042091906148e3565b90815260200160405180910390206000018054905014610475576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161046c90614b5e565b60405180910390fd5b60006104818587612b02565b9050806104c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ba90614a7e565b60405180910390fd5b6104cb613888565b836000016001856000018054905003815481106104e457fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156105965780601f1061056b57610100808354040283529160200191610596565b820191906000526020600020905b81548152906001019060200180831161057957829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff1660028111156105e257fe5b60028111156105ed57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561066557602002820191906000526020600020906000905b82829054906101000a900460ff1615158152602001906001019060208260000104928301926001038202915080841161062f5790505b505050505081525050905080846000016001866001018660405161068991906148e3565b90815260200160405180910390205403815481106106a357fe5b906000526020600020906005020160008201518160000190805190602001906106cd9291906138c4565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561071c57fe5b0217905550608082015181600401908051906020019061073d929190613944565b50905050836001018360405161075391906148e3565b90815260200160405180910390205484600101826000015160405161077891906148cc565b9081526020016040518091039020819055506000846001018460405161079e91906148e3565b908152602001604051809103902081905550836000018054809190600190036107c791906139ea565b5083600201836040516107da91906148e3565b9081526020016040518091039020600080820160006107f99190613a1c565b505050505050505050565b600080606061081284612b66565b91509150606061082182612902565b90506000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b82518110156109065760008260010184600184038151811061088b57fe5b60200260200101516040516108a091906148cc565b90815260200160405180910390205414156108c357600095505050505050610b3e565b816002018360018303815181106108d657fe5b60200260200101516040516108eb91906148cc565b9081526020016040518091039020915080600101905061086d565b50606060018351116109185783610931565b8260018451038151811061092857fe5b60200260200101515b90506000826001018260405161094791906148e3565b908152602001604051809103902054141561096a57600095505050505050610b3e565b610972613888565b826000016001846001018460405161098a91906148e3565b90815260200160405180910390205403815481106109a457fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610a565780601f10610a2b57610100808354040283529160200191610a56565b820191906000526020600020905b815481529060010190602001808311610a3957829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115610aa257fe5b6002811115610aad57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015610b2557602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411610aef5790505b5050505050815250509050806060015196505050505050505b919050565b600160009054906101000a900460ff16610b85576120006002819055506210000060038190555060018060006101000a81548160ff0219169083151502179055505b6000815111610bc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc090614ade565b60405180910390fd5b60003390506060610bd983612902565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015610cea57600082600101846001840381518110610c4357fe5b6020026020010151604051610c5891906148cc565b90815260200160405180910390205411610ca7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9e90614ade565b60405180910390fd5b81600201836001830381518110610cba57fe5b6020026020010151604051610ccf91906148cc565b90815260200160405180910390209150806001019050610c25565b50600254816000018054905010610d36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2d90614bfe565b60405180910390fd5b60606001835111610d475784610d60565b82600184510381518110610d5757fe5b60200260200101515b905060008260010182604051610d7691906148e3565b90815260200160405180910390205414610dc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbc90614c3e565b60405180910390fd5b610dce81612ee8565b610e0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0490614afe565b60405180910390fd5b6000610e198587612fc9565b905080610e5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e529061499e565b60405180910390fd5b610e63613888565b82816000018190525060008160200190151590811515815250508360000181908060018154018082558091505090600182039060005260206000209060050201600090919290919091506000820151816000019080519060200190610ec99291906138c4565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff02191690836002811115610f1857fe5b02179055506080820151816004019080519060200190610f39929190613944565b5050505083600001805490508460010184604051610f5791906148e3565b90815260200160405180910390208190555050505050505050565b610f7a61302d565b73ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161480610fdf57503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614155b61101e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101590614a5e565b60405180910390fd5b80600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411156110a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109790614b3e565b60405180910390fd5b600054600754820111156110e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e0906149be565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460076000828254039250508190555080600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550806007600082825401925050819055505050565b60008054905090565b600033905060006111aa82866130c6565b9050600160028111156111b957fe5b8160030160009054906101000a900460ff1660028111156111d657fe5b14611216576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120d90614c1e565b60405180910390fd5b6000600354858161122357fe5b061480156112345750806002015484105b611273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126a9061497e565b60405180910390fd5b600354848260020154031080156112905750838160020154038351145b8061129d57506003548351145b6112dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d390614a1e565b60405180910390fd5b600015158160040160035486816112ef57fe5b04815481106112fa57fe5b90600052602060002090602091828204019190069054906101000a900460ff1615151461135c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611353906149fe565b60405180910390fd5b600061136a838787876132c5565b9050806113ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a390614b1e565b60405180910390fd5b60018260040160035487816113bd57fe5b04815481106113c857fe5b90600052602060002090602091828204019190066101000a81548160ff021916908315150217905550505050505050565b611401613a40565b6000606061140e86612b66565b9150915061141a613888565b61142483836130c6565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156114c85780601f1061149d576101008083540402835291602001916114c8565b820191906000526020600020905b8154815290600101906020018083116114ab57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561151457fe5b600281111561151f57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561159757602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116115615790505b50505050508152505090506002808111156115ae57fe5b816060015160028111156115be57fe5b146115fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f590614c9e565b60405180910390fd5b60035485111580156116105750600085115b61164f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164690614a1e565b60405180910390fd5b80604001518587011115611698576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168f9061497e565b60405180910390fd5b60006116a684848989613376565b8096508192505050806116ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e590614b9e565b60405180910390fd5b505050509392505050565b6000339050600061170a82846130c6565b90506001600281111561171957fe5b8160030160009054906101000a900460ff16600281111561173657fe5b14611776576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176d90614c1e565b60405180910390fd5b60006001905060008260040180549050905060008090505b818110156117e157600015158460040182815481106117a957fe5b90600052602060002090602091828204019190069054906101000a900460ff16151514156117d657600092505b80600101905061178e565b5081611822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181990614b7e565b60405180910390fd5b60028360030160006101000a81548160ff0219169083600281111561184357fe5b021790555060006118548587613409565b905080611896576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188d906149de565b60405180910390fd5b505050505050565b6060600060606118ad84612b66565b9150915060606118bc82612902565b90506000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008090505b82518110156119c65760008260010184838151811061192257fe5b602002602001015160405161193791906148cc565b90815260200160405180910390205411611986576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197d90614ade565b60405180910390fd5b8160020183828151811061199657fe5b60200260200101516040516119ab91906148cc565b90815260200160405180910390209150806001019050611907565b5080600001805480602002602001604051908101604052809291908181526020016000905b82821015611b8e57838290600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611aa75780601f10611a7c57610100808354040283529160200191611aa7565b820191906000526020600020905b815481529060010190602001808311611a8a57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115611af357fe5b6002811115611afe57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015611b7657602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411611b405790505b505050505081525050815260200190600101906119eb565b50505050945050505050919050565b600160009054906101000a900460ff16611bdf576120006002819055506210000060038190555060018060006101000a81548160ff0219169083151502179055505b60003390506305f5e100821115611c2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2290614bde565b60405180910390fd5b6060611c3684612902565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015611d4757600082600101846001840381518110611ca057fe5b6020026020010151604051611cb591906148cc565b90815260200160405180910390205411611d04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cfb90614ade565b60405180910390fd5b81600201836001830381518110611d1757fe5b6020026020010151604051611d2c91906148cc565b90815260200160405180910390209150806001019050611c82565b5060606001835111611d595785611d72565b82600184510381518110611d6957fe5b60200260200101515b905060008260010182604051611d8891906148e3565b90815260200160405180910390205414611dd7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dce90614c3e565b60405180910390fd5b611de081612ee8565b611e1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1690614bbe565b60405180910390fd5b6000611e2c85888861346d565b905080611e6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6590614c7e565b60405180910390fd5b6060600354600160035489010381611e8257fe5b04604051908082528060200260200182016040528015611eb15781602001602082028038833980820191505090505b509050836000016040518060a0016040528085815260200160011515815260200189815260200160016002811115611ee557fe5b815260200183815250908060018154018082558091505090600182039060005260206000209060050201600090919290919091506000820151816000019080519060200190611f359291906138c4565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff02191690836002811115611f8457fe5b02179055506080820151816004019080519060200190611fa5929190613944565b5050505083600001805490508460010184604051611fc391906148e3565b90815260200160405180910390208190555086600560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505050505050505050565b6000339050612039613888565b61204382846130c6565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156120e75780601f106120bc576101008083540402835291602001916120e7565b820191906000526020600020905b8154815290600101906020018083116120ca57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561213357fe5b600281111561213e57fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156121b657602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116121805790505b5050505050815250509050600060028111156121ce57fe5b816060015160028111156121de57fe5b141561221f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221690614a3e565b60405180910390fd5b600061222b83856134da565b90508061226d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226490614a9e565b60405180910390fd5b606061227885612902565b90506000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b825181101561231057816002018360018303815181106122e057fe5b60200260200101516040516122f591906148cc565b908152602001604051809103902091508060010190506122c4565b506000600182600101866000015160405161232b91906148cc565b908152602001604051809103902054039050612345613888565b8260000160018460000180549050038154811061235e57fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156124105780601f106123e557610100808354040283529160200191612410565b820191906000526020600020905b8154815290600101906020018083116123f357829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561245c57fe5b600281111561246757fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156124df57602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116124a95790505b5050505050815250509050808360000183815481106124fa57fe5b906000526020600020906005020160008201518160000190805190602001906125249291906138c4565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561257357fe5b02179055506080820151816004019080519060200190612594929190613944565b50905050826000018054809190600190036125af91906139ea565b508260010186600001516040516125c691906148cc565b9081526020016040518091039020548360010182600001516040516125eb91906148cc565b908152602001604051809103902081905550600083600101876000015160405161261591906148cc565b9081526020016040518091039020819055508560400151600560008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505050505050505050565b600080606061269084612b66565b9150915061269c613888565b6126a683836130c6565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561274a5780601f1061271f5761010080835404028352916020019161274a565b820191906000526020600020905b81548152906001019060200180831161272d57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561279657fe5b60028111156127a157fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561281957602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116127e35790505b50505050508152505090506001600281111561283157fe5b8160600151600281111561284157fe5b1480612866575060028081111561285457fe5b8160600151600281111561286457fe5b145b6128a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161289c90614c1e565b60405180910390fd5b60006128b1848461353e565b8096508192505050806128f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128f090614c5e565b60405180910390fd5b50505050919050565b606061290c613a65565b612915836135a7565b905061291f613a65565b61295d6040518060400160405280600181526020017f2f000000000000000000000000000000000000000000000000000000000000008152506135a7565b90506060600161297683856135d590919063ffffffff16565b016040519080825280602002602001820160405280156129aa57816020015b60608152602001906001900390816129955790505b50905060008090505b81518110156129fb576129d76129d2848661364a90919063ffffffff16565b613664565b8282815181106129e357fe5b602002602001018190525080806001019150506129b3565b50600081600183510381518110612a0e57fe5b6020026020010151511415612a795780600182510381518110612a2d57fe5b6020026020010160608152506001815103604051908082528060200260200182016040528015612a7157816020015b6060815260200190600190039081612a5c5790505b509350612ab2565b8051604051908082528060200260200182016040528015612aae57816020015b6060815260200190600190039081612a995790505b5093505b60008090505b8451811015612af957818181518110612acd57fe5b6020026020010151858281518110612ae157fe5b60200260200101819052508080600101915050612ab8565b50505050919050565b60008060016020601f85510181612b1557fe5b040190506040518481526020810160005b83811015612b47578060200286015181602002830152806001019050612b26565b50602082602085026040018460006010600019f1935050505092915050565b6000606060006028905080845111612bb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612baa90614abe565b60405180910390fd5b6060816040519080825280601f01601f191660200182016040528015612be85781602001600182028038833980820191505090505b50905060008090505b82811015612c5857858181518110612c0557fe5b602001015160f81c60f81b828281518110612c1c57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050612bf1565b50600080905060008090505b83811015612d87576000838281518110612c7a57fe5b602001015160f81c60f81b60f81c60ff16905060308110158015612c9f575060398111155b80612cb8575060418110158015612cb75750605a8111155b5b80612cd1575060618110158015612cd0575060668111155b5b612d10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d0790614abe565b60405180910390fd5b60308110158015612d22575060398111155b15612d335760308103601084020192505b60418110158015612d455750605a8111155b15612d565760378103601084020192505b60618110158015612d68575060668111155b15612d795760578103601084020192505b508080600101915050612c64565b508094507f2f00000000000000000000000000000000000000000000000000000000000000868481518110612db857fe5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612e25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e1c90614abe565b60405180910390fd5b6000600184885103039050806040519080825280601f01601f191660200182016040528015612e635781602001600182028038833980820191505090505b50945060008090505b81811015612ede5760008860018784010181518110612e8757fe5b602001015160f81c60f81b905080878381518110612ea157fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350508080600101915050612e6c565b5050505050915091565b6000604051602001612ef99061490f565b6040516020818303038152906040528051906020012082604051602001612f2091906148e3565b604051602081830303815290604052805190602001201480612f8b5750604051602001612f4c906148fa565b6040516020818303038152906040528051906020012082604051602001612f7391906148e3565b60405160208183030381529060405280519060200120145b80612f97575060008251145b15612fa55760009050612fc4565b60008251905060ff811115612fbe576000915050612fc4565b60019150505b919050565b60008060016020601f85510181612fdc57fe5b040190506040518481526020810160005b8381101561300e578060200286015181602002830152806001019050612fed565b5060208260208502604001846000600f600019f1935050505092915050565b600073d2001000000000000000000000000000000000d273ffffffffffffffffffffffffffffffffffffffff166383e781fe6040518163ffffffff1660e01b815260040160206040518083038186803b15801561308957600080fd5b505afa15801561309d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506130c19190810190613c9a565b905090565b600060606130d383612902565b90506000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b82518110156131e45760008260010184600184038151811061313d57fe5b602002602001015160405161315291906148cc565b908152602001604051809103902054116131a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161319890614ade565b60405180910390fd5b816002018360018303815181106131b457fe5b60200260200101516040516131c991906148cc565b9081526020016040518091039020915080600101905061311f565b50606060018351116131f6578461320f565b8260018451038151811061320657fe5b60200260200101515b90506000826001018260405161322591906148e3565b90815260200160405180910390205411613274576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161326b90614ade565b60405180910390fd5b6000826000016001846001018460405161328e91906148e3565b90815260200160405180910390205403815481106132a857fe5b906000526020600020906005020190508094505050505092915050565b60008060016020601f855101816132d857fe5b04019050600060016020601f885101816132ee57fe5b040190506040518781526020810160005b838110156133205780602002890151816020028301528060010190506132ff565b50868360200282015260005b84811015613352578060200287015181856001010160200283015280600101905061332c565b50602082848601602002606001846000600c600019f1945050505050949350505050565b6000613380613a40565b600060016020601f8851018161339257fe5b0401905060006020601f8601816133a557fe5b0490506040518881526020810160005b848110156133d657806020028a0151816020028301528060010190506133b5565b5083602002810188815287816020015283602002868660030160200285600a600019fa9650505050505094509492505050565b60008060016020601f8551018161341c57fe5b040190506040518481526020810160005b8381101561344e57806020028601518160200283015280600101905061342d565b50602082602085026040018460006011600019f1935050505092915050565b60008060016020601f8651018161348057fe5b040190506040518581526020810160005b838110156134b2578060200287015181602002830152806001019050613491565b50846020840282015260208260208502604001846000600b600019f193505050509392505050565b60008060016020601f855101816134ed57fe5b040190506040518481526020810160005b8381101561351f5780602002860151816020028301528060010190506134fe565b5060208260208502604001846000600e600019f1935050505092915050565b600080600060016020601f8651018161355357fe5b040190506040518581526020810160005b83811015613585578060200287015181602002830152806001019050613564565b506020826020850260200184600d600019fa9450815193505050509250929050565b6135af613a65565b600060208301905060405180604001604052808451815260200182815250915050919050565b60008082600001516135f985600001518660200151866000015187602001516136c6565b0190505b83600001518460200151018111613643578180600101925050826000015161363b8560200151830386600001510383866000015187602001516136c6565b0190506135fd565b5092915050565b613652613a65565b61365d8383836137a1565b5092915050565b60608082600001516040519080825280601f01601f19166020018201604052801561369e5781602001600182028038833980820191505090505b50905060006020820190506136bc818560200151866000015161383f565b8192505050919050565b6000808490506000868511613791576020851161374b57600060018660200360080260020a031960001b905060008186511690506000878a8a0103905060008386511690505b82811461373d5781861061372a578a8a019650505050505050613799565b858060010196505083865116905061370c565b859650505050505050613799565b60008585209050600091505b858803821161378f57600086842090508082141561377b5783945050505050613799565b600184019350508180600101925050613757565b505b868601925050505b949350505050565b6137a9613a65565b60006137c785600001518660200151866000015187602001516136c6565b90508460200151836020018181525050846020015181038360000181815250508460000151856020015101811415613809576000856000018181525050613834565b8360000151836000015101856000018181510391508181525050836000015181018560200181815250505b829150509392505050565b5b602081106138635781518352602083019250602082019150602081039050613840565b60006001826020036101000a0390508019835116818551168181178652505050505050565b6040518060a001604052806060815260200160001515815260200160008152602001600060028111156138b757fe5b8152602001606081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061390557805160ff1916838001178555613933565b82800160010185558215613933579182015b82811115613932578251825591602001919060010190613917565b5b5090506139409190613a7f565b5090565b82805482825590600052602060002090601f016020900481019282156139d95791602002820160005b838211156139aa57835183826101000a81548160ff021916908315150217905550926020019260010160208160000104928301926001030261396d565b80156139d75782816101000a81549060ff02191690556001016020816000010492830192600103026139aa565b505b5090506139e69190613aa4565b5090565b815481835581811115613a1757600502816005028360005260206000209182019101613a169190613ad4565b5b505050565b5080546000825560050290600052602060002090810190613a3d9190613ad4565b50565b6040518062100000016040528061800090602082028038833980820191505090505090565b604051806040016040528060008152602001600081525090565b613aa191905b80821115613a9d576000816000905550600101613a85565b5090565b90565b613ad191905b80821115613acd57600081816101000a81549060ff021916905550600101613aaa565b5090565b90565b613b4091905b80821115613b3c5760008082016000613af39190613b43565b6001820160006101000a81549060ff021916905560028201600090556003820160006101000a81549060ff0219169055600482016000613b339190613b8b565b50600501613ada565b5090565b90565b50805460018160011615610100020316600290046000825580601f10613b695750613b88565b601f016020900490600052602060002090810190613b879190613a7f565b5b50565b50805460008255601f016020900490600052602060002090810190613bb09190613a7f565b50565b600081359050613bc281614f18565b92915050565b600081519050613bd781614f18565b92915050565b600082601f830112613bee57600080fd5b8135613c01613bfc82614d06565b614cd9565b91508082526020830160208301858383011115613c1d57600080fd5b613c28838284614eb8565b50505092915050565b600082601f830112613c4257600080fd5b8135613c55613c5082614d32565b614cd9565b91508082526020830160208301858383011115613c7157600080fd5b613c7c838284614eb8565b50505092915050565b600081359050613c9481614f2f565b92915050565b600060208284031215613cac57600080fd5b6000613cba84828501613bc8565b91505092915050565b60008060408385031215613cd657600080fd5b6000613ce485828601613bb3565b9250506020613cf585828601613c85565b9150509250929050565b600060208284031215613d1157600080fd5b600082013567ffffffffffffffff811115613d2b57600080fd5b613d3784828501613c31565b91505092915050565b60008060408385031215613d5357600080fd5b600083013567ffffffffffffffff811115613d6d57600080fd5b613d7985828601613c31565b9250506020613d8a85828601613c85565b9150509250929050565b600080600060608486031215613da957600080fd5b600084013567ffffffffffffffff811115613dc357600080fd5b613dcf86828701613c31565b9350506020613de086828701613c85565b925050604084013567ffffffffffffffff811115613dfd57600080fd5b613e0986828701613bdd565b9150509250925092565b600080600060608486031215613e2857600080fd5b600084013567ffffffffffffffff811115613e4257600080fd5b613e4e86828701613c31565b9350506020613e5f86828701613c85565b9250506040613e7086828701613c85565b9150509250925092565b6000613e868383613fe8565b60208301905092915050565b6000613e9e8383613ff7565b60208301905092915050565b6000613eb68383614831565b905092915050565b6000613ec982614d88565b613ed38185614de7565b9350613ede83614d5e565b8060005b83811015613f0f578151613ef68882613e7a565b9750613f0183614dc0565b925050600181019050613ee2565b5085935050505092915050565b613f2581614d93565b613f2f8184614df8565b9250613f3a82614d6e565b8060005b83811015613f6b578151613f528782613e92565b9650613f5d83614dcd565b925050600181019050613f3e565b505050505050565b6000613f7e82614d9f565b613f888185614e03565b935083602082028501613f9a85614d78565b8060005b85811015613fd65784840389528151613fb78582613eaa565b9450613fc283614dda565b925060208a01995050600181019050613f9e565b50829750879550505050505092915050565b613ff181614e53565b82525050565b61400081614e5f565b82525050565b61400f81614ea6565b82525050565b61401e81614ea6565b82525050565b600061402f82614db5565b6140398185614e36565b9350614049818560208601614ec7565b80840191505092915050565b600061406082614daa565b61406a8185614e14565b935061407a818560208601614ec7565b61408381614efa565b840191505092915050565b600061409982614daa565b6140a38185614e36565b93506140b3818560208601614ec7565b80840191505092915050565b60006140cc601883614e25565b91507f496e636f7272656374206368756e6b20706f736974696f6e00000000000000006000830152602082019050919050565b600061410c601583614e25565b91507f4469726563746f7279206e6f74206372656174656400000000000000000000006000830152602082019050919050565b600061414c602483614e25565b91507f4e6f7420656e6f756768206d656d6f727920696e207468652046696c6573746f60008301527f72616765000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006141b2601b83614e25565b91507f48617368206861736e2774206265656e2063616c63756c6174656400000000006000830152602082019050919050565b60006141f2601983614e25565b91507f4368756e6b20697320616c72656164792075706c6f61646564000000000000006000830152602082019050919050565b6000614232601683614e25565b91507f496e636f7272656374206368756e6b206c656e677468000000000000000000006000830152602082019050919050565b6000614272600f83614e25565b91507f46696c65206e6f742065786973747300000000000000000000000000000000006000830152602082019050919050565b60006142b2600e83614e25565b91507f496e76616c69642073656e6465720000000000000000000000000000000000006000830152602082019050919050565b60006142f2601883614e25565b91507f4469726563746f7279206973206e6f742064656c6574656400000000000000006000830152602082019050919050565b6000614332601083614e25565b91507f46696c65206e6f742064656c65746564000000000000000000000000000000006000830152602082019050919050565b6000614372601383614e25565b91507f496e76616c69642073746f7261676550617468000000000000000000000000006000830152602082019050919050565b60006143b2600c83614e25565b91507f496e76616c6964207061746800000000000000000000000000000000000000006000830152602082019050919050565b60006143f2600183614e36565b91507f2e000000000000000000000000000000000000000000000000000000000000006000830152600182019050919050565b6000614432601683614e25565b91507f496e76616c6964206469726563746f7279206e616d65000000000000000000006000830152602082019050919050565b6000614472601583614e25565b91507f4368756e6b207761736e27742075706c6f6164656400000000000000000000006000830152602082019050919050565b60006144b2602683614e25565b91507f436f756c64206e6f742072657365727665206c657373207468616e207573656460008301527f20737061636500000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614518601683614e25565b91507f4469726563746f7279206973206e6f7420656d707479000000000000000000006000830152602082019050919050565b6000614558602383614e25565b91507f46696c65206861736e2774206265656e2075706c6f6164656420636f7272656360008301527f746c7900000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006145be601183614e25565b91507f4368756e6b207761736e277420726561640000000000000000000000000000006000830152602082019050919050565b60006145fe601883614e25565b91507f46696c656e616d652073686f756c64206265203c2032353600000000000000006000830152602082019050919050565b600061463e601f83614e25565b91507f46696c652073686f756c64206265206c657373207468616e20313030204d42006000830152602082019050919050565b600061467e600283614e36565b91507f2e2e0000000000000000000000000000000000000000000000000000000000006000830152600282019050919050565b60006146be601183614e25565b91507f4469726563746f72792069732066756c6c0000000000000000000000000000006000830152602082019050919050565b60006146fe600e83614e25565b91507f46696c65206e6f7420666f756e640000000000000000000000000000000000006000830152602082019050919050565b600061473e601883614e25565b91507f46696c65206f72206469726563746f72792065786973747300000000000000006000830152602082019050919050565b600061477e601883614e25565b91507f45564d206572726f7220696e2067657446696c6553697a6500000000000000006000830152602082019050919050565b60006147be601083614e25565b91507f46696c65206e6f742063726561746564000000000000000000000000000000006000830152602082019050919050565b60006147fe601983614e25565b91507f46696c65206861736e2774206265656e2075706c6f61646564000000000000006000830152602082019050919050565b600060a083016000830151848203600086015261484e8282614055565b91505060208301516148636020860182613fe8565b50604083015161487660408601826148ae565b5060608301516148896060860182614006565b50608083015184820360808601526148a18282613ebe565b9150508091505092915050565b6148b781614e9c565b82525050565b6148c681614e9c565b82525050565b60006148d8828461408e565b915081905092915050565b60006148ef8284614024565b915081905092915050565b6000614905826143e5565b9150819050919050565b600061491a82614671565b9150819050919050565b6000621000008201905061493b6000830184613f1c565b92915050565b6000602082019050818103600083015261495b8184613f73565b905092915050565b60006020820190506149786000830184614015565b92915050565b60006020820190508181036000830152614997816140bf565b9050919050565b600060208201905081810360008301526149b7816140ff565b9050919050565b600060208201905081810360008301526149d78161413f565b9050919050565b600060208201905081810360008301526149f7816141a5565b9050919050565b60006020820190508181036000830152614a17816141e5565b9050919050565b60006020820190508181036000830152614a3781614225565b9050919050565b60006020820190508181036000830152614a5781614265565b9050919050565b60006020820190508181036000830152614a77816142a5565b9050919050565b60006020820190508181036000830152614a97816142e5565b9050919050565b60006020820190508181036000830152614ab781614325565b9050919050565b60006020820190508181036000830152614ad781614365565b9050919050565b60006020820190508181036000830152614af7816143a5565b9050919050565b60006020820190508181036000830152614b1781614425565b9050919050565b60006020820190508181036000830152614b3781614465565b9050919050565b60006020820190508181036000830152614b57816144a5565b9050919050565b60006020820190508181036000830152614b778161450b565b9050919050565b60006020820190508181036000830152614b978161454b565b9050919050565b60006020820190508181036000830152614bb7816145b1565b9050919050565b60006020820190508181036000830152614bd7816145f1565b9050919050565b60006020820190508181036000830152614bf781614631565b9050919050565b60006020820190508181036000830152614c17816146b1565b9050919050565b60006020820190508181036000830152614c37816146f1565b9050919050565b60006020820190508181036000830152614c5781614731565b9050919050565b60006020820190508181036000830152614c7781614771565b9050919050565b60006020820190508181036000830152614c97816147b1565b9050919050565b60006020820190508181036000830152614cb7816147f1565b9050919050565b6000602082019050614cd360008301846148bd565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614cfc57600080fd5b8060405250919050565b600067ffffffffffffffff821115614d1d57600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614d4957600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050919050565b6000819050602082019050919050565b600081519050919050565b60006180009050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614e4c82614e7c565b9050919050565b60008115159050919050565b6000819050919050565b6000819050614e7782614f0b565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000614eb182614e69565b9050919050565b82818337600083830152505050565b60005b83811015614ee5578082015181840152602081019050614eca565b83811115614ef4576000848401525b50505050565b6000601f19601f8301169050919050565b60038110614f1557fe5b50565b614f2181614e41565b8114614f2c57600080fd5b50565b614f3881614e9c565b8114614f4357600080fd5b5056fea365627a7a723158202ae226b25ad72f9cff2d74c6dc7bcfb78530ab1d2438f48a8dab67499b37a8e56c6578706572696d656e74616cf564736f6c634300050d0040", + "nonce": "0", + "storage": { + "0x0": "2868903936" + } + }, + "0x69362535ec535F0643cBf62D16aDeDCAf32Ee6F8": { + "balance": "0", + "code": "0x608060405234801561001057600080fd5b50600436106100b45760003560e01c806379210e8e1161007157806379210e8e1461017757806381a8235a146101a757806385aeeb17146101c35780639a9a5593146101f3578063a99100541461020f578063b57321221461022b576100b4565b806307c6e7d3146100b9578063122f4fba146100d55780631c6ec7a9146101055780631cfe4e3b14610121578063373dedb41461013d57806361e46db51461015b575b600080fd5b6100d360048036036100ce9190810190613e0d565b61025b565b005b6100ef60048036036100ea9190810190613e0d565b610804565b6040516100fc9190614ab1565b60405180910390f35b61011f600480360361011a9190810190613e0d565b610b43565b005b61013b60048036036101369190810190613dd1565b610f72565b005b610145611190565b6040516101529190614e2c565b60405180910390f35b61017560048036036101709190810190613ea2565b611199565b005b610191600480360361018c9190810190613f21565b6113f9565b60405161019e9190614a72565b60405180910390f35b6101c160048036036101bc9190810190613e0d565b6116f9565b005b6101dd60048036036101d89190810190613e0d565b61189e565b6040516101ea9190614a8f565b60405180910390f35b61020d60048036036102089190810190613e4e565b611b9d565b005b61022960048036036102249190810190613e0d565b61213a565b005b61024560048036036102409190810190613e0d565b612790565b6040516102529190614e2c565b60405180910390f35b6000339050606061026b83612a10565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b825181101561037c576000826001018460018403815181106102d557fe5b60200260200101516040516102ea9190614a1a565b90815260200160405180910390205411610339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161033090614c2c565b60405180910390fd5b8160020183600183038151811061034c57fe5b60200260200101516040516103619190614a1a565b908152602001604051809103902091508060010190506102b7565b506060600183511161038e57846103a7565b8260018451038151811061039e57fe5b60200260200101515b9050600082600101826040516103bd9190614a31565b9081526020016040518091039020541161040c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161040390614c2c565b60405180910390fd5b600082600201826040516104209190614a31565b90815260200160405180910390206000018054905014610475576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161046c90614cac565b60405180910390fd5b60006104818587612c10565b9050806104c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ba90614bcc565b60405180910390fd5b6104cb613996565b836000016001856000018054905003815481106104e457fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156105965780601f1061056b57610100808354040283529160200191610596565b820191906000526020600020905b81548152906001019060200180831161057957829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff1660028111156105e257fe5b60028111156105ed57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561066557602002820191906000526020600020906000905b82829054906101000a900460ff1615158152602001906001019060208260000104928301926001038202915080841161062f5790505b50505050508152505090508084600001600186600101866040516106899190614a31565b90815260200160405180910390205403815481106106a357fe5b906000526020600020906005020160008201518160000190805190602001906106cd9291906139d2565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561071c57fe5b0217905550608082015181600401908051906020019061073d929190613a52565b5090505083600101836040516107539190614a31565b9081526020016040518091039020548460010182600001516040516107789190614a1a565b9081526020016040518091039020819055506000846001018460405161079e9190614a31565b908152602001604051809103902081905550836000018054809190600190036107c79190613af8565b5083600201836040516107da9190614a31565b9081526020016040518091039020600080820160006107f99190613b2a565b505050505050505050565b600080606061081284612c74565b91509150606061082182612a10565b90506000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b82518110156109065760008260010184600184038151811061088b57fe5b60200260200101516040516108a09190614a1a565b90815260200160405180910390205414156108c357600095505050505050610b3e565b816002018360018303815181106108d657fe5b60200260200101516040516108eb9190614a1a565b9081526020016040518091039020915080600101905061086d565b50606060018351116109185783610931565b8260018451038151811061092857fe5b60200260200101515b9050600082600101826040516109479190614a31565b908152602001604051809103902054141561096a57600095505050505050610b3e565b610972613996565b826000016001846001018460405161098a9190614a31565b90815260200160405180910390205403815481106109a457fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610a565780601f10610a2b57610100808354040283529160200191610a56565b820191906000526020600020905b815481529060010190602001808311610a3957829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115610aa257fe5b6002811115610aad57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015610b2557602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411610aef5790505b5050505050815250509050806060015196505050505050505b919050565b600160009054906101000a900460ff16610b85576120006002819055506210000060038190555060018060006101000a81548160ff0219169083151502179055505b6000815111610bc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc090614c2c565b60405180910390fd5b60003390506060610bd983612a10565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015610cea57600082600101846001840381518110610c4357fe5b6020026020010151604051610c589190614a1a565b90815260200160405180910390205411610ca7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9e90614c2c565b60405180910390fd5b81600201836001830381518110610cba57fe5b6020026020010151604051610ccf9190614a1a565b90815260200160405180910390209150806001019050610c25565b50600254816000018054905010610d36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2d90614d4c565b60405180910390fd5b60606001835111610d475784610d60565b82600184510381518110610d5757fe5b60200260200101515b905060008260010182604051610d769190614a31565b90815260200160405180910390205414610dc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbc90614d8c565b60405180910390fd5b610dce81612ff6565b610e0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0490614c4c565b60405180910390fd5b6000610e1985876130d7565b905080610e5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5290614aec565b60405180910390fd5b610e63613996565b82816000018190525060008160200190151590811515815250508360000181908060018154018082558091505090600182039060005260206000209060050201600090919290919091506000820151816000019080519060200190610ec99291906139d2565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff02191690836002811115610f1857fe5b02179055506080820151816004019080519060200190610f39929190613a52565b5050505083600001805490508460010184604051610f579190614a31565b90815260200160405180910390208190555050505050505050565b610f7a61313b565b73ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161480610fdf57503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614155b61101e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101590614bac565b60405180910390fd5b80600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411156110a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109790614c8c565b60405180910390fd5b600054600754820111156110e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e090614b0c565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460076000828254039250508190555080600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550806007600082825401925050819055505050565b60008054905090565b600033905060006111aa82866131d4565b9050600160028111156111b957fe5b8160030160009054906101000a900460ff1660028111156111d657fe5b14611216576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120d90614d6c565b60405180910390fd5b6000600354858161122357fe5b061480156112345750806002015484105b611273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126a90614acc565b60405180910390fd5b600354848260020154031080156112905750838160020154038351145b8061129d57506003548351145b6112dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d390614b6c565b60405180910390fd5b600015158160040160035486816112ef57fe5b04815481106112fa57fe5b90600052602060002090602091828204019190069054906101000a900460ff1615151461135c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135390614b4c565b60405180910390fd5b600061136a838787876133d3565b9050806113ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a390614c6c565b60405180910390fd5b60018260040160035487816113bd57fe5b04815481106113c857fe5b90600052602060002090602091828204019190066101000a81548160ff021916908315150217905550505050505050565b611401613b4e565b6000606061140e86612c74565b9150915061141a613996565b61142483836131d4565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156114c85780601f1061149d576101008083540402835291602001916114c8565b820191906000526020600020905b8154815290600101906020018083116114ab57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561151457fe5b600281111561151f57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561159757602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116115615790505b50505050508152505090506002808111156115ae57fe5b816060015160028111156115be57fe5b146115fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f590614e0c565b60405180910390fd5b60035485111580156116105750600085115b61164f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164690614b6c565b60405180910390fd5b80604001518587011115611698576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168f90614acc565b60405180910390fd5b60006116a684848989613484565b8096508192505050806116ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e590614cec565b60405180910390fd5b505050509392505050565b6000339050600061170a82846131d4565b90506001600281111561171957fe5b8160030160009054906101000a900460ff16600281111561173657fe5b14611776576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176d90614d6c565b60405180910390fd5b60006001905060008260040180549050905060008090505b818110156117e157600015158460040182815481106117a957fe5b90600052602060002090602091828204019190069054906101000a900460ff16151514156117d657600092505b80600101905061178e565b5081611822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181990614ccc565b60405180910390fd5b60028360030160006101000a81548160ff0219169083600281111561184357fe5b021790555060006118548587613517565b905080611896576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188d90614b2c565b60405180910390fd5b505050505050565b6060600060606118ad84612c74565b9150915060606118bc82612a10565b90506000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008090505b82518110156119c65760008260010184838151811061192257fe5b60200260200101516040516119379190614a1a565b90815260200160405180910390205411611986576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197d90614c2c565b60405180910390fd5b8160020183828151811061199657fe5b60200260200101516040516119ab9190614a1a565b90815260200160405180910390209150806001019050611907565b5080600001805480602002602001604051908101604052809291908181526020016000905b82821015611b8e57838290600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611aa75780601f10611a7c57610100808354040283529160200191611aa7565b820191906000526020600020905b815481529060010190602001808311611a8a57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115611af357fe5b6002811115611afe57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015611b7657602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411611b405790505b505050505081525050815260200190600101906119eb565b50505050945050505050919050565b600160009054906101000a900460ff16611bdf576120006002819055506210000060038190555060018060006101000a81548160ff0219169083151502179055505b60003390506305f5e100821115611c2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2290614d2c565b60405180910390fd5b600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205483011115611cee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce590614dac565b60405180910390fd5b6060611cf984612a10565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015611e0a57600082600101846001840381518110611d6357fe5b6020026020010151604051611d789190614a1a565b90815260200160405180910390205411611dc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dbe90614c2c565b60405180910390fd5b81600201836001830381518110611dda57fe5b6020026020010151604051611def9190614a1a565b90815260200160405180910390209150806001019050611d45565b50600254816000018054905010611e56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4d90614d4c565b60405180910390fd5b60606001835111611e675785611e80565b82600184510381518110611e7757fe5b60200260200101515b905060008260010182604051611e969190614a31565b90815260200160405180910390205414611ee5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611edc90614d8c565b60405180910390fd5b611eee81612ff6565b611f2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2490614d0c565b60405180910390fd5b6000611f3a85888861357b565b905080611f7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7390614dec565b60405180910390fd5b6060600354600160035489010381611f9057fe5b04604051908082528060200260200182016040528015611fbf5781602001602082028038833980820191505090505b509050836000016040518060a0016040528085815260200160011515815260200189815260200160016002811115611ff357fe5b8152602001838152509080600181540180825580915050906001820390600052602060002090600502016000909192909190915060008201518160000190805190602001906120439291906139d2565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561209257fe5b021790555060808201518160040190805190602001906120b3929190613a52565b50505050836000018054905084600101846040516120d19190614a31565b90815260200160405180910390208190555086600560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505050505050505050565b6000339050612147613996565b61215182846131d4565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156121f55780601f106121ca576101008083540402835291602001916121f5565b820191906000526020600020905b8154815290600101906020018083116121d857829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561224157fe5b600281111561224c57fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156122c457602002820191906000526020600020906000905b82829054906101000a900460ff1615158152602001906001019060208260000104928301926001038202915080841161228e5790505b5050505050815250509050600060028111156122dc57fe5b816060015160028111156122ec57fe5b141561232d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232490614b8c565b60405180910390fd5b600061233983856135e8565b90508061237b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161237290614bec565b60405180910390fd5b606061238685612a10565b90506000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b825181101561241e57816002018360018303815181106123ee57fe5b60200260200101516040516124039190614a1a565b908152602001604051809103902091508060010190506123d2565b50600060018260010186600001516040516124399190614a1a565b908152602001604051809103902054039050612453613996565b8260000160018460000180549050038154811061246c57fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561251e5780601f106124f35761010080835404028352916020019161251e565b820191906000526020600020905b81548152906001019060200180831161250157829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561256a57fe5b600281111561257557fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156125ed57602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116125b75790505b50505050508152505090508083600001838154811061260857fe5b906000526020600020906005020160008201518160000190805190602001906126329291906139d2565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561268157fe5b021790555060808201518160040190805190602001906126a2929190613a52565b50905050826000018054809190600190036126bd9190613af8565b508260010186600001516040516126d49190614a1a565b9081526020016040518091039020548360010182600001516040516126f99190614a1a565b90815260200160405180910390208190555060008360010187600001516040516127239190614a1a565b9081526020016040518091039020819055508560400151600560008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505050505050505050565b600080606061279e84612c74565b915091506127aa613996565b6127b483836131d4565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156128585780601f1061282d57610100808354040283529160200191612858565b820191906000526020600020905b81548152906001019060200180831161283b57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff1660028111156128a457fe5b60028111156128af57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561292757602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116128f15790505b50505050508152505090506001600281111561293f57fe5b8160600151600281111561294f57fe5b1480612974575060028081111561296257fe5b8160600151600281111561297257fe5b145b6129b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129aa90614d6c565b60405180910390fd5b60006129bf848461364c565b809650819250505080612a07576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129fe90614dcc565b60405180910390fd5b50505050919050565b6060612a1a613b73565b612a23836136b5565b9050612a2d613b73565b612a6b6040518060400160405280600181526020017f2f000000000000000000000000000000000000000000000000000000000000008152506136b5565b905060606001612a8483856136e390919063ffffffff16565b01604051908082528060200260200182016040528015612ab857816020015b6060815260200190600190039081612aa35790505b50905060008090505b8151811015612b0957612ae5612ae0848661375890919063ffffffff16565b613772565b828281518110612af157fe5b60200260200101819052508080600101915050612ac1565b50600081600183510381518110612b1c57fe5b6020026020010151511415612b875780600182510381518110612b3b57fe5b6020026020010160608152506001815103604051908082528060200260200182016040528015612b7f57816020015b6060815260200190600190039081612b6a5790505b509350612bc0565b8051604051908082528060200260200182016040528015612bbc57816020015b6060815260200190600190039081612ba75790505b5093505b60008090505b8451811015612c0757818181518110612bdb57fe5b6020026020010151858281518110612bef57fe5b60200260200101819052508080600101915050612bc6565b50505050919050565b60008060016020601f85510181612c2357fe5b040190506040518481526020810160005b83811015612c55578060200286015181602002830152806001019050612c34565b50602082602085026040018460006010600019f1935050505092915050565b6000606060006028905080845111612cc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cb890614c0c565b60405180910390fd5b6060816040519080825280601f01601f191660200182016040528015612cf65781602001600182028038833980820191505090505b50905060008090505b82811015612d6657858181518110612d1357fe5b602001015160f81c60f81b828281518110612d2a57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050612cff565b50600080905060008090505b83811015612e95576000838281518110612d8857fe5b602001015160f81c60f81b60f81c60ff16905060308110158015612dad575060398111155b80612dc6575060418110158015612dc55750605a8111155b5b80612ddf575060618110158015612dde575060668111155b5b612e1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e1590614c0c565b60405180910390fd5b60308110158015612e30575060398111155b15612e415760308103601084020192505b60418110158015612e535750605a8111155b15612e645760378103601084020192505b60618110158015612e76575060668111155b15612e875760578103601084020192505b508080600101915050612d72565b508094507f2f00000000000000000000000000000000000000000000000000000000000000868481518110612ec657fe5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612f33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f2a90614c0c565b60405180910390fd5b6000600184885103039050806040519080825280601f01601f191660200182016040528015612f715781602001600182028038833980820191505090505b50945060008090505b81811015612fec5760008860018784010181518110612f9557fe5b602001015160f81c60f81b905080878381518110612faf57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350508080600101915050612f7a565b5050505050915091565b600060405160200161300790614a5d565b604051602081830303815290604052805190602001208260405160200161302e9190614a31565b604051602081830303815290604052805190602001201480613099575060405160200161305a90614a48565b60405160208183030381529060405280519060200120826040516020016130819190614a31565b60405160208183030381529060405280519060200120145b806130a5575060008251145b156130b357600090506130d2565b60008251905060ff8111156130cc5760009150506130d2565b60019150505b919050565b60008060016020601f855101816130ea57fe5b040190506040518481526020810160005b8381101561311c5780602002860151816020028301528060010190506130fb565b5060208260208502604001846000600f600019f1935050505092915050565b600073d2001000000000000000000000000000000000d273ffffffffffffffffffffffffffffffffffffffff166383e781fe6040518163ffffffff1660e01b815260040160206040518083038186803b15801561319757600080fd5b505afa1580156131ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506131cf9190810190613da8565b905090565b600060606131e183612a10565b90506000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b82518110156132f25760008260010184600184038151811061324b57fe5b60200260200101516040516132609190614a1a565b908152602001604051809103902054116132af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132a690614c2c565b60405180910390fd5b816002018360018303815181106132c257fe5b60200260200101516040516132d79190614a1a565b9081526020016040518091039020915080600101905061322d565b5060606001835111613304578461331d565b8260018451038151811061331457fe5b60200260200101515b9050600082600101826040516133339190614a31565b90815260200160405180910390205411613382576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161337990614c2c565b60405180910390fd5b6000826000016001846001018460405161339c9190614a31565b90815260200160405180910390205403815481106133b657fe5b906000526020600020906005020190508094505050505092915050565b60008060016020601f855101816133e657fe5b04019050600060016020601f885101816133fc57fe5b040190506040518781526020810160005b8381101561342e57806020028901518160200283015280600101905061340d565b50868360200282015260005b84811015613460578060200287015181856001010160200283015280600101905061343a565b50602082848601602002606001846000600c600019f1945050505050949350505050565b600061348e613b4e565b600060016020601f885101816134a057fe5b0401905060006020601f8601816134b357fe5b0490506040518881526020810160005b848110156134e457806020028a0151816020028301528060010190506134c3565b5083602002810188815287816020015283602002868660030160200285600a600019fa9650505050505094509492505050565b60008060016020601f8551018161352a57fe5b040190506040518481526020810160005b8381101561355c57806020028601518160200283015280600101905061353b565b50602082602085026040018460006011600019f1935050505092915050565b60008060016020601f8651018161358e57fe5b040190506040518581526020810160005b838110156135c057806020028701518160200283015280600101905061359f565b50846020840282015260208260208502604001846000600b600019f193505050509392505050565b60008060016020601f855101816135fb57fe5b040190506040518481526020810160005b8381101561362d57806020028601518160200283015280600101905061360c565b5060208260208502604001846000600e600019f1935050505092915050565b600080600060016020601f8651018161366157fe5b040190506040518581526020810160005b83811015613693578060200287015181602002830152806001019050613672565b506020826020850260200184600d600019fa9450815193505050509250929050565b6136bd613b73565b600060208301905060405180604001604052808451815260200182815250915050919050565b600080826000015161370785600001518660200151866000015187602001516137d4565b0190505b8360000151846020015101811161375157818060010192505082600001516137498560200151830386600001510383866000015187602001516137d4565b01905061370b565b5092915050565b613760613b73565b61376b8383836138af565b5092915050565b60608082600001516040519080825280601f01601f1916602001820160405280156137ac5781602001600182028038833980820191505090505b50905060006020820190506137ca818560200151866000015161394d565b8192505050919050565b600080849050600086851161389f576020851161385957600060018660200360080260020a031960001b905060008186511690506000878a8a0103905060008386511690505b82811461384b57818610613838578a8a0196505050505050506138a7565b858060010196505083865116905061381a565b8596505050505050506138a7565b60008585209050600091505b858803821161389d57600086842090508082141561388957839450505050506138a7565b600184019350508180600101925050613865565b505b868601925050505b949350505050565b6138b7613b73565b60006138d585600001518660200151866000015187602001516137d4565b90508460200151836020018181525050846020015181038360000181815250508460000151856020015101811415613917576000856000018181525050613942565b8360000151836000015101856000018181510391508181525050836000015181018560200181815250505b829150509392505050565b5b60208110613971578151835260208301925060208201915060208103905061394e565b60006001826020036101000a0390508019835116818551168181178652505050505050565b6040518060a001604052806060815260200160001515815260200160008152602001600060028111156139c557fe5b8152602001606081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613a1357805160ff1916838001178555613a41565b82800160010185558215613a41579182015b82811115613a40578251825591602001919060010190613a25565b5b509050613a4e9190613b8d565b5090565b82805482825590600052602060002090601f01602090048101928215613ae75791602002820160005b83821115613ab857835183826101000a81548160ff0219169083151502179055509260200192600101602081600001049283019260010302613a7b565b8015613ae55782816101000a81549060ff0219169055600101602081600001049283019260010302613ab8565b505b509050613af49190613bb2565b5090565b815481835581811115613b2557600502816005028360005260206000209182019101613b249190613be2565b5b505050565b5080546000825560050290600052602060002090810190613b4b9190613be2565b50565b6040518062100000016040528061800090602082028038833980820191505090505090565b604051806040016040528060008152602001600081525090565b613baf91905b80821115613bab576000816000905550600101613b93565b5090565b90565b613bdf91905b80821115613bdb57600081816101000a81549060ff021916905550600101613bb8565b5090565b90565b613c4e91905b80821115613c4a5760008082016000613c019190613c51565b6001820160006101000a81549060ff021916905560028201600090556003820160006101000a81549060ff0219169055600482016000613c419190613c99565b50600501613be8565b5090565b90565b50805460018160011615610100020316600290046000825580601f10613c775750613c96565b601f016020900490600052602060002090810190613c959190613b8d565b5b50565b50805460008255601f016020900490600052602060002090810190613cbe9190613b8d565b50565b600081359050613cd081615086565b92915050565b600081519050613ce581615086565b92915050565b600082601f830112613cfc57600080fd5b8135613d0f613d0a82614e74565b614e47565b91508082526020830160208301858383011115613d2b57600080fd5b613d36838284615026565b50505092915050565b600082601f830112613d5057600080fd5b8135613d63613d5e82614ea0565b614e47565b91508082526020830160208301858383011115613d7f57600080fd5b613d8a838284615026565b50505092915050565b600081359050613da28161509d565b92915050565b600060208284031215613dba57600080fd5b6000613dc884828501613cd6565b91505092915050565b60008060408385031215613de457600080fd5b6000613df285828601613cc1565b9250506020613e0385828601613d93565b9150509250929050565b600060208284031215613e1f57600080fd5b600082013567ffffffffffffffff811115613e3957600080fd5b613e4584828501613d3f565b91505092915050565b60008060408385031215613e6157600080fd5b600083013567ffffffffffffffff811115613e7b57600080fd5b613e8785828601613d3f565b9250506020613e9885828601613d93565b9150509250929050565b600080600060608486031215613eb757600080fd5b600084013567ffffffffffffffff811115613ed157600080fd5b613edd86828701613d3f565b9350506020613eee86828701613d93565b925050604084013567ffffffffffffffff811115613f0b57600080fd5b613f1786828701613ceb565b9150509250925092565b600080600060608486031215613f3657600080fd5b600084013567ffffffffffffffff811115613f5057600080fd5b613f5c86828701613d3f565b9350506020613f6d86828701613d93565b9250506040613f7e86828701613d93565b9150509250925092565b6000613f9483836140f6565b60208301905092915050565b6000613fac8383614105565b60208301905092915050565b6000613fc4838361497f565b905092915050565b6000613fd782614ef6565b613fe18185614f55565b9350613fec83614ecc565b8060005b8381101561401d5781516140048882613f88565b975061400f83614f2e565b925050600181019050613ff0565b5085935050505092915050565b61403381614f01565b61403d8184614f66565b925061404882614edc565b8060005b838110156140795781516140608782613fa0565b965061406b83614f3b565b92505060018101905061404c565b505050505050565b600061408c82614f0d565b6140968185614f71565b9350836020820285016140a885614ee6565b8060005b858110156140e457848403895281516140c58582613fb8565b94506140d083614f48565b925060208a019950506001810190506140ac565b50829750879550505050505092915050565b6140ff81614fc1565b82525050565b61410e81614fcd565b82525050565b61411d81615014565b82525050565b61412c81615014565b82525050565b600061413d82614f23565b6141478185614fa4565b9350614157818560208601615035565b80840191505092915050565b600061416e82614f18565b6141788185614f82565b9350614188818560208601615035565b61419181615068565b840191505092915050565b60006141a782614f18565b6141b18185614fa4565b93506141c1818560208601615035565b80840191505092915050565b60006141da601883614f93565b91507f496e636f7272656374206368756e6b20706f736974696f6e00000000000000006000830152602082019050919050565b600061421a601583614f93565b91507f4469726563746f7279206e6f74206372656174656400000000000000000000006000830152602082019050919050565b600061425a602483614f93565b91507f4e6f7420656e6f756768206d656d6f727920696e207468652046696c6573746f60008301527f72616765000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006142c0601b83614f93565b91507f48617368206861736e2774206265656e2063616c63756c6174656400000000006000830152602082019050919050565b6000614300601983614f93565b91507f4368756e6b20697320616c72656164792075706c6f61646564000000000000006000830152602082019050919050565b6000614340601683614f93565b91507f496e636f7272656374206368756e6b206c656e677468000000000000000000006000830152602082019050919050565b6000614380600f83614f93565b91507f46696c65206e6f742065786973747300000000000000000000000000000000006000830152602082019050919050565b60006143c0600e83614f93565b91507f496e76616c69642073656e6465720000000000000000000000000000000000006000830152602082019050919050565b6000614400601883614f93565b91507f4469726563746f7279206973206e6f742064656c6574656400000000000000006000830152602082019050919050565b6000614440601083614f93565b91507f46696c65206e6f742064656c65746564000000000000000000000000000000006000830152602082019050919050565b6000614480601383614f93565b91507f496e76616c69642073746f7261676550617468000000000000000000000000006000830152602082019050919050565b60006144c0600c83614f93565b91507f496e76616c6964207061746800000000000000000000000000000000000000006000830152602082019050919050565b6000614500600183614fa4565b91507f2e000000000000000000000000000000000000000000000000000000000000006000830152600182019050919050565b6000614540601683614f93565b91507f496e76616c6964206469726563746f7279206e616d65000000000000000000006000830152602082019050919050565b6000614580601583614f93565b91507f4368756e6b207761736e27742075706c6f6164656400000000000000000000006000830152602082019050919050565b60006145c0602683614f93565b91507f436f756c64206e6f742072657365727665206c657373207468616e207573656460008301527f20737061636500000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614626601683614f93565b91507f4469726563746f7279206973206e6f7420656d707479000000000000000000006000830152602082019050919050565b6000614666602383614f93565b91507f46696c65206861736e2774206265656e2075706c6f6164656420636f7272656360008301527f746c7900000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006146cc601183614f93565b91507f4368756e6b207761736e277420726561640000000000000000000000000000006000830152602082019050919050565b600061470c601883614f93565b91507f46696c656e616d652073686f756c64206265203c2032353600000000000000006000830152602082019050919050565b600061474c601f83614f93565b91507f46696c652073686f756c64206265206c657373207468616e20313030204d42006000830152602082019050919050565b600061478c600283614fa4565b91507f2e2e0000000000000000000000000000000000000000000000000000000000006000830152600282019050919050565b60006147cc601183614f93565b91507f4469726563746f72792069732066756c6c0000000000000000000000000000006000830152602082019050919050565b600061480c600e83614f93565b91507f46696c65206e6f7420666f756e640000000000000000000000000000000000006000830152602082019050919050565b600061484c601883614f93565b91507f46696c65206f72206469726563746f72792065786973747300000000000000006000830152602082019050919050565b600061488c601983614f93565b91507f4e6f7420656e6f756768207265736572766564207370616365000000000000006000830152602082019050919050565b60006148cc601883614f93565b91507f45564d206572726f7220696e2067657446696c6553697a6500000000000000006000830152602082019050919050565b600061490c601083614f93565b91507f46696c65206e6f742063726561746564000000000000000000000000000000006000830152602082019050919050565b600061494c601983614f93565b91507f46696c65206861736e2774206265656e2075706c6f61646564000000000000006000830152602082019050919050565b600060a083016000830151848203600086015261499c8282614163565b91505060208301516149b160208601826140f6565b5060408301516149c460408601826149fc565b5060608301516149d76060860182614114565b50608083015184820360808601526149ef8282613fcc565b9150508091505092915050565b614a058161500a565b82525050565b614a148161500a565b82525050565b6000614a26828461419c565b915081905092915050565b6000614a3d8284614132565b915081905092915050565b6000614a53826144f3565b9150819050919050565b6000614a688261477f565b9150819050919050565b60006210000082019050614a89600083018461402a565b92915050565b60006020820190508181036000830152614aa98184614081565b905092915050565b6000602082019050614ac66000830184614123565b92915050565b60006020820190508181036000830152614ae5816141cd565b9050919050565b60006020820190508181036000830152614b058161420d565b9050919050565b60006020820190508181036000830152614b258161424d565b9050919050565b60006020820190508181036000830152614b45816142b3565b9050919050565b60006020820190508181036000830152614b65816142f3565b9050919050565b60006020820190508181036000830152614b8581614333565b9050919050565b60006020820190508181036000830152614ba581614373565b9050919050565b60006020820190508181036000830152614bc5816143b3565b9050919050565b60006020820190508181036000830152614be5816143f3565b9050919050565b60006020820190508181036000830152614c0581614433565b9050919050565b60006020820190508181036000830152614c2581614473565b9050919050565b60006020820190508181036000830152614c45816144b3565b9050919050565b60006020820190508181036000830152614c6581614533565b9050919050565b60006020820190508181036000830152614c8581614573565b9050919050565b60006020820190508181036000830152614ca5816145b3565b9050919050565b60006020820190508181036000830152614cc581614619565b9050919050565b60006020820190508181036000830152614ce581614659565b9050919050565b60006020820190508181036000830152614d05816146bf565b9050919050565b60006020820190508181036000830152614d25816146ff565b9050919050565b60006020820190508181036000830152614d458161473f565b9050919050565b60006020820190508181036000830152614d65816147bf565b9050919050565b60006020820190508181036000830152614d85816147ff565b9050919050565b60006020820190508181036000830152614da58161483f565b9050919050565b60006020820190508181036000830152614dc58161487f565b9050919050565b60006020820190508181036000830152614de5816148bf565b9050919050565b60006020820190508181036000830152614e05816148ff565b9050919050565b60006020820190508181036000830152614e258161493f565b9050919050565b6000602082019050614e416000830184614a0b565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614e6a57600080fd5b8060405250919050565b600067ffffffffffffffff821115614e8b57600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614eb757600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050919050565b6000819050602082019050919050565b600081519050919050565b60006180009050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614fba82614fea565b9050919050565b60008115159050919050565b6000819050919050565b6000819050614fe582615079565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061501f82614fd7565b9050919050565b82818337600083830152505050565b60005b83811015615053578082015181840152602081019050615038565b83811115615062576000848401525b50505050565b6000601f19601f8301169050919050565b6003811061508357fe5b50565b61508f81614faf565b811461509a57600080fd5b50565b6150a68161500a565b81146150b157600080fd5b5056fea365627a7a72315820314a90e541327f2678eaf7815f54348c3702e4fa45cdf1d5595b378d08af86896c6578706572696d656e74616cf564736f6c634300050d0040", + "nonce": "0", + "storage": { + "0x0": "2868903936" + } + }, + "0x69bfcdcb98c9562e0a2faee3ecdfd65e8a0adb19": { + "balance": "1000000000000000000000000000000" + }, + "0x6a37ad7dceec4595eea9f03b82d2710e738343ac": { + "balance": "1000000000000000000000000000000" + }, + "0x6b806862a977a0e22ed1752f858e5332647121c8": { + "balance": "1000000000000000000000000000000" + }, + "0x6c0ef9084a57df13c175afea32ea47a510c5506e": { + "balance": "1000000000000000000000000000000" + }, + "0x6cd5e637266e18d3e888ee99451eb828c6b491f4": { + "balance": "1000000000000000000000000000000" + }, + "0x6d0d7f0ff51917bd84a5f7270d31a894282aaf4b": { + "balance": "1000000000000000000000000000000" + }, + "0x6d8092cb926daf29236f866cd31c327ff73323d1": { + "balance": "1000000000000000000000000000000" + }, + "0x6d80aAC61F6d92c7F4A3c412850474ba963B698E": { + "balance": "1000000000000000000000" + }, + "0x6fec280c0ab320715b17d70e8b02c2d4141c1372": { + "balance": "1000000000000000000000000000000" + }, + "0x733ad609ef2e742334d96266fbc13733f1cf5e4a": { + "balance": "1000000000000000000000000000000" + }, + "0x7525198d8cd1121d57358a0b0ed037e924581a76": { + "balance": "1000000000000000000000000000000" + }, + "0x765708943c3b791563d1e3f0533b6d7e7d769e4d": { + "balance": "1000000000000000000000000000000" + }, + "0x7685d04f0b7657017b77efa004a14ff9f022acab": { + "balance": "1000000000000000000000000000000" + }, + "0x76b545cb6a2fc671f741950eeb27627e69a1e69b": { + "balance": "1000000000000000000000000000000" + }, + "0x77a0bc73442d3d9cb993e8d9752f95babf0ccaa6": { + "balance": "1000000000000000000000000000000" + }, + "0x7a89A6c323FaCfF0ADeF7EEF3e491aD4044d0592": { + "balance": "100000000000000000000000" + }, + "0x7e7E68F04D1799Fa25C8cff57314c8a5d3942e69": { + "balance": "1000000000000000000000000" + }, + "0x811d701d14539d190a8593fe901eafe8eff511f5": { + "balance": "1000000000000000000000000000000" + }, + "0x81dcbd71da28fafb9ca99ff5a22bfcebba84fecc": { + "balance": "100000000000000000000000" + }, + "0x83c1479d2a32d9ed9fa699289b6c2db56b7cd045": { + "balance": "1000000000000000000000000000000" + }, + "0x85b33f0853ab8eaa4e602bdfd724d44bc2731e90": { + "balance": "1000000000000000000000000000000" + }, + "0x863f816036e3cbba90855196c9d1e339fcff1650": { + "balance": "1000000000000000000000000000000" + }, + "0x87ea381878572d63b3453033d7540abddd191186": { + "balance": "1000000000000000000000000000000" + }, + "0x88fd5e01078629cc194c933d9631b9448fe10b1d": { + "balance": "1000000000000000000000000000000" + }, + "0x8945e48bd056f45c8b57f9025d2674bb03a24035": { + "balance": "1000000000000000000000000000000" + }, + "0x8a920edc1021ce76c22774e0e83723a6e51c2439": { + "balance": "1000000000000000000000000000000" + }, + "0x8e6081e272c8f4d49f5b29157b52f68cbd6307ad": { + "balance": "1000000000000000000000000000000" + }, + "0x8fe24dbbf9884bd458d8cfac528b4ad70e82497d": { + "balance": "1000000000000000000000000000000" + }, + "0x90431f3f75b26657f74abbb5c759b12e78f916cc": { + "balance": "1000000000000000000000000000000" + }, + "0x907cd0881E50d359bb9Fd120B1A5A143b1C97De6": { + "balance": "1000000000000000000000000000000000000000000000000000000000" + }, + "0x94c6e5746971d6aebeaa42cbbe2feca0f6b5b24f": { + "balance": "1000000000000000000000000000000" + }, + "0x96672f9e982936e1904b15c948cc81bf18027db6": { + "balance": "1000000000000000000000000000000" + }, + "0x97b921ba45e0aa8830701aa62050a83ee00a1bb8": { + "balance": "1000000000000000000000000000000" + }, + "0x98e50c97baf98dc6a81bdb95067339a269a36fc1": { + "balance": "1000000000000000000000000000000" + }, + "0x9b77f28285a49601169a33332f08aa309d97edd0": { + "balance": "1000000000000000000000000000000" + }, + "0x9f62f4215cd277ca40dede101b4ccb29290de6bb": { + "balance": "1000000000000000000000000000000" + }, + "0xD1001000000000000000000000000000000000D1": { + "balance": "0", + "code": "0x608060405260043610603f576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680636d4ce63c146044575b600080fd5b348015604f57600080fd5b506056606c565b6040518082815260200191505060405180910390f35b60006001600060048152602001908152602001600020600060098152602001908152602001600020600101549050905600a165627a7a723058208fe64219becc0bcab1c8f854f05804ebb6bb555da5dbc49e8f7021c31d77636a0029", + "nonce": "0", + "storage": { + "0x3b4da637a1b0e6dbfc6795f2b7f0cb29eebb91b3af4dcc335e1633f6b4af810b": "1111" + } + }, + "0xD3001000000000000000000000000000000000D3": { + "balance": "0", + "code": "0x60806040526004361061007b5760003560e01c80639623609d1161004e5780639623609d1461013657806399a88ec4146101f5578063f2fde38b14610230578063f3b7dead146102635761007b565b8063204e1c7a14610080578063715018a6146100cf5780637eff275e146100e65780638da5cb5b14610121575b600080fd5b34801561008c57600080fd5b506100b3600480360360208110156100a357600080fd5b50356001600160a01b0316610296565b604080516001600160a01b039092168252519081900360200190f35b3480156100db57600080fd5b506100e4610328565b005b3480156100f257600080fd5b506100e46004803603604081101561010957600080fd5b506001600160a01b03813581169160200135166103ca565b34801561012d57600080fd5b506100b3610496565b6100e46004803603606081101561014c57600080fd5b6001600160a01b03823581169260208101359091169181019060608101604082013564010000000081111561018057600080fd5b82018360208201111561019257600080fd5b803590602001918460018302840111640100000000831117156101b457600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506104a5945050505050565b34801561020157600080fd5b506100e46004803603604081101561021857600080fd5b506001600160a01b03813581169160200135166105dd565b34801561023c57600080fd5b506100e46004803603602081101561025357600080fd5b50356001600160a01b031661068d565b34801561026f57600080fd5b506100b36004803603602081101561028657600080fd5b50356001600160a01b0316610785565b6000806060836001600160a01b03166040518080635c60da1b60e01b8152506004019050600060405180830381855afa9150503d80600081146102f5576040519150601f19603f3d011682016040523d82523d6000602084013e6102fa565b606091505b50915091508161030957600080fd5b80806020019051602081101561031e57600080fd5b5051949350505050565b6103306107e4565b6000546001600160a01b03908116911614610380576040805162461bcd60e51b8152602060048201819052602482015260008051602061080f833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6103d26107e4565b6000546001600160a01b03908116911614610422576040805162461bcd60e51b8152602060048201819052602482015260008051602061080f833981519152604482015290519081900360640190fd5b816001600160a01b0316638f283970826040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050600060405180830381600087803b15801561047a57600080fd5b505af115801561048e573d6000803e3d6000fd5b505050505050565b6000546001600160a01b031690565b6104ad6107e4565b6000546001600160a01b039081169116146104fd576040805162461bcd60e51b8152602060048201819052602482015260008051602061080f833981519152604482015290519081900360640190fd5b826001600160a01b0316634f1ef2863484846040518463ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561057357818101518382015260200161055b565b50505050905090810190601f1680156105a05780820380516001836020036101000a031916815260200191505b5093505050506000604051808303818588803b1580156105bf57600080fd5b505af11580156105d3573d6000803e3d6000fd5b5050505050505050565b6105e56107e4565b6000546001600160a01b03908116911614610635576040805162461bcd60e51b8152602060048201819052602482015260008051602061080f833981519152604482015290519081900360640190fd5b816001600160a01b0316633659cfe6826040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050600060405180830381600087803b15801561047a57600080fd5b6106956107e4565b6000546001600160a01b039081169116146106e5576040805162461bcd60e51b8152602060048201819052602482015260008051602061080f833981519152604482015290519081900360640190fd5b6001600160a01b03811661072a5760405162461bcd60e51b81526004018080602001828103825260268152602001806107e96026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000806060836001600160a01b031660405180806303e1469160e61b8152506004019050600060405180830381855afa9150503d80600081146102f5576040519150601f19603f3d011682016040523d82523d6000602084013e6102fa565b339056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a26469706673582212201d968ac32bef5562c6b4f1bd5d2f2a74c14d07ce008ca6fdc5a3bd0f5fc265f564736f6c63430006080033", + "nonce": "0", + "storage": { + "0x0": "0x907cd0881E50d359bb9Fd120B1A5A143b1C97De6" + } + }, + "0xD3002000000000000000000000000000000000D3": { + "balance": "0", + "code": "0x60806040526004361061004e5760003560e01c80633659cfe6146100655780634f1ef286146100985780635c60da1b146101185780638f28397014610149578063f851a4401461017c5761005d565b3661005d5761005b610191565b005b61005b610191565b34801561007157600080fd5b5061005b6004803603602081101561008857600080fd5b50356001600160a01b03166101ab565b61005b600480360360408110156100ae57600080fd5b6001600160a01b0382351691908101906040810160208201356401000000008111156100d957600080fd5b8201836020820111156100eb57600080fd5b8035906020019184600183028401116401000000008311171561010d57600080fd5b5090925090506101e5565b34801561012457600080fd5b5061012d610292565b604080516001600160a01b039092168252519081900360200190f35b34801561015557600080fd5b5061005b6004803603602081101561016c57600080fd5b50356001600160a01b03166102cf565b34801561018857600080fd5b5061012d610389565b6101996103ba565b6101a96101a461041a565b61043f565b565b6101b3610463565b6001600160a01b0316336001600160a01b031614156101da576101d581610488565b6101e2565b6101e2610191565b50565b6101ed610463565b6001600160a01b0316336001600160a01b031614156102855761020f83610488565b6000836001600160a01b031683836040518083838082843760405192019450600093509091505080830381855af49150503d806000811461026c576040519150601f19603f3d011682016040523d82523d6000602084013e610271565b606091505b505090508061027f57600080fd5b5061028d565b61028d610191565b505050565b600061029c610463565b6001600160a01b0316336001600160a01b031614156102c4576102bd61041a565b90506102cc565b6102cc610191565b90565b6102d7610463565b6001600160a01b0316336001600160a01b031614156101da576001600160a01b0381166103355760405162461bcd60e51b81526004018080602001828103825260368152602001806105876036913960400191505060405180910390fd5b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f61035e610463565b604080516001600160a01b03928316815291841660208301528051918290030190a16101d5816104c8565b6000610393610463565b6001600160a01b0316336001600160a01b031614156102c4576102bd610463565b3b151590565b6103c2610463565b6001600160a01b0316336001600160a01b031614156104125760405162461bcd60e51b81526004018080602001828103825260328152602001806105556032913960400191505060405180910390fd5b6101a96101a9565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b3660008037600080366000845af43d6000803e80801561045e573d6000f35b3d6000fd5b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b610491816104ec565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610355565b6104f5816103b4565b6105305760405162461bcd60e51b815260040180806020018281038252603b8152602001806105bd603b913960400191505060405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5556fe43616e6e6f742063616c6c2066616c6c6261636b2066756e6374696f6e2066726f6d207468652070726f78792061646d696e43616e6e6f74206368616e6765207468652061646d696e206f6620612070726f787920746f20746865207a65726f206164647265737343616e6e6f742073657420612070726f787920696d706c656d656e746174696f6e20746f2061206e6f6e2d636f6e74726163742061646472657373a26469706673582212206e221e2a3547bd97244b05ed46430b1b078ba097cb2a4e25ec3d79cf9ac9f02c64736f6c63430006080033", + "nonce": "0", + "storage": { + "0x0": "1000000", + "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0xD3003000000000000000000000000000000000D3", + "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "0xD3001000000000000000000000000000000000D3" + } + }, + "0xD3003000000000000000000000000000000000D3": { + "balance": "0", + "code": "0x608060405234801561001057600080fd5b50600436106100b45760003560e01c806379210e8e1161007157806379210e8e1461017757806381a8235a146101a757806385aeeb17146101c35780639a9a5593146101f3578063a99100541461020f578063b57321221461022b576100b4565b806307c6e7d3146100b9578063122f4fba146100d55780631c6ec7a9146101055780631cfe4e3b14610121578063373dedb41461013d57806361e46db51461015b575b600080fd5b6100d360048036036100ce9190810190613e94565b61025b565b005b6100ef60048036036100ea9190810190613e94565b610862565b6040516100fc9190614b38565b60405180910390f35b61011f600480360361011a9190810190613e94565b610ba1565b005b61013b60048036036101369190810190613e58565b610fce565b005b6101456111ec565b6040516101529190614eb3565b60405180910390f35b61017560048036036101709190810190613f29565b6111f6565b005b610191600480360361018c9190810190613fa8565b611456565b60405161019e9190614af9565b60405180910390f35b6101c160048036036101bc9190810190613e94565b611756565b005b6101dd60048036036101d89190810190613e94565b6118fb565b6040516101ea9190614b16565b60405180910390f35b61020d60048036036102089190810190613ed5565b611bfa565b005b61022960048036036102249190810190613e94565b612195565b005b61024560048036036102409190810190613e94565b612849565b6040516102529190614eb3565b60405180910390f35b6000339050606061026b83612ac9565b90506000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b825181101561037c576000826001018460018403815181106102d557fe5b60200260200101516040516102ea9190614aa1565b90815260200160405180910390205411610339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161033090614cb3565b60405180910390fd5b8160020183600183038151811061034c57fe5b60200260200101516040516103619190614aa1565b908152602001604051809103902091508060010190506102b7565b506060600183511161038e57846103a7565b8260018451038151811061039e57fe5b60200260200101515b9050600082600101826040516103bd9190614ab8565b9081526020016040518091039020541161040c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161040390614cb3565b60405180910390fd5b600082600201826040516104209190614ab8565b90815260200160405180910390206000018054905014610475576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161046c90614d33565b60405180910390fd5b60006104818587612cc9565b9050806104c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ba90614c53565b60405180910390fd5b6104cb613a4f565b836000016001856000018054905003815481106104e457fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156105965780601f1061056b57610100808354040283529160200191610596565b820191906000526020600020905b81548152906001019060200180831161057957829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff1660028111156105e257fe5b60028111156105ed57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561066557602002820191906000526020600020906000905b82829054906101000a900460ff1615158152602001906001019060208260000104928301926001038202915080841161062f5790505b50505050508152505090508084600001600186600101866040516106899190614ab8565b90815260200160405180910390205403815481106106a357fe5b906000526020600020906005020160008201518160000190805190602001906106cd929190613a8b565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561071c57fe5b0217905550608082015181600401908051906020019061073d929190613b0b565b5090505083600101836040516107539190614ab8565b9081526020016040518091039020548460010182600001516040516107789190614aa1565b9081526020016040518091039020819055506000846001018460405161079e9190614ab8565b908152602001604051809103902081905550836000018054806107bd57fe5b6001900381819060005260206000209060050201600080820160006107e29190613bb1565b6001820160006101000a81549060ff021916905560028201600090556003820160006101000a81549060ff02191690556004820160006108229190613bf9565b5050905583600201836040516108389190614ab8565b9081526020016040518091039020600080820160006108579190613c21565b505050505050505050565b600080606061087084612d2d565b91509150606061087f82612ac9565b90506000600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015610964576000826001018460018403815181106108e957fe5b60200260200101516040516108fe9190614aa1565b908152602001604051809103902054141561092157600095505050505050610b9c565b8160020183600183038151811061093457fe5b60200260200101516040516109499190614aa1565b908152602001604051809103902091508060010190506108cb565b5060606001835111610976578361098f565b8260018451038151811061098657fe5b60200260200101515b9050600082600101826040516109a59190614ab8565b90815260200160405180910390205414156109c857600095505050505050610b9c565b6109d0613a4f565b82600001600184600101846040516109e89190614ab8565b9081526020016040518091039020540381548110610a0257fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610ab45780601f10610a8957610100808354040283529160200191610ab4565b820191906000526020600020905b815481529060010190602001808311610a9757829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115610b0057fe5b6002811115610b0b57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015610b8357602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411610b4d5790505b5050505050815250509050806060015196505050505050505b919050565b600360009054906101000a900460ff16610be457612000600481905550621000006005819055506001600360006101000a81548160ff0219169083151502179055505b6000815111610c28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1f90614cb3565b60405180910390fd5b60003390506060610c3883612ac9565b90506000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015610d4957600082600101846001840381518110610ca257fe5b6020026020010151604051610cb79190614aa1565b90815260200160405180910390205411610d06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cfd90614cb3565b60405180910390fd5b81600201836001830381518110610d1957fe5b6020026020010151604051610d2e9190614aa1565b90815260200160405180910390209150806001019050610c84565b50600454816000018054905010610d95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8c90614dd3565b60405180910390fd5b60606001835111610da65784610dbf565b82600184510381518110610db657fe5b60200260200101515b905060008260010182604051610dd59190614ab8565b90815260200160405180910390205414610e24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1b90614e13565b60405180910390fd5b610e2d816130af565b610e6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6390614cd3565b60405180910390fd5b6000610e788587613190565b905080610eba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb190614b73565b60405180910390fd5b610ec2613a4f565b8281600001819052506000816020019015159081151581525050836000018190806001815401808255809150506001900390600052602060002090600502016000909190919091506000820151816000019080519060200190610f26929190613a8b565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff02191690836002811115610f7557fe5b02179055506080820151816004019080519060200190610f96929190613b0b565b50505083600001805490508460010184604051610fb39190614ab8565b90815260200160405180910390208190555050505050505050565b610fd66131f4565b73ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16148061103b57503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614155b61107a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107190614c33565b60405180910390fd5b80600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411156110fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f390614d13565b60405180910390fd5b60025460095482011115611145576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113c90614b93565b60405180910390fd5b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460096000828254039250508190555080600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550806009600082825401925050819055505050565b6000600254905090565b60003390506000611207828661328d565b90506001600281111561121657fe5b8160030160009054906101000a900460ff16600281111561123357fe5b14611273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126a90614df3565b60405180910390fd5b6000600554858161128057fe5b061480156112915750806002015484105b6112d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c790614b53565b60405180910390fd5b600554848260020154031080156112ed5750838160020154038351145b806112fa57506005548351145b611339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133090614bf3565b60405180910390fd5b6000151581600401600554868161134c57fe5b048154811061135757fe5b90600052602060002090602091828204019190069054906101000a900460ff161515146113b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b090614bd3565b60405180910390fd5b60006113c78387878761348c565b905080611409576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140090614cf3565b60405180910390fd5b600182600401600554878161141a57fe5b048154811061142557fe5b90600052602060002090602091828204019190066101000a81548160ff021916908315150217905550505050505050565b61145e613c45565b6000606061146b86612d2d565b91509150611477613a4f565b611481838361328d565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156115255780601f106114fa57610100808354040283529160200191611525565b820191906000526020600020905b81548152906001019060200180831161150857829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561157157fe5b600281111561157c57fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156115f457602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116115be5790505b505050505081525050905060028081111561160b57fe5b8160600151600281111561161b57fe5b1461165b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165290614e93565b60405180910390fd5b600554851115801561166d5750600085115b6116ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a390614bf3565b60405180910390fd5b806040015185870111156116f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ec90614b53565b60405180910390fd5b60006117038484898961353d565b80965081925050508061174b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174290614d73565b60405180910390fd5b505050509392505050565b60003390506000611767828461328d565b90506001600281111561177657fe5b8160030160009054906101000a900460ff16600281111561179357fe5b146117d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ca90614df3565b60405180910390fd5b60006001905060008260040180549050905060008090505b8181101561183e576000151584600401828154811061180657fe5b90600052602060002090602091828204019190069054906101000a900460ff161515141561183357600092505b8060010190506117eb565b508161187f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187690614d53565b60405180910390fd5b60028360030160006101000a81548160ff021916908360028111156118a057fe5b021790555060006118b185876135d0565b9050806118f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ea90614bb3565b60405180910390fd5b505050505050565b60606000606061190a84612d2d565b91509150606061191982612ac9565b90506000600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008090505b8251811015611a235760008260010184838151811061197f57fe5b60200260200101516040516119949190614aa1565b908152602001604051809103902054116119e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119da90614cb3565b60405180910390fd5b816002018382815181106119f357fe5b6020026020010151604051611a089190614aa1565b90815260200160405180910390209150806001019050611964565b5080600001805480602002602001604051908101604052809291908181526020016000905b82821015611beb57838290600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611b045780601f10611ad957610100808354040283529160200191611b04565b820191906000526020600020905b815481529060010190602001808311611ae757829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115611b5057fe5b6002811115611b5b57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015611bd357602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411611b9d5790505b50505050508152505081526020019060010190611a48565b50505050945050505050919050565b600360009054906101000a900460ff16611c3d57612000600481905550621000006005819055506001600360006101000a81548160ff0219169083151502179055505b60003390506305f5e100821115611c89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8090614db3565b60405180910390fd5b600660008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205483011115611d4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4390614e33565b60405180910390fd5b6060611d5784612ac9565b90506000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015611e6857600082600101846001840381518110611dc157fe5b6020026020010151604051611dd69190614aa1565b90815260200160405180910390205411611e25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1c90614cb3565b60405180910390fd5b81600201836001830381518110611e3857fe5b6020026020010151604051611e4d9190614aa1565b90815260200160405180910390209150806001019050611da3565b50600454816000018054905010611eb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eab90614dd3565b60405180910390fd5b60606001835111611ec55785611ede565b82600184510381518110611ed557fe5b60200260200101515b905060008260010182604051611ef49190614ab8565b90815260200160405180910390205414611f43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3a90614e13565b60405180910390fd5b611f4c816130af565b611f8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8290614d93565b60405180910390fd5b6000611f98858888613634565b905080611fda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd190614e73565b60405180910390fd5b6060600554600160055489010381611fee57fe5b0460405190808252806020026020018201604052801561201d5781602001602082028038833980820191505090505b509050836000016040518060a001604052808581526020016001151581526020018981526020016001600281111561205157fe5b8152602001838152509080600181540180825580915050600190039060005260206000209060050201600090919091909150600082015181600001908051906020019061209f929190613a8b565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff021916908360028111156120ee57fe5b0217905550608082015181600401908051906020019061210f929190613b0b565b5050508360000180549050846001018460405161212c9190614ab8565b90815260200160405180910390208190555086600760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505050505050505050565b60003390506121a2613a4f565b6121ac828461328d565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156122505780601f1061222557610100808354040283529160200191612250565b820191906000526020600020905b81548152906001019060200180831161223357829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561229c57fe5b60028111156122a757fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561231f57602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116122e95790505b50505050508152505090506000600281111561233757fe5b8160600151600281111561234757fe5b1415612388576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161237f90614c13565b60405180910390fd5b600061239483856136a1565b9050806123d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123cd90614c73565b60405180910390fd5b60606123e185612ac9565b90506000600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015612479578160020183600183038151811061244957fe5b602002602001015160405161245e9190614aa1565b9081526020016040518091039020915080600101905061242d565b50600060018260010186600001516040516124949190614aa1565b9081526020016040518091039020540390506124ae613a4f565b826000016001846000018054905003815481106124c757fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156125795780601f1061254e57610100808354040283529160200191612579565b820191906000526020600020905b81548152906001019060200180831161255c57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff1660028111156125c557fe5b60028111156125d057fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561264857602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116126125790505b50505050508152505090508083600001838154811061266357fe5b9060005260206000209060050201600082015181600001908051906020019061268d929190613a8b565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff021916908360028111156126dc57fe5b021790555060808201518160040190805190602001906126fd929190613b0b565b509050508260000180548061270e57fe5b6001900381819060005260206000209060050201600080820160006127339190613bb1565b6001820160006101000a81549060ff021916905560028201600090556003820160006101000a81549060ff02191690556004820160006127739190613bf9565b5050905582600101866000015160405161278d9190614aa1565b9081526020016040518091039020548360010182600001516040516127b29190614aa1565b90815260200160405180910390208190555060008360010187600001516040516127dc9190614aa1565b9081526020016040518091039020819055508560400151600760008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505050505050505050565b600080606061285784612d2d565b91509150612863613a4f565b61286d838361328d565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156129115780601f106128e657610100808354040283529160200191612911565b820191906000526020600020905b8154815290600101906020018083116128f457829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561295d57fe5b600281111561296857fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156129e057602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116129aa5790505b5050505050815250509050600160028111156129f857fe5b81606001516002811115612a0857fe5b1480612a2d5750600280811115612a1b57fe5b81606001516002811115612a2b57fe5b145b612a6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a6390614df3565b60405180910390fd5b6000612a788484613705565b809650819250505080612ac0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ab790614e53565b60405180910390fd5b50505050919050565b6060612ad3613c6a565b612adc8361376e565b9050612ae6613c6a565b612b246040518060400160405280600181526020017f2f0000000000000000000000000000000000000000000000000000000000000081525061376e565b905060606001612b3d838561379c90919063ffffffff16565b01604051908082528060200260200182016040528015612b7157816020015b6060815260200190600190039081612b5c5790505b50905060008090505b8151811015612bc257612b9e612b99848661381190919063ffffffff16565b61382b565b828281518110612baa57fe5b60200260200101819052508080600101915050612b7a565b50600081600183510381518110612bd557fe5b6020026020010151511415612c405780600182510381518110612bf457fe5b6020026020010160608152506001815103604051908082528060200260200182016040528015612c3857816020015b6060815260200190600190039081612c235790505b509350612c79565b8051604051908082528060200260200182016040528015612c7557816020015b6060815260200190600190039081612c605790505b5093505b60008090505b8451811015612cc057818181518110612c9457fe5b6020026020010151858281518110612ca857fe5b60200260200101819052508080600101915050612c7f565b50505050919050565b60008060016020601f85510181612cdc57fe5b040190506040518481526020810160005b83811015612d0e578060200286015181602002830152806001019050612ced565b50602082602085026040018460006010600019f1935050505092915050565b6000606060006028905080845111612d7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d7190614c93565b60405180910390fd5b6060816040519080825280601f01601f191660200182016040528015612daf5781602001600182028038833980820191505090505b50905060008090505b82811015612e1f57858181518110612dcc57fe5b602001015160f81c60f81b828281518110612de357fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050612db8565b50600080905060008090505b83811015612f4e576000838281518110612e4157fe5b602001015160f81c60f81b60f81c60ff16905060308110158015612e66575060398111155b80612e7f575060418110158015612e7e5750605a8111155b5b80612e98575060618110158015612e97575060668111155b5b612ed7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ece90614c93565b60405180910390fd5b60308110158015612ee9575060398111155b15612efa5760308103601084020192505b60418110158015612f0c5750605a8111155b15612f1d5760378103601084020192505b60618110158015612f2f575060668111155b15612f405760578103601084020192505b508080600101915050612e2b565b508094507f2f00000000000000000000000000000000000000000000000000000000000000868481518110612f7f57fe5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612fec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fe390614c93565b60405180910390fd5b6000600184885103039050806040519080825280601f01601f19166020018201604052801561302a5781602001600182028038833980820191505090505b50945060008090505b818110156130a5576000886001878401018151811061304e57fe5b602001015160f81c60f81b90508087838151811061306857fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350508080600101915050613033565b5050505050915091565b60006040516020016130c090614ae4565b60405160208183030381529060405280519060200120826040516020016130e79190614ab8565b604051602081830303815290604052805190602001201480613152575060405160200161311390614acf565b604051602081830303815290604052805190602001208260405160200161313a9190614ab8565b60405160208183030381529060405280519060200120145b8061315e575060008251145b1561316c576000905061318b565b60008251905060ff81111561318557600091505061318b565b60019150505b919050565b60008060016020601f855101816131a357fe5b040190506040518481526020810160005b838110156131d55780602002860151816020028301528060010190506131b4565b5060208260208502604001846000600f600019f1935050505092915050565b600073d2001000000000000000000000000000000000d273ffffffffffffffffffffffffffffffffffffffff166383e781fe6040518163ffffffff1660e01b815260040160206040518083038186803b15801561325057600080fd5b505afa158015613264573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506132889190810190613e2f565b905090565b6000606061329a83612ac9565b90506000600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b82518110156133ab5760008260010184600184038151811061330457fe5b60200260200101516040516133199190614aa1565b90815260200160405180910390205411613368576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161335f90614cb3565b60405180910390fd5b8160020183600183038151811061337b57fe5b60200260200101516040516133909190614aa1565b908152602001604051809103902091508060010190506132e6565b50606060018351116133bd57846133d6565b826001845103815181106133cd57fe5b60200260200101515b9050600082600101826040516133ec9190614ab8565b9081526020016040518091039020541161343b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161343290614cb3565b60405180910390fd5b600082600001600184600101846040516134559190614ab8565b908152602001604051809103902054038154811061346f57fe5b906000526020600020906005020190508094505050505092915050565b60008060016020601f8551018161349f57fe5b04019050600060016020601f885101816134b557fe5b040190506040518781526020810160005b838110156134e75780602002890151816020028301528060010190506134c6565b50868360200282015260005b8481101561351957806020028701518185600101016020028301528060010190506134f3565b50602082848601602002606001846000600c600019f1945050505050949350505050565b6000613547613c45565b600060016020601f8851018161355957fe5b0401905060006020601f86018161356c57fe5b0490506040518881526020810160005b8481101561359d57806020028a01518160200283015280600101905061357c565b5083602002810188815287816020015283602002868660030160200285600a600019fa9650505050505094509492505050565b60008060016020601f855101816135e357fe5b040190506040518481526020810160005b838110156136155780602002860151816020028301528060010190506135f4565b50602082602085026040018460006011600019f1935050505092915050565b60008060016020601f8651018161364757fe5b040190506040518581526020810160005b83811015613679578060200287015181602002830152806001019050613658565b50846020840282015260208260208502604001846000600b600019f193505050509392505050565b60008060016020601f855101816136b457fe5b040190506040518481526020810160005b838110156136e65780602002860151816020028301528060010190506136c5565b5060208260208502604001846000600e600019f1935050505092915050565b600080600060016020601f8651018161371a57fe5b040190506040518581526020810160005b8381101561374c57806020028701518160200283015280600101905061372b565b506020826020850260200184600d600019fa9450815193505050509250929050565b613776613c6a565b600060208301905060405180604001604052808451815260200182815250915050919050565b60008082600001516137c0856000015186602001518660000151876020015161388d565b0190505b8360000151846020015101811161380a578180600101925050826000015161380285602001518303866000015103838660000151876020015161388d565b0190506137c4565b5092915050565b613819613c6a565b613824838383613968565b5092915050565b60608082600001516040519080825280601f01601f1916602001820160405280156138655781602001600182028038833980820191505090505b50905060006020820190506138838185602001518660000151613a06565b8192505050919050565b6000808490506000868511613958576020851161391257600060018660200360080260020a031960001b905060008186511690506000878a8a0103905060008386511690505b828114613904578186106138f1578a8a019650505050505050613960565b85806001019650508386511690506138d3565b859650505050505050613960565b60008585209050600091505b85880382116139565760008684209050808214156139425783945050505050613960565b60018401935050818060010192505061391e565b505b868601925050505b949350505050565b613970613c6a565b600061398e856000015186602001518660000151876020015161388d565b905084602001518360200181815250508460200151810383600001818152505084600001518560200151018114156139d05760008560000181815250506139fb565b8360000151836000015101856000018181510391508181525050836000015181018560200181815250505b829150509392505050565b5b60208110613a2a5781518352602083019250602082019150602081039050613a07565b60006001826020036101000a0390508019835116818551168181178652505050505050565b6040518060a00160405280606081526020016000151581526020016000815260200160006002811115613a7e57fe5b8152602001606081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613acc57805160ff1916838001178555613afa565b82800160010185558215613afa579182015b82811115613af9578251825591602001919060010190613ade565b5b509050613b079190613c84565b5090565b82805482825590600052602060002090601f01602090048101928215613ba05791602002820160005b83821115613b7157835183826101000a81548160ff0219169083151502179055509260200192600101602081600001049283019260010302613b34565b8015613b9e5782816101000a81549060ff0219169055600101602081600001049283019260010302613b71565b505b509050613bad9190613ca9565b5090565b50805460018160011615610100020316600290046000825580601f10613bd75750613bf6565b601f016020900490600052602060002090810190613bf59190613c84565b5b50565b50805460008255601f016020900490600052602060002090810190613c1e9190613c84565b50565b5080546000825560050290600052602060002090810190613c429190613cd9565b50565b6040518062100000016040528061800090602082028038833980820191505090505090565b604051806040016040528060008152602001600081525090565b613ca691905b80821115613ca2576000816000905550600101613c8a565b5090565b90565b613cd691905b80821115613cd257600081816101000a81549060ff021916905550600101613caf565b5090565b90565b613d4591905b80821115613d415760008082016000613cf89190613bb1565b6001820160006101000a81549060ff021916905560028201600090556003820160006101000a81549060ff0219169055600482016000613d389190613bf9565b50600501613cdf565b5090565b90565b600081359050613d578161510d565b92915050565b600081519050613d6c8161510d565b92915050565b600082601f830112613d8357600080fd5b8135613d96613d9182614efb565b614ece565b91508082526020830160208301858383011115613db257600080fd5b613dbd8382846150ad565b50505092915050565b600082601f830112613dd757600080fd5b8135613dea613de582614f27565b614ece565b91508082526020830160208301858383011115613e0657600080fd5b613e118382846150ad565b50505092915050565b600081359050613e2981615124565b92915050565b600060208284031215613e4157600080fd5b6000613e4f84828501613d5d565b91505092915050565b60008060408385031215613e6b57600080fd5b6000613e7985828601613d48565b9250506020613e8a85828601613e1a565b9150509250929050565b600060208284031215613ea657600080fd5b600082013567ffffffffffffffff811115613ec057600080fd5b613ecc84828501613dc6565b91505092915050565b60008060408385031215613ee857600080fd5b600083013567ffffffffffffffff811115613f0257600080fd5b613f0e85828601613dc6565b9250506020613f1f85828601613e1a565b9150509250929050565b600080600060608486031215613f3e57600080fd5b600084013567ffffffffffffffff811115613f5857600080fd5b613f6486828701613dc6565b9350506020613f7586828701613e1a565b925050604084013567ffffffffffffffff811115613f9257600080fd5b613f9e86828701613d72565b9150509250925092565b600080600060608486031215613fbd57600080fd5b600084013567ffffffffffffffff811115613fd757600080fd5b613fe386828701613dc6565b9350506020613ff486828701613e1a565b925050604061400586828701613e1a565b9150509250925092565b600061401b838361417d565b60208301905092915050565b6000614033838361418c565b60208301905092915050565b600061404b8383614a06565b905092915050565b600061405e82614f7d565b6140688185614fdc565b935061407383614f53565b8060005b838110156140a457815161408b888261400f565b975061409683614fb5565b925050600181019050614077565b5085935050505092915050565b6140ba81614f88565b6140c48184614fed565b92506140cf82614f63565b8060005b838110156141005781516140e78782614027565b96506140f283614fc2565b9250506001810190506140d3565b505050505050565b600061411382614f94565b61411d8185614ff8565b93508360208202850161412f85614f6d565b8060005b8581101561416b578484038952815161414c858261403f565b945061415783614fcf565b925060208a01995050600181019050614133565b50829750879550505050505092915050565b61418681615048565b82525050565b61419581615054565b82525050565b6141a48161509b565b82525050565b6141b38161509b565b82525050565b60006141c482614faa565b6141ce818561502b565b93506141de8185602086016150bc565b80840191505092915050565b60006141f582614f9f565b6141ff8185615009565b935061420f8185602086016150bc565b614218816150ef565b840191505092915050565b600061422e82614f9f565b614238818561502b565b93506142488185602086016150bc565b80840191505092915050565b600061426160188361501a565b91507f496e636f7272656374206368756e6b20706f736974696f6e00000000000000006000830152602082019050919050565b60006142a160158361501a565b91507f4469726563746f7279206e6f74206372656174656400000000000000000000006000830152602082019050919050565b60006142e160248361501a565b91507f4e6f7420656e6f756768206d656d6f727920696e207468652046696c6573746f60008301527f72616765000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614347601b8361501a565b91507f48617368206861736e2774206265656e2063616c63756c6174656400000000006000830152602082019050919050565b600061438760198361501a565b91507f4368756e6b20697320616c72656164792075706c6f61646564000000000000006000830152602082019050919050565b60006143c760168361501a565b91507f496e636f7272656374206368756e6b206c656e677468000000000000000000006000830152602082019050919050565b6000614407600f8361501a565b91507f46696c65206e6f742065786973747300000000000000000000000000000000006000830152602082019050919050565b6000614447600e8361501a565b91507f496e76616c69642073656e6465720000000000000000000000000000000000006000830152602082019050919050565b600061448760188361501a565b91507f4469726563746f7279206973206e6f742064656c6574656400000000000000006000830152602082019050919050565b60006144c760108361501a565b91507f46696c65206e6f742064656c65746564000000000000000000000000000000006000830152602082019050919050565b600061450760138361501a565b91507f496e76616c69642073746f7261676550617468000000000000000000000000006000830152602082019050919050565b6000614547600c8361501a565b91507f496e76616c6964207061746800000000000000000000000000000000000000006000830152602082019050919050565b600061458760018361502b565b91507f2e000000000000000000000000000000000000000000000000000000000000006000830152600182019050919050565b60006145c760168361501a565b91507f496e76616c6964206469726563746f7279206e616d65000000000000000000006000830152602082019050919050565b600061460760158361501a565b91507f4368756e6b207761736e27742075706c6f6164656400000000000000000000006000830152602082019050919050565b600061464760268361501a565b91507f436f756c64206e6f742072657365727665206c657373207468616e207573656460008301527f20737061636500000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006146ad60168361501a565b91507f4469726563746f7279206973206e6f7420656d707479000000000000000000006000830152602082019050919050565b60006146ed60238361501a565b91507f46696c65206861736e2774206265656e2075706c6f6164656420636f7272656360008301527f746c7900000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061475360118361501a565b91507f4368756e6b207761736e277420726561640000000000000000000000000000006000830152602082019050919050565b600061479360188361501a565b91507f46696c656e616d652073686f756c64206265203c2032353600000000000000006000830152602082019050919050565b60006147d3601f8361501a565b91507f46696c652073686f756c64206265206c657373207468616e20313030204d42006000830152602082019050919050565b600061481360028361502b565b91507f2e2e0000000000000000000000000000000000000000000000000000000000006000830152600282019050919050565b600061485360118361501a565b91507f4469726563746f72792069732066756c6c0000000000000000000000000000006000830152602082019050919050565b6000614893600e8361501a565b91507f46696c65206e6f7420666f756e640000000000000000000000000000000000006000830152602082019050919050565b60006148d360188361501a565b91507f46696c65206f72206469726563746f72792065786973747300000000000000006000830152602082019050919050565b600061491360198361501a565b91507f4e6f7420656e6f756768207265736572766564207370616365000000000000006000830152602082019050919050565b600061495360188361501a565b91507f45564d206572726f7220696e2067657446696c6553697a6500000000000000006000830152602082019050919050565b600061499360108361501a565b91507f46696c65206e6f742063726561746564000000000000000000000000000000006000830152602082019050919050565b60006149d360198361501a565b91507f46696c65206861736e2774206265656e2075706c6f61646564000000000000006000830152602082019050919050565b600060a0830160008301518482036000860152614a2382826141ea565b9150506020830151614a38602086018261417d565b506040830151614a4b6040860182614a83565b506060830151614a5e606086018261419b565b5060808301518482036080860152614a768282614053565b9150508091505092915050565b614a8c81615091565b82525050565b614a9b81615091565b82525050565b6000614aad8284614223565b915081905092915050565b6000614ac482846141b9565b915081905092915050565b6000614ada8261457a565b9150819050919050565b6000614aef82614806565b9150819050919050565b60006210000082019050614b1060008301846140b1565b92915050565b60006020820190508181036000830152614b308184614108565b905092915050565b6000602082019050614b4d60008301846141aa565b92915050565b60006020820190508181036000830152614b6c81614254565b9050919050565b60006020820190508181036000830152614b8c81614294565b9050919050565b60006020820190508181036000830152614bac816142d4565b9050919050565b60006020820190508181036000830152614bcc8161433a565b9050919050565b60006020820190508181036000830152614bec8161437a565b9050919050565b60006020820190508181036000830152614c0c816143ba565b9050919050565b60006020820190508181036000830152614c2c816143fa565b9050919050565b60006020820190508181036000830152614c4c8161443a565b9050919050565b60006020820190508181036000830152614c6c8161447a565b9050919050565b60006020820190508181036000830152614c8c816144ba565b9050919050565b60006020820190508181036000830152614cac816144fa565b9050919050565b60006020820190508181036000830152614ccc8161453a565b9050919050565b60006020820190508181036000830152614cec816145ba565b9050919050565b60006020820190508181036000830152614d0c816145fa565b9050919050565b60006020820190508181036000830152614d2c8161463a565b9050919050565b60006020820190508181036000830152614d4c816146a0565b9050919050565b60006020820190508181036000830152614d6c816146e0565b9050919050565b60006020820190508181036000830152614d8c81614746565b9050919050565b60006020820190508181036000830152614dac81614786565b9050919050565b60006020820190508181036000830152614dcc816147c6565b9050919050565b60006020820190508181036000830152614dec81614846565b9050919050565b60006020820190508181036000830152614e0c81614886565b9050919050565b60006020820190508181036000830152614e2c816148c6565b9050919050565b60006020820190508181036000830152614e4c81614906565b9050919050565b60006020820190508181036000830152614e6c81614946565b9050919050565b60006020820190508181036000830152614e8c81614986565b9050919050565b60006020820190508181036000830152614eac816149c6565b9050919050565b6000602082019050614ec86000830184614a92565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614ef157600080fd5b8060405250919050565b600067ffffffffffffffff821115614f1257600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614f3e57600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050919050565b6000819050602082019050919050565b600081519050919050565b60006180009050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061504182615071565b9050919050565b60008115159050919050565b6000819050919050565b600081905061506c82615100565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006150a68261505e565b9050919050565b82818337600083830152505050565b60005b838110156150da5780820151818401526020810190506150bf565b838111156150e9576000848401525b50505050565b6000601f19601f8301169050919050565b6003811061510a57fe5b50565b61511681615036565b811461512157600080fd5b50565b61512d81615091565b811461513857600080fd5b5056fea2646970667358221220a549ad9e778ae8bb3048c0a1805e77745871cc1560637ae1c3ebccb76638d9c464736f6c63430006020033", + "nonce": "0", + "storage": {} + }, + "0xa096b05a489831db893fc53aacc7ed20efb36382": { + "balance": "1000000000000000000000000000000" + }, + "0xa1cd651d99283be60e2a9d2e3bc8a90aedb8244f": { + "balance": "1000000000000000000000000000000" + }, + "0xa2969e82619021ea407338f8bdf7c6f2bd679673": { + "balance": "1000000000000000000000000000000" + }, + "0xa3597b1162b6559cb5e966904b63e762ece756a4": { + "balance": "1000000000000000000000000000000" + }, + "0xa68f946090c600eda6f139783077ee802afeb990": { + "balance": "1000000000000000000000000000000" + }, + "0xa6d50055592cecb795bc1ed3b9ea57ed426b0b7c": { + "balance": "1000000000000000000000000000000" + }, + "0xa7c0789bdeee38c6b59111a789dfb6b815489847": { + "balance": "1000000000000000000000000000000" + }, + "0xa8c813ee806b4c8537ff5f16084d44db18ea9ab1": { + "balance": "1000000000000000000000000000000" + }, + "0xaa6a87bbb74bc1f3cb40c1efb7fc171ee6407560": { + "balance": "1000000000000000000000000000000" + }, + "0xabf920b89f5a2487fdb70be17fd01a99a0602e62": { + "balance": "1000000000000000000000000000000" + }, + "0xac5df92da5171ba24a9618018b4f79494040334b": { + "balance": "1000000000000000000000000000000" + }, + "0xaf97a8318a1a51d5daeeb9650024b63ee44f45bd": { + "balance": "1000000000000000000000000000000" + }, + "0xb28c45b98ae43a5e9ee5509c97ea037b5de5d6d9": { + "balance": "1000000000000000000000000000000" + }, + "0xb64989ab32b089da3da103b93e6781d6d5dd10b4": { + "balance": "1000000000000000000000000000000" + }, + "0xb67e6f4a21f93c250fa6ff0cb142bd14dd4ca8eb": { + "balance": "1000000000000000000000000000000" + }, + "0xb70603c505f85130b5b2e73cd82d196dfd7d8b5e": { + "balance": "1000000000000000000000000000000" + }, + "0xb942414cae2a1ab1056657b905845c0ab6b6280a": { + "balance": "1000000000000000000000000000000" + }, + "0xbee0e5c1961d51be9bd670876caa9c90ba7d9016": { + "balance": "1000000000000000000000000000000" + }, + "0xbf2d8cebdeeb8ad8fed7b2a75f35922106f8d75c": { + "balance": "1000000000000000000000000000000" + }, + "0xbf5aa678b969c0871e2fbcf09c3dbb5d5865ac1e": { + "balance": "1000000000000000000000000000000" + }, + "0xc12bcedd9bcad9120150122cd50f39576ecccc08": { + "balance": "1000000000000000000000000000000" + }, + "0xc2d3852f3292acb81bd164dbae5f1e2a87535150": { + "balance": "1000000000000000000000000000000" + }, + "0xc3820490201e94d76b44655d2df713fec29d9795": { + "balance": "1000000000000000000000000000000" + }, + "0xc58744e2eceefd45cc5469f0e0a708ad24ddbbdb": { + "balance": "1000000000000000000000000000000" + }, + "0xc7865200e8e51ba1c8d695f327deed432930f2cc": { + "balance": "1000000000000000000000000000000" + }, + "0xc8e4d709eb3eb335dc69c9fbf2d24d447cb86105": { + "balance": "1000000000000000000000000000000" + }, + "0xc98af661e44c5bf31d2f8bdff4bbf2808ed4e991": { + "balance": "1000000000000000000000000000000" + }, + "0xca4409573a5129a72edf85d6c51e26760fc9c903": { + "balance": "100000000000000000000000" + }, + "0xcc33e23b04b74f7ba8fbe315083182224af973fa": { + "balance": "1000000000000000000000000000000" + }, + "0xce1c62d0a77600fb2f959b4da76fcb9b3b9430a3": { + "balance": "1000000000000000000000000000000" + }, + "0xd1b6c947fb14060b38945584714491592e84875d": { + "balance": "1000000000000000000000000000000" + }, + "0xd23cd6a9ddcc3470300003621bbac1e06a7919d5": { + "balance": "1000000000000000000000000000000" + }, + "0xd2c5b39B4e735C17612Bb5a08FD024ccc5dBCb23": { + "balance": "100000000000000000000000" + }, + "0xd2cd302eb060e375a65d65946692a3ac2d838d35": { + "balance": "1000000000000000000000000000000" + }, + "0xd2e75c41ced8699e3176f6e335355701a2568b7b": { + "balance": "1000000000000000000000000000000" + }, + "0xd3d38f4cb0aeb4c7c2527ddaeec2ab3b910c8528": { + "balance": "1000000000000000000000000000000" + }, + "0xd5b561a27cca5049650a14ab93dbf1a20c0cefc1": { + "balance": "1000000000000000000000000000000" + }, + "0xd90045420b8abc37b3f9304ed2b385fc1b7fa8c5": { + "balance": "1000000000000000000000000000000" + }, + "0xd951bf4cff429062702a7d8699a5f0bf14845d9b": { + "balance": "1000000000000000000000000000000" + }, + "0xdc6a269c58e58a93a22b5df8cdf1af630c47481f": { + "balance": "1000000000000000000000000000000" + }, + "0xdc6d02ef4003a4f2d0ccff65ae1a2d8157fbb23e": { + "balance": "1000000000000000000000000000000" + }, + "0xde14aca36acc62c305a7ee571da37840a408e600": { + "balance": "1000000000000000000000000000000" + }, + "0xdee32ae508cf783f53ab8bc39d878fe323cdfae3": { + "balance": "1000000000000000000000000000000" + }, + "0xe083a100d51fc4f38aae4a3a68404c36ad96c612": { + "balance": "1000000000000000000000000000000" + }, + "0xe1607990ce800407e3c206e58de4917977181d4d": { + "balance": "1000000000000000000000000000000" + }, + "0xe25e5b63dfd4cf59b81eddf64f1195858634b8a6": { + "balance": "1000000000000000000000000000000" + }, + "0xe372377decb3bdc0c7f5272d38ce0ba2a54934fe": { + "balance": "1000000000000000000000000000000" + }, + "0xe3cc6ec63b5652d1594bc63bb293f4e80f76dbdd": { + "balance": "1000000000000000000000000000000" + }, + "0xe3da7c014286258944ab20a31e4d861b4c9262f1": { + "balance": "1000000000000000000000000000000" + }, + "0xe8b57f330d56081c856e618210fbedb414925ff0": { + "balance": "1000000000000000000000000000000" + }, + "0xe91ac72a568e752eb7c9f5235100586ce97c8cc1": { + "balance": "1000000000000000000000000000000" + }, + "0xf184c8c243a178c1748a0af45caedeca476105b4": { + "balance": "1000000000000000000000000000000" + }, + "0xf1a5912ff318aebf312cdb54c75642a9e632703c": { + "balance": "1000000000000000000000000000000" + }, + "0xf2197b153b4c9086fc5410431fbf7960d284c65e": { + "balance": "1000000000000000000000000000000" + }, + "0xf36620e71327f4a55d550d46e030ccf0c728f154": { + "balance": "1000000000000000000000000000000" + }, + "0xf9817fB82fc767aA9A4A97a1901676244b88ce0E": { + "balance": "100000000000000000000000" + }, + "0xfa723938fa8da1a8a2114ad409a11581761ee40d": { + "balance": "1000000000000000000000000000000" + }, + "0xfa7a8c69810eaf16a395d2a93b3ab51efeed2a1c": { + "balance": "1000000000000000000000000000000" + }, + "0xfaa1038074941571524934ba52d312e88b3577f5": { + "balance": "1000000000000000000000000000000" + }, + "0xfe14077c26a507496b7208384d459e21c49c4212": { + "balance": "1000000000000000000000000000000" + }, + "0xfe275c9b5ac792327da509b27eb9614196dfb07d": { + "balance": "1000000000000000000000000000000" + }, + "0xfe2c5aa110fff89361806ea7ee080bfffba0d3dd": { + "balance": "1000000000000000000000000000000" + }, + "0xfe3d4f1fc038f4f756ba44995129cd45c9e0e861": { + "balance": "1000000000000000000000000000000" + }, + "0xfee314cdc84ecfaa675e41b3559c0101e1eba6b8": { + "balance": "1000000000000000000000000000000" + } + }, + "genesis": { + "author": "0x0000000000000000000000000000000000000001", + "difficulty": "0x0", + "extraData": "0x11bbe8db4e347b4e8c937c1c8370e4b5ed33adb3db69cbdb7a38e1e50b1b82fa", + "gasLimit": "0xFFFFFFFFF", + "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000abc", + "nonce": "0x0000000000000042", + "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "timestamp": "0x00" + }, + "params": { + "EIP150ForkBlock": "0x00", + "EIP158ForkBlock": "0x00", + "accountStartNonce": "0x00", + "blockReward": "0x4563918244F40000", + "byzantiumForkBlock": "0x0", + "chainID": "0x12345", + "constantinopleForkBlock": "0x0", + "daoHardforkBlock": "0x0", + "difficultyBoundDivisor": "0x0800", + "durationLimit": "0x0d", + "externalGasDifficulty": "0x01", + "gasLimitBoundDivisor": "0x0400", + "homesteadForkBlock": "0x0", + "maxGasLimit": "0xFFFFFFFFF", + "maximumExtraDataSize": "0x20", + "minGasLimit": "0xFFFFFFFFF", + "minimumDifficulty": "0x0", + "networkID": "12313219", + "tieBreakingGas": false + }, + "sealEngine": "Ethash", + "skaleConfig": { + "nodeInfo": { + "basePort": 1531, + "bindIP": "0.0.0.0", + "collectionDuration": 10, + "collectionQueueSize": 2, + "db-path": "/tmp/test_eth_4_of_16", + "ecdsaKeyName": "", + "httpRpcPort": 1534, + "httpsRpcPort": 1239, + "logLevel": "info", + "logLevelProposal": "info", + "maxCacheSize": 2000, + "maxOpenLeveldbFiles": 25, + "minCacheSize": 1000, + "nodeID": 1604, + "nodeName": "Node1", + "rotateAfterBlock": 0, + "testSignatures": true, + "transactionQueueSize": 10000, + "wsRpcPort": 1533, + "wssRpcPort": 1538 + }, + "sChain": { + "EIP1559TransactionsPatchTimestamp": 1, + "contractStorageLimit": 10000000000, + "contractStoragePatchTimestamp": 1, + "contractStorageZeroValuePatchTimestamp": 1, + "correctForkInPowPatchTimestamp": 1, + "emptyBlockIntervalMs": 10000, + "fastConsensusPatchTimestamp": 1, + "flexibleDeploymentPatchTimestamp": 1, + "levelDBReopenIntervalMs": 1, + "multiTransactionMode": false, + "nodes": [ + { + "basePort": 1231, + "ip": "127.0.0.1", + "nodeID": 1601, + "publicKey": "", + "schainIndex": 1 + }, + { + "basePort": 1331, + "ip": "127.0.0.1", + "nodeID": 1602, + "publicKey": "", + "schainIndex": 2 + }, + { + "basePort": 1431, + "ip": "127.0.0.1", + "nodeID": 1603, + "publicKey": "", + "schainIndex": 3 + }, + { + "basePort": 1531, + "ip": "127.0.0.1", + "nodeID": 1604, + "publicKey": "", + "schainIndex": 4 + }, + { + "basePort": 1631, + "ip": "127.0.0.1", + "nodeID": 1605, + "publicKey": "", + "schainIndex": 5 + }, + { + "basePort": 1731, + "ip": "127.0.0.1", + "nodeID": 1606, + "publicKey": "", + "schainIndex": 6 + }, + { + "basePort": 1831, + "ip": "127.0.0.1", + "nodeID": 1607, + "publicKey": "", + "schainIndex": 7 + }, + { + "basePort": 1931, + "ip": "127.0.0.1", + "nodeID": 1608, + "publicKey": "", + "schainIndex": 8 + }, + { + "basePort": 2031, + "ip": "127.0.0.1", + "nodeID": 1609, + "publicKey": "", + "schainIndex": 9 + }, + { + "basePort": 2131, + "ip": "127.0.0.1", + "nodeID": 1610, + "publicKey": "", + "schainIndex": 10 + }, + { + "basePort": 2231, + "ip": "127.0.0.1", + "nodeID": 1611, + "publicKey": "", + "schainIndex": 11 + }, + { + "basePort": 2331, + "ip": "127.0.0.1", + "nodeID": 1612, + "publicKey": "", + "schainIndex": 12 + }, + { + "basePort": 2431, + "ip": "127.0.0.1", + "nodeID": 1613, + "publicKey": "", + "schainIndex": 13 + }, + { + "basePort": 2531, + "ip": "127.0.0.1", + "nodeID": 1614, + "publicKey": "", + "schainIndex": 14 + }, + { + "basePort": 2631, + "ip": "127.0.0.1", + "nodeID": 1615, + "publicKey": "", + "schainIndex": 15 + }, + { + "basePort": 2731, + "ip": "127.0.0.1", + "nodeID": 1616, + "publicKey": "", + "schainIndex": 16 + } + ], + "powCheckPatchTimestamp": 1, + "precompiledConfigPatchTimestamp": 1, + "pushZeroPatchTimestamp": 1, + "revertableFSPatchTimestamp": 1, + "schainID": 5, + "schainName": "TestChain", + "schainOwner": "0x907cd0881E50d359bb9Fd120B1A5A143b1C97De6", + "skipInvalidTransactionsPatchTimestamp": 1, + "storageDestructionPatchTimestamp": 1, + "verifyBlsSyncPatchTimestamp": 1, + "verifyDaSigsPatchTimestamp": 1 + } + }, + "unddos": { + "origins": [ + { + "ban_lengthy": 0, + "ban_peak": 0, + "max_calls_per_minute": 1000000000, + "max_calls_per_second": 1000000000, + "max_ws_conn": 65535, + "origin": [ + "*" + ] + } + ] + } +} \ No newline at end of file diff --git a/test/historicstate/configs/test_4_of_4.json b/test/historicstate/configs/test_4_of_4.json new file mode 100644 index 000000000..cb5aead86 --- /dev/null +++ b/test/historicstate/configs/test_4_of_4.json @@ -0,0 +1,826 @@ +{ + "accounts": { + "0000000000000000000000000000000000000001": { + "precompiled": { + "linear": { + "base": 3000, + "word": 0 + }, + "name": "ecrecover" + } + }, + "0000000000000000000000000000000000000002": { + "precompiled": { + "linear": { + "base": 60, + "word": 12 + }, + "name": "sha256" + } + }, + "0000000000000000000000000000000000000003": { + "precompiled": { + "linear": { + "base": 600, + "word": 120 + }, + "name": "ripemd160" + } + }, + "0000000000000000000000000000000000000004": { + "precompiled": { + "linear": { + "base": 15, + "word": 3 + }, + "name": "identity" + } + }, + "0000000000000000000000000000000000000005": { + "precompiled": { + "name": "modexp", + "startingBlock": "0x2dc6c0" + } + }, + "0000000000000000000000000000000000000006": { + "precompiled": { + "linear": { + "base": 500, + "word": 0 + }, + "name": "alt_bn128_G1_add", + "startingBlock": "0x2dc6c0" + } + }, + "0000000000000000000000000000000000000007": { + "precompiled": { + "linear": { + "base": 40000, + "word": 0 + }, + "name": "alt_bn128_G1_mul", + "startingBlock": "0x2dc6c0" + } + }, + "0000000000000000000000000000000000000008": { + "precompiled": { + "name": "alt_bn128_pairing_product", + "startingBlock": "0x2dc6c0" + } + }, + "000000000000000000000000000000000000000A": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "readChunk", + "startingBlock": "0x0" + } + }, + "000000000000000000000000000000000000000B": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "createFile", + "restrictAccess": [ + "69362535ec535F0643cBf62D16aDeDCAf32Ee6F7" + ], + "startingBlock": "0x0" + } + }, + "000000000000000000000000000000000000000C": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "uploadChunk", + "startingBlock": "0x0" + } + }, + "000000000000000000000000000000000000000D": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "getFileSize", + "startingBlock": "0x0" + } + }, + "000000000000000000000000000000000000000E": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "deleteFile", + "startingBlock": "0x0" + } + }, + "000000000000000000000000000000000000000F": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "createDirectory", + "startingBlock": "0x0" + } + }, + "0000000000000000000000000000000000000010": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "deleteDirectory", + "startingBlock": "0x0" + } + }, + "0x006d8e49ce0b9eb5646e34a4d91934801b9044fd": { + "balance": "1000000000000000000000000000000" + }, + "0x0150b461b06922a5030784ba888962c28bb1f188": { + "balance": "1000000000000000000000000000000" + }, + "0x03309956988ae70152ae4469daf99b0cac2306c5": { + "balance": "1000000000000000000000000000000" + }, + "0x06104a85a380895b6dd4030113806df2b044905e": { + "balance": "1000000000000000000000000000000" + }, + "0x079cf317ef40b16141784b6fabff812d64f7c0fd": { + "balance": "1000000000000000000000000000000" + }, + "0x0966454f51166c68b73b2865473c8fb2fcdefdd5": { + "balance": "1000000000000000000000000000000" + }, + "0x099452fedc71897880f584b1bc1706efc4e76e36": { + "balance": "1000000000000000000000000000000" + }, + "0x0aa6a44690ef52354e976990292cf9c5cd36ad59": { + "balance": "1000000000000000000000000000000" + }, + "0x0fbbe17a0e5a61ee3e8661f442d7f6b177c49820": { + "balance": "1000000000000000000000000000000" + }, + "0x1239fe658b410dbbac5bbd572035f5041542f9e5": { + "balance": "1000000000000000000000000000000" + }, + "0x12d5d7340a93be7be28ea7a3ae198242f8e1282c": { + "balance": "1000000000000000000000000000000" + }, + "0x137048b9fa4f1234d6519271b2c5ec64f480db0f": { + "balance": "1000000000000000000000000000000" + }, + "0x13867af77a63048e17380e39248ada90521e97e4": { + "balance": "1000000000000000000000000000000" + }, + "0x138ea4bdf0382c2deffd5b0bff0afe59f471467f": { + "balance": "1000000000000000000000000000000" + }, + "0x13d19c55ee0a212249d26b9d741ff6d7f416db01": { + "balance": "1000000000000000000000000000000" + }, + "0x157d38b52196b248e9fe6a2172e32ce2b8c078e6": { + "balance": "1000000000000000000000000000000" + }, + "0x16e8c390f8e576161cfe966f2c3e5dd303eb9039": { + "balance": "1000000000000000000000000000000" + }, + "0x194cb9991d3d94c43e400becf21dfea45e7b3b4c": { + "balance": "1000000000000000000000000000000" + }, + "0x1C9abe4ff0CcECa40fc404c74AB7d4923fEF8901": { + "balance": "100000000000000000000000" + }, + "0x1a66fc89809112c20aa76a993db712fa9e003e4e": { + "balance": "1000000000000000000000000000000" + }, + "0x1f1d6041e12a18cf1202019f146f2fc150915e8d": { + "balance": "1000000000000000000000000000000" + }, + "0x1feaf1671c1f0faf0d44c152f72dc755db932569": { + "balance": "1000000000000000000000000000000" + }, + "0x236bf02dfafaf03851a4e6f5d69052f4884cec32": { + "balance": "1000000000000000000000000000000" + }, + "0x26d88f6a8b659be4165ee53774a057e41b5201c9": { + "balance": "1000000000000000000000000000000" + }, + "0x28353685b0b986a724b92113debb3d8cd9a6b263": { + "balance": "1000000000000000000000000000000" + }, + "0x29d83322219fdfb821459d5fdf796360faf3166a": { + "balance": "1000000000000000000000000000000" + }, + "0x2bee474be207bdbeac83d6672da5ed2fd417eac9": { + "balance": "1000000000000000000000000000000" + }, + "0x2d93455b07bccf38e8d019f7f43a2c2d70b46b4e": { + "balance": "1000000000000000000000000000000" + }, + "0x2f971bd38806c3ca45ae0a125d1267118bf5619c": { + "balance": "1000000000000000000000000000000" + }, + "0x30aaab366dfac8331f3e827495c789cde9b437c0": { + "balance": "1000000000000000000000000000000" + }, + "0x32ea0400dc2d20664cc4744b2fab04ecb709445c": { + "balance": "1000000000000000000000000000000" + }, + "0x3760dc9594ccac0f33ade5cc5371402131696341": { + "balance": "1000000000000000000000000000000" + }, + "0x38855e430611bc179cd777a8704679ffc43921de": { + "balance": "1000000000000000000000000000000" + }, + "0x3a921471a2397644c37c88ef9572c421ab37145d": { + "balance": "1000000000000000000000000000000" + }, + "0x3bcca8a8471d55a1a668bc163c0336e4a57e5c99": { + "balance": "1000000000000000000000000000000" + }, + "0x3d46ee560227c1d73cd6042b47fc8fddd8a06ecb": { + "balance": "1000000000000000000000000000000" + }, + "0x3f5bdf5d4c274c82b8d17aa2810b00d2cf050f24": { + "balance": "1000000000000000000000000000000" + }, + "0x3ffe1c9183e0f97f52a816405a7d2350624ec88b": { + "balance": "1000000000000000000000000000000" + }, + "0x426ec5f07847674aada3856609d8baaa16805d88": { + "balance": "1000000000000000000000000000000" + }, + "0x482d7f53cba6ae73a354533673c48e2dfd560949": { + "balance": "1000000000000000000000000000000" + }, + "0x48acbd6a2724eadcc2a11144ab84b6a617d1a241": { + "balance": "1000000000000000000000000000000" + }, + "0x49ef89840e400026eb5c8d79bd1b0adc152fe86d": { + "balance": "1000000000000000000000000000000" + }, + "0x4bf989fa6572af36b190032505506f1db888357f": { + "balance": "1000000000000000000000000000000" + }, + "0x4cf9b195f7cb5f86694d9b399fe21a5f34616fd3": { + "balance": "1000000000000000000000000000000" + }, + "0x4e9b85904bca60aeb5b916ca86ac622096908427": { + "balance": "1000000000000000000000000000000" + }, + "0x50120c17d7b59200e9b76e89e4e3de2f0cd00090": { + "balance": "1000000000000000000000000000000" + }, + "0x54db355342c35085a1a53184162b2fddd0a43b0f": { + "balance": "1000000000000000000000000000000" + }, + "0x54e228d8fea148cfe2b109b3b152ff21321d09a2": { + "balance": "1000000000000000000000000000000" + }, + "0x5667601b7dcde6f24d06bccc4f291cb06976f4ee": { + "balance": "1000000000000000000000000000000" + }, + "0x57829f2ecca390cd9d1c41f92328bad4d1073bbb": { + "balance": "1000000000000000000000000000000" + }, + "0x5EF25557E2ed6AFfF321B266C93e95A0B4B05AbC": { + "balance": "1000000000000000000000000" + }, + "0x5a3adad4382b3eb1e0c65f2de2845901081039b5": { + "balance": "1000000000000000000000000000000" + }, + "0x5cdb7392efdce502ccc6fba5c3c1dd1653967b4d": { + "balance": "1000000000000000000000000000000" + }, + "0x5d012c13b2854bda8b7b6580e97e52751884f827": { + "balance": "1000000000000000000000000000000" + }, + "0x5d9326c6504833d84f8a0d65ded59b1a6e768ca2": { + "balance": "1000000000000000000000000000000" + }, + "0x60268f799d8f1808e4a32c2eb898e73a8881f6f0": { + "balance": "1000000000000000000000000000000" + }, + "0x605ba4a05d779f9869bd9a10234c22f516766cfe": { + "balance": "1000000000000000000000000000000" + }, + "0x6093f0f2a7b5148b71603ac439adbc4c0e5aa5da": { + "balance": "1000000000000000000000000000000" + }, + "0x6196d135CdDb9d73A0756C1E44b5b02B11acf594": { + "balance": "2000000000000000000000", + "code": "", + "nonce": "5076", + "storage": {} + }, + "0x62712ceccb50f62ca4c5402fff6da9c819c866cf": { + "balance": "1000000000000000000000000000000" + }, + "0x62971de462ea1ec0d3b43a6a85b6fb975e6c6f64": { + "balance": "1000000000000000000000000000000" + }, + "0x62cf32dfb9eb6358dc5deb006aef1d75fb153e5f": { + "balance": "1000000000000000000000000000000" + }, + "0x62d8b22c1d71577829b2fee20a5c3fff43aed0ec": { + "balance": "100000000000000000000000" + }, + "0x6314956b78bb2eaed1c49b3ae71d4d0ec501cfab": { + "balance": "1000000000000000000000000000000" + }, + "0x661bda4daeba3ce9ac2aa30b80d463580f90d31a": { + "balance": "1000000000000000000000000000000" + }, + "0x66c5a87f4a49DD75e970055A265E8dd5C3F8f852": { + "balance": "1000000000000000000000" + }, + "0x66cd465ddcd85504c0d2cfb1728acee994d55a3f": { + "balance": "1000000000000000000000000000000" + }, + "0x68bca79ae7aae796027ff843d2303444da5cf5d8": { + "balance": "1000000000000000000000000000000" + }, + "0x6923877b65e24966efa9efd1207822fa2eaf601a": { + "balance": "1000000000000000000000000000000" + }, + "0x69362535ec535F0643cBf62D16aDeDCAf32Ee6F7": { + "balance": "0", + "code": "0x608060405234801561001057600080fd5b50600436106100b45760003560e01c806379210e8e1161007157806379210e8e1461017757806381a8235a146101a757806385aeeb17146101c35780639a9a5593146101f3578063a99100541461020f578063b57321221461022b576100b4565b806307c6e7d3146100b9578063122f4fba146100d55780631c6ec7a9146101055780631cfe4e3b14610121578063373dedb41461013d57806361e46db51461015b575b600080fd5b6100d360048036036100ce9190810190613cff565b61025b565b005b6100ef60048036036100ea9190810190613cff565b610804565b6040516100fc9190614963565b60405180910390f35b61011f600480360361011a9190810190613cff565b610b43565b005b61013b60048036036101369190810190613cc3565b610f72565b005b610145611190565b6040516101529190614cbe565b60405180910390f35b61017560048036036101709190810190613d94565b611199565b005b610191600480360361018c9190810190613e13565b6113f9565b60405161019e9190614924565b60405180910390f35b6101c160048036036101bc9190810190613cff565b6116f9565b005b6101dd60048036036101d89190810190613cff565b61189e565b6040516101ea9190614941565b60405180910390f35b61020d60048036036102089190810190613d40565b611b9d565b005b61022960048036036102249190810190613cff565b61202c565b005b61024560048036036102409190810190613cff565b612682565b6040516102529190614cbe565b60405180910390f35b6000339050606061026b83612902565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b825181101561037c576000826001018460018403815181106102d557fe5b60200260200101516040516102ea91906148cc565b90815260200160405180910390205411610339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161033090614ade565b60405180910390fd5b8160020183600183038151811061034c57fe5b602002602001015160405161036191906148cc565b908152602001604051809103902091508060010190506102b7565b506060600183511161038e57846103a7565b8260018451038151811061039e57fe5b60200260200101515b9050600082600101826040516103bd91906148e3565b9081526020016040518091039020541161040c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161040390614ade565b60405180910390fd5b6000826002018260405161042091906148e3565b90815260200160405180910390206000018054905014610475576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161046c90614b5e565b60405180910390fd5b60006104818587612b02565b9050806104c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ba90614a7e565b60405180910390fd5b6104cb613888565b836000016001856000018054905003815481106104e457fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156105965780601f1061056b57610100808354040283529160200191610596565b820191906000526020600020905b81548152906001019060200180831161057957829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff1660028111156105e257fe5b60028111156105ed57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561066557602002820191906000526020600020906000905b82829054906101000a900460ff1615158152602001906001019060208260000104928301926001038202915080841161062f5790505b505050505081525050905080846000016001866001018660405161068991906148e3565b90815260200160405180910390205403815481106106a357fe5b906000526020600020906005020160008201518160000190805190602001906106cd9291906138c4565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561071c57fe5b0217905550608082015181600401908051906020019061073d929190613944565b50905050836001018360405161075391906148e3565b90815260200160405180910390205484600101826000015160405161077891906148cc565b9081526020016040518091039020819055506000846001018460405161079e91906148e3565b908152602001604051809103902081905550836000018054809190600190036107c791906139ea565b5083600201836040516107da91906148e3565b9081526020016040518091039020600080820160006107f99190613a1c565b505050505050505050565b600080606061081284612b66565b91509150606061082182612902565b90506000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b82518110156109065760008260010184600184038151811061088b57fe5b60200260200101516040516108a091906148cc565b90815260200160405180910390205414156108c357600095505050505050610b3e565b816002018360018303815181106108d657fe5b60200260200101516040516108eb91906148cc565b9081526020016040518091039020915080600101905061086d565b50606060018351116109185783610931565b8260018451038151811061092857fe5b60200260200101515b90506000826001018260405161094791906148e3565b908152602001604051809103902054141561096a57600095505050505050610b3e565b610972613888565b826000016001846001018460405161098a91906148e3565b90815260200160405180910390205403815481106109a457fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610a565780601f10610a2b57610100808354040283529160200191610a56565b820191906000526020600020905b815481529060010190602001808311610a3957829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115610aa257fe5b6002811115610aad57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015610b2557602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411610aef5790505b5050505050815250509050806060015196505050505050505b919050565b600160009054906101000a900460ff16610b85576120006002819055506210000060038190555060018060006101000a81548160ff0219169083151502179055505b6000815111610bc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc090614ade565b60405180910390fd5b60003390506060610bd983612902565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015610cea57600082600101846001840381518110610c4357fe5b6020026020010151604051610c5891906148cc565b90815260200160405180910390205411610ca7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9e90614ade565b60405180910390fd5b81600201836001830381518110610cba57fe5b6020026020010151604051610ccf91906148cc565b90815260200160405180910390209150806001019050610c25565b50600254816000018054905010610d36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2d90614bfe565b60405180910390fd5b60606001835111610d475784610d60565b82600184510381518110610d5757fe5b60200260200101515b905060008260010182604051610d7691906148e3565b90815260200160405180910390205414610dc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbc90614c3e565b60405180910390fd5b610dce81612ee8565b610e0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0490614afe565b60405180910390fd5b6000610e198587612fc9565b905080610e5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e529061499e565b60405180910390fd5b610e63613888565b82816000018190525060008160200190151590811515815250508360000181908060018154018082558091505090600182039060005260206000209060050201600090919290919091506000820151816000019080519060200190610ec99291906138c4565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff02191690836002811115610f1857fe5b02179055506080820151816004019080519060200190610f39929190613944565b5050505083600001805490508460010184604051610f5791906148e3565b90815260200160405180910390208190555050505050505050565b610f7a61302d565b73ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161480610fdf57503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614155b61101e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101590614a5e565b60405180910390fd5b80600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411156110a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109790614b3e565b60405180910390fd5b600054600754820111156110e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e0906149be565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460076000828254039250508190555080600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550806007600082825401925050819055505050565b60008054905090565b600033905060006111aa82866130c6565b9050600160028111156111b957fe5b8160030160009054906101000a900460ff1660028111156111d657fe5b14611216576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120d90614c1e565b60405180910390fd5b6000600354858161122357fe5b061480156112345750806002015484105b611273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126a9061497e565b60405180910390fd5b600354848260020154031080156112905750838160020154038351145b8061129d57506003548351145b6112dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d390614a1e565b60405180910390fd5b600015158160040160035486816112ef57fe5b04815481106112fa57fe5b90600052602060002090602091828204019190069054906101000a900460ff1615151461135c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611353906149fe565b60405180910390fd5b600061136a838787876132c5565b9050806113ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a390614b1e565b60405180910390fd5b60018260040160035487816113bd57fe5b04815481106113c857fe5b90600052602060002090602091828204019190066101000a81548160ff021916908315150217905550505050505050565b611401613a40565b6000606061140e86612b66565b9150915061141a613888565b61142483836130c6565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156114c85780601f1061149d576101008083540402835291602001916114c8565b820191906000526020600020905b8154815290600101906020018083116114ab57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561151457fe5b600281111561151f57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561159757602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116115615790505b50505050508152505090506002808111156115ae57fe5b816060015160028111156115be57fe5b146115fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f590614c9e565b60405180910390fd5b60035485111580156116105750600085115b61164f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164690614a1e565b60405180910390fd5b80604001518587011115611698576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168f9061497e565b60405180910390fd5b60006116a684848989613376565b8096508192505050806116ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e590614b9e565b60405180910390fd5b505050509392505050565b6000339050600061170a82846130c6565b90506001600281111561171957fe5b8160030160009054906101000a900460ff16600281111561173657fe5b14611776576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176d90614c1e565b60405180910390fd5b60006001905060008260040180549050905060008090505b818110156117e157600015158460040182815481106117a957fe5b90600052602060002090602091828204019190069054906101000a900460ff16151514156117d657600092505b80600101905061178e565b5081611822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181990614b7e565b60405180910390fd5b60028360030160006101000a81548160ff0219169083600281111561184357fe5b021790555060006118548587613409565b905080611896576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188d906149de565b60405180910390fd5b505050505050565b6060600060606118ad84612b66565b9150915060606118bc82612902565b90506000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008090505b82518110156119c65760008260010184838151811061192257fe5b602002602001015160405161193791906148cc565b90815260200160405180910390205411611986576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197d90614ade565b60405180910390fd5b8160020183828151811061199657fe5b60200260200101516040516119ab91906148cc565b90815260200160405180910390209150806001019050611907565b5080600001805480602002602001604051908101604052809291908181526020016000905b82821015611b8e57838290600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611aa75780601f10611a7c57610100808354040283529160200191611aa7565b820191906000526020600020905b815481529060010190602001808311611a8a57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115611af357fe5b6002811115611afe57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015611b7657602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411611b405790505b505050505081525050815260200190600101906119eb565b50505050945050505050919050565b600160009054906101000a900460ff16611bdf576120006002819055506210000060038190555060018060006101000a81548160ff0219169083151502179055505b60003390506305f5e100821115611c2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2290614bde565b60405180910390fd5b6060611c3684612902565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015611d4757600082600101846001840381518110611ca057fe5b6020026020010151604051611cb591906148cc565b90815260200160405180910390205411611d04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cfb90614ade565b60405180910390fd5b81600201836001830381518110611d1757fe5b6020026020010151604051611d2c91906148cc565b90815260200160405180910390209150806001019050611c82565b5060606001835111611d595785611d72565b82600184510381518110611d6957fe5b60200260200101515b905060008260010182604051611d8891906148e3565b90815260200160405180910390205414611dd7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dce90614c3e565b60405180910390fd5b611de081612ee8565b611e1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1690614bbe565b60405180910390fd5b6000611e2c85888861346d565b905080611e6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6590614c7e565b60405180910390fd5b6060600354600160035489010381611e8257fe5b04604051908082528060200260200182016040528015611eb15781602001602082028038833980820191505090505b509050836000016040518060a0016040528085815260200160011515815260200189815260200160016002811115611ee557fe5b815260200183815250908060018154018082558091505090600182039060005260206000209060050201600090919290919091506000820151816000019080519060200190611f359291906138c4565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff02191690836002811115611f8457fe5b02179055506080820151816004019080519060200190611fa5929190613944565b5050505083600001805490508460010184604051611fc391906148e3565b90815260200160405180910390208190555086600560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505050505050505050565b6000339050612039613888565b61204382846130c6565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156120e75780601f106120bc576101008083540402835291602001916120e7565b820191906000526020600020905b8154815290600101906020018083116120ca57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561213357fe5b600281111561213e57fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156121b657602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116121805790505b5050505050815250509050600060028111156121ce57fe5b816060015160028111156121de57fe5b141561221f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221690614a3e565b60405180910390fd5b600061222b83856134da565b90508061226d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226490614a9e565b60405180910390fd5b606061227885612902565b90506000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b825181101561231057816002018360018303815181106122e057fe5b60200260200101516040516122f591906148cc565b908152602001604051809103902091508060010190506122c4565b506000600182600101866000015160405161232b91906148cc565b908152602001604051809103902054039050612345613888565b8260000160018460000180549050038154811061235e57fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156124105780601f106123e557610100808354040283529160200191612410565b820191906000526020600020905b8154815290600101906020018083116123f357829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561245c57fe5b600281111561246757fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156124df57602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116124a95790505b5050505050815250509050808360000183815481106124fa57fe5b906000526020600020906005020160008201518160000190805190602001906125249291906138c4565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561257357fe5b02179055506080820151816004019080519060200190612594929190613944565b50905050826000018054809190600190036125af91906139ea565b508260010186600001516040516125c691906148cc565b9081526020016040518091039020548360010182600001516040516125eb91906148cc565b908152602001604051809103902081905550600083600101876000015160405161261591906148cc565b9081526020016040518091039020819055508560400151600560008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505050505050505050565b600080606061269084612b66565b9150915061269c613888565b6126a683836130c6565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561274a5780601f1061271f5761010080835404028352916020019161274a565b820191906000526020600020905b81548152906001019060200180831161272d57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561279657fe5b60028111156127a157fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561281957602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116127e35790505b50505050508152505090506001600281111561283157fe5b8160600151600281111561284157fe5b1480612866575060028081111561285457fe5b8160600151600281111561286457fe5b145b6128a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161289c90614c1e565b60405180910390fd5b60006128b1848461353e565b8096508192505050806128f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128f090614c5e565b60405180910390fd5b50505050919050565b606061290c613a65565b612915836135a7565b905061291f613a65565b61295d6040518060400160405280600181526020017f2f000000000000000000000000000000000000000000000000000000000000008152506135a7565b90506060600161297683856135d590919063ffffffff16565b016040519080825280602002602001820160405280156129aa57816020015b60608152602001906001900390816129955790505b50905060008090505b81518110156129fb576129d76129d2848661364a90919063ffffffff16565b613664565b8282815181106129e357fe5b602002602001018190525080806001019150506129b3565b50600081600183510381518110612a0e57fe5b6020026020010151511415612a795780600182510381518110612a2d57fe5b6020026020010160608152506001815103604051908082528060200260200182016040528015612a7157816020015b6060815260200190600190039081612a5c5790505b509350612ab2565b8051604051908082528060200260200182016040528015612aae57816020015b6060815260200190600190039081612a995790505b5093505b60008090505b8451811015612af957818181518110612acd57fe5b6020026020010151858281518110612ae157fe5b60200260200101819052508080600101915050612ab8565b50505050919050565b60008060016020601f85510181612b1557fe5b040190506040518481526020810160005b83811015612b47578060200286015181602002830152806001019050612b26565b50602082602085026040018460006010600019f1935050505092915050565b6000606060006028905080845111612bb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612baa90614abe565b60405180910390fd5b6060816040519080825280601f01601f191660200182016040528015612be85781602001600182028038833980820191505090505b50905060008090505b82811015612c5857858181518110612c0557fe5b602001015160f81c60f81b828281518110612c1c57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050612bf1565b50600080905060008090505b83811015612d87576000838281518110612c7a57fe5b602001015160f81c60f81b60f81c60ff16905060308110158015612c9f575060398111155b80612cb8575060418110158015612cb75750605a8111155b5b80612cd1575060618110158015612cd0575060668111155b5b612d10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d0790614abe565b60405180910390fd5b60308110158015612d22575060398111155b15612d335760308103601084020192505b60418110158015612d455750605a8111155b15612d565760378103601084020192505b60618110158015612d68575060668111155b15612d795760578103601084020192505b508080600101915050612c64565b508094507f2f00000000000000000000000000000000000000000000000000000000000000868481518110612db857fe5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612e25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e1c90614abe565b60405180910390fd5b6000600184885103039050806040519080825280601f01601f191660200182016040528015612e635781602001600182028038833980820191505090505b50945060008090505b81811015612ede5760008860018784010181518110612e8757fe5b602001015160f81c60f81b905080878381518110612ea157fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350508080600101915050612e6c565b5050505050915091565b6000604051602001612ef99061490f565b6040516020818303038152906040528051906020012082604051602001612f2091906148e3565b604051602081830303815290604052805190602001201480612f8b5750604051602001612f4c906148fa565b6040516020818303038152906040528051906020012082604051602001612f7391906148e3565b60405160208183030381529060405280519060200120145b80612f97575060008251145b15612fa55760009050612fc4565b60008251905060ff811115612fbe576000915050612fc4565b60019150505b919050565b60008060016020601f85510181612fdc57fe5b040190506040518481526020810160005b8381101561300e578060200286015181602002830152806001019050612fed565b5060208260208502604001846000600f600019f1935050505092915050565b600073d2001000000000000000000000000000000000d273ffffffffffffffffffffffffffffffffffffffff166383e781fe6040518163ffffffff1660e01b815260040160206040518083038186803b15801561308957600080fd5b505afa15801561309d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506130c19190810190613c9a565b905090565b600060606130d383612902565b90506000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b82518110156131e45760008260010184600184038151811061313d57fe5b602002602001015160405161315291906148cc565b908152602001604051809103902054116131a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161319890614ade565b60405180910390fd5b816002018360018303815181106131b457fe5b60200260200101516040516131c991906148cc565b9081526020016040518091039020915080600101905061311f565b50606060018351116131f6578461320f565b8260018451038151811061320657fe5b60200260200101515b90506000826001018260405161322591906148e3565b90815260200160405180910390205411613274576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161326b90614ade565b60405180910390fd5b6000826000016001846001018460405161328e91906148e3565b90815260200160405180910390205403815481106132a857fe5b906000526020600020906005020190508094505050505092915050565b60008060016020601f855101816132d857fe5b04019050600060016020601f885101816132ee57fe5b040190506040518781526020810160005b838110156133205780602002890151816020028301528060010190506132ff565b50868360200282015260005b84811015613352578060200287015181856001010160200283015280600101905061332c565b50602082848601602002606001846000600c600019f1945050505050949350505050565b6000613380613a40565b600060016020601f8851018161339257fe5b0401905060006020601f8601816133a557fe5b0490506040518881526020810160005b848110156133d657806020028a0151816020028301528060010190506133b5565b5083602002810188815287816020015283602002868660030160200285600a600019fa9650505050505094509492505050565b60008060016020601f8551018161341c57fe5b040190506040518481526020810160005b8381101561344e57806020028601518160200283015280600101905061342d565b50602082602085026040018460006011600019f1935050505092915050565b60008060016020601f8651018161348057fe5b040190506040518581526020810160005b838110156134b2578060200287015181602002830152806001019050613491565b50846020840282015260208260208502604001846000600b600019f193505050509392505050565b60008060016020601f855101816134ed57fe5b040190506040518481526020810160005b8381101561351f5780602002860151816020028301528060010190506134fe565b5060208260208502604001846000600e600019f1935050505092915050565b600080600060016020601f8651018161355357fe5b040190506040518581526020810160005b83811015613585578060200287015181602002830152806001019050613564565b506020826020850260200184600d600019fa9450815193505050509250929050565b6135af613a65565b600060208301905060405180604001604052808451815260200182815250915050919050565b60008082600001516135f985600001518660200151866000015187602001516136c6565b0190505b83600001518460200151018111613643578180600101925050826000015161363b8560200151830386600001510383866000015187602001516136c6565b0190506135fd565b5092915050565b613652613a65565b61365d8383836137a1565b5092915050565b60608082600001516040519080825280601f01601f19166020018201604052801561369e5781602001600182028038833980820191505090505b50905060006020820190506136bc818560200151866000015161383f565b8192505050919050565b6000808490506000868511613791576020851161374b57600060018660200360080260020a031960001b905060008186511690506000878a8a0103905060008386511690505b82811461373d5781861061372a578a8a019650505050505050613799565b858060010196505083865116905061370c565b859650505050505050613799565b60008585209050600091505b858803821161378f57600086842090508082141561377b5783945050505050613799565b600184019350508180600101925050613757565b505b868601925050505b949350505050565b6137a9613a65565b60006137c785600001518660200151866000015187602001516136c6565b90508460200151836020018181525050846020015181038360000181815250508460000151856020015101811415613809576000856000018181525050613834565b8360000151836000015101856000018181510391508181525050836000015181018560200181815250505b829150509392505050565b5b602081106138635781518352602083019250602082019150602081039050613840565b60006001826020036101000a0390508019835116818551168181178652505050505050565b6040518060a001604052806060815260200160001515815260200160008152602001600060028111156138b757fe5b8152602001606081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061390557805160ff1916838001178555613933565b82800160010185558215613933579182015b82811115613932578251825591602001919060010190613917565b5b5090506139409190613a7f565b5090565b82805482825590600052602060002090601f016020900481019282156139d95791602002820160005b838211156139aa57835183826101000a81548160ff021916908315150217905550926020019260010160208160000104928301926001030261396d565b80156139d75782816101000a81549060ff02191690556001016020816000010492830192600103026139aa565b505b5090506139e69190613aa4565b5090565b815481835581811115613a1757600502816005028360005260206000209182019101613a169190613ad4565b5b505050565b5080546000825560050290600052602060002090810190613a3d9190613ad4565b50565b6040518062100000016040528061800090602082028038833980820191505090505090565b604051806040016040528060008152602001600081525090565b613aa191905b80821115613a9d576000816000905550600101613a85565b5090565b90565b613ad191905b80821115613acd57600081816101000a81549060ff021916905550600101613aaa565b5090565b90565b613b4091905b80821115613b3c5760008082016000613af39190613b43565b6001820160006101000a81549060ff021916905560028201600090556003820160006101000a81549060ff0219169055600482016000613b339190613b8b565b50600501613ada565b5090565b90565b50805460018160011615610100020316600290046000825580601f10613b695750613b88565b601f016020900490600052602060002090810190613b879190613a7f565b5b50565b50805460008255601f016020900490600052602060002090810190613bb09190613a7f565b50565b600081359050613bc281614f18565b92915050565b600081519050613bd781614f18565b92915050565b600082601f830112613bee57600080fd5b8135613c01613bfc82614d06565b614cd9565b91508082526020830160208301858383011115613c1d57600080fd5b613c28838284614eb8565b50505092915050565b600082601f830112613c4257600080fd5b8135613c55613c5082614d32565b614cd9565b91508082526020830160208301858383011115613c7157600080fd5b613c7c838284614eb8565b50505092915050565b600081359050613c9481614f2f565b92915050565b600060208284031215613cac57600080fd5b6000613cba84828501613bc8565b91505092915050565b60008060408385031215613cd657600080fd5b6000613ce485828601613bb3565b9250506020613cf585828601613c85565b9150509250929050565b600060208284031215613d1157600080fd5b600082013567ffffffffffffffff811115613d2b57600080fd5b613d3784828501613c31565b91505092915050565b60008060408385031215613d5357600080fd5b600083013567ffffffffffffffff811115613d6d57600080fd5b613d7985828601613c31565b9250506020613d8a85828601613c85565b9150509250929050565b600080600060608486031215613da957600080fd5b600084013567ffffffffffffffff811115613dc357600080fd5b613dcf86828701613c31565b9350506020613de086828701613c85565b925050604084013567ffffffffffffffff811115613dfd57600080fd5b613e0986828701613bdd565b9150509250925092565b600080600060608486031215613e2857600080fd5b600084013567ffffffffffffffff811115613e4257600080fd5b613e4e86828701613c31565b9350506020613e5f86828701613c85565b9250506040613e7086828701613c85565b9150509250925092565b6000613e868383613fe8565b60208301905092915050565b6000613e9e8383613ff7565b60208301905092915050565b6000613eb68383614831565b905092915050565b6000613ec982614d88565b613ed38185614de7565b9350613ede83614d5e565b8060005b83811015613f0f578151613ef68882613e7a565b9750613f0183614dc0565b925050600181019050613ee2565b5085935050505092915050565b613f2581614d93565b613f2f8184614df8565b9250613f3a82614d6e565b8060005b83811015613f6b578151613f528782613e92565b9650613f5d83614dcd565b925050600181019050613f3e565b505050505050565b6000613f7e82614d9f565b613f888185614e03565b935083602082028501613f9a85614d78565b8060005b85811015613fd65784840389528151613fb78582613eaa565b9450613fc283614dda565b925060208a01995050600181019050613f9e565b50829750879550505050505092915050565b613ff181614e53565b82525050565b61400081614e5f565b82525050565b61400f81614ea6565b82525050565b61401e81614ea6565b82525050565b600061402f82614db5565b6140398185614e36565b9350614049818560208601614ec7565b80840191505092915050565b600061406082614daa565b61406a8185614e14565b935061407a818560208601614ec7565b61408381614efa565b840191505092915050565b600061409982614daa565b6140a38185614e36565b93506140b3818560208601614ec7565b80840191505092915050565b60006140cc601883614e25565b91507f496e636f7272656374206368756e6b20706f736974696f6e00000000000000006000830152602082019050919050565b600061410c601583614e25565b91507f4469726563746f7279206e6f74206372656174656400000000000000000000006000830152602082019050919050565b600061414c602483614e25565b91507f4e6f7420656e6f756768206d656d6f727920696e207468652046696c6573746f60008301527f72616765000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006141b2601b83614e25565b91507f48617368206861736e2774206265656e2063616c63756c6174656400000000006000830152602082019050919050565b60006141f2601983614e25565b91507f4368756e6b20697320616c72656164792075706c6f61646564000000000000006000830152602082019050919050565b6000614232601683614e25565b91507f496e636f7272656374206368756e6b206c656e677468000000000000000000006000830152602082019050919050565b6000614272600f83614e25565b91507f46696c65206e6f742065786973747300000000000000000000000000000000006000830152602082019050919050565b60006142b2600e83614e25565b91507f496e76616c69642073656e6465720000000000000000000000000000000000006000830152602082019050919050565b60006142f2601883614e25565b91507f4469726563746f7279206973206e6f742064656c6574656400000000000000006000830152602082019050919050565b6000614332601083614e25565b91507f46696c65206e6f742064656c65746564000000000000000000000000000000006000830152602082019050919050565b6000614372601383614e25565b91507f496e76616c69642073746f7261676550617468000000000000000000000000006000830152602082019050919050565b60006143b2600c83614e25565b91507f496e76616c6964207061746800000000000000000000000000000000000000006000830152602082019050919050565b60006143f2600183614e36565b91507f2e000000000000000000000000000000000000000000000000000000000000006000830152600182019050919050565b6000614432601683614e25565b91507f496e76616c6964206469726563746f7279206e616d65000000000000000000006000830152602082019050919050565b6000614472601583614e25565b91507f4368756e6b207761736e27742075706c6f6164656400000000000000000000006000830152602082019050919050565b60006144b2602683614e25565b91507f436f756c64206e6f742072657365727665206c657373207468616e207573656460008301527f20737061636500000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614518601683614e25565b91507f4469726563746f7279206973206e6f7420656d707479000000000000000000006000830152602082019050919050565b6000614558602383614e25565b91507f46696c65206861736e2774206265656e2075706c6f6164656420636f7272656360008301527f746c7900000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006145be601183614e25565b91507f4368756e6b207761736e277420726561640000000000000000000000000000006000830152602082019050919050565b60006145fe601883614e25565b91507f46696c656e616d652073686f756c64206265203c2032353600000000000000006000830152602082019050919050565b600061463e601f83614e25565b91507f46696c652073686f756c64206265206c657373207468616e20313030204d42006000830152602082019050919050565b600061467e600283614e36565b91507f2e2e0000000000000000000000000000000000000000000000000000000000006000830152600282019050919050565b60006146be601183614e25565b91507f4469726563746f72792069732066756c6c0000000000000000000000000000006000830152602082019050919050565b60006146fe600e83614e25565b91507f46696c65206e6f7420666f756e640000000000000000000000000000000000006000830152602082019050919050565b600061473e601883614e25565b91507f46696c65206f72206469726563746f72792065786973747300000000000000006000830152602082019050919050565b600061477e601883614e25565b91507f45564d206572726f7220696e2067657446696c6553697a6500000000000000006000830152602082019050919050565b60006147be601083614e25565b91507f46696c65206e6f742063726561746564000000000000000000000000000000006000830152602082019050919050565b60006147fe601983614e25565b91507f46696c65206861736e2774206265656e2075706c6f61646564000000000000006000830152602082019050919050565b600060a083016000830151848203600086015261484e8282614055565b91505060208301516148636020860182613fe8565b50604083015161487660408601826148ae565b5060608301516148896060860182614006565b50608083015184820360808601526148a18282613ebe565b9150508091505092915050565b6148b781614e9c565b82525050565b6148c681614e9c565b82525050565b60006148d8828461408e565b915081905092915050565b60006148ef8284614024565b915081905092915050565b6000614905826143e5565b9150819050919050565b600061491a82614671565b9150819050919050565b6000621000008201905061493b6000830184613f1c565b92915050565b6000602082019050818103600083015261495b8184613f73565b905092915050565b60006020820190506149786000830184614015565b92915050565b60006020820190508181036000830152614997816140bf565b9050919050565b600060208201905081810360008301526149b7816140ff565b9050919050565b600060208201905081810360008301526149d78161413f565b9050919050565b600060208201905081810360008301526149f7816141a5565b9050919050565b60006020820190508181036000830152614a17816141e5565b9050919050565b60006020820190508181036000830152614a3781614225565b9050919050565b60006020820190508181036000830152614a5781614265565b9050919050565b60006020820190508181036000830152614a77816142a5565b9050919050565b60006020820190508181036000830152614a97816142e5565b9050919050565b60006020820190508181036000830152614ab781614325565b9050919050565b60006020820190508181036000830152614ad781614365565b9050919050565b60006020820190508181036000830152614af7816143a5565b9050919050565b60006020820190508181036000830152614b1781614425565b9050919050565b60006020820190508181036000830152614b3781614465565b9050919050565b60006020820190508181036000830152614b57816144a5565b9050919050565b60006020820190508181036000830152614b778161450b565b9050919050565b60006020820190508181036000830152614b978161454b565b9050919050565b60006020820190508181036000830152614bb7816145b1565b9050919050565b60006020820190508181036000830152614bd7816145f1565b9050919050565b60006020820190508181036000830152614bf781614631565b9050919050565b60006020820190508181036000830152614c17816146b1565b9050919050565b60006020820190508181036000830152614c37816146f1565b9050919050565b60006020820190508181036000830152614c5781614731565b9050919050565b60006020820190508181036000830152614c7781614771565b9050919050565b60006020820190508181036000830152614c97816147b1565b9050919050565b60006020820190508181036000830152614cb7816147f1565b9050919050565b6000602082019050614cd360008301846148bd565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614cfc57600080fd5b8060405250919050565b600067ffffffffffffffff821115614d1d57600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614d4957600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050919050565b6000819050602082019050919050565b600081519050919050565b60006180009050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614e4c82614e7c565b9050919050565b60008115159050919050565b6000819050919050565b6000819050614e7782614f0b565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000614eb182614e69565b9050919050565b82818337600083830152505050565b60005b83811015614ee5578082015181840152602081019050614eca565b83811115614ef4576000848401525b50505050565b6000601f19601f8301169050919050565b60038110614f1557fe5b50565b614f2181614e41565b8114614f2c57600080fd5b50565b614f3881614e9c565b8114614f4357600080fd5b5056fea365627a7a723158202ae226b25ad72f9cff2d74c6dc7bcfb78530ab1d2438f48a8dab67499b37a8e56c6578706572696d656e74616cf564736f6c634300050d0040", + "nonce": "0", + "storage": { + "0x0": "2868903936" + } + }, + "0x69362535ec535F0643cBf62D16aDeDCAf32Ee6F8": { + "balance": "0", + "code": "0x608060405234801561001057600080fd5b50600436106100b45760003560e01c806379210e8e1161007157806379210e8e1461017757806381a8235a146101a757806385aeeb17146101c35780639a9a5593146101f3578063a99100541461020f578063b57321221461022b576100b4565b806307c6e7d3146100b9578063122f4fba146100d55780631c6ec7a9146101055780631cfe4e3b14610121578063373dedb41461013d57806361e46db51461015b575b600080fd5b6100d360048036036100ce9190810190613e0d565b61025b565b005b6100ef60048036036100ea9190810190613e0d565b610804565b6040516100fc9190614ab1565b60405180910390f35b61011f600480360361011a9190810190613e0d565b610b43565b005b61013b60048036036101369190810190613dd1565b610f72565b005b610145611190565b6040516101529190614e2c565b60405180910390f35b61017560048036036101709190810190613ea2565b611199565b005b610191600480360361018c9190810190613f21565b6113f9565b60405161019e9190614a72565b60405180910390f35b6101c160048036036101bc9190810190613e0d565b6116f9565b005b6101dd60048036036101d89190810190613e0d565b61189e565b6040516101ea9190614a8f565b60405180910390f35b61020d60048036036102089190810190613e4e565b611b9d565b005b61022960048036036102249190810190613e0d565b61213a565b005b61024560048036036102409190810190613e0d565b612790565b6040516102529190614e2c565b60405180910390f35b6000339050606061026b83612a10565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b825181101561037c576000826001018460018403815181106102d557fe5b60200260200101516040516102ea9190614a1a565b90815260200160405180910390205411610339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161033090614c2c565b60405180910390fd5b8160020183600183038151811061034c57fe5b60200260200101516040516103619190614a1a565b908152602001604051809103902091508060010190506102b7565b506060600183511161038e57846103a7565b8260018451038151811061039e57fe5b60200260200101515b9050600082600101826040516103bd9190614a31565b9081526020016040518091039020541161040c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161040390614c2c565b60405180910390fd5b600082600201826040516104209190614a31565b90815260200160405180910390206000018054905014610475576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161046c90614cac565b60405180910390fd5b60006104818587612c10565b9050806104c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ba90614bcc565b60405180910390fd5b6104cb613996565b836000016001856000018054905003815481106104e457fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156105965780601f1061056b57610100808354040283529160200191610596565b820191906000526020600020905b81548152906001019060200180831161057957829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff1660028111156105e257fe5b60028111156105ed57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561066557602002820191906000526020600020906000905b82829054906101000a900460ff1615158152602001906001019060208260000104928301926001038202915080841161062f5790505b50505050508152505090508084600001600186600101866040516106899190614a31565b90815260200160405180910390205403815481106106a357fe5b906000526020600020906005020160008201518160000190805190602001906106cd9291906139d2565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561071c57fe5b0217905550608082015181600401908051906020019061073d929190613a52565b5090505083600101836040516107539190614a31565b9081526020016040518091039020548460010182600001516040516107789190614a1a565b9081526020016040518091039020819055506000846001018460405161079e9190614a31565b908152602001604051809103902081905550836000018054809190600190036107c79190613af8565b5083600201836040516107da9190614a31565b9081526020016040518091039020600080820160006107f99190613b2a565b505050505050505050565b600080606061081284612c74565b91509150606061082182612a10565b90506000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b82518110156109065760008260010184600184038151811061088b57fe5b60200260200101516040516108a09190614a1a565b90815260200160405180910390205414156108c357600095505050505050610b3e565b816002018360018303815181106108d657fe5b60200260200101516040516108eb9190614a1a565b9081526020016040518091039020915080600101905061086d565b50606060018351116109185783610931565b8260018451038151811061092857fe5b60200260200101515b9050600082600101826040516109479190614a31565b908152602001604051809103902054141561096a57600095505050505050610b3e565b610972613996565b826000016001846001018460405161098a9190614a31565b90815260200160405180910390205403815481106109a457fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610a565780601f10610a2b57610100808354040283529160200191610a56565b820191906000526020600020905b815481529060010190602001808311610a3957829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115610aa257fe5b6002811115610aad57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015610b2557602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411610aef5790505b5050505050815250509050806060015196505050505050505b919050565b600160009054906101000a900460ff16610b85576120006002819055506210000060038190555060018060006101000a81548160ff0219169083151502179055505b6000815111610bc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc090614c2c565b60405180910390fd5b60003390506060610bd983612a10565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015610cea57600082600101846001840381518110610c4357fe5b6020026020010151604051610c589190614a1a565b90815260200160405180910390205411610ca7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9e90614c2c565b60405180910390fd5b81600201836001830381518110610cba57fe5b6020026020010151604051610ccf9190614a1a565b90815260200160405180910390209150806001019050610c25565b50600254816000018054905010610d36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2d90614d4c565b60405180910390fd5b60606001835111610d475784610d60565b82600184510381518110610d5757fe5b60200260200101515b905060008260010182604051610d769190614a31565b90815260200160405180910390205414610dc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbc90614d8c565b60405180910390fd5b610dce81612ff6565b610e0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0490614c4c565b60405180910390fd5b6000610e1985876130d7565b905080610e5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5290614aec565b60405180910390fd5b610e63613996565b82816000018190525060008160200190151590811515815250508360000181908060018154018082558091505090600182039060005260206000209060050201600090919290919091506000820151816000019080519060200190610ec99291906139d2565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff02191690836002811115610f1857fe5b02179055506080820151816004019080519060200190610f39929190613a52565b5050505083600001805490508460010184604051610f579190614a31565b90815260200160405180910390208190555050505050505050565b610f7a61313b565b73ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161480610fdf57503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614155b61101e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101590614bac565b60405180910390fd5b80600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411156110a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109790614c8c565b60405180910390fd5b600054600754820111156110e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e090614b0c565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460076000828254039250508190555080600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550806007600082825401925050819055505050565b60008054905090565b600033905060006111aa82866131d4565b9050600160028111156111b957fe5b8160030160009054906101000a900460ff1660028111156111d657fe5b14611216576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120d90614d6c565b60405180910390fd5b6000600354858161122357fe5b061480156112345750806002015484105b611273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126a90614acc565b60405180910390fd5b600354848260020154031080156112905750838160020154038351145b8061129d57506003548351145b6112dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d390614b6c565b60405180910390fd5b600015158160040160035486816112ef57fe5b04815481106112fa57fe5b90600052602060002090602091828204019190069054906101000a900460ff1615151461135c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135390614b4c565b60405180910390fd5b600061136a838787876133d3565b9050806113ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a390614c6c565b60405180910390fd5b60018260040160035487816113bd57fe5b04815481106113c857fe5b90600052602060002090602091828204019190066101000a81548160ff021916908315150217905550505050505050565b611401613b4e565b6000606061140e86612c74565b9150915061141a613996565b61142483836131d4565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156114c85780601f1061149d576101008083540402835291602001916114c8565b820191906000526020600020905b8154815290600101906020018083116114ab57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561151457fe5b600281111561151f57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561159757602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116115615790505b50505050508152505090506002808111156115ae57fe5b816060015160028111156115be57fe5b146115fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f590614e0c565b60405180910390fd5b60035485111580156116105750600085115b61164f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164690614b6c565b60405180910390fd5b80604001518587011115611698576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168f90614acc565b60405180910390fd5b60006116a684848989613484565b8096508192505050806116ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e590614cec565b60405180910390fd5b505050509392505050565b6000339050600061170a82846131d4565b90506001600281111561171957fe5b8160030160009054906101000a900460ff16600281111561173657fe5b14611776576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176d90614d6c565b60405180910390fd5b60006001905060008260040180549050905060008090505b818110156117e157600015158460040182815481106117a957fe5b90600052602060002090602091828204019190069054906101000a900460ff16151514156117d657600092505b80600101905061178e565b5081611822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181990614ccc565b60405180910390fd5b60028360030160006101000a81548160ff0219169083600281111561184357fe5b021790555060006118548587613517565b905080611896576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188d90614b2c565b60405180910390fd5b505050505050565b6060600060606118ad84612c74565b9150915060606118bc82612a10565b90506000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008090505b82518110156119c65760008260010184838151811061192257fe5b60200260200101516040516119379190614a1a565b90815260200160405180910390205411611986576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197d90614c2c565b60405180910390fd5b8160020183828151811061199657fe5b60200260200101516040516119ab9190614a1a565b90815260200160405180910390209150806001019050611907565b5080600001805480602002602001604051908101604052809291908181526020016000905b82821015611b8e57838290600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611aa75780601f10611a7c57610100808354040283529160200191611aa7565b820191906000526020600020905b815481529060010190602001808311611a8a57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115611af357fe5b6002811115611afe57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015611b7657602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411611b405790505b505050505081525050815260200190600101906119eb565b50505050945050505050919050565b600160009054906101000a900460ff16611bdf576120006002819055506210000060038190555060018060006101000a81548160ff0219169083151502179055505b60003390506305f5e100821115611c2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2290614d2c565b60405180910390fd5b600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205483011115611cee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce590614dac565b60405180910390fd5b6060611cf984612a10565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015611e0a57600082600101846001840381518110611d6357fe5b6020026020010151604051611d789190614a1a565b90815260200160405180910390205411611dc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dbe90614c2c565b60405180910390fd5b81600201836001830381518110611dda57fe5b6020026020010151604051611def9190614a1a565b90815260200160405180910390209150806001019050611d45565b50600254816000018054905010611e56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4d90614d4c565b60405180910390fd5b60606001835111611e675785611e80565b82600184510381518110611e7757fe5b60200260200101515b905060008260010182604051611e969190614a31565b90815260200160405180910390205414611ee5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611edc90614d8c565b60405180910390fd5b611eee81612ff6565b611f2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2490614d0c565b60405180910390fd5b6000611f3a85888861357b565b905080611f7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7390614dec565b60405180910390fd5b6060600354600160035489010381611f9057fe5b04604051908082528060200260200182016040528015611fbf5781602001602082028038833980820191505090505b509050836000016040518060a0016040528085815260200160011515815260200189815260200160016002811115611ff357fe5b8152602001838152509080600181540180825580915050906001820390600052602060002090600502016000909192909190915060008201518160000190805190602001906120439291906139d2565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561209257fe5b021790555060808201518160040190805190602001906120b3929190613a52565b50505050836000018054905084600101846040516120d19190614a31565b90815260200160405180910390208190555086600560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505050505050505050565b6000339050612147613996565b61215182846131d4565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156121f55780601f106121ca576101008083540402835291602001916121f5565b820191906000526020600020905b8154815290600101906020018083116121d857829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561224157fe5b600281111561224c57fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156122c457602002820191906000526020600020906000905b82829054906101000a900460ff1615158152602001906001019060208260000104928301926001038202915080841161228e5790505b5050505050815250509050600060028111156122dc57fe5b816060015160028111156122ec57fe5b141561232d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232490614b8c565b60405180910390fd5b600061233983856135e8565b90508061237b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161237290614bec565b60405180910390fd5b606061238685612a10565b90506000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b825181101561241e57816002018360018303815181106123ee57fe5b60200260200101516040516124039190614a1a565b908152602001604051809103902091508060010190506123d2565b50600060018260010186600001516040516124399190614a1a565b908152602001604051809103902054039050612453613996565b8260000160018460000180549050038154811061246c57fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561251e5780601f106124f35761010080835404028352916020019161251e565b820191906000526020600020905b81548152906001019060200180831161250157829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561256a57fe5b600281111561257557fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156125ed57602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116125b75790505b50505050508152505090508083600001838154811061260857fe5b906000526020600020906005020160008201518160000190805190602001906126329291906139d2565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561268157fe5b021790555060808201518160040190805190602001906126a2929190613a52565b50905050826000018054809190600190036126bd9190613af8565b508260010186600001516040516126d49190614a1a565b9081526020016040518091039020548360010182600001516040516126f99190614a1a565b90815260200160405180910390208190555060008360010187600001516040516127239190614a1a565b9081526020016040518091039020819055508560400151600560008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505050505050505050565b600080606061279e84612c74565b915091506127aa613996565b6127b483836131d4565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156128585780601f1061282d57610100808354040283529160200191612858565b820191906000526020600020905b81548152906001019060200180831161283b57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff1660028111156128a457fe5b60028111156128af57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561292757602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116128f15790505b50505050508152505090506001600281111561293f57fe5b8160600151600281111561294f57fe5b1480612974575060028081111561296257fe5b8160600151600281111561297257fe5b145b6129b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129aa90614d6c565b60405180910390fd5b60006129bf848461364c565b809650819250505080612a07576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129fe90614dcc565b60405180910390fd5b50505050919050565b6060612a1a613b73565b612a23836136b5565b9050612a2d613b73565b612a6b6040518060400160405280600181526020017f2f000000000000000000000000000000000000000000000000000000000000008152506136b5565b905060606001612a8483856136e390919063ffffffff16565b01604051908082528060200260200182016040528015612ab857816020015b6060815260200190600190039081612aa35790505b50905060008090505b8151811015612b0957612ae5612ae0848661375890919063ffffffff16565b613772565b828281518110612af157fe5b60200260200101819052508080600101915050612ac1565b50600081600183510381518110612b1c57fe5b6020026020010151511415612b875780600182510381518110612b3b57fe5b6020026020010160608152506001815103604051908082528060200260200182016040528015612b7f57816020015b6060815260200190600190039081612b6a5790505b509350612bc0565b8051604051908082528060200260200182016040528015612bbc57816020015b6060815260200190600190039081612ba75790505b5093505b60008090505b8451811015612c0757818181518110612bdb57fe5b6020026020010151858281518110612bef57fe5b60200260200101819052508080600101915050612bc6565b50505050919050565b60008060016020601f85510181612c2357fe5b040190506040518481526020810160005b83811015612c55578060200286015181602002830152806001019050612c34565b50602082602085026040018460006010600019f1935050505092915050565b6000606060006028905080845111612cc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cb890614c0c565b60405180910390fd5b6060816040519080825280601f01601f191660200182016040528015612cf65781602001600182028038833980820191505090505b50905060008090505b82811015612d6657858181518110612d1357fe5b602001015160f81c60f81b828281518110612d2a57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050612cff565b50600080905060008090505b83811015612e95576000838281518110612d8857fe5b602001015160f81c60f81b60f81c60ff16905060308110158015612dad575060398111155b80612dc6575060418110158015612dc55750605a8111155b5b80612ddf575060618110158015612dde575060668111155b5b612e1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e1590614c0c565b60405180910390fd5b60308110158015612e30575060398111155b15612e415760308103601084020192505b60418110158015612e535750605a8111155b15612e645760378103601084020192505b60618110158015612e76575060668111155b15612e875760578103601084020192505b508080600101915050612d72565b508094507f2f00000000000000000000000000000000000000000000000000000000000000868481518110612ec657fe5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612f33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f2a90614c0c565b60405180910390fd5b6000600184885103039050806040519080825280601f01601f191660200182016040528015612f715781602001600182028038833980820191505090505b50945060008090505b81811015612fec5760008860018784010181518110612f9557fe5b602001015160f81c60f81b905080878381518110612faf57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350508080600101915050612f7a565b5050505050915091565b600060405160200161300790614a5d565b604051602081830303815290604052805190602001208260405160200161302e9190614a31565b604051602081830303815290604052805190602001201480613099575060405160200161305a90614a48565b60405160208183030381529060405280519060200120826040516020016130819190614a31565b60405160208183030381529060405280519060200120145b806130a5575060008251145b156130b357600090506130d2565b60008251905060ff8111156130cc5760009150506130d2565b60019150505b919050565b60008060016020601f855101816130ea57fe5b040190506040518481526020810160005b8381101561311c5780602002860151816020028301528060010190506130fb565b5060208260208502604001846000600f600019f1935050505092915050565b600073d2001000000000000000000000000000000000d273ffffffffffffffffffffffffffffffffffffffff166383e781fe6040518163ffffffff1660e01b815260040160206040518083038186803b15801561319757600080fd5b505afa1580156131ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506131cf9190810190613da8565b905090565b600060606131e183612a10565b90506000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b82518110156132f25760008260010184600184038151811061324b57fe5b60200260200101516040516132609190614a1a565b908152602001604051809103902054116132af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132a690614c2c565b60405180910390fd5b816002018360018303815181106132c257fe5b60200260200101516040516132d79190614a1a565b9081526020016040518091039020915080600101905061322d565b5060606001835111613304578461331d565b8260018451038151811061331457fe5b60200260200101515b9050600082600101826040516133339190614a31565b90815260200160405180910390205411613382576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161337990614c2c565b60405180910390fd5b6000826000016001846001018460405161339c9190614a31565b90815260200160405180910390205403815481106133b657fe5b906000526020600020906005020190508094505050505092915050565b60008060016020601f855101816133e657fe5b04019050600060016020601f885101816133fc57fe5b040190506040518781526020810160005b8381101561342e57806020028901518160200283015280600101905061340d565b50868360200282015260005b84811015613460578060200287015181856001010160200283015280600101905061343a565b50602082848601602002606001846000600c600019f1945050505050949350505050565b600061348e613b4e565b600060016020601f885101816134a057fe5b0401905060006020601f8601816134b357fe5b0490506040518881526020810160005b848110156134e457806020028a0151816020028301528060010190506134c3565b5083602002810188815287816020015283602002868660030160200285600a600019fa9650505050505094509492505050565b60008060016020601f8551018161352a57fe5b040190506040518481526020810160005b8381101561355c57806020028601518160200283015280600101905061353b565b50602082602085026040018460006011600019f1935050505092915050565b60008060016020601f8651018161358e57fe5b040190506040518581526020810160005b838110156135c057806020028701518160200283015280600101905061359f565b50846020840282015260208260208502604001846000600b600019f193505050509392505050565b60008060016020601f855101816135fb57fe5b040190506040518481526020810160005b8381101561362d57806020028601518160200283015280600101905061360c565b5060208260208502604001846000600e600019f1935050505092915050565b600080600060016020601f8651018161366157fe5b040190506040518581526020810160005b83811015613693578060200287015181602002830152806001019050613672565b506020826020850260200184600d600019fa9450815193505050509250929050565b6136bd613b73565b600060208301905060405180604001604052808451815260200182815250915050919050565b600080826000015161370785600001518660200151866000015187602001516137d4565b0190505b8360000151846020015101811161375157818060010192505082600001516137498560200151830386600001510383866000015187602001516137d4565b01905061370b565b5092915050565b613760613b73565b61376b8383836138af565b5092915050565b60608082600001516040519080825280601f01601f1916602001820160405280156137ac5781602001600182028038833980820191505090505b50905060006020820190506137ca818560200151866000015161394d565b8192505050919050565b600080849050600086851161389f576020851161385957600060018660200360080260020a031960001b905060008186511690506000878a8a0103905060008386511690505b82811461384b57818610613838578a8a0196505050505050506138a7565b858060010196505083865116905061381a565b8596505050505050506138a7565b60008585209050600091505b858803821161389d57600086842090508082141561388957839450505050506138a7565b600184019350508180600101925050613865565b505b868601925050505b949350505050565b6138b7613b73565b60006138d585600001518660200151866000015187602001516137d4565b90508460200151836020018181525050846020015181038360000181815250508460000151856020015101811415613917576000856000018181525050613942565b8360000151836000015101856000018181510391508181525050836000015181018560200181815250505b829150509392505050565b5b60208110613971578151835260208301925060208201915060208103905061394e565b60006001826020036101000a0390508019835116818551168181178652505050505050565b6040518060a001604052806060815260200160001515815260200160008152602001600060028111156139c557fe5b8152602001606081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613a1357805160ff1916838001178555613a41565b82800160010185558215613a41579182015b82811115613a40578251825591602001919060010190613a25565b5b509050613a4e9190613b8d565b5090565b82805482825590600052602060002090601f01602090048101928215613ae75791602002820160005b83821115613ab857835183826101000a81548160ff0219169083151502179055509260200192600101602081600001049283019260010302613a7b565b8015613ae55782816101000a81549060ff0219169055600101602081600001049283019260010302613ab8565b505b509050613af49190613bb2565b5090565b815481835581811115613b2557600502816005028360005260206000209182019101613b249190613be2565b5b505050565b5080546000825560050290600052602060002090810190613b4b9190613be2565b50565b6040518062100000016040528061800090602082028038833980820191505090505090565b604051806040016040528060008152602001600081525090565b613baf91905b80821115613bab576000816000905550600101613b93565b5090565b90565b613bdf91905b80821115613bdb57600081816101000a81549060ff021916905550600101613bb8565b5090565b90565b613c4e91905b80821115613c4a5760008082016000613c019190613c51565b6001820160006101000a81549060ff021916905560028201600090556003820160006101000a81549060ff0219169055600482016000613c419190613c99565b50600501613be8565b5090565b90565b50805460018160011615610100020316600290046000825580601f10613c775750613c96565b601f016020900490600052602060002090810190613c959190613b8d565b5b50565b50805460008255601f016020900490600052602060002090810190613cbe9190613b8d565b50565b600081359050613cd081615086565b92915050565b600081519050613ce581615086565b92915050565b600082601f830112613cfc57600080fd5b8135613d0f613d0a82614e74565b614e47565b91508082526020830160208301858383011115613d2b57600080fd5b613d36838284615026565b50505092915050565b600082601f830112613d5057600080fd5b8135613d63613d5e82614ea0565b614e47565b91508082526020830160208301858383011115613d7f57600080fd5b613d8a838284615026565b50505092915050565b600081359050613da28161509d565b92915050565b600060208284031215613dba57600080fd5b6000613dc884828501613cd6565b91505092915050565b60008060408385031215613de457600080fd5b6000613df285828601613cc1565b9250506020613e0385828601613d93565b9150509250929050565b600060208284031215613e1f57600080fd5b600082013567ffffffffffffffff811115613e3957600080fd5b613e4584828501613d3f565b91505092915050565b60008060408385031215613e6157600080fd5b600083013567ffffffffffffffff811115613e7b57600080fd5b613e8785828601613d3f565b9250506020613e9885828601613d93565b9150509250929050565b600080600060608486031215613eb757600080fd5b600084013567ffffffffffffffff811115613ed157600080fd5b613edd86828701613d3f565b9350506020613eee86828701613d93565b925050604084013567ffffffffffffffff811115613f0b57600080fd5b613f1786828701613ceb565b9150509250925092565b600080600060608486031215613f3657600080fd5b600084013567ffffffffffffffff811115613f5057600080fd5b613f5c86828701613d3f565b9350506020613f6d86828701613d93565b9250506040613f7e86828701613d93565b9150509250925092565b6000613f9483836140f6565b60208301905092915050565b6000613fac8383614105565b60208301905092915050565b6000613fc4838361497f565b905092915050565b6000613fd782614ef6565b613fe18185614f55565b9350613fec83614ecc565b8060005b8381101561401d5781516140048882613f88565b975061400f83614f2e565b925050600181019050613ff0565b5085935050505092915050565b61403381614f01565b61403d8184614f66565b925061404882614edc565b8060005b838110156140795781516140608782613fa0565b965061406b83614f3b565b92505060018101905061404c565b505050505050565b600061408c82614f0d565b6140968185614f71565b9350836020820285016140a885614ee6565b8060005b858110156140e457848403895281516140c58582613fb8565b94506140d083614f48565b925060208a019950506001810190506140ac565b50829750879550505050505092915050565b6140ff81614fc1565b82525050565b61410e81614fcd565b82525050565b61411d81615014565b82525050565b61412c81615014565b82525050565b600061413d82614f23565b6141478185614fa4565b9350614157818560208601615035565b80840191505092915050565b600061416e82614f18565b6141788185614f82565b9350614188818560208601615035565b61419181615068565b840191505092915050565b60006141a782614f18565b6141b18185614fa4565b93506141c1818560208601615035565b80840191505092915050565b60006141da601883614f93565b91507f496e636f7272656374206368756e6b20706f736974696f6e00000000000000006000830152602082019050919050565b600061421a601583614f93565b91507f4469726563746f7279206e6f74206372656174656400000000000000000000006000830152602082019050919050565b600061425a602483614f93565b91507f4e6f7420656e6f756768206d656d6f727920696e207468652046696c6573746f60008301527f72616765000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006142c0601b83614f93565b91507f48617368206861736e2774206265656e2063616c63756c6174656400000000006000830152602082019050919050565b6000614300601983614f93565b91507f4368756e6b20697320616c72656164792075706c6f61646564000000000000006000830152602082019050919050565b6000614340601683614f93565b91507f496e636f7272656374206368756e6b206c656e677468000000000000000000006000830152602082019050919050565b6000614380600f83614f93565b91507f46696c65206e6f742065786973747300000000000000000000000000000000006000830152602082019050919050565b60006143c0600e83614f93565b91507f496e76616c69642073656e6465720000000000000000000000000000000000006000830152602082019050919050565b6000614400601883614f93565b91507f4469726563746f7279206973206e6f742064656c6574656400000000000000006000830152602082019050919050565b6000614440601083614f93565b91507f46696c65206e6f742064656c65746564000000000000000000000000000000006000830152602082019050919050565b6000614480601383614f93565b91507f496e76616c69642073746f7261676550617468000000000000000000000000006000830152602082019050919050565b60006144c0600c83614f93565b91507f496e76616c6964207061746800000000000000000000000000000000000000006000830152602082019050919050565b6000614500600183614fa4565b91507f2e000000000000000000000000000000000000000000000000000000000000006000830152600182019050919050565b6000614540601683614f93565b91507f496e76616c6964206469726563746f7279206e616d65000000000000000000006000830152602082019050919050565b6000614580601583614f93565b91507f4368756e6b207761736e27742075706c6f6164656400000000000000000000006000830152602082019050919050565b60006145c0602683614f93565b91507f436f756c64206e6f742072657365727665206c657373207468616e207573656460008301527f20737061636500000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614626601683614f93565b91507f4469726563746f7279206973206e6f7420656d707479000000000000000000006000830152602082019050919050565b6000614666602383614f93565b91507f46696c65206861736e2774206265656e2075706c6f6164656420636f7272656360008301527f746c7900000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006146cc601183614f93565b91507f4368756e6b207761736e277420726561640000000000000000000000000000006000830152602082019050919050565b600061470c601883614f93565b91507f46696c656e616d652073686f756c64206265203c2032353600000000000000006000830152602082019050919050565b600061474c601f83614f93565b91507f46696c652073686f756c64206265206c657373207468616e20313030204d42006000830152602082019050919050565b600061478c600283614fa4565b91507f2e2e0000000000000000000000000000000000000000000000000000000000006000830152600282019050919050565b60006147cc601183614f93565b91507f4469726563746f72792069732066756c6c0000000000000000000000000000006000830152602082019050919050565b600061480c600e83614f93565b91507f46696c65206e6f7420666f756e640000000000000000000000000000000000006000830152602082019050919050565b600061484c601883614f93565b91507f46696c65206f72206469726563746f72792065786973747300000000000000006000830152602082019050919050565b600061488c601983614f93565b91507f4e6f7420656e6f756768207265736572766564207370616365000000000000006000830152602082019050919050565b60006148cc601883614f93565b91507f45564d206572726f7220696e2067657446696c6553697a6500000000000000006000830152602082019050919050565b600061490c601083614f93565b91507f46696c65206e6f742063726561746564000000000000000000000000000000006000830152602082019050919050565b600061494c601983614f93565b91507f46696c65206861736e2774206265656e2075706c6f61646564000000000000006000830152602082019050919050565b600060a083016000830151848203600086015261499c8282614163565b91505060208301516149b160208601826140f6565b5060408301516149c460408601826149fc565b5060608301516149d76060860182614114565b50608083015184820360808601526149ef8282613fcc565b9150508091505092915050565b614a058161500a565b82525050565b614a148161500a565b82525050565b6000614a26828461419c565b915081905092915050565b6000614a3d8284614132565b915081905092915050565b6000614a53826144f3565b9150819050919050565b6000614a688261477f565b9150819050919050565b60006210000082019050614a89600083018461402a565b92915050565b60006020820190508181036000830152614aa98184614081565b905092915050565b6000602082019050614ac66000830184614123565b92915050565b60006020820190508181036000830152614ae5816141cd565b9050919050565b60006020820190508181036000830152614b058161420d565b9050919050565b60006020820190508181036000830152614b258161424d565b9050919050565b60006020820190508181036000830152614b45816142b3565b9050919050565b60006020820190508181036000830152614b65816142f3565b9050919050565b60006020820190508181036000830152614b8581614333565b9050919050565b60006020820190508181036000830152614ba581614373565b9050919050565b60006020820190508181036000830152614bc5816143b3565b9050919050565b60006020820190508181036000830152614be5816143f3565b9050919050565b60006020820190508181036000830152614c0581614433565b9050919050565b60006020820190508181036000830152614c2581614473565b9050919050565b60006020820190508181036000830152614c45816144b3565b9050919050565b60006020820190508181036000830152614c6581614533565b9050919050565b60006020820190508181036000830152614c8581614573565b9050919050565b60006020820190508181036000830152614ca5816145b3565b9050919050565b60006020820190508181036000830152614cc581614619565b9050919050565b60006020820190508181036000830152614ce581614659565b9050919050565b60006020820190508181036000830152614d05816146bf565b9050919050565b60006020820190508181036000830152614d25816146ff565b9050919050565b60006020820190508181036000830152614d458161473f565b9050919050565b60006020820190508181036000830152614d65816147bf565b9050919050565b60006020820190508181036000830152614d85816147ff565b9050919050565b60006020820190508181036000830152614da58161483f565b9050919050565b60006020820190508181036000830152614dc58161487f565b9050919050565b60006020820190508181036000830152614de5816148bf565b9050919050565b60006020820190508181036000830152614e05816148ff565b9050919050565b60006020820190508181036000830152614e258161493f565b9050919050565b6000602082019050614e416000830184614a0b565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614e6a57600080fd5b8060405250919050565b600067ffffffffffffffff821115614e8b57600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614eb757600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050919050565b6000819050602082019050919050565b600081519050919050565b60006180009050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614fba82614fea565b9050919050565b60008115159050919050565b6000819050919050565b6000819050614fe582615079565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061501f82614fd7565b9050919050565b82818337600083830152505050565b60005b83811015615053578082015181840152602081019050615038565b83811115615062576000848401525b50505050565b6000601f19601f8301169050919050565b6003811061508357fe5b50565b61508f81614faf565b811461509a57600080fd5b50565b6150a68161500a565b81146150b157600080fd5b5056fea365627a7a72315820314a90e541327f2678eaf7815f54348c3702e4fa45cdf1d5595b378d08af86896c6578706572696d656e74616cf564736f6c634300050d0040", + "nonce": "0", + "storage": { + "0x0": "2868903936" + } + }, + "0x69bfcdcb98c9562e0a2faee3ecdfd65e8a0adb19": { + "balance": "1000000000000000000000000000000" + }, + "0x6a37ad7dceec4595eea9f03b82d2710e738343ac": { + "balance": "1000000000000000000000000000000" + }, + "0x6b806862a977a0e22ed1752f858e5332647121c8": { + "balance": "1000000000000000000000000000000" + }, + "0x6c0ef9084a57df13c175afea32ea47a510c5506e": { + "balance": "1000000000000000000000000000000" + }, + "0x6cd5e637266e18d3e888ee99451eb828c6b491f4": { + "balance": "1000000000000000000000000000000" + }, + "0x6d0d7f0ff51917bd84a5f7270d31a894282aaf4b": { + "balance": "1000000000000000000000000000000" + }, + "0x6d8092cb926daf29236f866cd31c327ff73323d1": { + "balance": "1000000000000000000000000000000" + }, + "0x6d80aAC61F6d92c7F4A3c412850474ba963B698E": { + "balance": "1000000000000000000000" + }, + "0x6fec280c0ab320715b17d70e8b02c2d4141c1372": { + "balance": "1000000000000000000000000000000" + }, + "0x733ad609ef2e742334d96266fbc13733f1cf5e4a": { + "balance": "1000000000000000000000000000000" + }, + "0x7525198d8cd1121d57358a0b0ed037e924581a76": { + "balance": "1000000000000000000000000000000" + }, + "0x765708943c3b791563d1e3f0533b6d7e7d769e4d": { + "balance": "1000000000000000000000000000000" + }, + "0x7685d04f0b7657017b77efa004a14ff9f022acab": { + "balance": "1000000000000000000000000000000" + }, + "0x76b545cb6a2fc671f741950eeb27627e69a1e69b": { + "balance": "1000000000000000000000000000000" + }, + "0x77a0bc73442d3d9cb993e8d9752f95babf0ccaa6": { + "balance": "1000000000000000000000000000000" + }, + "0x7a89A6c323FaCfF0ADeF7EEF3e491aD4044d0592": { + "balance": "100000000000000000000000" + }, + "0x7e7E68F04D1799Fa25C8cff57314c8a5d3942e69": { + "balance": "1000000000000000000000000" + }, + "0x811d701d14539d190a8593fe901eafe8eff511f5": { + "balance": "1000000000000000000000000000000" + }, + "0x81dcbd71da28fafb9ca99ff5a22bfcebba84fecc": { + "balance": "100000000000000000000000" + }, + "0x83c1479d2a32d9ed9fa699289b6c2db56b7cd045": { + "balance": "1000000000000000000000000000000" + }, + "0x85b33f0853ab8eaa4e602bdfd724d44bc2731e90": { + "balance": "1000000000000000000000000000000" + }, + "0x863f816036e3cbba90855196c9d1e339fcff1650": { + "balance": "1000000000000000000000000000000" + }, + "0x87ea381878572d63b3453033d7540abddd191186": { + "balance": "1000000000000000000000000000000" + }, + "0x88fd5e01078629cc194c933d9631b9448fe10b1d": { + "balance": "1000000000000000000000000000000" + }, + "0x8945e48bd056f45c8b57f9025d2674bb03a24035": { + "balance": "1000000000000000000000000000000" + }, + "0x8a920edc1021ce76c22774e0e83723a6e51c2439": { + "balance": "1000000000000000000000000000000" + }, + "0x8e6081e272c8f4d49f5b29157b52f68cbd6307ad": { + "balance": "1000000000000000000000000000000" + }, + "0x8fe24dbbf9884bd458d8cfac528b4ad70e82497d": { + "balance": "1000000000000000000000000000000" + }, + "0x90431f3f75b26657f74abbb5c759b12e78f916cc": { + "balance": "1000000000000000000000000000000" + }, + "0x907cd0881E50d359bb9Fd120B1A5A143b1C97De6": { + "balance": "1000000000000000000000000000000000000000000000000000000000" + }, + "0x94c6e5746971d6aebeaa42cbbe2feca0f6b5b24f": { + "balance": "1000000000000000000000000000000" + }, + "0x96672f9e982936e1904b15c948cc81bf18027db6": { + "balance": "1000000000000000000000000000000" + }, + "0x97b921ba45e0aa8830701aa62050a83ee00a1bb8": { + "balance": "1000000000000000000000000000000" + }, + "0x98e50c97baf98dc6a81bdb95067339a269a36fc1": { + "balance": "1000000000000000000000000000000" + }, + "0x9b77f28285a49601169a33332f08aa309d97edd0": { + "balance": "1000000000000000000000000000000" + }, + "0x9f62f4215cd277ca40dede101b4ccb29290de6bb": { + "balance": "1000000000000000000000000000000" + }, + "0xD1001000000000000000000000000000000000D1": { + "balance": "0", + "code": "0x608060405260043610603f576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680636d4ce63c146044575b600080fd5b348015604f57600080fd5b506056606c565b6040518082815260200191505060405180910390f35b60006001600060048152602001908152602001600020600060098152602001908152602001600020600101549050905600a165627a7a723058208fe64219becc0bcab1c8f854f05804ebb6bb555da5dbc49e8f7021c31d77636a0029", + "nonce": "0", + "storage": { + "0x3b4da637a1b0e6dbfc6795f2b7f0cb29eebb91b3af4dcc335e1633f6b4af810b": "1111" + } + }, + "0xD3001000000000000000000000000000000000D3": { + "balance": "0", + "code": "0x60806040526004361061007b5760003560e01c80639623609d1161004e5780639623609d1461013657806399a88ec4146101f5578063f2fde38b14610230578063f3b7dead146102635761007b565b8063204e1c7a14610080578063715018a6146100cf5780637eff275e146100e65780638da5cb5b14610121575b600080fd5b34801561008c57600080fd5b506100b3600480360360208110156100a357600080fd5b50356001600160a01b0316610296565b604080516001600160a01b039092168252519081900360200190f35b3480156100db57600080fd5b506100e4610328565b005b3480156100f257600080fd5b506100e46004803603604081101561010957600080fd5b506001600160a01b03813581169160200135166103ca565b34801561012d57600080fd5b506100b3610496565b6100e46004803603606081101561014c57600080fd5b6001600160a01b03823581169260208101359091169181019060608101604082013564010000000081111561018057600080fd5b82018360208201111561019257600080fd5b803590602001918460018302840111640100000000831117156101b457600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506104a5945050505050565b34801561020157600080fd5b506100e46004803603604081101561021857600080fd5b506001600160a01b03813581169160200135166105dd565b34801561023c57600080fd5b506100e46004803603602081101561025357600080fd5b50356001600160a01b031661068d565b34801561026f57600080fd5b506100b36004803603602081101561028657600080fd5b50356001600160a01b0316610785565b6000806060836001600160a01b03166040518080635c60da1b60e01b8152506004019050600060405180830381855afa9150503d80600081146102f5576040519150601f19603f3d011682016040523d82523d6000602084013e6102fa565b606091505b50915091508161030957600080fd5b80806020019051602081101561031e57600080fd5b5051949350505050565b6103306107e4565b6000546001600160a01b03908116911614610380576040805162461bcd60e51b8152602060048201819052602482015260008051602061080f833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6103d26107e4565b6000546001600160a01b03908116911614610422576040805162461bcd60e51b8152602060048201819052602482015260008051602061080f833981519152604482015290519081900360640190fd5b816001600160a01b0316638f283970826040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050600060405180830381600087803b15801561047a57600080fd5b505af115801561048e573d6000803e3d6000fd5b505050505050565b6000546001600160a01b031690565b6104ad6107e4565b6000546001600160a01b039081169116146104fd576040805162461bcd60e51b8152602060048201819052602482015260008051602061080f833981519152604482015290519081900360640190fd5b826001600160a01b0316634f1ef2863484846040518463ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561057357818101518382015260200161055b565b50505050905090810190601f1680156105a05780820380516001836020036101000a031916815260200191505b5093505050506000604051808303818588803b1580156105bf57600080fd5b505af11580156105d3573d6000803e3d6000fd5b5050505050505050565b6105e56107e4565b6000546001600160a01b03908116911614610635576040805162461bcd60e51b8152602060048201819052602482015260008051602061080f833981519152604482015290519081900360640190fd5b816001600160a01b0316633659cfe6826040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050600060405180830381600087803b15801561047a57600080fd5b6106956107e4565b6000546001600160a01b039081169116146106e5576040805162461bcd60e51b8152602060048201819052602482015260008051602061080f833981519152604482015290519081900360640190fd5b6001600160a01b03811661072a5760405162461bcd60e51b81526004018080602001828103825260268152602001806107e96026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000806060836001600160a01b031660405180806303e1469160e61b8152506004019050600060405180830381855afa9150503d80600081146102f5576040519150601f19603f3d011682016040523d82523d6000602084013e6102fa565b339056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a26469706673582212201d968ac32bef5562c6b4f1bd5d2f2a74c14d07ce008ca6fdc5a3bd0f5fc265f564736f6c63430006080033", + "nonce": "0", + "storage": { + "0x0": "0x907cd0881E50d359bb9Fd120B1A5A143b1C97De6" + } + }, + "0xD3002000000000000000000000000000000000D3": { + "balance": "0", + "code": "0x60806040526004361061004e5760003560e01c80633659cfe6146100655780634f1ef286146100985780635c60da1b146101185780638f28397014610149578063f851a4401461017c5761005d565b3661005d5761005b610191565b005b61005b610191565b34801561007157600080fd5b5061005b6004803603602081101561008857600080fd5b50356001600160a01b03166101ab565b61005b600480360360408110156100ae57600080fd5b6001600160a01b0382351691908101906040810160208201356401000000008111156100d957600080fd5b8201836020820111156100eb57600080fd5b8035906020019184600183028401116401000000008311171561010d57600080fd5b5090925090506101e5565b34801561012457600080fd5b5061012d610292565b604080516001600160a01b039092168252519081900360200190f35b34801561015557600080fd5b5061005b6004803603602081101561016c57600080fd5b50356001600160a01b03166102cf565b34801561018857600080fd5b5061012d610389565b6101996103ba565b6101a96101a461041a565b61043f565b565b6101b3610463565b6001600160a01b0316336001600160a01b031614156101da576101d581610488565b6101e2565b6101e2610191565b50565b6101ed610463565b6001600160a01b0316336001600160a01b031614156102855761020f83610488565b6000836001600160a01b031683836040518083838082843760405192019450600093509091505080830381855af49150503d806000811461026c576040519150601f19603f3d011682016040523d82523d6000602084013e610271565b606091505b505090508061027f57600080fd5b5061028d565b61028d610191565b505050565b600061029c610463565b6001600160a01b0316336001600160a01b031614156102c4576102bd61041a565b90506102cc565b6102cc610191565b90565b6102d7610463565b6001600160a01b0316336001600160a01b031614156101da576001600160a01b0381166103355760405162461bcd60e51b81526004018080602001828103825260368152602001806105876036913960400191505060405180910390fd5b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f61035e610463565b604080516001600160a01b03928316815291841660208301528051918290030190a16101d5816104c8565b6000610393610463565b6001600160a01b0316336001600160a01b031614156102c4576102bd610463565b3b151590565b6103c2610463565b6001600160a01b0316336001600160a01b031614156104125760405162461bcd60e51b81526004018080602001828103825260328152602001806105556032913960400191505060405180910390fd5b6101a96101a9565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b3660008037600080366000845af43d6000803e80801561045e573d6000f35b3d6000fd5b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b610491816104ec565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610355565b6104f5816103b4565b6105305760405162461bcd60e51b815260040180806020018281038252603b8152602001806105bd603b913960400191505060405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5556fe43616e6e6f742063616c6c2066616c6c6261636b2066756e6374696f6e2066726f6d207468652070726f78792061646d696e43616e6e6f74206368616e6765207468652061646d696e206f6620612070726f787920746f20746865207a65726f206164647265737343616e6e6f742073657420612070726f787920696d706c656d656e746174696f6e20746f2061206e6f6e2d636f6e74726163742061646472657373a26469706673582212206e221e2a3547bd97244b05ed46430b1b078ba097cb2a4e25ec3d79cf9ac9f02c64736f6c63430006080033", + "nonce": "0", + "storage": { + "0x0": "1000000", + "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0xD3003000000000000000000000000000000000D3", + "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "0xD3001000000000000000000000000000000000D3" + } + }, + "0xD3003000000000000000000000000000000000D3": { + "balance": "0", + "code": "0x608060405234801561001057600080fd5b50600436106100b45760003560e01c806379210e8e1161007157806379210e8e1461017757806381a8235a146101a757806385aeeb17146101c35780639a9a5593146101f3578063a99100541461020f578063b57321221461022b576100b4565b806307c6e7d3146100b9578063122f4fba146100d55780631c6ec7a9146101055780631cfe4e3b14610121578063373dedb41461013d57806361e46db51461015b575b600080fd5b6100d360048036036100ce9190810190613e94565b61025b565b005b6100ef60048036036100ea9190810190613e94565b610862565b6040516100fc9190614b38565b60405180910390f35b61011f600480360361011a9190810190613e94565b610ba1565b005b61013b60048036036101369190810190613e58565b610fce565b005b6101456111ec565b6040516101529190614eb3565b60405180910390f35b61017560048036036101709190810190613f29565b6111f6565b005b610191600480360361018c9190810190613fa8565b611456565b60405161019e9190614af9565b60405180910390f35b6101c160048036036101bc9190810190613e94565b611756565b005b6101dd60048036036101d89190810190613e94565b6118fb565b6040516101ea9190614b16565b60405180910390f35b61020d60048036036102089190810190613ed5565b611bfa565b005b61022960048036036102249190810190613e94565b612195565b005b61024560048036036102409190810190613e94565b612849565b6040516102529190614eb3565b60405180910390f35b6000339050606061026b83612ac9565b90506000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b825181101561037c576000826001018460018403815181106102d557fe5b60200260200101516040516102ea9190614aa1565b90815260200160405180910390205411610339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161033090614cb3565b60405180910390fd5b8160020183600183038151811061034c57fe5b60200260200101516040516103619190614aa1565b908152602001604051809103902091508060010190506102b7565b506060600183511161038e57846103a7565b8260018451038151811061039e57fe5b60200260200101515b9050600082600101826040516103bd9190614ab8565b9081526020016040518091039020541161040c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161040390614cb3565b60405180910390fd5b600082600201826040516104209190614ab8565b90815260200160405180910390206000018054905014610475576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161046c90614d33565b60405180910390fd5b60006104818587612cc9565b9050806104c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ba90614c53565b60405180910390fd5b6104cb613a4f565b836000016001856000018054905003815481106104e457fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156105965780601f1061056b57610100808354040283529160200191610596565b820191906000526020600020905b81548152906001019060200180831161057957829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff1660028111156105e257fe5b60028111156105ed57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561066557602002820191906000526020600020906000905b82829054906101000a900460ff1615158152602001906001019060208260000104928301926001038202915080841161062f5790505b50505050508152505090508084600001600186600101866040516106899190614ab8565b90815260200160405180910390205403815481106106a357fe5b906000526020600020906005020160008201518160000190805190602001906106cd929190613a8b565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561071c57fe5b0217905550608082015181600401908051906020019061073d929190613b0b565b5090505083600101836040516107539190614ab8565b9081526020016040518091039020548460010182600001516040516107789190614aa1565b9081526020016040518091039020819055506000846001018460405161079e9190614ab8565b908152602001604051809103902081905550836000018054806107bd57fe5b6001900381819060005260206000209060050201600080820160006107e29190613bb1565b6001820160006101000a81549060ff021916905560028201600090556003820160006101000a81549060ff02191690556004820160006108229190613bf9565b5050905583600201836040516108389190614ab8565b9081526020016040518091039020600080820160006108579190613c21565b505050505050505050565b600080606061087084612d2d565b91509150606061087f82612ac9565b90506000600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015610964576000826001018460018403815181106108e957fe5b60200260200101516040516108fe9190614aa1565b908152602001604051809103902054141561092157600095505050505050610b9c565b8160020183600183038151811061093457fe5b60200260200101516040516109499190614aa1565b908152602001604051809103902091508060010190506108cb565b5060606001835111610976578361098f565b8260018451038151811061098657fe5b60200260200101515b9050600082600101826040516109a59190614ab8565b90815260200160405180910390205414156109c857600095505050505050610b9c565b6109d0613a4f565b82600001600184600101846040516109e89190614ab8565b9081526020016040518091039020540381548110610a0257fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610ab45780601f10610a8957610100808354040283529160200191610ab4565b820191906000526020600020905b815481529060010190602001808311610a9757829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115610b0057fe5b6002811115610b0b57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015610b8357602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411610b4d5790505b5050505050815250509050806060015196505050505050505b919050565b600360009054906101000a900460ff16610be457612000600481905550621000006005819055506001600360006101000a81548160ff0219169083151502179055505b6000815111610c28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1f90614cb3565b60405180910390fd5b60003390506060610c3883612ac9565b90506000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015610d4957600082600101846001840381518110610ca257fe5b6020026020010151604051610cb79190614aa1565b90815260200160405180910390205411610d06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cfd90614cb3565b60405180910390fd5b81600201836001830381518110610d1957fe5b6020026020010151604051610d2e9190614aa1565b90815260200160405180910390209150806001019050610c84565b50600454816000018054905010610d95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8c90614dd3565b60405180910390fd5b60606001835111610da65784610dbf565b82600184510381518110610db657fe5b60200260200101515b905060008260010182604051610dd59190614ab8565b90815260200160405180910390205414610e24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1b90614e13565b60405180910390fd5b610e2d816130af565b610e6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6390614cd3565b60405180910390fd5b6000610e788587613190565b905080610eba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb190614b73565b60405180910390fd5b610ec2613a4f565b8281600001819052506000816020019015159081151581525050836000018190806001815401808255809150506001900390600052602060002090600502016000909190919091506000820151816000019080519060200190610f26929190613a8b565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff02191690836002811115610f7557fe5b02179055506080820151816004019080519060200190610f96929190613b0b565b50505083600001805490508460010184604051610fb39190614ab8565b90815260200160405180910390208190555050505050505050565b610fd66131f4565b73ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16148061103b57503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614155b61107a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107190614c33565b60405180910390fd5b80600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411156110fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f390614d13565b60405180910390fd5b60025460095482011115611145576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113c90614b93565b60405180910390fd5b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460096000828254039250508190555080600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550806009600082825401925050819055505050565b6000600254905090565b60003390506000611207828661328d565b90506001600281111561121657fe5b8160030160009054906101000a900460ff16600281111561123357fe5b14611273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126a90614df3565b60405180910390fd5b6000600554858161128057fe5b061480156112915750806002015484105b6112d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c790614b53565b60405180910390fd5b600554848260020154031080156112ed5750838160020154038351145b806112fa57506005548351145b611339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133090614bf3565b60405180910390fd5b6000151581600401600554868161134c57fe5b048154811061135757fe5b90600052602060002090602091828204019190069054906101000a900460ff161515146113b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b090614bd3565b60405180910390fd5b60006113c78387878761348c565b905080611409576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140090614cf3565b60405180910390fd5b600182600401600554878161141a57fe5b048154811061142557fe5b90600052602060002090602091828204019190066101000a81548160ff021916908315150217905550505050505050565b61145e613c45565b6000606061146b86612d2d565b91509150611477613a4f565b611481838361328d565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156115255780601f106114fa57610100808354040283529160200191611525565b820191906000526020600020905b81548152906001019060200180831161150857829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561157157fe5b600281111561157c57fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156115f457602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116115be5790505b505050505081525050905060028081111561160b57fe5b8160600151600281111561161b57fe5b1461165b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165290614e93565b60405180910390fd5b600554851115801561166d5750600085115b6116ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a390614bf3565b60405180910390fd5b806040015185870111156116f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ec90614b53565b60405180910390fd5b60006117038484898961353d565b80965081925050508061174b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174290614d73565b60405180910390fd5b505050509392505050565b60003390506000611767828461328d565b90506001600281111561177657fe5b8160030160009054906101000a900460ff16600281111561179357fe5b146117d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ca90614df3565b60405180910390fd5b60006001905060008260040180549050905060008090505b8181101561183e576000151584600401828154811061180657fe5b90600052602060002090602091828204019190069054906101000a900460ff161515141561183357600092505b8060010190506117eb565b508161187f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187690614d53565b60405180910390fd5b60028360030160006101000a81548160ff021916908360028111156118a057fe5b021790555060006118b185876135d0565b9050806118f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ea90614bb3565b60405180910390fd5b505050505050565b60606000606061190a84612d2d565b91509150606061191982612ac9565b90506000600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008090505b8251811015611a235760008260010184838151811061197f57fe5b60200260200101516040516119949190614aa1565b908152602001604051809103902054116119e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119da90614cb3565b60405180910390fd5b816002018382815181106119f357fe5b6020026020010151604051611a089190614aa1565b90815260200160405180910390209150806001019050611964565b5080600001805480602002602001604051908101604052809291908181526020016000905b82821015611beb57838290600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611b045780601f10611ad957610100808354040283529160200191611b04565b820191906000526020600020905b815481529060010190602001808311611ae757829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115611b5057fe5b6002811115611b5b57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015611bd357602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411611b9d5790505b50505050508152505081526020019060010190611a48565b50505050945050505050919050565b600360009054906101000a900460ff16611c3d57612000600481905550621000006005819055506001600360006101000a81548160ff0219169083151502179055505b60003390506305f5e100821115611c89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8090614db3565b60405180910390fd5b600660008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205483011115611d4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4390614e33565b60405180910390fd5b6060611d5784612ac9565b90506000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015611e6857600082600101846001840381518110611dc157fe5b6020026020010151604051611dd69190614aa1565b90815260200160405180910390205411611e25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1c90614cb3565b60405180910390fd5b81600201836001830381518110611e3857fe5b6020026020010151604051611e4d9190614aa1565b90815260200160405180910390209150806001019050611da3565b50600454816000018054905010611eb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eab90614dd3565b60405180910390fd5b60606001835111611ec55785611ede565b82600184510381518110611ed557fe5b60200260200101515b905060008260010182604051611ef49190614ab8565b90815260200160405180910390205414611f43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3a90614e13565b60405180910390fd5b611f4c816130af565b611f8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8290614d93565b60405180910390fd5b6000611f98858888613634565b905080611fda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd190614e73565b60405180910390fd5b6060600554600160055489010381611fee57fe5b0460405190808252806020026020018201604052801561201d5781602001602082028038833980820191505090505b509050836000016040518060a001604052808581526020016001151581526020018981526020016001600281111561205157fe5b8152602001838152509080600181540180825580915050600190039060005260206000209060050201600090919091909150600082015181600001908051906020019061209f929190613a8b565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff021916908360028111156120ee57fe5b0217905550608082015181600401908051906020019061210f929190613b0b565b5050508360000180549050846001018460405161212c9190614ab8565b90815260200160405180910390208190555086600760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505050505050505050565b60003390506121a2613a4f565b6121ac828461328d565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156122505780601f1061222557610100808354040283529160200191612250565b820191906000526020600020905b81548152906001019060200180831161223357829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561229c57fe5b60028111156122a757fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561231f57602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116122e95790505b50505050508152505090506000600281111561233757fe5b8160600151600281111561234757fe5b1415612388576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161237f90614c13565b60405180910390fd5b600061239483856136a1565b9050806123d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123cd90614c73565b60405180910390fd5b60606123e185612ac9565b90506000600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015612479578160020183600183038151811061244957fe5b602002602001015160405161245e9190614aa1565b9081526020016040518091039020915080600101905061242d565b50600060018260010186600001516040516124949190614aa1565b9081526020016040518091039020540390506124ae613a4f565b826000016001846000018054905003815481106124c757fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156125795780601f1061254e57610100808354040283529160200191612579565b820191906000526020600020905b81548152906001019060200180831161255c57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff1660028111156125c557fe5b60028111156125d057fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561264857602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116126125790505b50505050508152505090508083600001838154811061266357fe5b9060005260206000209060050201600082015181600001908051906020019061268d929190613a8b565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff021916908360028111156126dc57fe5b021790555060808201518160040190805190602001906126fd929190613b0b565b509050508260000180548061270e57fe5b6001900381819060005260206000209060050201600080820160006127339190613bb1565b6001820160006101000a81549060ff021916905560028201600090556003820160006101000a81549060ff02191690556004820160006127739190613bf9565b5050905582600101866000015160405161278d9190614aa1565b9081526020016040518091039020548360010182600001516040516127b29190614aa1565b90815260200160405180910390208190555060008360010187600001516040516127dc9190614aa1565b9081526020016040518091039020819055508560400151600760008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505050505050505050565b600080606061285784612d2d565b91509150612863613a4f565b61286d838361328d565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156129115780601f106128e657610100808354040283529160200191612911565b820191906000526020600020905b8154815290600101906020018083116128f457829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561295d57fe5b600281111561296857fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156129e057602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116129aa5790505b5050505050815250509050600160028111156129f857fe5b81606001516002811115612a0857fe5b1480612a2d5750600280811115612a1b57fe5b81606001516002811115612a2b57fe5b145b612a6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a6390614df3565b60405180910390fd5b6000612a788484613705565b809650819250505080612ac0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ab790614e53565b60405180910390fd5b50505050919050565b6060612ad3613c6a565b612adc8361376e565b9050612ae6613c6a565b612b246040518060400160405280600181526020017f2f0000000000000000000000000000000000000000000000000000000000000081525061376e565b905060606001612b3d838561379c90919063ffffffff16565b01604051908082528060200260200182016040528015612b7157816020015b6060815260200190600190039081612b5c5790505b50905060008090505b8151811015612bc257612b9e612b99848661381190919063ffffffff16565b61382b565b828281518110612baa57fe5b60200260200101819052508080600101915050612b7a565b50600081600183510381518110612bd557fe5b6020026020010151511415612c405780600182510381518110612bf457fe5b6020026020010160608152506001815103604051908082528060200260200182016040528015612c3857816020015b6060815260200190600190039081612c235790505b509350612c79565b8051604051908082528060200260200182016040528015612c7557816020015b6060815260200190600190039081612c605790505b5093505b60008090505b8451811015612cc057818181518110612c9457fe5b6020026020010151858281518110612ca857fe5b60200260200101819052508080600101915050612c7f565b50505050919050565b60008060016020601f85510181612cdc57fe5b040190506040518481526020810160005b83811015612d0e578060200286015181602002830152806001019050612ced565b50602082602085026040018460006010600019f1935050505092915050565b6000606060006028905080845111612d7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d7190614c93565b60405180910390fd5b6060816040519080825280601f01601f191660200182016040528015612daf5781602001600182028038833980820191505090505b50905060008090505b82811015612e1f57858181518110612dcc57fe5b602001015160f81c60f81b828281518110612de357fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050612db8565b50600080905060008090505b83811015612f4e576000838281518110612e4157fe5b602001015160f81c60f81b60f81c60ff16905060308110158015612e66575060398111155b80612e7f575060418110158015612e7e5750605a8111155b5b80612e98575060618110158015612e97575060668111155b5b612ed7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ece90614c93565b60405180910390fd5b60308110158015612ee9575060398111155b15612efa5760308103601084020192505b60418110158015612f0c5750605a8111155b15612f1d5760378103601084020192505b60618110158015612f2f575060668111155b15612f405760578103601084020192505b508080600101915050612e2b565b508094507f2f00000000000000000000000000000000000000000000000000000000000000868481518110612f7f57fe5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612fec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fe390614c93565b60405180910390fd5b6000600184885103039050806040519080825280601f01601f19166020018201604052801561302a5781602001600182028038833980820191505090505b50945060008090505b818110156130a5576000886001878401018151811061304e57fe5b602001015160f81c60f81b90508087838151811061306857fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350508080600101915050613033565b5050505050915091565b60006040516020016130c090614ae4565b60405160208183030381529060405280519060200120826040516020016130e79190614ab8565b604051602081830303815290604052805190602001201480613152575060405160200161311390614acf565b604051602081830303815290604052805190602001208260405160200161313a9190614ab8565b60405160208183030381529060405280519060200120145b8061315e575060008251145b1561316c576000905061318b565b60008251905060ff81111561318557600091505061318b565b60019150505b919050565b60008060016020601f855101816131a357fe5b040190506040518481526020810160005b838110156131d55780602002860151816020028301528060010190506131b4565b5060208260208502604001846000600f600019f1935050505092915050565b600073d2001000000000000000000000000000000000d273ffffffffffffffffffffffffffffffffffffffff166383e781fe6040518163ffffffff1660e01b815260040160206040518083038186803b15801561325057600080fd5b505afa158015613264573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506132889190810190613e2f565b905090565b6000606061329a83612ac9565b90506000600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b82518110156133ab5760008260010184600184038151811061330457fe5b60200260200101516040516133199190614aa1565b90815260200160405180910390205411613368576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161335f90614cb3565b60405180910390fd5b8160020183600183038151811061337b57fe5b60200260200101516040516133909190614aa1565b908152602001604051809103902091508060010190506132e6565b50606060018351116133bd57846133d6565b826001845103815181106133cd57fe5b60200260200101515b9050600082600101826040516133ec9190614ab8565b9081526020016040518091039020541161343b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161343290614cb3565b60405180910390fd5b600082600001600184600101846040516134559190614ab8565b908152602001604051809103902054038154811061346f57fe5b906000526020600020906005020190508094505050505092915050565b60008060016020601f8551018161349f57fe5b04019050600060016020601f885101816134b557fe5b040190506040518781526020810160005b838110156134e75780602002890151816020028301528060010190506134c6565b50868360200282015260005b8481101561351957806020028701518185600101016020028301528060010190506134f3565b50602082848601602002606001846000600c600019f1945050505050949350505050565b6000613547613c45565b600060016020601f8851018161355957fe5b0401905060006020601f86018161356c57fe5b0490506040518881526020810160005b8481101561359d57806020028a01518160200283015280600101905061357c565b5083602002810188815287816020015283602002868660030160200285600a600019fa9650505050505094509492505050565b60008060016020601f855101816135e357fe5b040190506040518481526020810160005b838110156136155780602002860151816020028301528060010190506135f4565b50602082602085026040018460006011600019f1935050505092915050565b60008060016020601f8651018161364757fe5b040190506040518581526020810160005b83811015613679578060200287015181602002830152806001019050613658565b50846020840282015260208260208502604001846000600b600019f193505050509392505050565b60008060016020601f855101816136b457fe5b040190506040518481526020810160005b838110156136e65780602002860151816020028301528060010190506136c5565b5060208260208502604001846000600e600019f1935050505092915050565b600080600060016020601f8651018161371a57fe5b040190506040518581526020810160005b8381101561374c57806020028701518160200283015280600101905061372b565b506020826020850260200184600d600019fa9450815193505050509250929050565b613776613c6a565b600060208301905060405180604001604052808451815260200182815250915050919050565b60008082600001516137c0856000015186602001518660000151876020015161388d565b0190505b8360000151846020015101811161380a578180600101925050826000015161380285602001518303866000015103838660000151876020015161388d565b0190506137c4565b5092915050565b613819613c6a565b613824838383613968565b5092915050565b60608082600001516040519080825280601f01601f1916602001820160405280156138655781602001600182028038833980820191505090505b50905060006020820190506138838185602001518660000151613a06565b8192505050919050565b6000808490506000868511613958576020851161391257600060018660200360080260020a031960001b905060008186511690506000878a8a0103905060008386511690505b828114613904578186106138f1578a8a019650505050505050613960565b85806001019650508386511690506138d3565b859650505050505050613960565b60008585209050600091505b85880382116139565760008684209050808214156139425783945050505050613960565b60018401935050818060010192505061391e565b505b868601925050505b949350505050565b613970613c6a565b600061398e856000015186602001518660000151876020015161388d565b905084602001518360200181815250508460200151810383600001818152505084600001518560200151018114156139d05760008560000181815250506139fb565b8360000151836000015101856000018181510391508181525050836000015181018560200181815250505b829150509392505050565b5b60208110613a2a5781518352602083019250602082019150602081039050613a07565b60006001826020036101000a0390508019835116818551168181178652505050505050565b6040518060a00160405280606081526020016000151581526020016000815260200160006002811115613a7e57fe5b8152602001606081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613acc57805160ff1916838001178555613afa565b82800160010185558215613afa579182015b82811115613af9578251825591602001919060010190613ade565b5b509050613b079190613c84565b5090565b82805482825590600052602060002090601f01602090048101928215613ba05791602002820160005b83821115613b7157835183826101000a81548160ff0219169083151502179055509260200192600101602081600001049283019260010302613b34565b8015613b9e5782816101000a81549060ff0219169055600101602081600001049283019260010302613b71565b505b509050613bad9190613ca9565b5090565b50805460018160011615610100020316600290046000825580601f10613bd75750613bf6565b601f016020900490600052602060002090810190613bf59190613c84565b5b50565b50805460008255601f016020900490600052602060002090810190613c1e9190613c84565b50565b5080546000825560050290600052602060002090810190613c429190613cd9565b50565b6040518062100000016040528061800090602082028038833980820191505090505090565b604051806040016040528060008152602001600081525090565b613ca691905b80821115613ca2576000816000905550600101613c8a565b5090565b90565b613cd691905b80821115613cd257600081816101000a81549060ff021916905550600101613caf565b5090565b90565b613d4591905b80821115613d415760008082016000613cf89190613bb1565b6001820160006101000a81549060ff021916905560028201600090556003820160006101000a81549060ff0219169055600482016000613d389190613bf9565b50600501613cdf565b5090565b90565b600081359050613d578161510d565b92915050565b600081519050613d6c8161510d565b92915050565b600082601f830112613d8357600080fd5b8135613d96613d9182614efb565b614ece565b91508082526020830160208301858383011115613db257600080fd5b613dbd8382846150ad565b50505092915050565b600082601f830112613dd757600080fd5b8135613dea613de582614f27565b614ece565b91508082526020830160208301858383011115613e0657600080fd5b613e118382846150ad565b50505092915050565b600081359050613e2981615124565b92915050565b600060208284031215613e4157600080fd5b6000613e4f84828501613d5d565b91505092915050565b60008060408385031215613e6b57600080fd5b6000613e7985828601613d48565b9250506020613e8a85828601613e1a565b9150509250929050565b600060208284031215613ea657600080fd5b600082013567ffffffffffffffff811115613ec057600080fd5b613ecc84828501613dc6565b91505092915050565b60008060408385031215613ee857600080fd5b600083013567ffffffffffffffff811115613f0257600080fd5b613f0e85828601613dc6565b9250506020613f1f85828601613e1a565b9150509250929050565b600080600060608486031215613f3e57600080fd5b600084013567ffffffffffffffff811115613f5857600080fd5b613f6486828701613dc6565b9350506020613f7586828701613e1a565b925050604084013567ffffffffffffffff811115613f9257600080fd5b613f9e86828701613d72565b9150509250925092565b600080600060608486031215613fbd57600080fd5b600084013567ffffffffffffffff811115613fd757600080fd5b613fe386828701613dc6565b9350506020613ff486828701613e1a565b925050604061400586828701613e1a565b9150509250925092565b600061401b838361417d565b60208301905092915050565b6000614033838361418c565b60208301905092915050565b600061404b8383614a06565b905092915050565b600061405e82614f7d565b6140688185614fdc565b935061407383614f53565b8060005b838110156140a457815161408b888261400f565b975061409683614fb5565b925050600181019050614077565b5085935050505092915050565b6140ba81614f88565b6140c48184614fed565b92506140cf82614f63565b8060005b838110156141005781516140e78782614027565b96506140f283614fc2565b9250506001810190506140d3565b505050505050565b600061411382614f94565b61411d8185614ff8565b93508360208202850161412f85614f6d565b8060005b8581101561416b578484038952815161414c858261403f565b945061415783614fcf565b925060208a01995050600181019050614133565b50829750879550505050505092915050565b61418681615048565b82525050565b61419581615054565b82525050565b6141a48161509b565b82525050565b6141b38161509b565b82525050565b60006141c482614faa565b6141ce818561502b565b93506141de8185602086016150bc565b80840191505092915050565b60006141f582614f9f565b6141ff8185615009565b935061420f8185602086016150bc565b614218816150ef565b840191505092915050565b600061422e82614f9f565b614238818561502b565b93506142488185602086016150bc565b80840191505092915050565b600061426160188361501a565b91507f496e636f7272656374206368756e6b20706f736974696f6e00000000000000006000830152602082019050919050565b60006142a160158361501a565b91507f4469726563746f7279206e6f74206372656174656400000000000000000000006000830152602082019050919050565b60006142e160248361501a565b91507f4e6f7420656e6f756768206d656d6f727920696e207468652046696c6573746f60008301527f72616765000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614347601b8361501a565b91507f48617368206861736e2774206265656e2063616c63756c6174656400000000006000830152602082019050919050565b600061438760198361501a565b91507f4368756e6b20697320616c72656164792075706c6f61646564000000000000006000830152602082019050919050565b60006143c760168361501a565b91507f496e636f7272656374206368756e6b206c656e677468000000000000000000006000830152602082019050919050565b6000614407600f8361501a565b91507f46696c65206e6f742065786973747300000000000000000000000000000000006000830152602082019050919050565b6000614447600e8361501a565b91507f496e76616c69642073656e6465720000000000000000000000000000000000006000830152602082019050919050565b600061448760188361501a565b91507f4469726563746f7279206973206e6f742064656c6574656400000000000000006000830152602082019050919050565b60006144c760108361501a565b91507f46696c65206e6f742064656c65746564000000000000000000000000000000006000830152602082019050919050565b600061450760138361501a565b91507f496e76616c69642073746f7261676550617468000000000000000000000000006000830152602082019050919050565b6000614547600c8361501a565b91507f496e76616c6964207061746800000000000000000000000000000000000000006000830152602082019050919050565b600061458760018361502b565b91507f2e000000000000000000000000000000000000000000000000000000000000006000830152600182019050919050565b60006145c760168361501a565b91507f496e76616c6964206469726563746f7279206e616d65000000000000000000006000830152602082019050919050565b600061460760158361501a565b91507f4368756e6b207761736e27742075706c6f6164656400000000000000000000006000830152602082019050919050565b600061464760268361501a565b91507f436f756c64206e6f742072657365727665206c657373207468616e207573656460008301527f20737061636500000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006146ad60168361501a565b91507f4469726563746f7279206973206e6f7420656d707479000000000000000000006000830152602082019050919050565b60006146ed60238361501a565b91507f46696c65206861736e2774206265656e2075706c6f6164656420636f7272656360008301527f746c7900000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061475360118361501a565b91507f4368756e6b207761736e277420726561640000000000000000000000000000006000830152602082019050919050565b600061479360188361501a565b91507f46696c656e616d652073686f756c64206265203c2032353600000000000000006000830152602082019050919050565b60006147d3601f8361501a565b91507f46696c652073686f756c64206265206c657373207468616e20313030204d42006000830152602082019050919050565b600061481360028361502b565b91507f2e2e0000000000000000000000000000000000000000000000000000000000006000830152600282019050919050565b600061485360118361501a565b91507f4469726563746f72792069732066756c6c0000000000000000000000000000006000830152602082019050919050565b6000614893600e8361501a565b91507f46696c65206e6f7420666f756e640000000000000000000000000000000000006000830152602082019050919050565b60006148d360188361501a565b91507f46696c65206f72206469726563746f72792065786973747300000000000000006000830152602082019050919050565b600061491360198361501a565b91507f4e6f7420656e6f756768207265736572766564207370616365000000000000006000830152602082019050919050565b600061495360188361501a565b91507f45564d206572726f7220696e2067657446696c6553697a6500000000000000006000830152602082019050919050565b600061499360108361501a565b91507f46696c65206e6f742063726561746564000000000000000000000000000000006000830152602082019050919050565b60006149d360198361501a565b91507f46696c65206861736e2774206265656e2075706c6f61646564000000000000006000830152602082019050919050565b600060a0830160008301518482036000860152614a2382826141ea565b9150506020830151614a38602086018261417d565b506040830151614a4b6040860182614a83565b506060830151614a5e606086018261419b565b5060808301518482036080860152614a768282614053565b9150508091505092915050565b614a8c81615091565b82525050565b614a9b81615091565b82525050565b6000614aad8284614223565b915081905092915050565b6000614ac482846141b9565b915081905092915050565b6000614ada8261457a565b9150819050919050565b6000614aef82614806565b9150819050919050565b60006210000082019050614b1060008301846140b1565b92915050565b60006020820190508181036000830152614b308184614108565b905092915050565b6000602082019050614b4d60008301846141aa565b92915050565b60006020820190508181036000830152614b6c81614254565b9050919050565b60006020820190508181036000830152614b8c81614294565b9050919050565b60006020820190508181036000830152614bac816142d4565b9050919050565b60006020820190508181036000830152614bcc8161433a565b9050919050565b60006020820190508181036000830152614bec8161437a565b9050919050565b60006020820190508181036000830152614c0c816143ba565b9050919050565b60006020820190508181036000830152614c2c816143fa565b9050919050565b60006020820190508181036000830152614c4c8161443a565b9050919050565b60006020820190508181036000830152614c6c8161447a565b9050919050565b60006020820190508181036000830152614c8c816144ba565b9050919050565b60006020820190508181036000830152614cac816144fa565b9050919050565b60006020820190508181036000830152614ccc8161453a565b9050919050565b60006020820190508181036000830152614cec816145ba565b9050919050565b60006020820190508181036000830152614d0c816145fa565b9050919050565b60006020820190508181036000830152614d2c8161463a565b9050919050565b60006020820190508181036000830152614d4c816146a0565b9050919050565b60006020820190508181036000830152614d6c816146e0565b9050919050565b60006020820190508181036000830152614d8c81614746565b9050919050565b60006020820190508181036000830152614dac81614786565b9050919050565b60006020820190508181036000830152614dcc816147c6565b9050919050565b60006020820190508181036000830152614dec81614846565b9050919050565b60006020820190508181036000830152614e0c81614886565b9050919050565b60006020820190508181036000830152614e2c816148c6565b9050919050565b60006020820190508181036000830152614e4c81614906565b9050919050565b60006020820190508181036000830152614e6c81614946565b9050919050565b60006020820190508181036000830152614e8c81614986565b9050919050565b60006020820190508181036000830152614eac816149c6565b9050919050565b6000602082019050614ec86000830184614a92565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614ef157600080fd5b8060405250919050565b600067ffffffffffffffff821115614f1257600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614f3e57600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050919050565b6000819050602082019050919050565b600081519050919050565b60006180009050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061504182615071565b9050919050565b60008115159050919050565b6000819050919050565b600081905061506c82615100565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006150a68261505e565b9050919050565b82818337600083830152505050565b60005b838110156150da5780820151818401526020810190506150bf565b838111156150e9576000848401525b50505050565b6000601f19601f8301169050919050565b6003811061510a57fe5b50565b61511681615036565b811461512157600080fd5b50565b61512d81615091565b811461513857600080fd5b5056fea2646970667358221220a549ad9e778ae8bb3048c0a1805e77745871cc1560637ae1c3ebccb76638d9c464736f6c63430006020033", + "nonce": "0", + "storage": {} + }, + "0xa096b05a489831db893fc53aacc7ed20efb36382": { + "balance": "1000000000000000000000000000000" + }, + "0xa1cd651d99283be60e2a9d2e3bc8a90aedb8244f": { + "balance": "1000000000000000000000000000000" + }, + "0xa2969e82619021ea407338f8bdf7c6f2bd679673": { + "balance": "1000000000000000000000000000000" + }, + "0xa3597b1162b6559cb5e966904b63e762ece756a4": { + "balance": "1000000000000000000000000000000" + }, + "0xa68f946090c600eda6f139783077ee802afeb990": { + "balance": "1000000000000000000000000000000" + }, + "0xa6d50055592cecb795bc1ed3b9ea57ed426b0b7c": { + "balance": "1000000000000000000000000000000" + }, + "0xa7c0789bdeee38c6b59111a789dfb6b815489847": { + "balance": "1000000000000000000000000000000" + }, + "0xa8c813ee806b4c8537ff5f16084d44db18ea9ab1": { + "balance": "1000000000000000000000000000000" + }, + "0xaa6a87bbb74bc1f3cb40c1efb7fc171ee6407560": { + "balance": "1000000000000000000000000000000" + }, + "0xabf920b89f5a2487fdb70be17fd01a99a0602e62": { + "balance": "1000000000000000000000000000000" + }, + "0xac5df92da5171ba24a9618018b4f79494040334b": { + "balance": "1000000000000000000000000000000" + }, + "0xaf97a8318a1a51d5daeeb9650024b63ee44f45bd": { + "balance": "1000000000000000000000000000000" + }, + "0xb28c45b98ae43a5e9ee5509c97ea037b5de5d6d9": { + "balance": "1000000000000000000000000000000" + }, + "0xb64989ab32b089da3da103b93e6781d6d5dd10b4": { + "balance": "1000000000000000000000000000000" + }, + "0xb67e6f4a21f93c250fa6ff0cb142bd14dd4ca8eb": { + "balance": "1000000000000000000000000000000" + }, + "0xb70603c505f85130b5b2e73cd82d196dfd7d8b5e": { + "balance": "1000000000000000000000000000000" + }, + "0xb942414cae2a1ab1056657b905845c0ab6b6280a": { + "balance": "1000000000000000000000000000000" + }, + "0xbee0e5c1961d51be9bd670876caa9c90ba7d9016": { + "balance": "1000000000000000000000000000000" + }, + "0xbf2d8cebdeeb8ad8fed7b2a75f35922106f8d75c": { + "balance": "1000000000000000000000000000000" + }, + "0xbf5aa678b969c0871e2fbcf09c3dbb5d5865ac1e": { + "balance": "1000000000000000000000000000000" + }, + "0xc12bcedd9bcad9120150122cd50f39576ecccc08": { + "balance": "1000000000000000000000000000000" + }, + "0xc2d3852f3292acb81bd164dbae5f1e2a87535150": { + "balance": "1000000000000000000000000000000" + }, + "0xc3820490201e94d76b44655d2df713fec29d9795": { + "balance": "1000000000000000000000000000000" + }, + "0xc58744e2eceefd45cc5469f0e0a708ad24ddbbdb": { + "balance": "1000000000000000000000000000000" + }, + "0xc7865200e8e51ba1c8d695f327deed432930f2cc": { + "balance": "1000000000000000000000000000000" + }, + "0xc8e4d709eb3eb335dc69c9fbf2d24d447cb86105": { + "balance": "1000000000000000000000000000000" + }, + "0xc98af661e44c5bf31d2f8bdff4bbf2808ed4e991": { + "balance": "1000000000000000000000000000000" + }, + "0xca4409573a5129a72edf85d6c51e26760fc9c903": { + "balance": "100000000000000000000000" + }, + "0xcc33e23b04b74f7ba8fbe315083182224af973fa": { + "balance": "1000000000000000000000000000000" + }, + "0xce1c62d0a77600fb2f959b4da76fcb9b3b9430a3": { + "balance": "1000000000000000000000000000000" + }, + "0xd1b6c947fb14060b38945584714491592e84875d": { + "balance": "1000000000000000000000000000000" + }, + "0xd23cd6a9ddcc3470300003621bbac1e06a7919d5": { + "balance": "1000000000000000000000000000000" + }, + "0xd2c5b39B4e735C17612Bb5a08FD024ccc5dBCb23": { + "balance": "100000000000000000000000" + }, + "0xd2cd302eb060e375a65d65946692a3ac2d838d35": { + "balance": "1000000000000000000000000000000" + }, + "0xd2e75c41ced8699e3176f6e335355701a2568b7b": { + "balance": "1000000000000000000000000000000" + }, + "0xd3d38f4cb0aeb4c7c2527ddaeec2ab3b910c8528": { + "balance": "1000000000000000000000000000000" + }, + "0xd5b561a27cca5049650a14ab93dbf1a20c0cefc1": { + "balance": "1000000000000000000000000000000" + }, + "0xd90045420b8abc37b3f9304ed2b385fc1b7fa8c5": { + "balance": "1000000000000000000000000000000" + }, + "0xd951bf4cff429062702a7d8699a5f0bf14845d9b": { + "balance": "1000000000000000000000000000000" + }, + "0xdc6a269c58e58a93a22b5df8cdf1af630c47481f": { + "balance": "1000000000000000000000000000000" + }, + "0xdc6d02ef4003a4f2d0ccff65ae1a2d8157fbb23e": { + "balance": "1000000000000000000000000000000" + }, + "0xde14aca36acc62c305a7ee571da37840a408e600": { + "balance": "1000000000000000000000000000000" + }, + "0xdee32ae508cf783f53ab8bc39d878fe323cdfae3": { + "balance": "1000000000000000000000000000000" + }, + "0xe083a100d51fc4f38aae4a3a68404c36ad96c612": { + "balance": "1000000000000000000000000000000" + }, + "0xe1607990ce800407e3c206e58de4917977181d4d": { + "balance": "1000000000000000000000000000000" + }, + "0xe25e5b63dfd4cf59b81eddf64f1195858634b8a6": { + "balance": "1000000000000000000000000000000" + }, + "0xe372377decb3bdc0c7f5272d38ce0ba2a54934fe": { + "balance": "1000000000000000000000000000000" + }, + "0xe3cc6ec63b5652d1594bc63bb293f4e80f76dbdd": { + "balance": "1000000000000000000000000000000" + }, + "0xe3da7c014286258944ab20a31e4d861b4c9262f1": { + "balance": "1000000000000000000000000000000" + }, + "0xe8b57f330d56081c856e618210fbedb414925ff0": { + "balance": "1000000000000000000000000000000" + }, + "0xe91ac72a568e752eb7c9f5235100586ce97c8cc1": { + "balance": "1000000000000000000000000000000" + }, + "0xf184c8c243a178c1748a0af45caedeca476105b4": { + "balance": "1000000000000000000000000000000" + }, + "0xf1a5912ff318aebf312cdb54c75642a9e632703c": { + "balance": "1000000000000000000000000000000" + }, + "0xf2197b153b4c9086fc5410431fbf7960d284c65e": { + "balance": "1000000000000000000000000000000" + }, + "0xf36620e71327f4a55d550d46e030ccf0c728f154": { + "balance": "1000000000000000000000000000000" + }, + "0xf9817fB82fc767aA9A4A97a1901676244b88ce0E": { + "balance": "100000000000000000000000" + }, + "0xfa723938fa8da1a8a2114ad409a11581761ee40d": { + "balance": "1000000000000000000000000000000" + }, + "0xfa7a8c69810eaf16a395d2a93b3ab51efeed2a1c": { + "balance": "1000000000000000000000000000000" + }, + "0xfaa1038074941571524934ba52d312e88b3577f5": { + "balance": "1000000000000000000000000000000" + }, + "0xfe14077c26a507496b7208384d459e21c49c4212": { + "balance": "1000000000000000000000000000000" + }, + "0xfe275c9b5ac792327da509b27eb9614196dfb07d": { + "balance": "1000000000000000000000000000000" + }, + "0xfe2c5aa110fff89361806ea7ee080bfffba0d3dd": { + "balance": "1000000000000000000000000000000" + }, + "0xfe3d4f1fc038f4f756ba44995129cd45c9e0e861": { + "balance": "1000000000000000000000000000000" + }, + "0xfee314cdc84ecfaa675e41b3559c0101e1eba6b8": { + "balance": "1000000000000000000000000000000" + } + }, + "genesis": { + "author": "0x0000000000000000000000000000000000000001", + "difficulty": "0x0", + "extraData": "0x11bbe8db4e347b4e8c937c1c8370e4b5ed33adb3db69cbdb7a38e1e50b1b82fa", + "gasLimit": "0xFFFFFFFFF", + "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000abc", + "nonce": "0x0000000000000042", + "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "timestamp": "0x00" + }, + "params": { + "EIP150ForkBlock": "0x00", + "EIP158ForkBlock": "0x00", + "accountStartNonce": "0x00", + "blockReward": "0x4563918244F40000", + "byzantiumForkBlock": "0x0", + "chainID": "0x12345", + "constantinopleForkBlock": "0x0", + "daoHardforkBlock": "0x0", + "difficultyBoundDivisor": "0x0800", + "durationLimit": "0x0d", + "externalGasDifficulty": "0x01", + "gasLimitBoundDivisor": "0x0400", + "homesteadForkBlock": "0x0", + "maxGasLimit": "0xFFFFFFFFF", + "maximumExtraDataSize": "0x20", + "minGasLimit": "0xFFFFFFFFF", + "minimumDifficulty": "0x0", + "networkID": "12313219", + "tieBreakingGas": false + }, + "sealEngine": "Ethash", + "skaleConfig": { + "nodeInfo": { + "basePort": 1531, + "bindIP": "0.0.0.0", + "collectionDuration": 10, + "collectionQueueSize": 2, + "db-path": "/tmp/test_eth_4_of_4", + "ecdsaKeyName": "", + "httpRpcPort": 1534, + "httpsRpcPort": 1239, + "logLevel": "info", + "logLevelProposal": "info", + "maxCacheSize": 2000, + "maxOpenLeveldbFiles": 25, + "minCacheSize": 1000, + "nodeID": 404, + "nodeName": "Node1", + "rotateAfterBlock": 0, + "testSignatures": true, + "transactionQueueSize": 10000, + "wsRpcPort": 1533, + "wssRpcPort": 1538 + }, + "sChain": { + "EIP1559TransactionsPatchTimestamp": 1, + "contractStorageLimit": 10000000000, + "contractStoragePatchTimestamp": 1, + "contractStorageZeroValuePatchTimestamp": 1, + "correctForkInPowPatchTimestamp": 1, + "emptyBlockIntervalMs": 10000, + "fastConsensusPatchTimestamp": 1, + "flexibleDeploymentPatchTimestamp": 1, + "levelDBReopenIntervalMs": 1, + "multiTransactionMode": false, + "nodes": [ + { + "basePort": 1231, + "ip": "127.0.0.1", + "nodeID": 401, + "publicKey": "", + "schainIndex": 1 + }, + { + "basePort": 1331, + "ip": "127.0.0.1", + "nodeID": 402, + "publicKey": "", + "schainIndex": 2 + }, + { + "basePort": 1431, + "ip": "127.0.0.1", + "nodeID": 403, + "publicKey": "", + "schainIndex": 3 + }, + { + "basePort": 1531, + "ip": "127.0.0.1", + "nodeID": 404, + "publicKey": "", + "schainIndex": 4 + } + ], + "powCheckPatchTimestamp": 1, + "precompiledConfigPatchTimestamp": 1, + "pushZeroPatchTimestamp": 1, + "revertableFSPatchTimestamp": 1, + "schainID": 5, + "schainName": "TestChain", + "schainOwner": "0x907cd0881E50d359bb9Fd120B1A5A143b1C97De6", + "skipInvalidTransactionsPatchTimestamp": 1, + "storageDestructionPatchTimestamp": 1, + "verifyBlsSyncPatchTimestamp": 1, + "verifyDaSigsPatchTimestamp": 1 + } + }, + "unddos": { + "origins": [ + { + "ban_lengthy": 0, + "ban_peak": 0, + "max_calls_per_minute": 1000000000, + "max_calls_per_second": 1000000000, + "max_ws_conn": 65535, + "origin": [ + "*" + ] + } + ] + } +} \ No newline at end of file diff --git a/test/historicstate/configs/test_5_of_16.json b/test/historicstate/configs/test_5_of_16.json new file mode 100644 index 000000000..4fdee6dfd --- /dev/null +++ b/test/historicstate/configs/test_5_of_16.json @@ -0,0 +1,910 @@ +{ + "accounts": { + "0000000000000000000000000000000000000001": { + "precompiled": { + "linear": { + "base": 3000, + "word": 0 + }, + "name": "ecrecover" + } + }, + "0000000000000000000000000000000000000002": { + "precompiled": { + "linear": { + "base": 60, + "word": 12 + }, + "name": "sha256" + } + }, + "0000000000000000000000000000000000000003": { + "precompiled": { + "linear": { + "base": 600, + "word": 120 + }, + "name": "ripemd160" + } + }, + "0000000000000000000000000000000000000004": { + "precompiled": { + "linear": { + "base": 15, + "word": 3 + }, + "name": "identity" + } + }, + "0000000000000000000000000000000000000005": { + "precompiled": { + "name": "modexp", + "startingBlock": "0x2dc6c0" + } + }, + "0000000000000000000000000000000000000006": { + "precompiled": { + "linear": { + "base": 500, + "word": 0 + }, + "name": "alt_bn128_G1_add", + "startingBlock": "0x2dc6c0" + } + }, + "0000000000000000000000000000000000000007": { + "precompiled": { + "linear": { + "base": 40000, + "word": 0 + }, + "name": "alt_bn128_G1_mul", + "startingBlock": "0x2dc6c0" + } + }, + "0000000000000000000000000000000000000008": { + "precompiled": { + "name": "alt_bn128_pairing_product", + "startingBlock": "0x2dc6c0" + } + }, + "000000000000000000000000000000000000000A": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "readChunk", + "startingBlock": "0x0" + } + }, + "000000000000000000000000000000000000000B": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "createFile", + "restrictAccess": [ + "69362535ec535F0643cBf62D16aDeDCAf32Ee6F7" + ], + "startingBlock": "0x0" + } + }, + "000000000000000000000000000000000000000C": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "uploadChunk", + "startingBlock": "0x0" + } + }, + "000000000000000000000000000000000000000D": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "getFileSize", + "startingBlock": "0x0" + } + }, + "000000000000000000000000000000000000000E": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "deleteFile", + "startingBlock": "0x0" + } + }, + "000000000000000000000000000000000000000F": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "createDirectory", + "startingBlock": "0x0" + } + }, + "0000000000000000000000000000000000000010": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "deleteDirectory", + "startingBlock": "0x0" + } + }, + "0x006d8e49ce0b9eb5646e34a4d91934801b9044fd": { + "balance": "1000000000000000000000000000000" + }, + "0x0150b461b06922a5030784ba888962c28bb1f188": { + "balance": "1000000000000000000000000000000" + }, + "0x03309956988ae70152ae4469daf99b0cac2306c5": { + "balance": "1000000000000000000000000000000" + }, + "0x06104a85a380895b6dd4030113806df2b044905e": { + "balance": "1000000000000000000000000000000" + }, + "0x079cf317ef40b16141784b6fabff812d64f7c0fd": { + "balance": "1000000000000000000000000000000" + }, + "0x0966454f51166c68b73b2865473c8fb2fcdefdd5": { + "balance": "1000000000000000000000000000000" + }, + "0x099452fedc71897880f584b1bc1706efc4e76e36": { + "balance": "1000000000000000000000000000000" + }, + "0x0aa6a44690ef52354e976990292cf9c5cd36ad59": { + "balance": "1000000000000000000000000000000" + }, + "0x0fbbe17a0e5a61ee3e8661f442d7f6b177c49820": { + "balance": "1000000000000000000000000000000" + }, + "0x1239fe658b410dbbac5bbd572035f5041542f9e5": { + "balance": "1000000000000000000000000000000" + }, + "0x12d5d7340a93be7be28ea7a3ae198242f8e1282c": { + "balance": "1000000000000000000000000000000" + }, + "0x137048b9fa4f1234d6519271b2c5ec64f480db0f": { + "balance": "1000000000000000000000000000000" + }, + "0x13867af77a63048e17380e39248ada90521e97e4": { + "balance": "1000000000000000000000000000000" + }, + "0x138ea4bdf0382c2deffd5b0bff0afe59f471467f": { + "balance": "1000000000000000000000000000000" + }, + "0x13d19c55ee0a212249d26b9d741ff6d7f416db01": { + "balance": "1000000000000000000000000000000" + }, + "0x157d38b52196b248e9fe6a2172e32ce2b8c078e6": { + "balance": "1000000000000000000000000000000" + }, + "0x16e8c390f8e576161cfe966f2c3e5dd303eb9039": { + "balance": "1000000000000000000000000000000" + }, + "0x194cb9991d3d94c43e400becf21dfea45e7b3b4c": { + "balance": "1000000000000000000000000000000" + }, + "0x1C9abe4ff0CcECa40fc404c74AB7d4923fEF8901": { + "balance": "100000000000000000000000" + }, + "0x1a66fc89809112c20aa76a993db712fa9e003e4e": { + "balance": "1000000000000000000000000000000" + }, + "0x1f1d6041e12a18cf1202019f146f2fc150915e8d": { + "balance": "1000000000000000000000000000000" + }, + "0x1feaf1671c1f0faf0d44c152f72dc755db932569": { + "balance": "1000000000000000000000000000000" + }, + "0x236bf02dfafaf03851a4e6f5d69052f4884cec32": { + "balance": "1000000000000000000000000000000" + }, + "0x26d88f6a8b659be4165ee53774a057e41b5201c9": { + "balance": "1000000000000000000000000000000" + }, + "0x28353685b0b986a724b92113debb3d8cd9a6b263": { + "balance": "1000000000000000000000000000000" + }, + "0x29d83322219fdfb821459d5fdf796360faf3166a": { + "balance": "1000000000000000000000000000000" + }, + "0x2bee474be207bdbeac83d6672da5ed2fd417eac9": { + "balance": "1000000000000000000000000000000" + }, + "0x2d93455b07bccf38e8d019f7f43a2c2d70b46b4e": { + "balance": "1000000000000000000000000000000" + }, + "0x2f971bd38806c3ca45ae0a125d1267118bf5619c": { + "balance": "1000000000000000000000000000000" + }, + "0x30aaab366dfac8331f3e827495c789cde9b437c0": { + "balance": "1000000000000000000000000000000" + }, + "0x32ea0400dc2d20664cc4744b2fab04ecb709445c": { + "balance": "1000000000000000000000000000000" + }, + "0x3760dc9594ccac0f33ade5cc5371402131696341": { + "balance": "1000000000000000000000000000000" + }, + "0x38855e430611bc179cd777a8704679ffc43921de": { + "balance": "1000000000000000000000000000000" + }, + "0x3a921471a2397644c37c88ef9572c421ab37145d": { + "balance": "1000000000000000000000000000000" + }, + "0x3bcca8a8471d55a1a668bc163c0336e4a57e5c99": { + "balance": "1000000000000000000000000000000" + }, + "0x3d46ee560227c1d73cd6042b47fc8fddd8a06ecb": { + "balance": "1000000000000000000000000000000" + }, + "0x3f5bdf5d4c274c82b8d17aa2810b00d2cf050f24": { + "balance": "1000000000000000000000000000000" + }, + "0x3ffe1c9183e0f97f52a816405a7d2350624ec88b": { + "balance": "1000000000000000000000000000000" + }, + "0x426ec5f07847674aada3856609d8baaa16805d88": { + "balance": "1000000000000000000000000000000" + }, + "0x482d7f53cba6ae73a354533673c48e2dfd560949": { + "balance": "1000000000000000000000000000000" + }, + "0x48acbd6a2724eadcc2a11144ab84b6a617d1a241": { + "balance": "1000000000000000000000000000000" + }, + "0x49ef89840e400026eb5c8d79bd1b0adc152fe86d": { + "balance": "1000000000000000000000000000000" + }, + "0x4bf989fa6572af36b190032505506f1db888357f": { + "balance": "1000000000000000000000000000000" + }, + "0x4cf9b195f7cb5f86694d9b399fe21a5f34616fd3": { + "balance": "1000000000000000000000000000000" + }, + "0x4e9b85904bca60aeb5b916ca86ac622096908427": { + "balance": "1000000000000000000000000000000" + }, + "0x50120c17d7b59200e9b76e89e4e3de2f0cd00090": { + "balance": "1000000000000000000000000000000" + }, + "0x54db355342c35085a1a53184162b2fddd0a43b0f": { + "balance": "1000000000000000000000000000000" + }, + "0x54e228d8fea148cfe2b109b3b152ff21321d09a2": { + "balance": "1000000000000000000000000000000" + }, + "0x5667601b7dcde6f24d06bccc4f291cb06976f4ee": { + "balance": "1000000000000000000000000000000" + }, + "0x57829f2ecca390cd9d1c41f92328bad4d1073bbb": { + "balance": "1000000000000000000000000000000" + }, + "0x5EF25557E2ed6AFfF321B266C93e95A0B4B05AbC": { + "balance": "1000000000000000000000000" + }, + "0x5a3adad4382b3eb1e0c65f2de2845901081039b5": { + "balance": "1000000000000000000000000000000" + }, + "0x5cdb7392efdce502ccc6fba5c3c1dd1653967b4d": { + "balance": "1000000000000000000000000000000" + }, + "0x5d012c13b2854bda8b7b6580e97e52751884f827": { + "balance": "1000000000000000000000000000000" + }, + "0x5d9326c6504833d84f8a0d65ded59b1a6e768ca2": { + "balance": "1000000000000000000000000000000" + }, + "0x60268f799d8f1808e4a32c2eb898e73a8881f6f0": { + "balance": "1000000000000000000000000000000" + }, + "0x605ba4a05d779f9869bd9a10234c22f516766cfe": { + "balance": "1000000000000000000000000000000" + }, + "0x6093f0f2a7b5148b71603ac439adbc4c0e5aa5da": { + "balance": "1000000000000000000000000000000" + }, + "0x6196d135CdDb9d73A0756C1E44b5b02B11acf594": { + "balance": "2000000000000000000000", + "code": "", + "nonce": "5076", + "storage": {} + }, + "0x62712ceccb50f62ca4c5402fff6da9c819c866cf": { + "balance": "1000000000000000000000000000000" + }, + "0x62971de462ea1ec0d3b43a6a85b6fb975e6c6f64": { + "balance": "1000000000000000000000000000000" + }, + "0x62cf32dfb9eb6358dc5deb006aef1d75fb153e5f": { + "balance": "1000000000000000000000000000000" + }, + "0x62d8b22c1d71577829b2fee20a5c3fff43aed0ec": { + "balance": "100000000000000000000000" + }, + "0x6314956b78bb2eaed1c49b3ae71d4d0ec501cfab": { + "balance": "1000000000000000000000000000000" + }, + "0x661bda4daeba3ce9ac2aa30b80d463580f90d31a": { + "balance": "1000000000000000000000000000000" + }, + "0x66c5a87f4a49DD75e970055A265E8dd5C3F8f852": { + "balance": "1000000000000000000000" + }, + "0x66cd465ddcd85504c0d2cfb1728acee994d55a3f": { + "balance": "1000000000000000000000000000000" + }, + "0x68bca79ae7aae796027ff843d2303444da5cf5d8": { + "balance": "1000000000000000000000000000000" + }, + "0x6923877b65e24966efa9efd1207822fa2eaf601a": { + "balance": "1000000000000000000000000000000" + }, + "0x69362535ec535F0643cBf62D16aDeDCAf32Ee6F7": { + "balance": "0", + "code": "0x608060405234801561001057600080fd5b50600436106100b45760003560e01c806379210e8e1161007157806379210e8e1461017757806381a8235a146101a757806385aeeb17146101c35780639a9a5593146101f3578063a99100541461020f578063b57321221461022b576100b4565b806307c6e7d3146100b9578063122f4fba146100d55780631c6ec7a9146101055780631cfe4e3b14610121578063373dedb41461013d57806361e46db51461015b575b600080fd5b6100d360048036036100ce9190810190613cff565b61025b565b005b6100ef60048036036100ea9190810190613cff565b610804565b6040516100fc9190614963565b60405180910390f35b61011f600480360361011a9190810190613cff565b610b43565b005b61013b60048036036101369190810190613cc3565b610f72565b005b610145611190565b6040516101529190614cbe565b60405180910390f35b61017560048036036101709190810190613d94565b611199565b005b610191600480360361018c9190810190613e13565b6113f9565b60405161019e9190614924565b60405180910390f35b6101c160048036036101bc9190810190613cff565b6116f9565b005b6101dd60048036036101d89190810190613cff565b61189e565b6040516101ea9190614941565b60405180910390f35b61020d60048036036102089190810190613d40565b611b9d565b005b61022960048036036102249190810190613cff565b61202c565b005b61024560048036036102409190810190613cff565b612682565b6040516102529190614cbe565b60405180910390f35b6000339050606061026b83612902565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b825181101561037c576000826001018460018403815181106102d557fe5b60200260200101516040516102ea91906148cc565b90815260200160405180910390205411610339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161033090614ade565b60405180910390fd5b8160020183600183038151811061034c57fe5b602002602001015160405161036191906148cc565b908152602001604051809103902091508060010190506102b7565b506060600183511161038e57846103a7565b8260018451038151811061039e57fe5b60200260200101515b9050600082600101826040516103bd91906148e3565b9081526020016040518091039020541161040c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161040390614ade565b60405180910390fd5b6000826002018260405161042091906148e3565b90815260200160405180910390206000018054905014610475576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161046c90614b5e565b60405180910390fd5b60006104818587612b02565b9050806104c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ba90614a7e565b60405180910390fd5b6104cb613888565b836000016001856000018054905003815481106104e457fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156105965780601f1061056b57610100808354040283529160200191610596565b820191906000526020600020905b81548152906001019060200180831161057957829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff1660028111156105e257fe5b60028111156105ed57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561066557602002820191906000526020600020906000905b82829054906101000a900460ff1615158152602001906001019060208260000104928301926001038202915080841161062f5790505b505050505081525050905080846000016001866001018660405161068991906148e3565b90815260200160405180910390205403815481106106a357fe5b906000526020600020906005020160008201518160000190805190602001906106cd9291906138c4565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561071c57fe5b0217905550608082015181600401908051906020019061073d929190613944565b50905050836001018360405161075391906148e3565b90815260200160405180910390205484600101826000015160405161077891906148cc565b9081526020016040518091039020819055506000846001018460405161079e91906148e3565b908152602001604051809103902081905550836000018054809190600190036107c791906139ea565b5083600201836040516107da91906148e3565b9081526020016040518091039020600080820160006107f99190613a1c565b505050505050505050565b600080606061081284612b66565b91509150606061082182612902565b90506000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b82518110156109065760008260010184600184038151811061088b57fe5b60200260200101516040516108a091906148cc565b90815260200160405180910390205414156108c357600095505050505050610b3e565b816002018360018303815181106108d657fe5b60200260200101516040516108eb91906148cc565b9081526020016040518091039020915080600101905061086d565b50606060018351116109185783610931565b8260018451038151811061092857fe5b60200260200101515b90506000826001018260405161094791906148e3565b908152602001604051809103902054141561096a57600095505050505050610b3e565b610972613888565b826000016001846001018460405161098a91906148e3565b90815260200160405180910390205403815481106109a457fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610a565780601f10610a2b57610100808354040283529160200191610a56565b820191906000526020600020905b815481529060010190602001808311610a3957829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115610aa257fe5b6002811115610aad57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015610b2557602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411610aef5790505b5050505050815250509050806060015196505050505050505b919050565b600160009054906101000a900460ff16610b85576120006002819055506210000060038190555060018060006101000a81548160ff0219169083151502179055505b6000815111610bc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc090614ade565b60405180910390fd5b60003390506060610bd983612902565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015610cea57600082600101846001840381518110610c4357fe5b6020026020010151604051610c5891906148cc565b90815260200160405180910390205411610ca7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9e90614ade565b60405180910390fd5b81600201836001830381518110610cba57fe5b6020026020010151604051610ccf91906148cc565b90815260200160405180910390209150806001019050610c25565b50600254816000018054905010610d36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2d90614bfe565b60405180910390fd5b60606001835111610d475784610d60565b82600184510381518110610d5757fe5b60200260200101515b905060008260010182604051610d7691906148e3565b90815260200160405180910390205414610dc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbc90614c3e565b60405180910390fd5b610dce81612ee8565b610e0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0490614afe565b60405180910390fd5b6000610e198587612fc9565b905080610e5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e529061499e565b60405180910390fd5b610e63613888565b82816000018190525060008160200190151590811515815250508360000181908060018154018082558091505090600182039060005260206000209060050201600090919290919091506000820151816000019080519060200190610ec99291906138c4565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff02191690836002811115610f1857fe5b02179055506080820151816004019080519060200190610f39929190613944565b5050505083600001805490508460010184604051610f5791906148e3565b90815260200160405180910390208190555050505050505050565b610f7a61302d565b73ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161480610fdf57503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614155b61101e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101590614a5e565b60405180910390fd5b80600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411156110a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109790614b3e565b60405180910390fd5b600054600754820111156110e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e0906149be565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460076000828254039250508190555080600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550806007600082825401925050819055505050565b60008054905090565b600033905060006111aa82866130c6565b9050600160028111156111b957fe5b8160030160009054906101000a900460ff1660028111156111d657fe5b14611216576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120d90614c1e565b60405180910390fd5b6000600354858161122357fe5b061480156112345750806002015484105b611273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126a9061497e565b60405180910390fd5b600354848260020154031080156112905750838160020154038351145b8061129d57506003548351145b6112dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d390614a1e565b60405180910390fd5b600015158160040160035486816112ef57fe5b04815481106112fa57fe5b90600052602060002090602091828204019190069054906101000a900460ff1615151461135c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611353906149fe565b60405180910390fd5b600061136a838787876132c5565b9050806113ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a390614b1e565b60405180910390fd5b60018260040160035487816113bd57fe5b04815481106113c857fe5b90600052602060002090602091828204019190066101000a81548160ff021916908315150217905550505050505050565b611401613a40565b6000606061140e86612b66565b9150915061141a613888565b61142483836130c6565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156114c85780601f1061149d576101008083540402835291602001916114c8565b820191906000526020600020905b8154815290600101906020018083116114ab57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561151457fe5b600281111561151f57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561159757602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116115615790505b50505050508152505090506002808111156115ae57fe5b816060015160028111156115be57fe5b146115fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f590614c9e565b60405180910390fd5b60035485111580156116105750600085115b61164f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164690614a1e565b60405180910390fd5b80604001518587011115611698576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168f9061497e565b60405180910390fd5b60006116a684848989613376565b8096508192505050806116ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e590614b9e565b60405180910390fd5b505050509392505050565b6000339050600061170a82846130c6565b90506001600281111561171957fe5b8160030160009054906101000a900460ff16600281111561173657fe5b14611776576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176d90614c1e565b60405180910390fd5b60006001905060008260040180549050905060008090505b818110156117e157600015158460040182815481106117a957fe5b90600052602060002090602091828204019190069054906101000a900460ff16151514156117d657600092505b80600101905061178e565b5081611822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181990614b7e565b60405180910390fd5b60028360030160006101000a81548160ff0219169083600281111561184357fe5b021790555060006118548587613409565b905080611896576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188d906149de565b60405180910390fd5b505050505050565b6060600060606118ad84612b66565b9150915060606118bc82612902565b90506000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008090505b82518110156119c65760008260010184838151811061192257fe5b602002602001015160405161193791906148cc565b90815260200160405180910390205411611986576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197d90614ade565b60405180910390fd5b8160020183828151811061199657fe5b60200260200101516040516119ab91906148cc565b90815260200160405180910390209150806001019050611907565b5080600001805480602002602001604051908101604052809291908181526020016000905b82821015611b8e57838290600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611aa75780601f10611a7c57610100808354040283529160200191611aa7565b820191906000526020600020905b815481529060010190602001808311611a8a57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115611af357fe5b6002811115611afe57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015611b7657602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411611b405790505b505050505081525050815260200190600101906119eb565b50505050945050505050919050565b600160009054906101000a900460ff16611bdf576120006002819055506210000060038190555060018060006101000a81548160ff0219169083151502179055505b60003390506305f5e100821115611c2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2290614bde565b60405180910390fd5b6060611c3684612902565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015611d4757600082600101846001840381518110611ca057fe5b6020026020010151604051611cb591906148cc565b90815260200160405180910390205411611d04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cfb90614ade565b60405180910390fd5b81600201836001830381518110611d1757fe5b6020026020010151604051611d2c91906148cc565b90815260200160405180910390209150806001019050611c82565b5060606001835111611d595785611d72565b82600184510381518110611d6957fe5b60200260200101515b905060008260010182604051611d8891906148e3565b90815260200160405180910390205414611dd7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dce90614c3e565b60405180910390fd5b611de081612ee8565b611e1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1690614bbe565b60405180910390fd5b6000611e2c85888861346d565b905080611e6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6590614c7e565b60405180910390fd5b6060600354600160035489010381611e8257fe5b04604051908082528060200260200182016040528015611eb15781602001602082028038833980820191505090505b509050836000016040518060a0016040528085815260200160011515815260200189815260200160016002811115611ee557fe5b815260200183815250908060018154018082558091505090600182039060005260206000209060050201600090919290919091506000820151816000019080519060200190611f359291906138c4565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff02191690836002811115611f8457fe5b02179055506080820151816004019080519060200190611fa5929190613944565b5050505083600001805490508460010184604051611fc391906148e3565b90815260200160405180910390208190555086600560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505050505050505050565b6000339050612039613888565b61204382846130c6565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156120e75780601f106120bc576101008083540402835291602001916120e7565b820191906000526020600020905b8154815290600101906020018083116120ca57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561213357fe5b600281111561213e57fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156121b657602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116121805790505b5050505050815250509050600060028111156121ce57fe5b816060015160028111156121de57fe5b141561221f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221690614a3e565b60405180910390fd5b600061222b83856134da565b90508061226d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226490614a9e565b60405180910390fd5b606061227885612902565b90506000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b825181101561231057816002018360018303815181106122e057fe5b60200260200101516040516122f591906148cc565b908152602001604051809103902091508060010190506122c4565b506000600182600101866000015160405161232b91906148cc565b908152602001604051809103902054039050612345613888565b8260000160018460000180549050038154811061235e57fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156124105780601f106123e557610100808354040283529160200191612410565b820191906000526020600020905b8154815290600101906020018083116123f357829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561245c57fe5b600281111561246757fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156124df57602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116124a95790505b5050505050815250509050808360000183815481106124fa57fe5b906000526020600020906005020160008201518160000190805190602001906125249291906138c4565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561257357fe5b02179055506080820151816004019080519060200190612594929190613944565b50905050826000018054809190600190036125af91906139ea565b508260010186600001516040516125c691906148cc565b9081526020016040518091039020548360010182600001516040516125eb91906148cc565b908152602001604051809103902081905550600083600101876000015160405161261591906148cc565b9081526020016040518091039020819055508560400151600560008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505050505050505050565b600080606061269084612b66565b9150915061269c613888565b6126a683836130c6565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561274a5780601f1061271f5761010080835404028352916020019161274a565b820191906000526020600020905b81548152906001019060200180831161272d57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561279657fe5b60028111156127a157fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561281957602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116127e35790505b50505050508152505090506001600281111561283157fe5b8160600151600281111561284157fe5b1480612866575060028081111561285457fe5b8160600151600281111561286457fe5b145b6128a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161289c90614c1e565b60405180910390fd5b60006128b1848461353e565b8096508192505050806128f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128f090614c5e565b60405180910390fd5b50505050919050565b606061290c613a65565b612915836135a7565b905061291f613a65565b61295d6040518060400160405280600181526020017f2f000000000000000000000000000000000000000000000000000000000000008152506135a7565b90506060600161297683856135d590919063ffffffff16565b016040519080825280602002602001820160405280156129aa57816020015b60608152602001906001900390816129955790505b50905060008090505b81518110156129fb576129d76129d2848661364a90919063ffffffff16565b613664565b8282815181106129e357fe5b602002602001018190525080806001019150506129b3565b50600081600183510381518110612a0e57fe5b6020026020010151511415612a795780600182510381518110612a2d57fe5b6020026020010160608152506001815103604051908082528060200260200182016040528015612a7157816020015b6060815260200190600190039081612a5c5790505b509350612ab2565b8051604051908082528060200260200182016040528015612aae57816020015b6060815260200190600190039081612a995790505b5093505b60008090505b8451811015612af957818181518110612acd57fe5b6020026020010151858281518110612ae157fe5b60200260200101819052508080600101915050612ab8565b50505050919050565b60008060016020601f85510181612b1557fe5b040190506040518481526020810160005b83811015612b47578060200286015181602002830152806001019050612b26565b50602082602085026040018460006010600019f1935050505092915050565b6000606060006028905080845111612bb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612baa90614abe565b60405180910390fd5b6060816040519080825280601f01601f191660200182016040528015612be85781602001600182028038833980820191505090505b50905060008090505b82811015612c5857858181518110612c0557fe5b602001015160f81c60f81b828281518110612c1c57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050612bf1565b50600080905060008090505b83811015612d87576000838281518110612c7a57fe5b602001015160f81c60f81b60f81c60ff16905060308110158015612c9f575060398111155b80612cb8575060418110158015612cb75750605a8111155b5b80612cd1575060618110158015612cd0575060668111155b5b612d10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d0790614abe565b60405180910390fd5b60308110158015612d22575060398111155b15612d335760308103601084020192505b60418110158015612d455750605a8111155b15612d565760378103601084020192505b60618110158015612d68575060668111155b15612d795760578103601084020192505b508080600101915050612c64565b508094507f2f00000000000000000000000000000000000000000000000000000000000000868481518110612db857fe5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612e25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e1c90614abe565b60405180910390fd5b6000600184885103039050806040519080825280601f01601f191660200182016040528015612e635781602001600182028038833980820191505090505b50945060008090505b81811015612ede5760008860018784010181518110612e8757fe5b602001015160f81c60f81b905080878381518110612ea157fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350508080600101915050612e6c565b5050505050915091565b6000604051602001612ef99061490f565b6040516020818303038152906040528051906020012082604051602001612f2091906148e3565b604051602081830303815290604052805190602001201480612f8b5750604051602001612f4c906148fa565b6040516020818303038152906040528051906020012082604051602001612f7391906148e3565b60405160208183030381529060405280519060200120145b80612f97575060008251145b15612fa55760009050612fc4565b60008251905060ff811115612fbe576000915050612fc4565b60019150505b919050565b60008060016020601f85510181612fdc57fe5b040190506040518481526020810160005b8381101561300e578060200286015181602002830152806001019050612fed565b5060208260208502604001846000600f600019f1935050505092915050565b600073d2001000000000000000000000000000000000d273ffffffffffffffffffffffffffffffffffffffff166383e781fe6040518163ffffffff1660e01b815260040160206040518083038186803b15801561308957600080fd5b505afa15801561309d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506130c19190810190613c9a565b905090565b600060606130d383612902565b90506000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b82518110156131e45760008260010184600184038151811061313d57fe5b602002602001015160405161315291906148cc565b908152602001604051809103902054116131a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161319890614ade565b60405180910390fd5b816002018360018303815181106131b457fe5b60200260200101516040516131c991906148cc565b9081526020016040518091039020915080600101905061311f565b50606060018351116131f6578461320f565b8260018451038151811061320657fe5b60200260200101515b90506000826001018260405161322591906148e3565b90815260200160405180910390205411613274576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161326b90614ade565b60405180910390fd5b6000826000016001846001018460405161328e91906148e3565b90815260200160405180910390205403815481106132a857fe5b906000526020600020906005020190508094505050505092915050565b60008060016020601f855101816132d857fe5b04019050600060016020601f885101816132ee57fe5b040190506040518781526020810160005b838110156133205780602002890151816020028301528060010190506132ff565b50868360200282015260005b84811015613352578060200287015181856001010160200283015280600101905061332c565b50602082848601602002606001846000600c600019f1945050505050949350505050565b6000613380613a40565b600060016020601f8851018161339257fe5b0401905060006020601f8601816133a557fe5b0490506040518881526020810160005b848110156133d657806020028a0151816020028301528060010190506133b5565b5083602002810188815287816020015283602002868660030160200285600a600019fa9650505050505094509492505050565b60008060016020601f8551018161341c57fe5b040190506040518481526020810160005b8381101561344e57806020028601518160200283015280600101905061342d565b50602082602085026040018460006011600019f1935050505092915050565b60008060016020601f8651018161348057fe5b040190506040518581526020810160005b838110156134b2578060200287015181602002830152806001019050613491565b50846020840282015260208260208502604001846000600b600019f193505050509392505050565b60008060016020601f855101816134ed57fe5b040190506040518481526020810160005b8381101561351f5780602002860151816020028301528060010190506134fe565b5060208260208502604001846000600e600019f1935050505092915050565b600080600060016020601f8651018161355357fe5b040190506040518581526020810160005b83811015613585578060200287015181602002830152806001019050613564565b506020826020850260200184600d600019fa9450815193505050509250929050565b6135af613a65565b600060208301905060405180604001604052808451815260200182815250915050919050565b60008082600001516135f985600001518660200151866000015187602001516136c6565b0190505b83600001518460200151018111613643578180600101925050826000015161363b8560200151830386600001510383866000015187602001516136c6565b0190506135fd565b5092915050565b613652613a65565b61365d8383836137a1565b5092915050565b60608082600001516040519080825280601f01601f19166020018201604052801561369e5781602001600182028038833980820191505090505b50905060006020820190506136bc818560200151866000015161383f565b8192505050919050565b6000808490506000868511613791576020851161374b57600060018660200360080260020a031960001b905060008186511690506000878a8a0103905060008386511690505b82811461373d5781861061372a578a8a019650505050505050613799565b858060010196505083865116905061370c565b859650505050505050613799565b60008585209050600091505b858803821161378f57600086842090508082141561377b5783945050505050613799565b600184019350508180600101925050613757565b505b868601925050505b949350505050565b6137a9613a65565b60006137c785600001518660200151866000015187602001516136c6565b90508460200151836020018181525050846020015181038360000181815250508460000151856020015101811415613809576000856000018181525050613834565b8360000151836000015101856000018181510391508181525050836000015181018560200181815250505b829150509392505050565b5b602081106138635781518352602083019250602082019150602081039050613840565b60006001826020036101000a0390508019835116818551168181178652505050505050565b6040518060a001604052806060815260200160001515815260200160008152602001600060028111156138b757fe5b8152602001606081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061390557805160ff1916838001178555613933565b82800160010185558215613933579182015b82811115613932578251825591602001919060010190613917565b5b5090506139409190613a7f565b5090565b82805482825590600052602060002090601f016020900481019282156139d95791602002820160005b838211156139aa57835183826101000a81548160ff021916908315150217905550926020019260010160208160000104928301926001030261396d565b80156139d75782816101000a81549060ff02191690556001016020816000010492830192600103026139aa565b505b5090506139e69190613aa4565b5090565b815481835581811115613a1757600502816005028360005260206000209182019101613a169190613ad4565b5b505050565b5080546000825560050290600052602060002090810190613a3d9190613ad4565b50565b6040518062100000016040528061800090602082028038833980820191505090505090565b604051806040016040528060008152602001600081525090565b613aa191905b80821115613a9d576000816000905550600101613a85565b5090565b90565b613ad191905b80821115613acd57600081816101000a81549060ff021916905550600101613aaa565b5090565b90565b613b4091905b80821115613b3c5760008082016000613af39190613b43565b6001820160006101000a81549060ff021916905560028201600090556003820160006101000a81549060ff0219169055600482016000613b339190613b8b565b50600501613ada565b5090565b90565b50805460018160011615610100020316600290046000825580601f10613b695750613b88565b601f016020900490600052602060002090810190613b879190613a7f565b5b50565b50805460008255601f016020900490600052602060002090810190613bb09190613a7f565b50565b600081359050613bc281614f18565b92915050565b600081519050613bd781614f18565b92915050565b600082601f830112613bee57600080fd5b8135613c01613bfc82614d06565b614cd9565b91508082526020830160208301858383011115613c1d57600080fd5b613c28838284614eb8565b50505092915050565b600082601f830112613c4257600080fd5b8135613c55613c5082614d32565b614cd9565b91508082526020830160208301858383011115613c7157600080fd5b613c7c838284614eb8565b50505092915050565b600081359050613c9481614f2f565b92915050565b600060208284031215613cac57600080fd5b6000613cba84828501613bc8565b91505092915050565b60008060408385031215613cd657600080fd5b6000613ce485828601613bb3565b9250506020613cf585828601613c85565b9150509250929050565b600060208284031215613d1157600080fd5b600082013567ffffffffffffffff811115613d2b57600080fd5b613d3784828501613c31565b91505092915050565b60008060408385031215613d5357600080fd5b600083013567ffffffffffffffff811115613d6d57600080fd5b613d7985828601613c31565b9250506020613d8a85828601613c85565b9150509250929050565b600080600060608486031215613da957600080fd5b600084013567ffffffffffffffff811115613dc357600080fd5b613dcf86828701613c31565b9350506020613de086828701613c85565b925050604084013567ffffffffffffffff811115613dfd57600080fd5b613e0986828701613bdd565b9150509250925092565b600080600060608486031215613e2857600080fd5b600084013567ffffffffffffffff811115613e4257600080fd5b613e4e86828701613c31565b9350506020613e5f86828701613c85565b9250506040613e7086828701613c85565b9150509250925092565b6000613e868383613fe8565b60208301905092915050565b6000613e9e8383613ff7565b60208301905092915050565b6000613eb68383614831565b905092915050565b6000613ec982614d88565b613ed38185614de7565b9350613ede83614d5e565b8060005b83811015613f0f578151613ef68882613e7a565b9750613f0183614dc0565b925050600181019050613ee2565b5085935050505092915050565b613f2581614d93565b613f2f8184614df8565b9250613f3a82614d6e565b8060005b83811015613f6b578151613f528782613e92565b9650613f5d83614dcd565b925050600181019050613f3e565b505050505050565b6000613f7e82614d9f565b613f888185614e03565b935083602082028501613f9a85614d78565b8060005b85811015613fd65784840389528151613fb78582613eaa565b9450613fc283614dda565b925060208a01995050600181019050613f9e565b50829750879550505050505092915050565b613ff181614e53565b82525050565b61400081614e5f565b82525050565b61400f81614ea6565b82525050565b61401e81614ea6565b82525050565b600061402f82614db5565b6140398185614e36565b9350614049818560208601614ec7565b80840191505092915050565b600061406082614daa565b61406a8185614e14565b935061407a818560208601614ec7565b61408381614efa565b840191505092915050565b600061409982614daa565b6140a38185614e36565b93506140b3818560208601614ec7565b80840191505092915050565b60006140cc601883614e25565b91507f496e636f7272656374206368756e6b20706f736974696f6e00000000000000006000830152602082019050919050565b600061410c601583614e25565b91507f4469726563746f7279206e6f74206372656174656400000000000000000000006000830152602082019050919050565b600061414c602483614e25565b91507f4e6f7420656e6f756768206d656d6f727920696e207468652046696c6573746f60008301527f72616765000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006141b2601b83614e25565b91507f48617368206861736e2774206265656e2063616c63756c6174656400000000006000830152602082019050919050565b60006141f2601983614e25565b91507f4368756e6b20697320616c72656164792075706c6f61646564000000000000006000830152602082019050919050565b6000614232601683614e25565b91507f496e636f7272656374206368756e6b206c656e677468000000000000000000006000830152602082019050919050565b6000614272600f83614e25565b91507f46696c65206e6f742065786973747300000000000000000000000000000000006000830152602082019050919050565b60006142b2600e83614e25565b91507f496e76616c69642073656e6465720000000000000000000000000000000000006000830152602082019050919050565b60006142f2601883614e25565b91507f4469726563746f7279206973206e6f742064656c6574656400000000000000006000830152602082019050919050565b6000614332601083614e25565b91507f46696c65206e6f742064656c65746564000000000000000000000000000000006000830152602082019050919050565b6000614372601383614e25565b91507f496e76616c69642073746f7261676550617468000000000000000000000000006000830152602082019050919050565b60006143b2600c83614e25565b91507f496e76616c6964207061746800000000000000000000000000000000000000006000830152602082019050919050565b60006143f2600183614e36565b91507f2e000000000000000000000000000000000000000000000000000000000000006000830152600182019050919050565b6000614432601683614e25565b91507f496e76616c6964206469726563746f7279206e616d65000000000000000000006000830152602082019050919050565b6000614472601583614e25565b91507f4368756e6b207761736e27742075706c6f6164656400000000000000000000006000830152602082019050919050565b60006144b2602683614e25565b91507f436f756c64206e6f742072657365727665206c657373207468616e207573656460008301527f20737061636500000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614518601683614e25565b91507f4469726563746f7279206973206e6f7420656d707479000000000000000000006000830152602082019050919050565b6000614558602383614e25565b91507f46696c65206861736e2774206265656e2075706c6f6164656420636f7272656360008301527f746c7900000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006145be601183614e25565b91507f4368756e6b207761736e277420726561640000000000000000000000000000006000830152602082019050919050565b60006145fe601883614e25565b91507f46696c656e616d652073686f756c64206265203c2032353600000000000000006000830152602082019050919050565b600061463e601f83614e25565b91507f46696c652073686f756c64206265206c657373207468616e20313030204d42006000830152602082019050919050565b600061467e600283614e36565b91507f2e2e0000000000000000000000000000000000000000000000000000000000006000830152600282019050919050565b60006146be601183614e25565b91507f4469726563746f72792069732066756c6c0000000000000000000000000000006000830152602082019050919050565b60006146fe600e83614e25565b91507f46696c65206e6f7420666f756e640000000000000000000000000000000000006000830152602082019050919050565b600061473e601883614e25565b91507f46696c65206f72206469726563746f72792065786973747300000000000000006000830152602082019050919050565b600061477e601883614e25565b91507f45564d206572726f7220696e2067657446696c6553697a6500000000000000006000830152602082019050919050565b60006147be601083614e25565b91507f46696c65206e6f742063726561746564000000000000000000000000000000006000830152602082019050919050565b60006147fe601983614e25565b91507f46696c65206861736e2774206265656e2075706c6f61646564000000000000006000830152602082019050919050565b600060a083016000830151848203600086015261484e8282614055565b91505060208301516148636020860182613fe8565b50604083015161487660408601826148ae565b5060608301516148896060860182614006565b50608083015184820360808601526148a18282613ebe565b9150508091505092915050565b6148b781614e9c565b82525050565b6148c681614e9c565b82525050565b60006148d8828461408e565b915081905092915050565b60006148ef8284614024565b915081905092915050565b6000614905826143e5565b9150819050919050565b600061491a82614671565b9150819050919050565b6000621000008201905061493b6000830184613f1c565b92915050565b6000602082019050818103600083015261495b8184613f73565b905092915050565b60006020820190506149786000830184614015565b92915050565b60006020820190508181036000830152614997816140bf565b9050919050565b600060208201905081810360008301526149b7816140ff565b9050919050565b600060208201905081810360008301526149d78161413f565b9050919050565b600060208201905081810360008301526149f7816141a5565b9050919050565b60006020820190508181036000830152614a17816141e5565b9050919050565b60006020820190508181036000830152614a3781614225565b9050919050565b60006020820190508181036000830152614a5781614265565b9050919050565b60006020820190508181036000830152614a77816142a5565b9050919050565b60006020820190508181036000830152614a97816142e5565b9050919050565b60006020820190508181036000830152614ab781614325565b9050919050565b60006020820190508181036000830152614ad781614365565b9050919050565b60006020820190508181036000830152614af7816143a5565b9050919050565b60006020820190508181036000830152614b1781614425565b9050919050565b60006020820190508181036000830152614b3781614465565b9050919050565b60006020820190508181036000830152614b57816144a5565b9050919050565b60006020820190508181036000830152614b778161450b565b9050919050565b60006020820190508181036000830152614b978161454b565b9050919050565b60006020820190508181036000830152614bb7816145b1565b9050919050565b60006020820190508181036000830152614bd7816145f1565b9050919050565b60006020820190508181036000830152614bf781614631565b9050919050565b60006020820190508181036000830152614c17816146b1565b9050919050565b60006020820190508181036000830152614c37816146f1565b9050919050565b60006020820190508181036000830152614c5781614731565b9050919050565b60006020820190508181036000830152614c7781614771565b9050919050565b60006020820190508181036000830152614c97816147b1565b9050919050565b60006020820190508181036000830152614cb7816147f1565b9050919050565b6000602082019050614cd360008301846148bd565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614cfc57600080fd5b8060405250919050565b600067ffffffffffffffff821115614d1d57600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614d4957600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050919050565b6000819050602082019050919050565b600081519050919050565b60006180009050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614e4c82614e7c565b9050919050565b60008115159050919050565b6000819050919050565b6000819050614e7782614f0b565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000614eb182614e69565b9050919050565b82818337600083830152505050565b60005b83811015614ee5578082015181840152602081019050614eca565b83811115614ef4576000848401525b50505050565b6000601f19601f8301169050919050565b60038110614f1557fe5b50565b614f2181614e41565b8114614f2c57600080fd5b50565b614f3881614e9c565b8114614f4357600080fd5b5056fea365627a7a723158202ae226b25ad72f9cff2d74c6dc7bcfb78530ab1d2438f48a8dab67499b37a8e56c6578706572696d656e74616cf564736f6c634300050d0040", + "nonce": "0", + "storage": { + "0x0": "2868903936" + } + }, + "0x69362535ec535F0643cBf62D16aDeDCAf32Ee6F8": { + "balance": "0", + "code": "0x608060405234801561001057600080fd5b50600436106100b45760003560e01c806379210e8e1161007157806379210e8e1461017757806381a8235a146101a757806385aeeb17146101c35780639a9a5593146101f3578063a99100541461020f578063b57321221461022b576100b4565b806307c6e7d3146100b9578063122f4fba146100d55780631c6ec7a9146101055780631cfe4e3b14610121578063373dedb41461013d57806361e46db51461015b575b600080fd5b6100d360048036036100ce9190810190613e0d565b61025b565b005b6100ef60048036036100ea9190810190613e0d565b610804565b6040516100fc9190614ab1565b60405180910390f35b61011f600480360361011a9190810190613e0d565b610b43565b005b61013b60048036036101369190810190613dd1565b610f72565b005b610145611190565b6040516101529190614e2c565b60405180910390f35b61017560048036036101709190810190613ea2565b611199565b005b610191600480360361018c9190810190613f21565b6113f9565b60405161019e9190614a72565b60405180910390f35b6101c160048036036101bc9190810190613e0d565b6116f9565b005b6101dd60048036036101d89190810190613e0d565b61189e565b6040516101ea9190614a8f565b60405180910390f35b61020d60048036036102089190810190613e4e565b611b9d565b005b61022960048036036102249190810190613e0d565b61213a565b005b61024560048036036102409190810190613e0d565b612790565b6040516102529190614e2c565b60405180910390f35b6000339050606061026b83612a10565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b825181101561037c576000826001018460018403815181106102d557fe5b60200260200101516040516102ea9190614a1a565b90815260200160405180910390205411610339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161033090614c2c565b60405180910390fd5b8160020183600183038151811061034c57fe5b60200260200101516040516103619190614a1a565b908152602001604051809103902091508060010190506102b7565b506060600183511161038e57846103a7565b8260018451038151811061039e57fe5b60200260200101515b9050600082600101826040516103bd9190614a31565b9081526020016040518091039020541161040c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161040390614c2c565b60405180910390fd5b600082600201826040516104209190614a31565b90815260200160405180910390206000018054905014610475576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161046c90614cac565b60405180910390fd5b60006104818587612c10565b9050806104c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ba90614bcc565b60405180910390fd5b6104cb613996565b836000016001856000018054905003815481106104e457fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156105965780601f1061056b57610100808354040283529160200191610596565b820191906000526020600020905b81548152906001019060200180831161057957829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff1660028111156105e257fe5b60028111156105ed57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561066557602002820191906000526020600020906000905b82829054906101000a900460ff1615158152602001906001019060208260000104928301926001038202915080841161062f5790505b50505050508152505090508084600001600186600101866040516106899190614a31565b90815260200160405180910390205403815481106106a357fe5b906000526020600020906005020160008201518160000190805190602001906106cd9291906139d2565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561071c57fe5b0217905550608082015181600401908051906020019061073d929190613a52565b5090505083600101836040516107539190614a31565b9081526020016040518091039020548460010182600001516040516107789190614a1a565b9081526020016040518091039020819055506000846001018460405161079e9190614a31565b908152602001604051809103902081905550836000018054809190600190036107c79190613af8565b5083600201836040516107da9190614a31565b9081526020016040518091039020600080820160006107f99190613b2a565b505050505050505050565b600080606061081284612c74565b91509150606061082182612a10565b90506000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b82518110156109065760008260010184600184038151811061088b57fe5b60200260200101516040516108a09190614a1a565b90815260200160405180910390205414156108c357600095505050505050610b3e565b816002018360018303815181106108d657fe5b60200260200101516040516108eb9190614a1a565b9081526020016040518091039020915080600101905061086d565b50606060018351116109185783610931565b8260018451038151811061092857fe5b60200260200101515b9050600082600101826040516109479190614a31565b908152602001604051809103902054141561096a57600095505050505050610b3e565b610972613996565b826000016001846001018460405161098a9190614a31565b90815260200160405180910390205403815481106109a457fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610a565780601f10610a2b57610100808354040283529160200191610a56565b820191906000526020600020905b815481529060010190602001808311610a3957829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115610aa257fe5b6002811115610aad57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015610b2557602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411610aef5790505b5050505050815250509050806060015196505050505050505b919050565b600160009054906101000a900460ff16610b85576120006002819055506210000060038190555060018060006101000a81548160ff0219169083151502179055505b6000815111610bc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc090614c2c565b60405180910390fd5b60003390506060610bd983612a10565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015610cea57600082600101846001840381518110610c4357fe5b6020026020010151604051610c589190614a1a565b90815260200160405180910390205411610ca7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9e90614c2c565b60405180910390fd5b81600201836001830381518110610cba57fe5b6020026020010151604051610ccf9190614a1a565b90815260200160405180910390209150806001019050610c25565b50600254816000018054905010610d36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2d90614d4c565b60405180910390fd5b60606001835111610d475784610d60565b82600184510381518110610d5757fe5b60200260200101515b905060008260010182604051610d769190614a31565b90815260200160405180910390205414610dc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbc90614d8c565b60405180910390fd5b610dce81612ff6565b610e0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0490614c4c565b60405180910390fd5b6000610e1985876130d7565b905080610e5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5290614aec565b60405180910390fd5b610e63613996565b82816000018190525060008160200190151590811515815250508360000181908060018154018082558091505090600182039060005260206000209060050201600090919290919091506000820151816000019080519060200190610ec99291906139d2565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff02191690836002811115610f1857fe5b02179055506080820151816004019080519060200190610f39929190613a52565b5050505083600001805490508460010184604051610f579190614a31565b90815260200160405180910390208190555050505050505050565b610f7a61313b565b73ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161480610fdf57503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614155b61101e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101590614bac565b60405180910390fd5b80600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411156110a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109790614c8c565b60405180910390fd5b600054600754820111156110e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e090614b0c565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460076000828254039250508190555080600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550806007600082825401925050819055505050565b60008054905090565b600033905060006111aa82866131d4565b9050600160028111156111b957fe5b8160030160009054906101000a900460ff1660028111156111d657fe5b14611216576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120d90614d6c565b60405180910390fd5b6000600354858161122357fe5b061480156112345750806002015484105b611273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126a90614acc565b60405180910390fd5b600354848260020154031080156112905750838160020154038351145b8061129d57506003548351145b6112dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d390614b6c565b60405180910390fd5b600015158160040160035486816112ef57fe5b04815481106112fa57fe5b90600052602060002090602091828204019190069054906101000a900460ff1615151461135c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135390614b4c565b60405180910390fd5b600061136a838787876133d3565b9050806113ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a390614c6c565b60405180910390fd5b60018260040160035487816113bd57fe5b04815481106113c857fe5b90600052602060002090602091828204019190066101000a81548160ff021916908315150217905550505050505050565b611401613b4e565b6000606061140e86612c74565b9150915061141a613996565b61142483836131d4565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156114c85780601f1061149d576101008083540402835291602001916114c8565b820191906000526020600020905b8154815290600101906020018083116114ab57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561151457fe5b600281111561151f57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561159757602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116115615790505b50505050508152505090506002808111156115ae57fe5b816060015160028111156115be57fe5b146115fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f590614e0c565b60405180910390fd5b60035485111580156116105750600085115b61164f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164690614b6c565b60405180910390fd5b80604001518587011115611698576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168f90614acc565b60405180910390fd5b60006116a684848989613484565b8096508192505050806116ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e590614cec565b60405180910390fd5b505050509392505050565b6000339050600061170a82846131d4565b90506001600281111561171957fe5b8160030160009054906101000a900460ff16600281111561173657fe5b14611776576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176d90614d6c565b60405180910390fd5b60006001905060008260040180549050905060008090505b818110156117e157600015158460040182815481106117a957fe5b90600052602060002090602091828204019190069054906101000a900460ff16151514156117d657600092505b80600101905061178e565b5081611822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181990614ccc565b60405180910390fd5b60028360030160006101000a81548160ff0219169083600281111561184357fe5b021790555060006118548587613517565b905080611896576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188d90614b2c565b60405180910390fd5b505050505050565b6060600060606118ad84612c74565b9150915060606118bc82612a10565b90506000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008090505b82518110156119c65760008260010184838151811061192257fe5b60200260200101516040516119379190614a1a565b90815260200160405180910390205411611986576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197d90614c2c565b60405180910390fd5b8160020183828151811061199657fe5b60200260200101516040516119ab9190614a1a565b90815260200160405180910390209150806001019050611907565b5080600001805480602002602001604051908101604052809291908181526020016000905b82821015611b8e57838290600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611aa75780601f10611a7c57610100808354040283529160200191611aa7565b820191906000526020600020905b815481529060010190602001808311611a8a57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115611af357fe5b6002811115611afe57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015611b7657602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411611b405790505b505050505081525050815260200190600101906119eb565b50505050945050505050919050565b600160009054906101000a900460ff16611bdf576120006002819055506210000060038190555060018060006101000a81548160ff0219169083151502179055505b60003390506305f5e100821115611c2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2290614d2c565b60405180910390fd5b600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205483011115611cee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce590614dac565b60405180910390fd5b6060611cf984612a10565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015611e0a57600082600101846001840381518110611d6357fe5b6020026020010151604051611d789190614a1a565b90815260200160405180910390205411611dc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dbe90614c2c565b60405180910390fd5b81600201836001830381518110611dda57fe5b6020026020010151604051611def9190614a1a565b90815260200160405180910390209150806001019050611d45565b50600254816000018054905010611e56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4d90614d4c565b60405180910390fd5b60606001835111611e675785611e80565b82600184510381518110611e7757fe5b60200260200101515b905060008260010182604051611e969190614a31565b90815260200160405180910390205414611ee5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611edc90614d8c565b60405180910390fd5b611eee81612ff6565b611f2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2490614d0c565b60405180910390fd5b6000611f3a85888861357b565b905080611f7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7390614dec565b60405180910390fd5b6060600354600160035489010381611f9057fe5b04604051908082528060200260200182016040528015611fbf5781602001602082028038833980820191505090505b509050836000016040518060a0016040528085815260200160011515815260200189815260200160016002811115611ff357fe5b8152602001838152509080600181540180825580915050906001820390600052602060002090600502016000909192909190915060008201518160000190805190602001906120439291906139d2565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561209257fe5b021790555060808201518160040190805190602001906120b3929190613a52565b50505050836000018054905084600101846040516120d19190614a31565b90815260200160405180910390208190555086600560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505050505050505050565b6000339050612147613996565b61215182846131d4565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156121f55780601f106121ca576101008083540402835291602001916121f5565b820191906000526020600020905b8154815290600101906020018083116121d857829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561224157fe5b600281111561224c57fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156122c457602002820191906000526020600020906000905b82829054906101000a900460ff1615158152602001906001019060208260000104928301926001038202915080841161228e5790505b5050505050815250509050600060028111156122dc57fe5b816060015160028111156122ec57fe5b141561232d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232490614b8c565b60405180910390fd5b600061233983856135e8565b90508061237b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161237290614bec565b60405180910390fd5b606061238685612a10565b90506000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b825181101561241e57816002018360018303815181106123ee57fe5b60200260200101516040516124039190614a1a565b908152602001604051809103902091508060010190506123d2565b50600060018260010186600001516040516124399190614a1a565b908152602001604051809103902054039050612453613996565b8260000160018460000180549050038154811061246c57fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561251e5780601f106124f35761010080835404028352916020019161251e565b820191906000526020600020905b81548152906001019060200180831161250157829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561256a57fe5b600281111561257557fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156125ed57602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116125b75790505b50505050508152505090508083600001838154811061260857fe5b906000526020600020906005020160008201518160000190805190602001906126329291906139d2565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561268157fe5b021790555060808201518160040190805190602001906126a2929190613a52565b50905050826000018054809190600190036126bd9190613af8565b508260010186600001516040516126d49190614a1a565b9081526020016040518091039020548360010182600001516040516126f99190614a1a565b90815260200160405180910390208190555060008360010187600001516040516127239190614a1a565b9081526020016040518091039020819055508560400151600560008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505050505050505050565b600080606061279e84612c74565b915091506127aa613996565b6127b483836131d4565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156128585780601f1061282d57610100808354040283529160200191612858565b820191906000526020600020905b81548152906001019060200180831161283b57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff1660028111156128a457fe5b60028111156128af57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561292757602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116128f15790505b50505050508152505090506001600281111561293f57fe5b8160600151600281111561294f57fe5b1480612974575060028081111561296257fe5b8160600151600281111561297257fe5b145b6129b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129aa90614d6c565b60405180910390fd5b60006129bf848461364c565b809650819250505080612a07576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129fe90614dcc565b60405180910390fd5b50505050919050565b6060612a1a613b73565b612a23836136b5565b9050612a2d613b73565b612a6b6040518060400160405280600181526020017f2f000000000000000000000000000000000000000000000000000000000000008152506136b5565b905060606001612a8483856136e390919063ffffffff16565b01604051908082528060200260200182016040528015612ab857816020015b6060815260200190600190039081612aa35790505b50905060008090505b8151811015612b0957612ae5612ae0848661375890919063ffffffff16565b613772565b828281518110612af157fe5b60200260200101819052508080600101915050612ac1565b50600081600183510381518110612b1c57fe5b6020026020010151511415612b875780600182510381518110612b3b57fe5b6020026020010160608152506001815103604051908082528060200260200182016040528015612b7f57816020015b6060815260200190600190039081612b6a5790505b509350612bc0565b8051604051908082528060200260200182016040528015612bbc57816020015b6060815260200190600190039081612ba75790505b5093505b60008090505b8451811015612c0757818181518110612bdb57fe5b6020026020010151858281518110612bef57fe5b60200260200101819052508080600101915050612bc6565b50505050919050565b60008060016020601f85510181612c2357fe5b040190506040518481526020810160005b83811015612c55578060200286015181602002830152806001019050612c34565b50602082602085026040018460006010600019f1935050505092915050565b6000606060006028905080845111612cc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cb890614c0c565b60405180910390fd5b6060816040519080825280601f01601f191660200182016040528015612cf65781602001600182028038833980820191505090505b50905060008090505b82811015612d6657858181518110612d1357fe5b602001015160f81c60f81b828281518110612d2a57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050612cff565b50600080905060008090505b83811015612e95576000838281518110612d8857fe5b602001015160f81c60f81b60f81c60ff16905060308110158015612dad575060398111155b80612dc6575060418110158015612dc55750605a8111155b5b80612ddf575060618110158015612dde575060668111155b5b612e1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e1590614c0c565b60405180910390fd5b60308110158015612e30575060398111155b15612e415760308103601084020192505b60418110158015612e535750605a8111155b15612e645760378103601084020192505b60618110158015612e76575060668111155b15612e875760578103601084020192505b508080600101915050612d72565b508094507f2f00000000000000000000000000000000000000000000000000000000000000868481518110612ec657fe5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612f33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f2a90614c0c565b60405180910390fd5b6000600184885103039050806040519080825280601f01601f191660200182016040528015612f715781602001600182028038833980820191505090505b50945060008090505b81811015612fec5760008860018784010181518110612f9557fe5b602001015160f81c60f81b905080878381518110612faf57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350508080600101915050612f7a565b5050505050915091565b600060405160200161300790614a5d565b604051602081830303815290604052805190602001208260405160200161302e9190614a31565b604051602081830303815290604052805190602001201480613099575060405160200161305a90614a48565b60405160208183030381529060405280519060200120826040516020016130819190614a31565b60405160208183030381529060405280519060200120145b806130a5575060008251145b156130b357600090506130d2565b60008251905060ff8111156130cc5760009150506130d2565b60019150505b919050565b60008060016020601f855101816130ea57fe5b040190506040518481526020810160005b8381101561311c5780602002860151816020028301528060010190506130fb565b5060208260208502604001846000600f600019f1935050505092915050565b600073d2001000000000000000000000000000000000d273ffffffffffffffffffffffffffffffffffffffff166383e781fe6040518163ffffffff1660e01b815260040160206040518083038186803b15801561319757600080fd5b505afa1580156131ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506131cf9190810190613da8565b905090565b600060606131e183612a10565b90506000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b82518110156132f25760008260010184600184038151811061324b57fe5b60200260200101516040516132609190614a1a565b908152602001604051809103902054116132af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132a690614c2c565b60405180910390fd5b816002018360018303815181106132c257fe5b60200260200101516040516132d79190614a1a565b9081526020016040518091039020915080600101905061322d565b5060606001835111613304578461331d565b8260018451038151811061331457fe5b60200260200101515b9050600082600101826040516133339190614a31565b90815260200160405180910390205411613382576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161337990614c2c565b60405180910390fd5b6000826000016001846001018460405161339c9190614a31565b90815260200160405180910390205403815481106133b657fe5b906000526020600020906005020190508094505050505092915050565b60008060016020601f855101816133e657fe5b04019050600060016020601f885101816133fc57fe5b040190506040518781526020810160005b8381101561342e57806020028901518160200283015280600101905061340d565b50868360200282015260005b84811015613460578060200287015181856001010160200283015280600101905061343a565b50602082848601602002606001846000600c600019f1945050505050949350505050565b600061348e613b4e565b600060016020601f885101816134a057fe5b0401905060006020601f8601816134b357fe5b0490506040518881526020810160005b848110156134e457806020028a0151816020028301528060010190506134c3565b5083602002810188815287816020015283602002868660030160200285600a600019fa9650505050505094509492505050565b60008060016020601f8551018161352a57fe5b040190506040518481526020810160005b8381101561355c57806020028601518160200283015280600101905061353b565b50602082602085026040018460006011600019f1935050505092915050565b60008060016020601f8651018161358e57fe5b040190506040518581526020810160005b838110156135c057806020028701518160200283015280600101905061359f565b50846020840282015260208260208502604001846000600b600019f193505050509392505050565b60008060016020601f855101816135fb57fe5b040190506040518481526020810160005b8381101561362d57806020028601518160200283015280600101905061360c565b5060208260208502604001846000600e600019f1935050505092915050565b600080600060016020601f8651018161366157fe5b040190506040518581526020810160005b83811015613693578060200287015181602002830152806001019050613672565b506020826020850260200184600d600019fa9450815193505050509250929050565b6136bd613b73565b600060208301905060405180604001604052808451815260200182815250915050919050565b600080826000015161370785600001518660200151866000015187602001516137d4565b0190505b8360000151846020015101811161375157818060010192505082600001516137498560200151830386600001510383866000015187602001516137d4565b01905061370b565b5092915050565b613760613b73565b61376b8383836138af565b5092915050565b60608082600001516040519080825280601f01601f1916602001820160405280156137ac5781602001600182028038833980820191505090505b50905060006020820190506137ca818560200151866000015161394d565b8192505050919050565b600080849050600086851161389f576020851161385957600060018660200360080260020a031960001b905060008186511690506000878a8a0103905060008386511690505b82811461384b57818610613838578a8a0196505050505050506138a7565b858060010196505083865116905061381a565b8596505050505050506138a7565b60008585209050600091505b858803821161389d57600086842090508082141561388957839450505050506138a7565b600184019350508180600101925050613865565b505b868601925050505b949350505050565b6138b7613b73565b60006138d585600001518660200151866000015187602001516137d4565b90508460200151836020018181525050846020015181038360000181815250508460000151856020015101811415613917576000856000018181525050613942565b8360000151836000015101856000018181510391508181525050836000015181018560200181815250505b829150509392505050565b5b60208110613971578151835260208301925060208201915060208103905061394e565b60006001826020036101000a0390508019835116818551168181178652505050505050565b6040518060a001604052806060815260200160001515815260200160008152602001600060028111156139c557fe5b8152602001606081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613a1357805160ff1916838001178555613a41565b82800160010185558215613a41579182015b82811115613a40578251825591602001919060010190613a25565b5b509050613a4e9190613b8d565b5090565b82805482825590600052602060002090601f01602090048101928215613ae75791602002820160005b83821115613ab857835183826101000a81548160ff0219169083151502179055509260200192600101602081600001049283019260010302613a7b565b8015613ae55782816101000a81549060ff0219169055600101602081600001049283019260010302613ab8565b505b509050613af49190613bb2565b5090565b815481835581811115613b2557600502816005028360005260206000209182019101613b249190613be2565b5b505050565b5080546000825560050290600052602060002090810190613b4b9190613be2565b50565b6040518062100000016040528061800090602082028038833980820191505090505090565b604051806040016040528060008152602001600081525090565b613baf91905b80821115613bab576000816000905550600101613b93565b5090565b90565b613bdf91905b80821115613bdb57600081816101000a81549060ff021916905550600101613bb8565b5090565b90565b613c4e91905b80821115613c4a5760008082016000613c019190613c51565b6001820160006101000a81549060ff021916905560028201600090556003820160006101000a81549060ff0219169055600482016000613c419190613c99565b50600501613be8565b5090565b90565b50805460018160011615610100020316600290046000825580601f10613c775750613c96565b601f016020900490600052602060002090810190613c959190613b8d565b5b50565b50805460008255601f016020900490600052602060002090810190613cbe9190613b8d565b50565b600081359050613cd081615086565b92915050565b600081519050613ce581615086565b92915050565b600082601f830112613cfc57600080fd5b8135613d0f613d0a82614e74565b614e47565b91508082526020830160208301858383011115613d2b57600080fd5b613d36838284615026565b50505092915050565b600082601f830112613d5057600080fd5b8135613d63613d5e82614ea0565b614e47565b91508082526020830160208301858383011115613d7f57600080fd5b613d8a838284615026565b50505092915050565b600081359050613da28161509d565b92915050565b600060208284031215613dba57600080fd5b6000613dc884828501613cd6565b91505092915050565b60008060408385031215613de457600080fd5b6000613df285828601613cc1565b9250506020613e0385828601613d93565b9150509250929050565b600060208284031215613e1f57600080fd5b600082013567ffffffffffffffff811115613e3957600080fd5b613e4584828501613d3f565b91505092915050565b60008060408385031215613e6157600080fd5b600083013567ffffffffffffffff811115613e7b57600080fd5b613e8785828601613d3f565b9250506020613e9885828601613d93565b9150509250929050565b600080600060608486031215613eb757600080fd5b600084013567ffffffffffffffff811115613ed157600080fd5b613edd86828701613d3f565b9350506020613eee86828701613d93565b925050604084013567ffffffffffffffff811115613f0b57600080fd5b613f1786828701613ceb565b9150509250925092565b600080600060608486031215613f3657600080fd5b600084013567ffffffffffffffff811115613f5057600080fd5b613f5c86828701613d3f565b9350506020613f6d86828701613d93565b9250506040613f7e86828701613d93565b9150509250925092565b6000613f9483836140f6565b60208301905092915050565b6000613fac8383614105565b60208301905092915050565b6000613fc4838361497f565b905092915050565b6000613fd782614ef6565b613fe18185614f55565b9350613fec83614ecc565b8060005b8381101561401d5781516140048882613f88565b975061400f83614f2e565b925050600181019050613ff0565b5085935050505092915050565b61403381614f01565b61403d8184614f66565b925061404882614edc565b8060005b838110156140795781516140608782613fa0565b965061406b83614f3b565b92505060018101905061404c565b505050505050565b600061408c82614f0d565b6140968185614f71565b9350836020820285016140a885614ee6565b8060005b858110156140e457848403895281516140c58582613fb8565b94506140d083614f48565b925060208a019950506001810190506140ac565b50829750879550505050505092915050565b6140ff81614fc1565b82525050565b61410e81614fcd565b82525050565b61411d81615014565b82525050565b61412c81615014565b82525050565b600061413d82614f23565b6141478185614fa4565b9350614157818560208601615035565b80840191505092915050565b600061416e82614f18565b6141788185614f82565b9350614188818560208601615035565b61419181615068565b840191505092915050565b60006141a782614f18565b6141b18185614fa4565b93506141c1818560208601615035565b80840191505092915050565b60006141da601883614f93565b91507f496e636f7272656374206368756e6b20706f736974696f6e00000000000000006000830152602082019050919050565b600061421a601583614f93565b91507f4469726563746f7279206e6f74206372656174656400000000000000000000006000830152602082019050919050565b600061425a602483614f93565b91507f4e6f7420656e6f756768206d656d6f727920696e207468652046696c6573746f60008301527f72616765000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006142c0601b83614f93565b91507f48617368206861736e2774206265656e2063616c63756c6174656400000000006000830152602082019050919050565b6000614300601983614f93565b91507f4368756e6b20697320616c72656164792075706c6f61646564000000000000006000830152602082019050919050565b6000614340601683614f93565b91507f496e636f7272656374206368756e6b206c656e677468000000000000000000006000830152602082019050919050565b6000614380600f83614f93565b91507f46696c65206e6f742065786973747300000000000000000000000000000000006000830152602082019050919050565b60006143c0600e83614f93565b91507f496e76616c69642073656e6465720000000000000000000000000000000000006000830152602082019050919050565b6000614400601883614f93565b91507f4469726563746f7279206973206e6f742064656c6574656400000000000000006000830152602082019050919050565b6000614440601083614f93565b91507f46696c65206e6f742064656c65746564000000000000000000000000000000006000830152602082019050919050565b6000614480601383614f93565b91507f496e76616c69642073746f7261676550617468000000000000000000000000006000830152602082019050919050565b60006144c0600c83614f93565b91507f496e76616c6964207061746800000000000000000000000000000000000000006000830152602082019050919050565b6000614500600183614fa4565b91507f2e000000000000000000000000000000000000000000000000000000000000006000830152600182019050919050565b6000614540601683614f93565b91507f496e76616c6964206469726563746f7279206e616d65000000000000000000006000830152602082019050919050565b6000614580601583614f93565b91507f4368756e6b207761736e27742075706c6f6164656400000000000000000000006000830152602082019050919050565b60006145c0602683614f93565b91507f436f756c64206e6f742072657365727665206c657373207468616e207573656460008301527f20737061636500000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614626601683614f93565b91507f4469726563746f7279206973206e6f7420656d707479000000000000000000006000830152602082019050919050565b6000614666602383614f93565b91507f46696c65206861736e2774206265656e2075706c6f6164656420636f7272656360008301527f746c7900000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006146cc601183614f93565b91507f4368756e6b207761736e277420726561640000000000000000000000000000006000830152602082019050919050565b600061470c601883614f93565b91507f46696c656e616d652073686f756c64206265203c2032353600000000000000006000830152602082019050919050565b600061474c601f83614f93565b91507f46696c652073686f756c64206265206c657373207468616e20313030204d42006000830152602082019050919050565b600061478c600283614fa4565b91507f2e2e0000000000000000000000000000000000000000000000000000000000006000830152600282019050919050565b60006147cc601183614f93565b91507f4469726563746f72792069732066756c6c0000000000000000000000000000006000830152602082019050919050565b600061480c600e83614f93565b91507f46696c65206e6f7420666f756e640000000000000000000000000000000000006000830152602082019050919050565b600061484c601883614f93565b91507f46696c65206f72206469726563746f72792065786973747300000000000000006000830152602082019050919050565b600061488c601983614f93565b91507f4e6f7420656e6f756768207265736572766564207370616365000000000000006000830152602082019050919050565b60006148cc601883614f93565b91507f45564d206572726f7220696e2067657446696c6553697a6500000000000000006000830152602082019050919050565b600061490c601083614f93565b91507f46696c65206e6f742063726561746564000000000000000000000000000000006000830152602082019050919050565b600061494c601983614f93565b91507f46696c65206861736e2774206265656e2075706c6f61646564000000000000006000830152602082019050919050565b600060a083016000830151848203600086015261499c8282614163565b91505060208301516149b160208601826140f6565b5060408301516149c460408601826149fc565b5060608301516149d76060860182614114565b50608083015184820360808601526149ef8282613fcc565b9150508091505092915050565b614a058161500a565b82525050565b614a148161500a565b82525050565b6000614a26828461419c565b915081905092915050565b6000614a3d8284614132565b915081905092915050565b6000614a53826144f3565b9150819050919050565b6000614a688261477f565b9150819050919050565b60006210000082019050614a89600083018461402a565b92915050565b60006020820190508181036000830152614aa98184614081565b905092915050565b6000602082019050614ac66000830184614123565b92915050565b60006020820190508181036000830152614ae5816141cd565b9050919050565b60006020820190508181036000830152614b058161420d565b9050919050565b60006020820190508181036000830152614b258161424d565b9050919050565b60006020820190508181036000830152614b45816142b3565b9050919050565b60006020820190508181036000830152614b65816142f3565b9050919050565b60006020820190508181036000830152614b8581614333565b9050919050565b60006020820190508181036000830152614ba581614373565b9050919050565b60006020820190508181036000830152614bc5816143b3565b9050919050565b60006020820190508181036000830152614be5816143f3565b9050919050565b60006020820190508181036000830152614c0581614433565b9050919050565b60006020820190508181036000830152614c2581614473565b9050919050565b60006020820190508181036000830152614c45816144b3565b9050919050565b60006020820190508181036000830152614c6581614533565b9050919050565b60006020820190508181036000830152614c8581614573565b9050919050565b60006020820190508181036000830152614ca5816145b3565b9050919050565b60006020820190508181036000830152614cc581614619565b9050919050565b60006020820190508181036000830152614ce581614659565b9050919050565b60006020820190508181036000830152614d05816146bf565b9050919050565b60006020820190508181036000830152614d25816146ff565b9050919050565b60006020820190508181036000830152614d458161473f565b9050919050565b60006020820190508181036000830152614d65816147bf565b9050919050565b60006020820190508181036000830152614d85816147ff565b9050919050565b60006020820190508181036000830152614da58161483f565b9050919050565b60006020820190508181036000830152614dc58161487f565b9050919050565b60006020820190508181036000830152614de5816148bf565b9050919050565b60006020820190508181036000830152614e05816148ff565b9050919050565b60006020820190508181036000830152614e258161493f565b9050919050565b6000602082019050614e416000830184614a0b565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614e6a57600080fd5b8060405250919050565b600067ffffffffffffffff821115614e8b57600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614eb757600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050919050565b6000819050602082019050919050565b600081519050919050565b60006180009050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614fba82614fea565b9050919050565b60008115159050919050565b6000819050919050565b6000819050614fe582615079565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061501f82614fd7565b9050919050565b82818337600083830152505050565b60005b83811015615053578082015181840152602081019050615038565b83811115615062576000848401525b50505050565b6000601f19601f8301169050919050565b6003811061508357fe5b50565b61508f81614faf565b811461509a57600080fd5b50565b6150a68161500a565b81146150b157600080fd5b5056fea365627a7a72315820314a90e541327f2678eaf7815f54348c3702e4fa45cdf1d5595b378d08af86896c6578706572696d656e74616cf564736f6c634300050d0040", + "nonce": "0", + "storage": { + "0x0": "2868903936" + } + }, + "0x69bfcdcb98c9562e0a2faee3ecdfd65e8a0adb19": { + "balance": "1000000000000000000000000000000" + }, + "0x6a37ad7dceec4595eea9f03b82d2710e738343ac": { + "balance": "1000000000000000000000000000000" + }, + "0x6b806862a977a0e22ed1752f858e5332647121c8": { + "balance": "1000000000000000000000000000000" + }, + "0x6c0ef9084a57df13c175afea32ea47a510c5506e": { + "balance": "1000000000000000000000000000000" + }, + "0x6cd5e637266e18d3e888ee99451eb828c6b491f4": { + "balance": "1000000000000000000000000000000" + }, + "0x6d0d7f0ff51917bd84a5f7270d31a894282aaf4b": { + "balance": "1000000000000000000000000000000" + }, + "0x6d8092cb926daf29236f866cd31c327ff73323d1": { + "balance": "1000000000000000000000000000000" + }, + "0x6d80aAC61F6d92c7F4A3c412850474ba963B698E": { + "balance": "1000000000000000000000" + }, + "0x6fec280c0ab320715b17d70e8b02c2d4141c1372": { + "balance": "1000000000000000000000000000000" + }, + "0x733ad609ef2e742334d96266fbc13733f1cf5e4a": { + "balance": "1000000000000000000000000000000" + }, + "0x7525198d8cd1121d57358a0b0ed037e924581a76": { + "balance": "1000000000000000000000000000000" + }, + "0x765708943c3b791563d1e3f0533b6d7e7d769e4d": { + "balance": "1000000000000000000000000000000" + }, + "0x7685d04f0b7657017b77efa004a14ff9f022acab": { + "balance": "1000000000000000000000000000000" + }, + "0x76b545cb6a2fc671f741950eeb27627e69a1e69b": { + "balance": "1000000000000000000000000000000" + }, + "0x77a0bc73442d3d9cb993e8d9752f95babf0ccaa6": { + "balance": "1000000000000000000000000000000" + }, + "0x7a89A6c323FaCfF0ADeF7EEF3e491aD4044d0592": { + "balance": "100000000000000000000000" + }, + "0x7e7E68F04D1799Fa25C8cff57314c8a5d3942e69": { + "balance": "1000000000000000000000000" + }, + "0x811d701d14539d190a8593fe901eafe8eff511f5": { + "balance": "1000000000000000000000000000000" + }, + "0x81dcbd71da28fafb9ca99ff5a22bfcebba84fecc": { + "balance": "100000000000000000000000" + }, + "0x83c1479d2a32d9ed9fa699289b6c2db56b7cd045": { + "balance": "1000000000000000000000000000000" + }, + "0x85b33f0853ab8eaa4e602bdfd724d44bc2731e90": { + "balance": "1000000000000000000000000000000" + }, + "0x863f816036e3cbba90855196c9d1e339fcff1650": { + "balance": "1000000000000000000000000000000" + }, + "0x87ea381878572d63b3453033d7540abddd191186": { + "balance": "1000000000000000000000000000000" + }, + "0x88fd5e01078629cc194c933d9631b9448fe10b1d": { + "balance": "1000000000000000000000000000000" + }, + "0x8945e48bd056f45c8b57f9025d2674bb03a24035": { + "balance": "1000000000000000000000000000000" + }, + "0x8a920edc1021ce76c22774e0e83723a6e51c2439": { + "balance": "1000000000000000000000000000000" + }, + "0x8e6081e272c8f4d49f5b29157b52f68cbd6307ad": { + "balance": "1000000000000000000000000000000" + }, + "0x8fe24dbbf9884bd458d8cfac528b4ad70e82497d": { + "balance": "1000000000000000000000000000000" + }, + "0x90431f3f75b26657f74abbb5c759b12e78f916cc": { + "balance": "1000000000000000000000000000000" + }, + "0x907cd0881E50d359bb9Fd120B1A5A143b1C97De6": { + "balance": "1000000000000000000000000000000000000000000000000000000000" + }, + "0x94c6e5746971d6aebeaa42cbbe2feca0f6b5b24f": { + "balance": "1000000000000000000000000000000" + }, + "0x96672f9e982936e1904b15c948cc81bf18027db6": { + "balance": "1000000000000000000000000000000" + }, + "0x97b921ba45e0aa8830701aa62050a83ee00a1bb8": { + "balance": "1000000000000000000000000000000" + }, + "0x98e50c97baf98dc6a81bdb95067339a269a36fc1": { + "balance": "1000000000000000000000000000000" + }, + "0x9b77f28285a49601169a33332f08aa309d97edd0": { + "balance": "1000000000000000000000000000000" + }, + "0x9f62f4215cd277ca40dede101b4ccb29290de6bb": { + "balance": "1000000000000000000000000000000" + }, + "0xD1001000000000000000000000000000000000D1": { + "balance": "0", + "code": "0x608060405260043610603f576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680636d4ce63c146044575b600080fd5b348015604f57600080fd5b506056606c565b6040518082815260200191505060405180910390f35b60006001600060048152602001908152602001600020600060098152602001908152602001600020600101549050905600a165627a7a723058208fe64219becc0bcab1c8f854f05804ebb6bb555da5dbc49e8f7021c31d77636a0029", + "nonce": "0", + "storage": { + "0x3b4da637a1b0e6dbfc6795f2b7f0cb29eebb91b3af4dcc335e1633f6b4af810b": "1111" + } + }, + "0xD3001000000000000000000000000000000000D3": { + "balance": "0", + "code": "0x60806040526004361061007b5760003560e01c80639623609d1161004e5780639623609d1461013657806399a88ec4146101f5578063f2fde38b14610230578063f3b7dead146102635761007b565b8063204e1c7a14610080578063715018a6146100cf5780637eff275e146100e65780638da5cb5b14610121575b600080fd5b34801561008c57600080fd5b506100b3600480360360208110156100a357600080fd5b50356001600160a01b0316610296565b604080516001600160a01b039092168252519081900360200190f35b3480156100db57600080fd5b506100e4610328565b005b3480156100f257600080fd5b506100e46004803603604081101561010957600080fd5b506001600160a01b03813581169160200135166103ca565b34801561012d57600080fd5b506100b3610496565b6100e46004803603606081101561014c57600080fd5b6001600160a01b03823581169260208101359091169181019060608101604082013564010000000081111561018057600080fd5b82018360208201111561019257600080fd5b803590602001918460018302840111640100000000831117156101b457600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506104a5945050505050565b34801561020157600080fd5b506100e46004803603604081101561021857600080fd5b506001600160a01b03813581169160200135166105dd565b34801561023c57600080fd5b506100e46004803603602081101561025357600080fd5b50356001600160a01b031661068d565b34801561026f57600080fd5b506100b36004803603602081101561028657600080fd5b50356001600160a01b0316610785565b6000806060836001600160a01b03166040518080635c60da1b60e01b8152506004019050600060405180830381855afa9150503d80600081146102f5576040519150601f19603f3d011682016040523d82523d6000602084013e6102fa565b606091505b50915091508161030957600080fd5b80806020019051602081101561031e57600080fd5b5051949350505050565b6103306107e4565b6000546001600160a01b03908116911614610380576040805162461bcd60e51b8152602060048201819052602482015260008051602061080f833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6103d26107e4565b6000546001600160a01b03908116911614610422576040805162461bcd60e51b8152602060048201819052602482015260008051602061080f833981519152604482015290519081900360640190fd5b816001600160a01b0316638f283970826040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050600060405180830381600087803b15801561047a57600080fd5b505af115801561048e573d6000803e3d6000fd5b505050505050565b6000546001600160a01b031690565b6104ad6107e4565b6000546001600160a01b039081169116146104fd576040805162461bcd60e51b8152602060048201819052602482015260008051602061080f833981519152604482015290519081900360640190fd5b826001600160a01b0316634f1ef2863484846040518463ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561057357818101518382015260200161055b565b50505050905090810190601f1680156105a05780820380516001836020036101000a031916815260200191505b5093505050506000604051808303818588803b1580156105bf57600080fd5b505af11580156105d3573d6000803e3d6000fd5b5050505050505050565b6105e56107e4565b6000546001600160a01b03908116911614610635576040805162461bcd60e51b8152602060048201819052602482015260008051602061080f833981519152604482015290519081900360640190fd5b816001600160a01b0316633659cfe6826040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050600060405180830381600087803b15801561047a57600080fd5b6106956107e4565b6000546001600160a01b039081169116146106e5576040805162461bcd60e51b8152602060048201819052602482015260008051602061080f833981519152604482015290519081900360640190fd5b6001600160a01b03811661072a5760405162461bcd60e51b81526004018080602001828103825260268152602001806107e96026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000806060836001600160a01b031660405180806303e1469160e61b8152506004019050600060405180830381855afa9150503d80600081146102f5576040519150601f19603f3d011682016040523d82523d6000602084013e6102fa565b339056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a26469706673582212201d968ac32bef5562c6b4f1bd5d2f2a74c14d07ce008ca6fdc5a3bd0f5fc265f564736f6c63430006080033", + "nonce": "0", + "storage": { + "0x0": "0x907cd0881E50d359bb9Fd120B1A5A143b1C97De6" + } + }, + "0xD3002000000000000000000000000000000000D3": { + "balance": "0", + "code": "0x60806040526004361061004e5760003560e01c80633659cfe6146100655780634f1ef286146100985780635c60da1b146101185780638f28397014610149578063f851a4401461017c5761005d565b3661005d5761005b610191565b005b61005b610191565b34801561007157600080fd5b5061005b6004803603602081101561008857600080fd5b50356001600160a01b03166101ab565b61005b600480360360408110156100ae57600080fd5b6001600160a01b0382351691908101906040810160208201356401000000008111156100d957600080fd5b8201836020820111156100eb57600080fd5b8035906020019184600183028401116401000000008311171561010d57600080fd5b5090925090506101e5565b34801561012457600080fd5b5061012d610292565b604080516001600160a01b039092168252519081900360200190f35b34801561015557600080fd5b5061005b6004803603602081101561016c57600080fd5b50356001600160a01b03166102cf565b34801561018857600080fd5b5061012d610389565b6101996103ba565b6101a96101a461041a565b61043f565b565b6101b3610463565b6001600160a01b0316336001600160a01b031614156101da576101d581610488565b6101e2565b6101e2610191565b50565b6101ed610463565b6001600160a01b0316336001600160a01b031614156102855761020f83610488565b6000836001600160a01b031683836040518083838082843760405192019450600093509091505080830381855af49150503d806000811461026c576040519150601f19603f3d011682016040523d82523d6000602084013e610271565b606091505b505090508061027f57600080fd5b5061028d565b61028d610191565b505050565b600061029c610463565b6001600160a01b0316336001600160a01b031614156102c4576102bd61041a565b90506102cc565b6102cc610191565b90565b6102d7610463565b6001600160a01b0316336001600160a01b031614156101da576001600160a01b0381166103355760405162461bcd60e51b81526004018080602001828103825260368152602001806105876036913960400191505060405180910390fd5b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f61035e610463565b604080516001600160a01b03928316815291841660208301528051918290030190a16101d5816104c8565b6000610393610463565b6001600160a01b0316336001600160a01b031614156102c4576102bd610463565b3b151590565b6103c2610463565b6001600160a01b0316336001600160a01b031614156104125760405162461bcd60e51b81526004018080602001828103825260328152602001806105556032913960400191505060405180910390fd5b6101a96101a9565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b3660008037600080366000845af43d6000803e80801561045e573d6000f35b3d6000fd5b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b610491816104ec565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610355565b6104f5816103b4565b6105305760405162461bcd60e51b815260040180806020018281038252603b8152602001806105bd603b913960400191505060405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5556fe43616e6e6f742063616c6c2066616c6c6261636b2066756e6374696f6e2066726f6d207468652070726f78792061646d696e43616e6e6f74206368616e6765207468652061646d696e206f6620612070726f787920746f20746865207a65726f206164647265737343616e6e6f742073657420612070726f787920696d706c656d656e746174696f6e20746f2061206e6f6e2d636f6e74726163742061646472657373a26469706673582212206e221e2a3547bd97244b05ed46430b1b078ba097cb2a4e25ec3d79cf9ac9f02c64736f6c63430006080033", + "nonce": "0", + "storage": { + "0x0": "1000000", + "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0xD3003000000000000000000000000000000000D3", + "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "0xD3001000000000000000000000000000000000D3" + } + }, + "0xD3003000000000000000000000000000000000D3": { + "balance": "0", + "code": "0x608060405234801561001057600080fd5b50600436106100b45760003560e01c806379210e8e1161007157806379210e8e1461017757806381a8235a146101a757806385aeeb17146101c35780639a9a5593146101f3578063a99100541461020f578063b57321221461022b576100b4565b806307c6e7d3146100b9578063122f4fba146100d55780631c6ec7a9146101055780631cfe4e3b14610121578063373dedb41461013d57806361e46db51461015b575b600080fd5b6100d360048036036100ce9190810190613e94565b61025b565b005b6100ef60048036036100ea9190810190613e94565b610862565b6040516100fc9190614b38565b60405180910390f35b61011f600480360361011a9190810190613e94565b610ba1565b005b61013b60048036036101369190810190613e58565b610fce565b005b6101456111ec565b6040516101529190614eb3565b60405180910390f35b61017560048036036101709190810190613f29565b6111f6565b005b610191600480360361018c9190810190613fa8565b611456565b60405161019e9190614af9565b60405180910390f35b6101c160048036036101bc9190810190613e94565b611756565b005b6101dd60048036036101d89190810190613e94565b6118fb565b6040516101ea9190614b16565b60405180910390f35b61020d60048036036102089190810190613ed5565b611bfa565b005b61022960048036036102249190810190613e94565b612195565b005b61024560048036036102409190810190613e94565b612849565b6040516102529190614eb3565b60405180910390f35b6000339050606061026b83612ac9565b90506000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b825181101561037c576000826001018460018403815181106102d557fe5b60200260200101516040516102ea9190614aa1565b90815260200160405180910390205411610339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161033090614cb3565b60405180910390fd5b8160020183600183038151811061034c57fe5b60200260200101516040516103619190614aa1565b908152602001604051809103902091508060010190506102b7565b506060600183511161038e57846103a7565b8260018451038151811061039e57fe5b60200260200101515b9050600082600101826040516103bd9190614ab8565b9081526020016040518091039020541161040c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161040390614cb3565b60405180910390fd5b600082600201826040516104209190614ab8565b90815260200160405180910390206000018054905014610475576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161046c90614d33565b60405180910390fd5b60006104818587612cc9565b9050806104c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ba90614c53565b60405180910390fd5b6104cb613a4f565b836000016001856000018054905003815481106104e457fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156105965780601f1061056b57610100808354040283529160200191610596565b820191906000526020600020905b81548152906001019060200180831161057957829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff1660028111156105e257fe5b60028111156105ed57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561066557602002820191906000526020600020906000905b82829054906101000a900460ff1615158152602001906001019060208260000104928301926001038202915080841161062f5790505b50505050508152505090508084600001600186600101866040516106899190614ab8565b90815260200160405180910390205403815481106106a357fe5b906000526020600020906005020160008201518160000190805190602001906106cd929190613a8b565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561071c57fe5b0217905550608082015181600401908051906020019061073d929190613b0b565b5090505083600101836040516107539190614ab8565b9081526020016040518091039020548460010182600001516040516107789190614aa1565b9081526020016040518091039020819055506000846001018460405161079e9190614ab8565b908152602001604051809103902081905550836000018054806107bd57fe5b6001900381819060005260206000209060050201600080820160006107e29190613bb1565b6001820160006101000a81549060ff021916905560028201600090556003820160006101000a81549060ff02191690556004820160006108229190613bf9565b5050905583600201836040516108389190614ab8565b9081526020016040518091039020600080820160006108579190613c21565b505050505050505050565b600080606061087084612d2d565b91509150606061087f82612ac9565b90506000600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015610964576000826001018460018403815181106108e957fe5b60200260200101516040516108fe9190614aa1565b908152602001604051809103902054141561092157600095505050505050610b9c565b8160020183600183038151811061093457fe5b60200260200101516040516109499190614aa1565b908152602001604051809103902091508060010190506108cb565b5060606001835111610976578361098f565b8260018451038151811061098657fe5b60200260200101515b9050600082600101826040516109a59190614ab8565b90815260200160405180910390205414156109c857600095505050505050610b9c565b6109d0613a4f565b82600001600184600101846040516109e89190614ab8565b9081526020016040518091039020540381548110610a0257fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610ab45780601f10610a8957610100808354040283529160200191610ab4565b820191906000526020600020905b815481529060010190602001808311610a9757829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115610b0057fe5b6002811115610b0b57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015610b8357602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411610b4d5790505b5050505050815250509050806060015196505050505050505b919050565b600360009054906101000a900460ff16610be457612000600481905550621000006005819055506001600360006101000a81548160ff0219169083151502179055505b6000815111610c28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1f90614cb3565b60405180910390fd5b60003390506060610c3883612ac9565b90506000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015610d4957600082600101846001840381518110610ca257fe5b6020026020010151604051610cb79190614aa1565b90815260200160405180910390205411610d06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cfd90614cb3565b60405180910390fd5b81600201836001830381518110610d1957fe5b6020026020010151604051610d2e9190614aa1565b90815260200160405180910390209150806001019050610c84565b50600454816000018054905010610d95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8c90614dd3565b60405180910390fd5b60606001835111610da65784610dbf565b82600184510381518110610db657fe5b60200260200101515b905060008260010182604051610dd59190614ab8565b90815260200160405180910390205414610e24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1b90614e13565b60405180910390fd5b610e2d816130af565b610e6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6390614cd3565b60405180910390fd5b6000610e788587613190565b905080610eba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb190614b73565b60405180910390fd5b610ec2613a4f565b8281600001819052506000816020019015159081151581525050836000018190806001815401808255809150506001900390600052602060002090600502016000909190919091506000820151816000019080519060200190610f26929190613a8b565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff02191690836002811115610f7557fe5b02179055506080820151816004019080519060200190610f96929190613b0b565b50505083600001805490508460010184604051610fb39190614ab8565b90815260200160405180910390208190555050505050505050565b610fd66131f4565b73ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16148061103b57503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614155b61107a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107190614c33565b60405180910390fd5b80600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411156110fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f390614d13565b60405180910390fd5b60025460095482011115611145576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113c90614b93565b60405180910390fd5b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460096000828254039250508190555080600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550806009600082825401925050819055505050565b6000600254905090565b60003390506000611207828661328d565b90506001600281111561121657fe5b8160030160009054906101000a900460ff16600281111561123357fe5b14611273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126a90614df3565b60405180910390fd5b6000600554858161128057fe5b061480156112915750806002015484105b6112d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c790614b53565b60405180910390fd5b600554848260020154031080156112ed5750838160020154038351145b806112fa57506005548351145b611339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133090614bf3565b60405180910390fd5b6000151581600401600554868161134c57fe5b048154811061135757fe5b90600052602060002090602091828204019190069054906101000a900460ff161515146113b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b090614bd3565b60405180910390fd5b60006113c78387878761348c565b905080611409576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140090614cf3565b60405180910390fd5b600182600401600554878161141a57fe5b048154811061142557fe5b90600052602060002090602091828204019190066101000a81548160ff021916908315150217905550505050505050565b61145e613c45565b6000606061146b86612d2d565b91509150611477613a4f565b611481838361328d565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156115255780601f106114fa57610100808354040283529160200191611525565b820191906000526020600020905b81548152906001019060200180831161150857829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561157157fe5b600281111561157c57fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156115f457602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116115be5790505b505050505081525050905060028081111561160b57fe5b8160600151600281111561161b57fe5b1461165b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165290614e93565b60405180910390fd5b600554851115801561166d5750600085115b6116ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a390614bf3565b60405180910390fd5b806040015185870111156116f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ec90614b53565b60405180910390fd5b60006117038484898961353d565b80965081925050508061174b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174290614d73565b60405180910390fd5b505050509392505050565b60003390506000611767828461328d565b90506001600281111561177657fe5b8160030160009054906101000a900460ff16600281111561179357fe5b146117d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ca90614df3565b60405180910390fd5b60006001905060008260040180549050905060008090505b8181101561183e576000151584600401828154811061180657fe5b90600052602060002090602091828204019190069054906101000a900460ff161515141561183357600092505b8060010190506117eb565b508161187f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187690614d53565b60405180910390fd5b60028360030160006101000a81548160ff021916908360028111156118a057fe5b021790555060006118b185876135d0565b9050806118f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ea90614bb3565b60405180910390fd5b505050505050565b60606000606061190a84612d2d565b91509150606061191982612ac9565b90506000600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008090505b8251811015611a235760008260010184838151811061197f57fe5b60200260200101516040516119949190614aa1565b908152602001604051809103902054116119e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119da90614cb3565b60405180910390fd5b816002018382815181106119f357fe5b6020026020010151604051611a089190614aa1565b90815260200160405180910390209150806001019050611964565b5080600001805480602002602001604051908101604052809291908181526020016000905b82821015611beb57838290600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611b045780601f10611ad957610100808354040283529160200191611b04565b820191906000526020600020905b815481529060010190602001808311611ae757829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115611b5057fe5b6002811115611b5b57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015611bd357602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411611b9d5790505b50505050508152505081526020019060010190611a48565b50505050945050505050919050565b600360009054906101000a900460ff16611c3d57612000600481905550621000006005819055506001600360006101000a81548160ff0219169083151502179055505b60003390506305f5e100821115611c89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8090614db3565b60405180910390fd5b600660008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205483011115611d4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4390614e33565b60405180910390fd5b6060611d5784612ac9565b90506000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015611e6857600082600101846001840381518110611dc157fe5b6020026020010151604051611dd69190614aa1565b90815260200160405180910390205411611e25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1c90614cb3565b60405180910390fd5b81600201836001830381518110611e3857fe5b6020026020010151604051611e4d9190614aa1565b90815260200160405180910390209150806001019050611da3565b50600454816000018054905010611eb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eab90614dd3565b60405180910390fd5b60606001835111611ec55785611ede565b82600184510381518110611ed557fe5b60200260200101515b905060008260010182604051611ef49190614ab8565b90815260200160405180910390205414611f43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3a90614e13565b60405180910390fd5b611f4c816130af565b611f8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8290614d93565b60405180910390fd5b6000611f98858888613634565b905080611fda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd190614e73565b60405180910390fd5b6060600554600160055489010381611fee57fe5b0460405190808252806020026020018201604052801561201d5781602001602082028038833980820191505090505b509050836000016040518060a001604052808581526020016001151581526020018981526020016001600281111561205157fe5b8152602001838152509080600181540180825580915050600190039060005260206000209060050201600090919091909150600082015181600001908051906020019061209f929190613a8b565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff021916908360028111156120ee57fe5b0217905550608082015181600401908051906020019061210f929190613b0b565b5050508360000180549050846001018460405161212c9190614ab8565b90815260200160405180910390208190555086600760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505050505050505050565b60003390506121a2613a4f565b6121ac828461328d565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156122505780601f1061222557610100808354040283529160200191612250565b820191906000526020600020905b81548152906001019060200180831161223357829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561229c57fe5b60028111156122a757fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561231f57602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116122e95790505b50505050508152505090506000600281111561233757fe5b8160600151600281111561234757fe5b1415612388576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161237f90614c13565b60405180910390fd5b600061239483856136a1565b9050806123d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123cd90614c73565b60405180910390fd5b60606123e185612ac9565b90506000600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015612479578160020183600183038151811061244957fe5b602002602001015160405161245e9190614aa1565b9081526020016040518091039020915080600101905061242d565b50600060018260010186600001516040516124949190614aa1565b9081526020016040518091039020540390506124ae613a4f565b826000016001846000018054905003815481106124c757fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156125795780601f1061254e57610100808354040283529160200191612579565b820191906000526020600020905b81548152906001019060200180831161255c57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff1660028111156125c557fe5b60028111156125d057fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561264857602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116126125790505b50505050508152505090508083600001838154811061266357fe5b9060005260206000209060050201600082015181600001908051906020019061268d929190613a8b565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff021916908360028111156126dc57fe5b021790555060808201518160040190805190602001906126fd929190613b0b565b509050508260000180548061270e57fe5b6001900381819060005260206000209060050201600080820160006127339190613bb1565b6001820160006101000a81549060ff021916905560028201600090556003820160006101000a81549060ff02191690556004820160006127739190613bf9565b5050905582600101866000015160405161278d9190614aa1565b9081526020016040518091039020548360010182600001516040516127b29190614aa1565b90815260200160405180910390208190555060008360010187600001516040516127dc9190614aa1565b9081526020016040518091039020819055508560400151600760008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505050505050505050565b600080606061285784612d2d565b91509150612863613a4f565b61286d838361328d565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156129115780601f106128e657610100808354040283529160200191612911565b820191906000526020600020905b8154815290600101906020018083116128f457829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561295d57fe5b600281111561296857fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156129e057602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116129aa5790505b5050505050815250509050600160028111156129f857fe5b81606001516002811115612a0857fe5b1480612a2d5750600280811115612a1b57fe5b81606001516002811115612a2b57fe5b145b612a6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a6390614df3565b60405180910390fd5b6000612a788484613705565b809650819250505080612ac0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ab790614e53565b60405180910390fd5b50505050919050565b6060612ad3613c6a565b612adc8361376e565b9050612ae6613c6a565b612b246040518060400160405280600181526020017f2f0000000000000000000000000000000000000000000000000000000000000081525061376e565b905060606001612b3d838561379c90919063ffffffff16565b01604051908082528060200260200182016040528015612b7157816020015b6060815260200190600190039081612b5c5790505b50905060008090505b8151811015612bc257612b9e612b99848661381190919063ffffffff16565b61382b565b828281518110612baa57fe5b60200260200101819052508080600101915050612b7a565b50600081600183510381518110612bd557fe5b6020026020010151511415612c405780600182510381518110612bf457fe5b6020026020010160608152506001815103604051908082528060200260200182016040528015612c3857816020015b6060815260200190600190039081612c235790505b509350612c79565b8051604051908082528060200260200182016040528015612c7557816020015b6060815260200190600190039081612c605790505b5093505b60008090505b8451811015612cc057818181518110612c9457fe5b6020026020010151858281518110612ca857fe5b60200260200101819052508080600101915050612c7f565b50505050919050565b60008060016020601f85510181612cdc57fe5b040190506040518481526020810160005b83811015612d0e578060200286015181602002830152806001019050612ced565b50602082602085026040018460006010600019f1935050505092915050565b6000606060006028905080845111612d7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d7190614c93565b60405180910390fd5b6060816040519080825280601f01601f191660200182016040528015612daf5781602001600182028038833980820191505090505b50905060008090505b82811015612e1f57858181518110612dcc57fe5b602001015160f81c60f81b828281518110612de357fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050612db8565b50600080905060008090505b83811015612f4e576000838281518110612e4157fe5b602001015160f81c60f81b60f81c60ff16905060308110158015612e66575060398111155b80612e7f575060418110158015612e7e5750605a8111155b5b80612e98575060618110158015612e97575060668111155b5b612ed7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ece90614c93565b60405180910390fd5b60308110158015612ee9575060398111155b15612efa5760308103601084020192505b60418110158015612f0c5750605a8111155b15612f1d5760378103601084020192505b60618110158015612f2f575060668111155b15612f405760578103601084020192505b508080600101915050612e2b565b508094507f2f00000000000000000000000000000000000000000000000000000000000000868481518110612f7f57fe5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612fec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fe390614c93565b60405180910390fd5b6000600184885103039050806040519080825280601f01601f19166020018201604052801561302a5781602001600182028038833980820191505090505b50945060008090505b818110156130a5576000886001878401018151811061304e57fe5b602001015160f81c60f81b90508087838151811061306857fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350508080600101915050613033565b5050505050915091565b60006040516020016130c090614ae4565b60405160208183030381529060405280519060200120826040516020016130e79190614ab8565b604051602081830303815290604052805190602001201480613152575060405160200161311390614acf565b604051602081830303815290604052805190602001208260405160200161313a9190614ab8565b60405160208183030381529060405280519060200120145b8061315e575060008251145b1561316c576000905061318b565b60008251905060ff81111561318557600091505061318b565b60019150505b919050565b60008060016020601f855101816131a357fe5b040190506040518481526020810160005b838110156131d55780602002860151816020028301528060010190506131b4565b5060208260208502604001846000600f600019f1935050505092915050565b600073d2001000000000000000000000000000000000d273ffffffffffffffffffffffffffffffffffffffff166383e781fe6040518163ffffffff1660e01b815260040160206040518083038186803b15801561325057600080fd5b505afa158015613264573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506132889190810190613e2f565b905090565b6000606061329a83612ac9565b90506000600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b82518110156133ab5760008260010184600184038151811061330457fe5b60200260200101516040516133199190614aa1565b90815260200160405180910390205411613368576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161335f90614cb3565b60405180910390fd5b8160020183600183038151811061337b57fe5b60200260200101516040516133909190614aa1565b908152602001604051809103902091508060010190506132e6565b50606060018351116133bd57846133d6565b826001845103815181106133cd57fe5b60200260200101515b9050600082600101826040516133ec9190614ab8565b9081526020016040518091039020541161343b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161343290614cb3565b60405180910390fd5b600082600001600184600101846040516134559190614ab8565b908152602001604051809103902054038154811061346f57fe5b906000526020600020906005020190508094505050505092915050565b60008060016020601f8551018161349f57fe5b04019050600060016020601f885101816134b557fe5b040190506040518781526020810160005b838110156134e75780602002890151816020028301528060010190506134c6565b50868360200282015260005b8481101561351957806020028701518185600101016020028301528060010190506134f3565b50602082848601602002606001846000600c600019f1945050505050949350505050565b6000613547613c45565b600060016020601f8851018161355957fe5b0401905060006020601f86018161356c57fe5b0490506040518881526020810160005b8481101561359d57806020028a01518160200283015280600101905061357c565b5083602002810188815287816020015283602002868660030160200285600a600019fa9650505050505094509492505050565b60008060016020601f855101816135e357fe5b040190506040518481526020810160005b838110156136155780602002860151816020028301528060010190506135f4565b50602082602085026040018460006011600019f1935050505092915050565b60008060016020601f8651018161364757fe5b040190506040518581526020810160005b83811015613679578060200287015181602002830152806001019050613658565b50846020840282015260208260208502604001846000600b600019f193505050509392505050565b60008060016020601f855101816136b457fe5b040190506040518481526020810160005b838110156136e65780602002860151816020028301528060010190506136c5565b5060208260208502604001846000600e600019f1935050505092915050565b600080600060016020601f8651018161371a57fe5b040190506040518581526020810160005b8381101561374c57806020028701518160200283015280600101905061372b565b506020826020850260200184600d600019fa9450815193505050509250929050565b613776613c6a565b600060208301905060405180604001604052808451815260200182815250915050919050565b60008082600001516137c0856000015186602001518660000151876020015161388d565b0190505b8360000151846020015101811161380a578180600101925050826000015161380285602001518303866000015103838660000151876020015161388d565b0190506137c4565b5092915050565b613819613c6a565b613824838383613968565b5092915050565b60608082600001516040519080825280601f01601f1916602001820160405280156138655781602001600182028038833980820191505090505b50905060006020820190506138838185602001518660000151613a06565b8192505050919050565b6000808490506000868511613958576020851161391257600060018660200360080260020a031960001b905060008186511690506000878a8a0103905060008386511690505b828114613904578186106138f1578a8a019650505050505050613960565b85806001019650508386511690506138d3565b859650505050505050613960565b60008585209050600091505b85880382116139565760008684209050808214156139425783945050505050613960565b60018401935050818060010192505061391e565b505b868601925050505b949350505050565b613970613c6a565b600061398e856000015186602001518660000151876020015161388d565b905084602001518360200181815250508460200151810383600001818152505084600001518560200151018114156139d05760008560000181815250506139fb565b8360000151836000015101856000018181510391508181525050836000015181018560200181815250505b829150509392505050565b5b60208110613a2a5781518352602083019250602082019150602081039050613a07565b60006001826020036101000a0390508019835116818551168181178652505050505050565b6040518060a00160405280606081526020016000151581526020016000815260200160006002811115613a7e57fe5b8152602001606081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613acc57805160ff1916838001178555613afa565b82800160010185558215613afa579182015b82811115613af9578251825591602001919060010190613ade565b5b509050613b079190613c84565b5090565b82805482825590600052602060002090601f01602090048101928215613ba05791602002820160005b83821115613b7157835183826101000a81548160ff0219169083151502179055509260200192600101602081600001049283019260010302613b34565b8015613b9e5782816101000a81549060ff0219169055600101602081600001049283019260010302613b71565b505b509050613bad9190613ca9565b5090565b50805460018160011615610100020316600290046000825580601f10613bd75750613bf6565b601f016020900490600052602060002090810190613bf59190613c84565b5b50565b50805460008255601f016020900490600052602060002090810190613c1e9190613c84565b50565b5080546000825560050290600052602060002090810190613c429190613cd9565b50565b6040518062100000016040528061800090602082028038833980820191505090505090565b604051806040016040528060008152602001600081525090565b613ca691905b80821115613ca2576000816000905550600101613c8a565b5090565b90565b613cd691905b80821115613cd257600081816101000a81549060ff021916905550600101613caf565b5090565b90565b613d4591905b80821115613d415760008082016000613cf89190613bb1565b6001820160006101000a81549060ff021916905560028201600090556003820160006101000a81549060ff0219169055600482016000613d389190613bf9565b50600501613cdf565b5090565b90565b600081359050613d578161510d565b92915050565b600081519050613d6c8161510d565b92915050565b600082601f830112613d8357600080fd5b8135613d96613d9182614efb565b614ece565b91508082526020830160208301858383011115613db257600080fd5b613dbd8382846150ad565b50505092915050565b600082601f830112613dd757600080fd5b8135613dea613de582614f27565b614ece565b91508082526020830160208301858383011115613e0657600080fd5b613e118382846150ad565b50505092915050565b600081359050613e2981615124565b92915050565b600060208284031215613e4157600080fd5b6000613e4f84828501613d5d565b91505092915050565b60008060408385031215613e6b57600080fd5b6000613e7985828601613d48565b9250506020613e8a85828601613e1a565b9150509250929050565b600060208284031215613ea657600080fd5b600082013567ffffffffffffffff811115613ec057600080fd5b613ecc84828501613dc6565b91505092915050565b60008060408385031215613ee857600080fd5b600083013567ffffffffffffffff811115613f0257600080fd5b613f0e85828601613dc6565b9250506020613f1f85828601613e1a565b9150509250929050565b600080600060608486031215613f3e57600080fd5b600084013567ffffffffffffffff811115613f5857600080fd5b613f6486828701613dc6565b9350506020613f7586828701613e1a565b925050604084013567ffffffffffffffff811115613f9257600080fd5b613f9e86828701613d72565b9150509250925092565b600080600060608486031215613fbd57600080fd5b600084013567ffffffffffffffff811115613fd757600080fd5b613fe386828701613dc6565b9350506020613ff486828701613e1a565b925050604061400586828701613e1a565b9150509250925092565b600061401b838361417d565b60208301905092915050565b6000614033838361418c565b60208301905092915050565b600061404b8383614a06565b905092915050565b600061405e82614f7d565b6140688185614fdc565b935061407383614f53565b8060005b838110156140a457815161408b888261400f565b975061409683614fb5565b925050600181019050614077565b5085935050505092915050565b6140ba81614f88565b6140c48184614fed565b92506140cf82614f63565b8060005b838110156141005781516140e78782614027565b96506140f283614fc2565b9250506001810190506140d3565b505050505050565b600061411382614f94565b61411d8185614ff8565b93508360208202850161412f85614f6d565b8060005b8581101561416b578484038952815161414c858261403f565b945061415783614fcf565b925060208a01995050600181019050614133565b50829750879550505050505092915050565b61418681615048565b82525050565b61419581615054565b82525050565b6141a48161509b565b82525050565b6141b38161509b565b82525050565b60006141c482614faa565b6141ce818561502b565b93506141de8185602086016150bc565b80840191505092915050565b60006141f582614f9f565b6141ff8185615009565b935061420f8185602086016150bc565b614218816150ef565b840191505092915050565b600061422e82614f9f565b614238818561502b565b93506142488185602086016150bc565b80840191505092915050565b600061426160188361501a565b91507f496e636f7272656374206368756e6b20706f736974696f6e00000000000000006000830152602082019050919050565b60006142a160158361501a565b91507f4469726563746f7279206e6f74206372656174656400000000000000000000006000830152602082019050919050565b60006142e160248361501a565b91507f4e6f7420656e6f756768206d656d6f727920696e207468652046696c6573746f60008301527f72616765000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614347601b8361501a565b91507f48617368206861736e2774206265656e2063616c63756c6174656400000000006000830152602082019050919050565b600061438760198361501a565b91507f4368756e6b20697320616c72656164792075706c6f61646564000000000000006000830152602082019050919050565b60006143c760168361501a565b91507f496e636f7272656374206368756e6b206c656e677468000000000000000000006000830152602082019050919050565b6000614407600f8361501a565b91507f46696c65206e6f742065786973747300000000000000000000000000000000006000830152602082019050919050565b6000614447600e8361501a565b91507f496e76616c69642073656e6465720000000000000000000000000000000000006000830152602082019050919050565b600061448760188361501a565b91507f4469726563746f7279206973206e6f742064656c6574656400000000000000006000830152602082019050919050565b60006144c760108361501a565b91507f46696c65206e6f742064656c65746564000000000000000000000000000000006000830152602082019050919050565b600061450760138361501a565b91507f496e76616c69642073746f7261676550617468000000000000000000000000006000830152602082019050919050565b6000614547600c8361501a565b91507f496e76616c6964207061746800000000000000000000000000000000000000006000830152602082019050919050565b600061458760018361502b565b91507f2e000000000000000000000000000000000000000000000000000000000000006000830152600182019050919050565b60006145c760168361501a565b91507f496e76616c6964206469726563746f7279206e616d65000000000000000000006000830152602082019050919050565b600061460760158361501a565b91507f4368756e6b207761736e27742075706c6f6164656400000000000000000000006000830152602082019050919050565b600061464760268361501a565b91507f436f756c64206e6f742072657365727665206c657373207468616e207573656460008301527f20737061636500000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006146ad60168361501a565b91507f4469726563746f7279206973206e6f7420656d707479000000000000000000006000830152602082019050919050565b60006146ed60238361501a565b91507f46696c65206861736e2774206265656e2075706c6f6164656420636f7272656360008301527f746c7900000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061475360118361501a565b91507f4368756e6b207761736e277420726561640000000000000000000000000000006000830152602082019050919050565b600061479360188361501a565b91507f46696c656e616d652073686f756c64206265203c2032353600000000000000006000830152602082019050919050565b60006147d3601f8361501a565b91507f46696c652073686f756c64206265206c657373207468616e20313030204d42006000830152602082019050919050565b600061481360028361502b565b91507f2e2e0000000000000000000000000000000000000000000000000000000000006000830152600282019050919050565b600061485360118361501a565b91507f4469726563746f72792069732066756c6c0000000000000000000000000000006000830152602082019050919050565b6000614893600e8361501a565b91507f46696c65206e6f7420666f756e640000000000000000000000000000000000006000830152602082019050919050565b60006148d360188361501a565b91507f46696c65206f72206469726563746f72792065786973747300000000000000006000830152602082019050919050565b600061491360198361501a565b91507f4e6f7420656e6f756768207265736572766564207370616365000000000000006000830152602082019050919050565b600061495360188361501a565b91507f45564d206572726f7220696e2067657446696c6553697a6500000000000000006000830152602082019050919050565b600061499360108361501a565b91507f46696c65206e6f742063726561746564000000000000000000000000000000006000830152602082019050919050565b60006149d360198361501a565b91507f46696c65206861736e2774206265656e2075706c6f61646564000000000000006000830152602082019050919050565b600060a0830160008301518482036000860152614a2382826141ea565b9150506020830151614a38602086018261417d565b506040830151614a4b6040860182614a83565b506060830151614a5e606086018261419b565b5060808301518482036080860152614a768282614053565b9150508091505092915050565b614a8c81615091565b82525050565b614a9b81615091565b82525050565b6000614aad8284614223565b915081905092915050565b6000614ac482846141b9565b915081905092915050565b6000614ada8261457a565b9150819050919050565b6000614aef82614806565b9150819050919050565b60006210000082019050614b1060008301846140b1565b92915050565b60006020820190508181036000830152614b308184614108565b905092915050565b6000602082019050614b4d60008301846141aa565b92915050565b60006020820190508181036000830152614b6c81614254565b9050919050565b60006020820190508181036000830152614b8c81614294565b9050919050565b60006020820190508181036000830152614bac816142d4565b9050919050565b60006020820190508181036000830152614bcc8161433a565b9050919050565b60006020820190508181036000830152614bec8161437a565b9050919050565b60006020820190508181036000830152614c0c816143ba565b9050919050565b60006020820190508181036000830152614c2c816143fa565b9050919050565b60006020820190508181036000830152614c4c8161443a565b9050919050565b60006020820190508181036000830152614c6c8161447a565b9050919050565b60006020820190508181036000830152614c8c816144ba565b9050919050565b60006020820190508181036000830152614cac816144fa565b9050919050565b60006020820190508181036000830152614ccc8161453a565b9050919050565b60006020820190508181036000830152614cec816145ba565b9050919050565b60006020820190508181036000830152614d0c816145fa565b9050919050565b60006020820190508181036000830152614d2c8161463a565b9050919050565b60006020820190508181036000830152614d4c816146a0565b9050919050565b60006020820190508181036000830152614d6c816146e0565b9050919050565b60006020820190508181036000830152614d8c81614746565b9050919050565b60006020820190508181036000830152614dac81614786565b9050919050565b60006020820190508181036000830152614dcc816147c6565b9050919050565b60006020820190508181036000830152614dec81614846565b9050919050565b60006020820190508181036000830152614e0c81614886565b9050919050565b60006020820190508181036000830152614e2c816148c6565b9050919050565b60006020820190508181036000830152614e4c81614906565b9050919050565b60006020820190508181036000830152614e6c81614946565b9050919050565b60006020820190508181036000830152614e8c81614986565b9050919050565b60006020820190508181036000830152614eac816149c6565b9050919050565b6000602082019050614ec86000830184614a92565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614ef157600080fd5b8060405250919050565b600067ffffffffffffffff821115614f1257600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614f3e57600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050919050565b6000819050602082019050919050565b600081519050919050565b60006180009050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061504182615071565b9050919050565b60008115159050919050565b6000819050919050565b600081905061506c82615100565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006150a68261505e565b9050919050565b82818337600083830152505050565b60005b838110156150da5780820151818401526020810190506150bf565b838111156150e9576000848401525b50505050565b6000601f19601f8301169050919050565b6003811061510a57fe5b50565b61511681615036565b811461512157600080fd5b50565b61512d81615091565b811461513857600080fd5b5056fea2646970667358221220a549ad9e778ae8bb3048c0a1805e77745871cc1560637ae1c3ebccb76638d9c464736f6c63430006020033", + "nonce": "0", + "storage": {} + }, + "0xa096b05a489831db893fc53aacc7ed20efb36382": { + "balance": "1000000000000000000000000000000" + }, + "0xa1cd651d99283be60e2a9d2e3bc8a90aedb8244f": { + "balance": "1000000000000000000000000000000" + }, + "0xa2969e82619021ea407338f8bdf7c6f2bd679673": { + "balance": "1000000000000000000000000000000" + }, + "0xa3597b1162b6559cb5e966904b63e762ece756a4": { + "balance": "1000000000000000000000000000000" + }, + "0xa68f946090c600eda6f139783077ee802afeb990": { + "balance": "1000000000000000000000000000000" + }, + "0xa6d50055592cecb795bc1ed3b9ea57ed426b0b7c": { + "balance": "1000000000000000000000000000000" + }, + "0xa7c0789bdeee38c6b59111a789dfb6b815489847": { + "balance": "1000000000000000000000000000000" + }, + "0xa8c813ee806b4c8537ff5f16084d44db18ea9ab1": { + "balance": "1000000000000000000000000000000" + }, + "0xaa6a87bbb74bc1f3cb40c1efb7fc171ee6407560": { + "balance": "1000000000000000000000000000000" + }, + "0xabf920b89f5a2487fdb70be17fd01a99a0602e62": { + "balance": "1000000000000000000000000000000" + }, + "0xac5df92da5171ba24a9618018b4f79494040334b": { + "balance": "1000000000000000000000000000000" + }, + "0xaf97a8318a1a51d5daeeb9650024b63ee44f45bd": { + "balance": "1000000000000000000000000000000" + }, + "0xb28c45b98ae43a5e9ee5509c97ea037b5de5d6d9": { + "balance": "1000000000000000000000000000000" + }, + "0xb64989ab32b089da3da103b93e6781d6d5dd10b4": { + "balance": "1000000000000000000000000000000" + }, + "0xb67e6f4a21f93c250fa6ff0cb142bd14dd4ca8eb": { + "balance": "1000000000000000000000000000000" + }, + "0xb70603c505f85130b5b2e73cd82d196dfd7d8b5e": { + "balance": "1000000000000000000000000000000" + }, + "0xb942414cae2a1ab1056657b905845c0ab6b6280a": { + "balance": "1000000000000000000000000000000" + }, + "0xbee0e5c1961d51be9bd670876caa9c90ba7d9016": { + "balance": "1000000000000000000000000000000" + }, + "0xbf2d8cebdeeb8ad8fed7b2a75f35922106f8d75c": { + "balance": "1000000000000000000000000000000" + }, + "0xbf5aa678b969c0871e2fbcf09c3dbb5d5865ac1e": { + "balance": "1000000000000000000000000000000" + }, + "0xc12bcedd9bcad9120150122cd50f39576ecccc08": { + "balance": "1000000000000000000000000000000" + }, + "0xc2d3852f3292acb81bd164dbae5f1e2a87535150": { + "balance": "1000000000000000000000000000000" + }, + "0xc3820490201e94d76b44655d2df713fec29d9795": { + "balance": "1000000000000000000000000000000" + }, + "0xc58744e2eceefd45cc5469f0e0a708ad24ddbbdb": { + "balance": "1000000000000000000000000000000" + }, + "0xc7865200e8e51ba1c8d695f327deed432930f2cc": { + "balance": "1000000000000000000000000000000" + }, + "0xc8e4d709eb3eb335dc69c9fbf2d24d447cb86105": { + "balance": "1000000000000000000000000000000" + }, + "0xc98af661e44c5bf31d2f8bdff4bbf2808ed4e991": { + "balance": "1000000000000000000000000000000" + }, + "0xca4409573a5129a72edf85d6c51e26760fc9c903": { + "balance": "100000000000000000000000" + }, + "0xcc33e23b04b74f7ba8fbe315083182224af973fa": { + "balance": "1000000000000000000000000000000" + }, + "0xce1c62d0a77600fb2f959b4da76fcb9b3b9430a3": { + "balance": "1000000000000000000000000000000" + }, + "0xd1b6c947fb14060b38945584714491592e84875d": { + "balance": "1000000000000000000000000000000" + }, + "0xd23cd6a9ddcc3470300003621bbac1e06a7919d5": { + "balance": "1000000000000000000000000000000" + }, + "0xd2c5b39B4e735C17612Bb5a08FD024ccc5dBCb23": { + "balance": "100000000000000000000000" + }, + "0xd2cd302eb060e375a65d65946692a3ac2d838d35": { + "balance": "1000000000000000000000000000000" + }, + "0xd2e75c41ced8699e3176f6e335355701a2568b7b": { + "balance": "1000000000000000000000000000000" + }, + "0xd3d38f4cb0aeb4c7c2527ddaeec2ab3b910c8528": { + "balance": "1000000000000000000000000000000" + }, + "0xd5b561a27cca5049650a14ab93dbf1a20c0cefc1": { + "balance": "1000000000000000000000000000000" + }, + "0xd90045420b8abc37b3f9304ed2b385fc1b7fa8c5": { + "balance": "1000000000000000000000000000000" + }, + "0xd951bf4cff429062702a7d8699a5f0bf14845d9b": { + "balance": "1000000000000000000000000000000" + }, + "0xdc6a269c58e58a93a22b5df8cdf1af630c47481f": { + "balance": "1000000000000000000000000000000" + }, + "0xdc6d02ef4003a4f2d0ccff65ae1a2d8157fbb23e": { + "balance": "1000000000000000000000000000000" + }, + "0xde14aca36acc62c305a7ee571da37840a408e600": { + "balance": "1000000000000000000000000000000" + }, + "0xdee32ae508cf783f53ab8bc39d878fe323cdfae3": { + "balance": "1000000000000000000000000000000" + }, + "0xe083a100d51fc4f38aae4a3a68404c36ad96c612": { + "balance": "1000000000000000000000000000000" + }, + "0xe1607990ce800407e3c206e58de4917977181d4d": { + "balance": "1000000000000000000000000000000" + }, + "0xe25e5b63dfd4cf59b81eddf64f1195858634b8a6": { + "balance": "1000000000000000000000000000000" + }, + "0xe372377decb3bdc0c7f5272d38ce0ba2a54934fe": { + "balance": "1000000000000000000000000000000" + }, + "0xe3cc6ec63b5652d1594bc63bb293f4e80f76dbdd": { + "balance": "1000000000000000000000000000000" + }, + "0xe3da7c014286258944ab20a31e4d861b4c9262f1": { + "balance": "1000000000000000000000000000000" + }, + "0xe8b57f330d56081c856e618210fbedb414925ff0": { + "balance": "1000000000000000000000000000000" + }, + "0xe91ac72a568e752eb7c9f5235100586ce97c8cc1": { + "balance": "1000000000000000000000000000000" + }, + "0xf184c8c243a178c1748a0af45caedeca476105b4": { + "balance": "1000000000000000000000000000000" + }, + "0xf1a5912ff318aebf312cdb54c75642a9e632703c": { + "balance": "1000000000000000000000000000000" + }, + "0xf2197b153b4c9086fc5410431fbf7960d284c65e": { + "balance": "1000000000000000000000000000000" + }, + "0xf36620e71327f4a55d550d46e030ccf0c728f154": { + "balance": "1000000000000000000000000000000" + }, + "0xf9817fB82fc767aA9A4A97a1901676244b88ce0E": { + "balance": "100000000000000000000000" + }, + "0xfa723938fa8da1a8a2114ad409a11581761ee40d": { + "balance": "1000000000000000000000000000000" + }, + "0xfa7a8c69810eaf16a395d2a93b3ab51efeed2a1c": { + "balance": "1000000000000000000000000000000" + }, + "0xfaa1038074941571524934ba52d312e88b3577f5": { + "balance": "1000000000000000000000000000000" + }, + "0xfe14077c26a507496b7208384d459e21c49c4212": { + "balance": "1000000000000000000000000000000" + }, + "0xfe275c9b5ac792327da509b27eb9614196dfb07d": { + "balance": "1000000000000000000000000000000" + }, + "0xfe2c5aa110fff89361806ea7ee080bfffba0d3dd": { + "balance": "1000000000000000000000000000000" + }, + "0xfe3d4f1fc038f4f756ba44995129cd45c9e0e861": { + "balance": "1000000000000000000000000000000" + }, + "0xfee314cdc84ecfaa675e41b3559c0101e1eba6b8": { + "balance": "1000000000000000000000000000000" + } + }, + "genesis": { + "author": "0x0000000000000000000000000000000000000001", + "difficulty": "0x0", + "extraData": "0x11bbe8db4e347b4e8c937c1c8370e4b5ed33adb3db69cbdb7a38e1e50b1b82fa", + "gasLimit": "0xFFFFFFFFF", + "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000abc", + "nonce": "0x0000000000000042", + "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "timestamp": "0x00" + }, + "params": { + "EIP150ForkBlock": "0x00", + "EIP158ForkBlock": "0x00", + "accountStartNonce": "0x00", + "blockReward": "0x4563918244F40000", + "byzantiumForkBlock": "0x0", + "chainID": "0x12345", + "constantinopleForkBlock": "0x0", + "daoHardforkBlock": "0x0", + "difficultyBoundDivisor": "0x0800", + "durationLimit": "0x0d", + "externalGasDifficulty": "0x01", + "gasLimitBoundDivisor": "0x0400", + "homesteadForkBlock": "0x0", + "maxGasLimit": "0xFFFFFFFFF", + "maximumExtraDataSize": "0x20", + "minGasLimit": "0xFFFFFFFFF", + "minimumDifficulty": "0x0", + "networkID": "12313219", + "tieBreakingGas": false + }, + "sealEngine": "Ethash", + "skaleConfig": { + "nodeInfo": { + "basePort": 1631, + "bindIP": "0.0.0.0", + "collectionDuration": 10, + "collectionQueueSize": 2, + "db-path": "/tmp/test_eth_5_of_16", + "ecdsaKeyName": "", + "httpRpcPort": 1634, + "httpsRpcPort": 1239, + "logLevel": "info", + "logLevelProposal": "info", + "maxCacheSize": 2000, + "maxOpenLeveldbFiles": 25, + "minCacheSize": 1000, + "nodeID": 1605, + "nodeName": "Node1", + "rotateAfterBlock": 0, + "testSignatures": true, + "transactionQueueSize": 10000, + "wsRpcPort": 1633, + "wssRpcPort": 1638 + }, + "sChain": { + "EIP1559TransactionsPatchTimestamp": 1, + "contractStorageLimit": 10000000000, + "contractStoragePatchTimestamp": 1, + "contractStorageZeroValuePatchTimestamp": 1, + "correctForkInPowPatchTimestamp": 1, + "emptyBlockIntervalMs": 10000, + "fastConsensusPatchTimestamp": 1, + "flexibleDeploymentPatchTimestamp": 1, + "levelDBReopenIntervalMs": 1, + "multiTransactionMode": false, + "nodes": [ + { + "basePort": 1231, + "ip": "127.0.0.1", + "nodeID": 1601, + "publicKey": "", + "schainIndex": 1 + }, + { + "basePort": 1331, + "ip": "127.0.0.1", + "nodeID": 1602, + "publicKey": "", + "schainIndex": 2 + }, + { + "basePort": 1431, + "ip": "127.0.0.1", + "nodeID": 1603, + "publicKey": "", + "schainIndex": 3 + }, + { + "basePort": 1531, + "ip": "127.0.0.1", + "nodeID": 1604, + "publicKey": "", + "schainIndex": 4 + }, + { + "basePort": 1631, + "ip": "127.0.0.1", + "nodeID": 1605, + "publicKey": "", + "schainIndex": 5 + }, + { + "basePort": 1731, + "ip": "127.0.0.1", + "nodeID": 1606, + "publicKey": "", + "schainIndex": 6 + }, + { + "basePort": 1831, + "ip": "127.0.0.1", + "nodeID": 1607, + "publicKey": "", + "schainIndex": 7 + }, + { + "basePort": 1931, + "ip": "127.0.0.1", + "nodeID": 1608, + "publicKey": "", + "schainIndex": 8 + }, + { + "basePort": 2031, + "ip": "127.0.0.1", + "nodeID": 1609, + "publicKey": "", + "schainIndex": 9 + }, + { + "basePort": 2131, + "ip": "127.0.0.1", + "nodeID": 1610, + "publicKey": "", + "schainIndex": 10 + }, + { + "basePort": 2231, + "ip": "127.0.0.1", + "nodeID": 1611, + "publicKey": "", + "schainIndex": 11 + }, + { + "basePort": 2331, + "ip": "127.0.0.1", + "nodeID": 1612, + "publicKey": "", + "schainIndex": 12 + }, + { + "basePort": 2431, + "ip": "127.0.0.1", + "nodeID": 1613, + "publicKey": "", + "schainIndex": 13 + }, + { + "basePort": 2531, + "ip": "127.0.0.1", + "nodeID": 1614, + "publicKey": "", + "schainIndex": 14 + }, + { + "basePort": 2631, + "ip": "127.0.0.1", + "nodeID": 1615, + "publicKey": "", + "schainIndex": 15 + }, + { + "basePort": 2731, + "ip": "127.0.0.1", + "nodeID": 1616, + "publicKey": "", + "schainIndex": 16 + } + ], + "powCheckPatchTimestamp": 1, + "precompiledConfigPatchTimestamp": 1, + "pushZeroPatchTimestamp": 1, + "revertableFSPatchTimestamp": 1, + "schainID": 5, + "schainName": "TestChain", + "schainOwner": "0x907cd0881E50d359bb9Fd120B1A5A143b1C97De6", + "skipInvalidTransactionsPatchTimestamp": 1, + "storageDestructionPatchTimestamp": 1, + "verifyBlsSyncPatchTimestamp": 1, + "verifyDaSigsPatchTimestamp": 1 + } + }, + "unddos": { + "origins": [ + { + "ban_lengthy": 0, + "ban_peak": 0, + "max_calls_per_minute": 1000000000, + "max_calls_per_second": 1000000000, + "max_ws_conn": 65535, + "origin": [ + "*" + ] + } + ] + } +} \ No newline at end of file diff --git a/test/historicstate/configs/test_6_of_16.json b/test/historicstate/configs/test_6_of_16.json new file mode 100644 index 000000000..ae5fe2f38 --- /dev/null +++ b/test/historicstate/configs/test_6_of_16.json @@ -0,0 +1,910 @@ +{ + "accounts": { + "0000000000000000000000000000000000000001": { + "precompiled": { + "linear": { + "base": 3000, + "word": 0 + }, + "name": "ecrecover" + } + }, + "0000000000000000000000000000000000000002": { + "precompiled": { + "linear": { + "base": 60, + "word": 12 + }, + "name": "sha256" + } + }, + "0000000000000000000000000000000000000003": { + "precompiled": { + "linear": { + "base": 600, + "word": 120 + }, + "name": "ripemd160" + } + }, + "0000000000000000000000000000000000000004": { + "precompiled": { + "linear": { + "base": 15, + "word": 3 + }, + "name": "identity" + } + }, + "0000000000000000000000000000000000000005": { + "precompiled": { + "name": "modexp", + "startingBlock": "0x2dc6c0" + } + }, + "0000000000000000000000000000000000000006": { + "precompiled": { + "linear": { + "base": 500, + "word": 0 + }, + "name": "alt_bn128_G1_add", + "startingBlock": "0x2dc6c0" + } + }, + "0000000000000000000000000000000000000007": { + "precompiled": { + "linear": { + "base": 40000, + "word": 0 + }, + "name": "alt_bn128_G1_mul", + "startingBlock": "0x2dc6c0" + } + }, + "0000000000000000000000000000000000000008": { + "precompiled": { + "name": "alt_bn128_pairing_product", + "startingBlock": "0x2dc6c0" + } + }, + "000000000000000000000000000000000000000A": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "readChunk", + "startingBlock": "0x0" + } + }, + "000000000000000000000000000000000000000B": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "createFile", + "restrictAccess": [ + "69362535ec535F0643cBf62D16aDeDCAf32Ee6F7" + ], + "startingBlock": "0x0" + } + }, + "000000000000000000000000000000000000000C": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "uploadChunk", + "startingBlock": "0x0" + } + }, + "000000000000000000000000000000000000000D": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "getFileSize", + "startingBlock": "0x0" + } + }, + "000000000000000000000000000000000000000E": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "deleteFile", + "startingBlock": "0x0" + } + }, + "000000000000000000000000000000000000000F": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "createDirectory", + "startingBlock": "0x0" + } + }, + "0000000000000000000000000000000000000010": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "deleteDirectory", + "startingBlock": "0x0" + } + }, + "0x006d8e49ce0b9eb5646e34a4d91934801b9044fd": { + "balance": "1000000000000000000000000000000" + }, + "0x0150b461b06922a5030784ba888962c28bb1f188": { + "balance": "1000000000000000000000000000000" + }, + "0x03309956988ae70152ae4469daf99b0cac2306c5": { + "balance": "1000000000000000000000000000000" + }, + "0x06104a85a380895b6dd4030113806df2b044905e": { + "balance": "1000000000000000000000000000000" + }, + "0x079cf317ef40b16141784b6fabff812d64f7c0fd": { + "balance": "1000000000000000000000000000000" + }, + "0x0966454f51166c68b73b2865473c8fb2fcdefdd5": { + "balance": "1000000000000000000000000000000" + }, + "0x099452fedc71897880f584b1bc1706efc4e76e36": { + "balance": "1000000000000000000000000000000" + }, + "0x0aa6a44690ef52354e976990292cf9c5cd36ad59": { + "balance": "1000000000000000000000000000000" + }, + "0x0fbbe17a0e5a61ee3e8661f442d7f6b177c49820": { + "balance": "1000000000000000000000000000000" + }, + "0x1239fe658b410dbbac5bbd572035f5041542f9e5": { + "balance": "1000000000000000000000000000000" + }, + "0x12d5d7340a93be7be28ea7a3ae198242f8e1282c": { + "balance": "1000000000000000000000000000000" + }, + "0x137048b9fa4f1234d6519271b2c5ec64f480db0f": { + "balance": "1000000000000000000000000000000" + }, + "0x13867af77a63048e17380e39248ada90521e97e4": { + "balance": "1000000000000000000000000000000" + }, + "0x138ea4bdf0382c2deffd5b0bff0afe59f471467f": { + "balance": "1000000000000000000000000000000" + }, + "0x13d19c55ee0a212249d26b9d741ff6d7f416db01": { + "balance": "1000000000000000000000000000000" + }, + "0x157d38b52196b248e9fe6a2172e32ce2b8c078e6": { + "balance": "1000000000000000000000000000000" + }, + "0x16e8c390f8e576161cfe966f2c3e5dd303eb9039": { + "balance": "1000000000000000000000000000000" + }, + "0x194cb9991d3d94c43e400becf21dfea45e7b3b4c": { + "balance": "1000000000000000000000000000000" + }, + "0x1C9abe4ff0CcECa40fc404c74AB7d4923fEF8901": { + "balance": "100000000000000000000000" + }, + "0x1a66fc89809112c20aa76a993db712fa9e003e4e": { + "balance": "1000000000000000000000000000000" + }, + "0x1f1d6041e12a18cf1202019f146f2fc150915e8d": { + "balance": "1000000000000000000000000000000" + }, + "0x1feaf1671c1f0faf0d44c152f72dc755db932569": { + "balance": "1000000000000000000000000000000" + }, + "0x236bf02dfafaf03851a4e6f5d69052f4884cec32": { + "balance": "1000000000000000000000000000000" + }, + "0x26d88f6a8b659be4165ee53774a057e41b5201c9": { + "balance": "1000000000000000000000000000000" + }, + "0x28353685b0b986a724b92113debb3d8cd9a6b263": { + "balance": "1000000000000000000000000000000" + }, + "0x29d83322219fdfb821459d5fdf796360faf3166a": { + "balance": "1000000000000000000000000000000" + }, + "0x2bee474be207bdbeac83d6672da5ed2fd417eac9": { + "balance": "1000000000000000000000000000000" + }, + "0x2d93455b07bccf38e8d019f7f43a2c2d70b46b4e": { + "balance": "1000000000000000000000000000000" + }, + "0x2f971bd38806c3ca45ae0a125d1267118bf5619c": { + "balance": "1000000000000000000000000000000" + }, + "0x30aaab366dfac8331f3e827495c789cde9b437c0": { + "balance": "1000000000000000000000000000000" + }, + "0x32ea0400dc2d20664cc4744b2fab04ecb709445c": { + "balance": "1000000000000000000000000000000" + }, + "0x3760dc9594ccac0f33ade5cc5371402131696341": { + "balance": "1000000000000000000000000000000" + }, + "0x38855e430611bc179cd777a8704679ffc43921de": { + "balance": "1000000000000000000000000000000" + }, + "0x3a921471a2397644c37c88ef9572c421ab37145d": { + "balance": "1000000000000000000000000000000" + }, + "0x3bcca8a8471d55a1a668bc163c0336e4a57e5c99": { + "balance": "1000000000000000000000000000000" + }, + "0x3d46ee560227c1d73cd6042b47fc8fddd8a06ecb": { + "balance": "1000000000000000000000000000000" + }, + "0x3f5bdf5d4c274c82b8d17aa2810b00d2cf050f24": { + "balance": "1000000000000000000000000000000" + }, + "0x3ffe1c9183e0f97f52a816405a7d2350624ec88b": { + "balance": "1000000000000000000000000000000" + }, + "0x426ec5f07847674aada3856609d8baaa16805d88": { + "balance": "1000000000000000000000000000000" + }, + "0x482d7f53cba6ae73a354533673c48e2dfd560949": { + "balance": "1000000000000000000000000000000" + }, + "0x48acbd6a2724eadcc2a11144ab84b6a617d1a241": { + "balance": "1000000000000000000000000000000" + }, + "0x49ef89840e400026eb5c8d79bd1b0adc152fe86d": { + "balance": "1000000000000000000000000000000" + }, + "0x4bf989fa6572af36b190032505506f1db888357f": { + "balance": "1000000000000000000000000000000" + }, + "0x4cf9b195f7cb5f86694d9b399fe21a5f34616fd3": { + "balance": "1000000000000000000000000000000" + }, + "0x4e9b85904bca60aeb5b916ca86ac622096908427": { + "balance": "1000000000000000000000000000000" + }, + "0x50120c17d7b59200e9b76e89e4e3de2f0cd00090": { + "balance": "1000000000000000000000000000000" + }, + "0x54db355342c35085a1a53184162b2fddd0a43b0f": { + "balance": "1000000000000000000000000000000" + }, + "0x54e228d8fea148cfe2b109b3b152ff21321d09a2": { + "balance": "1000000000000000000000000000000" + }, + "0x5667601b7dcde6f24d06bccc4f291cb06976f4ee": { + "balance": "1000000000000000000000000000000" + }, + "0x57829f2ecca390cd9d1c41f92328bad4d1073bbb": { + "balance": "1000000000000000000000000000000" + }, + "0x5EF25557E2ed6AFfF321B266C93e95A0B4B05AbC": { + "balance": "1000000000000000000000000" + }, + "0x5a3adad4382b3eb1e0c65f2de2845901081039b5": { + "balance": "1000000000000000000000000000000" + }, + "0x5cdb7392efdce502ccc6fba5c3c1dd1653967b4d": { + "balance": "1000000000000000000000000000000" + }, + "0x5d012c13b2854bda8b7b6580e97e52751884f827": { + "balance": "1000000000000000000000000000000" + }, + "0x5d9326c6504833d84f8a0d65ded59b1a6e768ca2": { + "balance": "1000000000000000000000000000000" + }, + "0x60268f799d8f1808e4a32c2eb898e73a8881f6f0": { + "balance": "1000000000000000000000000000000" + }, + "0x605ba4a05d779f9869bd9a10234c22f516766cfe": { + "balance": "1000000000000000000000000000000" + }, + "0x6093f0f2a7b5148b71603ac439adbc4c0e5aa5da": { + "balance": "1000000000000000000000000000000" + }, + "0x6196d135CdDb9d73A0756C1E44b5b02B11acf594": { + "balance": "2000000000000000000000", + "code": "", + "nonce": "5076", + "storage": {} + }, + "0x62712ceccb50f62ca4c5402fff6da9c819c866cf": { + "balance": "1000000000000000000000000000000" + }, + "0x62971de462ea1ec0d3b43a6a85b6fb975e6c6f64": { + "balance": "1000000000000000000000000000000" + }, + "0x62cf32dfb9eb6358dc5deb006aef1d75fb153e5f": { + "balance": "1000000000000000000000000000000" + }, + "0x62d8b22c1d71577829b2fee20a5c3fff43aed0ec": { + "balance": "100000000000000000000000" + }, + "0x6314956b78bb2eaed1c49b3ae71d4d0ec501cfab": { + "balance": "1000000000000000000000000000000" + }, + "0x661bda4daeba3ce9ac2aa30b80d463580f90d31a": { + "balance": "1000000000000000000000000000000" + }, + "0x66c5a87f4a49DD75e970055A265E8dd5C3F8f852": { + "balance": "1000000000000000000000" + }, + "0x66cd465ddcd85504c0d2cfb1728acee994d55a3f": { + "balance": "1000000000000000000000000000000" + }, + "0x68bca79ae7aae796027ff843d2303444da5cf5d8": { + "balance": "1000000000000000000000000000000" + }, + "0x6923877b65e24966efa9efd1207822fa2eaf601a": { + "balance": "1000000000000000000000000000000" + }, + "0x69362535ec535F0643cBf62D16aDeDCAf32Ee6F7": { + "balance": "0", + "code": "0x608060405234801561001057600080fd5b50600436106100b45760003560e01c806379210e8e1161007157806379210e8e1461017757806381a8235a146101a757806385aeeb17146101c35780639a9a5593146101f3578063a99100541461020f578063b57321221461022b576100b4565b806307c6e7d3146100b9578063122f4fba146100d55780631c6ec7a9146101055780631cfe4e3b14610121578063373dedb41461013d57806361e46db51461015b575b600080fd5b6100d360048036036100ce9190810190613cff565b61025b565b005b6100ef60048036036100ea9190810190613cff565b610804565b6040516100fc9190614963565b60405180910390f35b61011f600480360361011a9190810190613cff565b610b43565b005b61013b60048036036101369190810190613cc3565b610f72565b005b610145611190565b6040516101529190614cbe565b60405180910390f35b61017560048036036101709190810190613d94565b611199565b005b610191600480360361018c9190810190613e13565b6113f9565b60405161019e9190614924565b60405180910390f35b6101c160048036036101bc9190810190613cff565b6116f9565b005b6101dd60048036036101d89190810190613cff565b61189e565b6040516101ea9190614941565b60405180910390f35b61020d60048036036102089190810190613d40565b611b9d565b005b61022960048036036102249190810190613cff565b61202c565b005b61024560048036036102409190810190613cff565b612682565b6040516102529190614cbe565b60405180910390f35b6000339050606061026b83612902565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b825181101561037c576000826001018460018403815181106102d557fe5b60200260200101516040516102ea91906148cc565b90815260200160405180910390205411610339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161033090614ade565b60405180910390fd5b8160020183600183038151811061034c57fe5b602002602001015160405161036191906148cc565b908152602001604051809103902091508060010190506102b7565b506060600183511161038e57846103a7565b8260018451038151811061039e57fe5b60200260200101515b9050600082600101826040516103bd91906148e3565b9081526020016040518091039020541161040c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161040390614ade565b60405180910390fd5b6000826002018260405161042091906148e3565b90815260200160405180910390206000018054905014610475576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161046c90614b5e565b60405180910390fd5b60006104818587612b02565b9050806104c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ba90614a7e565b60405180910390fd5b6104cb613888565b836000016001856000018054905003815481106104e457fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156105965780601f1061056b57610100808354040283529160200191610596565b820191906000526020600020905b81548152906001019060200180831161057957829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff1660028111156105e257fe5b60028111156105ed57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561066557602002820191906000526020600020906000905b82829054906101000a900460ff1615158152602001906001019060208260000104928301926001038202915080841161062f5790505b505050505081525050905080846000016001866001018660405161068991906148e3565b90815260200160405180910390205403815481106106a357fe5b906000526020600020906005020160008201518160000190805190602001906106cd9291906138c4565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561071c57fe5b0217905550608082015181600401908051906020019061073d929190613944565b50905050836001018360405161075391906148e3565b90815260200160405180910390205484600101826000015160405161077891906148cc565b9081526020016040518091039020819055506000846001018460405161079e91906148e3565b908152602001604051809103902081905550836000018054809190600190036107c791906139ea565b5083600201836040516107da91906148e3565b9081526020016040518091039020600080820160006107f99190613a1c565b505050505050505050565b600080606061081284612b66565b91509150606061082182612902565b90506000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b82518110156109065760008260010184600184038151811061088b57fe5b60200260200101516040516108a091906148cc565b90815260200160405180910390205414156108c357600095505050505050610b3e565b816002018360018303815181106108d657fe5b60200260200101516040516108eb91906148cc565b9081526020016040518091039020915080600101905061086d565b50606060018351116109185783610931565b8260018451038151811061092857fe5b60200260200101515b90506000826001018260405161094791906148e3565b908152602001604051809103902054141561096a57600095505050505050610b3e565b610972613888565b826000016001846001018460405161098a91906148e3565b90815260200160405180910390205403815481106109a457fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610a565780601f10610a2b57610100808354040283529160200191610a56565b820191906000526020600020905b815481529060010190602001808311610a3957829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115610aa257fe5b6002811115610aad57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015610b2557602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411610aef5790505b5050505050815250509050806060015196505050505050505b919050565b600160009054906101000a900460ff16610b85576120006002819055506210000060038190555060018060006101000a81548160ff0219169083151502179055505b6000815111610bc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc090614ade565b60405180910390fd5b60003390506060610bd983612902565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015610cea57600082600101846001840381518110610c4357fe5b6020026020010151604051610c5891906148cc565b90815260200160405180910390205411610ca7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9e90614ade565b60405180910390fd5b81600201836001830381518110610cba57fe5b6020026020010151604051610ccf91906148cc565b90815260200160405180910390209150806001019050610c25565b50600254816000018054905010610d36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2d90614bfe565b60405180910390fd5b60606001835111610d475784610d60565b82600184510381518110610d5757fe5b60200260200101515b905060008260010182604051610d7691906148e3565b90815260200160405180910390205414610dc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbc90614c3e565b60405180910390fd5b610dce81612ee8565b610e0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0490614afe565b60405180910390fd5b6000610e198587612fc9565b905080610e5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e529061499e565b60405180910390fd5b610e63613888565b82816000018190525060008160200190151590811515815250508360000181908060018154018082558091505090600182039060005260206000209060050201600090919290919091506000820151816000019080519060200190610ec99291906138c4565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff02191690836002811115610f1857fe5b02179055506080820151816004019080519060200190610f39929190613944565b5050505083600001805490508460010184604051610f5791906148e3565b90815260200160405180910390208190555050505050505050565b610f7a61302d565b73ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161480610fdf57503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614155b61101e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101590614a5e565b60405180910390fd5b80600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411156110a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109790614b3e565b60405180910390fd5b600054600754820111156110e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e0906149be565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460076000828254039250508190555080600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550806007600082825401925050819055505050565b60008054905090565b600033905060006111aa82866130c6565b9050600160028111156111b957fe5b8160030160009054906101000a900460ff1660028111156111d657fe5b14611216576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120d90614c1e565b60405180910390fd5b6000600354858161122357fe5b061480156112345750806002015484105b611273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126a9061497e565b60405180910390fd5b600354848260020154031080156112905750838160020154038351145b8061129d57506003548351145b6112dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d390614a1e565b60405180910390fd5b600015158160040160035486816112ef57fe5b04815481106112fa57fe5b90600052602060002090602091828204019190069054906101000a900460ff1615151461135c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611353906149fe565b60405180910390fd5b600061136a838787876132c5565b9050806113ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a390614b1e565b60405180910390fd5b60018260040160035487816113bd57fe5b04815481106113c857fe5b90600052602060002090602091828204019190066101000a81548160ff021916908315150217905550505050505050565b611401613a40565b6000606061140e86612b66565b9150915061141a613888565b61142483836130c6565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156114c85780601f1061149d576101008083540402835291602001916114c8565b820191906000526020600020905b8154815290600101906020018083116114ab57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561151457fe5b600281111561151f57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561159757602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116115615790505b50505050508152505090506002808111156115ae57fe5b816060015160028111156115be57fe5b146115fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f590614c9e565b60405180910390fd5b60035485111580156116105750600085115b61164f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164690614a1e565b60405180910390fd5b80604001518587011115611698576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168f9061497e565b60405180910390fd5b60006116a684848989613376565b8096508192505050806116ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e590614b9e565b60405180910390fd5b505050509392505050565b6000339050600061170a82846130c6565b90506001600281111561171957fe5b8160030160009054906101000a900460ff16600281111561173657fe5b14611776576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176d90614c1e565b60405180910390fd5b60006001905060008260040180549050905060008090505b818110156117e157600015158460040182815481106117a957fe5b90600052602060002090602091828204019190069054906101000a900460ff16151514156117d657600092505b80600101905061178e565b5081611822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181990614b7e565b60405180910390fd5b60028360030160006101000a81548160ff0219169083600281111561184357fe5b021790555060006118548587613409565b905080611896576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188d906149de565b60405180910390fd5b505050505050565b6060600060606118ad84612b66565b9150915060606118bc82612902565b90506000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008090505b82518110156119c65760008260010184838151811061192257fe5b602002602001015160405161193791906148cc565b90815260200160405180910390205411611986576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197d90614ade565b60405180910390fd5b8160020183828151811061199657fe5b60200260200101516040516119ab91906148cc565b90815260200160405180910390209150806001019050611907565b5080600001805480602002602001604051908101604052809291908181526020016000905b82821015611b8e57838290600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611aa75780601f10611a7c57610100808354040283529160200191611aa7565b820191906000526020600020905b815481529060010190602001808311611a8a57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115611af357fe5b6002811115611afe57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015611b7657602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411611b405790505b505050505081525050815260200190600101906119eb565b50505050945050505050919050565b600160009054906101000a900460ff16611bdf576120006002819055506210000060038190555060018060006101000a81548160ff0219169083151502179055505b60003390506305f5e100821115611c2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2290614bde565b60405180910390fd5b6060611c3684612902565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015611d4757600082600101846001840381518110611ca057fe5b6020026020010151604051611cb591906148cc565b90815260200160405180910390205411611d04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cfb90614ade565b60405180910390fd5b81600201836001830381518110611d1757fe5b6020026020010151604051611d2c91906148cc565b90815260200160405180910390209150806001019050611c82565b5060606001835111611d595785611d72565b82600184510381518110611d6957fe5b60200260200101515b905060008260010182604051611d8891906148e3565b90815260200160405180910390205414611dd7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dce90614c3e565b60405180910390fd5b611de081612ee8565b611e1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1690614bbe565b60405180910390fd5b6000611e2c85888861346d565b905080611e6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6590614c7e565b60405180910390fd5b6060600354600160035489010381611e8257fe5b04604051908082528060200260200182016040528015611eb15781602001602082028038833980820191505090505b509050836000016040518060a0016040528085815260200160011515815260200189815260200160016002811115611ee557fe5b815260200183815250908060018154018082558091505090600182039060005260206000209060050201600090919290919091506000820151816000019080519060200190611f359291906138c4565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff02191690836002811115611f8457fe5b02179055506080820151816004019080519060200190611fa5929190613944565b5050505083600001805490508460010184604051611fc391906148e3565b90815260200160405180910390208190555086600560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505050505050505050565b6000339050612039613888565b61204382846130c6565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156120e75780601f106120bc576101008083540402835291602001916120e7565b820191906000526020600020905b8154815290600101906020018083116120ca57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561213357fe5b600281111561213e57fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156121b657602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116121805790505b5050505050815250509050600060028111156121ce57fe5b816060015160028111156121de57fe5b141561221f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221690614a3e565b60405180910390fd5b600061222b83856134da565b90508061226d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226490614a9e565b60405180910390fd5b606061227885612902565b90506000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b825181101561231057816002018360018303815181106122e057fe5b60200260200101516040516122f591906148cc565b908152602001604051809103902091508060010190506122c4565b506000600182600101866000015160405161232b91906148cc565b908152602001604051809103902054039050612345613888565b8260000160018460000180549050038154811061235e57fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156124105780601f106123e557610100808354040283529160200191612410565b820191906000526020600020905b8154815290600101906020018083116123f357829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561245c57fe5b600281111561246757fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156124df57602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116124a95790505b5050505050815250509050808360000183815481106124fa57fe5b906000526020600020906005020160008201518160000190805190602001906125249291906138c4565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561257357fe5b02179055506080820151816004019080519060200190612594929190613944565b50905050826000018054809190600190036125af91906139ea565b508260010186600001516040516125c691906148cc565b9081526020016040518091039020548360010182600001516040516125eb91906148cc565b908152602001604051809103902081905550600083600101876000015160405161261591906148cc565b9081526020016040518091039020819055508560400151600560008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505050505050505050565b600080606061269084612b66565b9150915061269c613888565b6126a683836130c6565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561274a5780601f1061271f5761010080835404028352916020019161274a565b820191906000526020600020905b81548152906001019060200180831161272d57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561279657fe5b60028111156127a157fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561281957602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116127e35790505b50505050508152505090506001600281111561283157fe5b8160600151600281111561284157fe5b1480612866575060028081111561285457fe5b8160600151600281111561286457fe5b145b6128a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161289c90614c1e565b60405180910390fd5b60006128b1848461353e565b8096508192505050806128f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128f090614c5e565b60405180910390fd5b50505050919050565b606061290c613a65565b612915836135a7565b905061291f613a65565b61295d6040518060400160405280600181526020017f2f000000000000000000000000000000000000000000000000000000000000008152506135a7565b90506060600161297683856135d590919063ffffffff16565b016040519080825280602002602001820160405280156129aa57816020015b60608152602001906001900390816129955790505b50905060008090505b81518110156129fb576129d76129d2848661364a90919063ffffffff16565b613664565b8282815181106129e357fe5b602002602001018190525080806001019150506129b3565b50600081600183510381518110612a0e57fe5b6020026020010151511415612a795780600182510381518110612a2d57fe5b6020026020010160608152506001815103604051908082528060200260200182016040528015612a7157816020015b6060815260200190600190039081612a5c5790505b509350612ab2565b8051604051908082528060200260200182016040528015612aae57816020015b6060815260200190600190039081612a995790505b5093505b60008090505b8451811015612af957818181518110612acd57fe5b6020026020010151858281518110612ae157fe5b60200260200101819052508080600101915050612ab8565b50505050919050565b60008060016020601f85510181612b1557fe5b040190506040518481526020810160005b83811015612b47578060200286015181602002830152806001019050612b26565b50602082602085026040018460006010600019f1935050505092915050565b6000606060006028905080845111612bb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612baa90614abe565b60405180910390fd5b6060816040519080825280601f01601f191660200182016040528015612be85781602001600182028038833980820191505090505b50905060008090505b82811015612c5857858181518110612c0557fe5b602001015160f81c60f81b828281518110612c1c57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050612bf1565b50600080905060008090505b83811015612d87576000838281518110612c7a57fe5b602001015160f81c60f81b60f81c60ff16905060308110158015612c9f575060398111155b80612cb8575060418110158015612cb75750605a8111155b5b80612cd1575060618110158015612cd0575060668111155b5b612d10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d0790614abe565b60405180910390fd5b60308110158015612d22575060398111155b15612d335760308103601084020192505b60418110158015612d455750605a8111155b15612d565760378103601084020192505b60618110158015612d68575060668111155b15612d795760578103601084020192505b508080600101915050612c64565b508094507f2f00000000000000000000000000000000000000000000000000000000000000868481518110612db857fe5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612e25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e1c90614abe565b60405180910390fd5b6000600184885103039050806040519080825280601f01601f191660200182016040528015612e635781602001600182028038833980820191505090505b50945060008090505b81811015612ede5760008860018784010181518110612e8757fe5b602001015160f81c60f81b905080878381518110612ea157fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350508080600101915050612e6c565b5050505050915091565b6000604051602001612ef99061490f565b6040516020818303038152906040528051906020012082604051602001612f2091906148e3565b604051602081830303815290604052805190602001201480612f8b5750604051602001612f4c906148fa565b6040516020818303038152906040528051906020012082604051602001612f7391906148e3565b60405160208183030381529060405280519060200120145b80612f97575060008251145b15612fa55760009050612fc4565b60008251905060ff811115612fbe576000915050612fc4565b60019150505b919050565b60008060016020601f85510181612fdc57fe5b040190506040518481526020810160005b8381101561300e578060200286015181602002830152806001019050612fed565b5060208260208502604001846000600f600019f1935050505092915050565b600073d2001000000000000000000000000000000000d273ffffffffffffffffffffffffffffffffffffffff166383e781fe6040518163ffffffff1660e01b815260040160206040518083038186803b15801561308957600080fd5b505afa15801561309d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506130c19190810190613c9a565b905090565b600060606130d383612902565b90506000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b82518110156131e45760008260010184600184038151811061313d57fe5b602002602001015160405161315291906148cc565b908152602001604051809103902054116131a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161319890614ade565b60405180910390fd5b816002018360018303815181106131b457fe5b60200260200101516040516131c991906148cc565b9081526020016040518091039020915080600101905061311f565b50606060018351116131f6578461320f565b8260018451038151811061320657fe5b60200260200101515b90506000826001018260405161322591906148e3565b90815260200160405180910390205411613274576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161326b90614ade565b60405180910390fd5b6000826000016001846001018460405161328e91906148e3565b90815260200160405180910390205403815481106132a857fe5b906000526020600020906005020190508094505050505092915050565b60008060016020601f855101816132d857fe5b04019050600060016020601f885101816132ee57fe5b040190506040518781526020810160005b838110156133205780602002890151816020028301528060010190506132ff565b50868360200282015260005b84811015613352578060200287015181856001010160200283015280600101905061332c565b50602082848601602002606001846000600c600019f1945050505050949350505050565b6000613380613a40565b600060016020601f8851018161339257fe5b0401905060006020601f8601816133a557fe5b0490506040518881526020810160005b848110156133d657806020028a0151816020028301528060010190506133b5565b5083602002810188815287816020015283602002868660030160200285600a600019fa9650505050505094509492505050565b60008060016020601f8551018161341c57fe5b040190506040518481526020810160005b8381101561344e57806020028601518160200283015280600101905061342d565b50602082602085026040018460006011600019f1935050505092915050565b60008060016020601f8651018161348057fe5b040190506040518581526020810160005b838110156134b2578060200287015181602002830152806001019050613491565b50846020840282015260208260208502604001846000600b600019f193505050509392505050565b60008060016020601f855101816134ed57fe5b040190506040518481526020810160005b8381101561351f5780602002860151816020028301528060010190506134fe565b5060208260208502604001846000600e600019f1935050505092915050565b600080600060016020601f8651018161355357fe5b040190506040518581526020810160005b83811015613585578060200287015181602002830152806001019050613564565b506020826020850260200184600d600019fa9450815193505050509250929050565b6135af613a65565b600060208301905060405180604001604052808451815260200182815250915050919050565b60008082600001516135f985600001518660200151866000015187602001516136c6565b0190505b83600001518460200151018111613643578180600101925050826000015161363b8560200151830386600001510383866000015187602001516136c6565b0190506135fd565b5092915050565b613652613a65565b61365d8383836137a1565b5092915050565b60608082600001516040519080825280601f01601f19166020018201604052801561369e5781602001600182028038833980820191505090505b50905060006020820190506136bc818560200151866000015161383f565b8192505050919050565b6000808490506000868511613791576020851161374b57600060018660200360080260020a031960001b905060008186511690506000878a8a0103905060008386511690505b82811461373d5781861061372a578a8a019650505050505050613799565b858060010196505083865116905061370c565b859650505050505050613799565b60008585209050600091505b858803821161378f57600086842090508082141561377b5783945050505050613799565b600184019350508180600101925050613757565b505b868601925050505b949350505050565b6137a9613a65565b60006137c785600001518660200151866000015187602001516136c6565b90508460200151836020018181525050846020015181038360000181815250508460000151856020015101811415613809576000856000018181525050613834565b8360000151836000015101856000018181510391508181525050836000015181018560200181815250505b829150509392505050565b5b602081106138635781518352602083019250602082019150602081039050613840565b60006001826020036101000a0390508019835116818551168181178652505050505050565b6040518060a001604052806060815260200160001515815260200160008152602001600060028111156138b757fe5b8152602001606081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061390557805160ff1916838001178555613933565b82800160010185558215613933579182015b82811115613932578251825591602001919060010190613917565b5b5090506139409190613a7f565b5090565b82805482825590600052602060002090601f016020900481019282156139d95791602002820160005b838211156139aa57835183826101000a81548160ff021916908315150217905550926020019260010160208160000104928301926001030261396d565b80156139d75782816101000a81549060ff02191690556001016020816000010492830192600103026139aa565b505b5090506139e69190613aa4565b5090565b815481835581811115613a1757600502816005028360005260206000209182019101613a169190613ad4565b5b505050565b5080546000825560050290600052602060002090810190613a3d9190613ad4565b50565b6040518062100000016040528061800090602082028038833980820191505090505090565b604051806040016040528060008152602001600081525090565b613aa191905b80821115613a9d576000816000905550600101613a85565b5090565b90565b613ad191905b80821115613acd57600081816101000a81549060ff021916905550600101613aaa565b5090565b90565b613b4091905b80821115613b3c5760008082016000613af39190613b43565b6001820160006101000a81549060ff021916905560028201600090556003820160006101000a81549060ff0219169055600482016000613b339190613b8b565b50600501613ada565b5090565b90565b50805460018160011615610100020316600290046000825580601f10613b695750613b88565b601f016020900490600052602060002090810190613b879190613a7f565b5b50565b50805460008255601f016020900490600052602060002090810190613bb09190613a7f565b50565b600081359050613bc281614f18565b92915050565b600081519050613bd781614f18565b92915050565b600082601f830112613bee57600080fd5b8135613c01613bfc82614d06565b614cd9565b91508082526020830160208301858383011115613c1d57600080fd5b613c28838284614eb8565b50505092915050565b600082601f830112613c4257600080fd5b8135613c55613c5082614d32565b614cd9565b91508082526020830160208301858383011115613c7157600080fd5b613c7c838284614eb8565b50505092915050565b600081359050613c9481614f2f565b92915050565b600060208284031215613cac57600080fd5b6000613cba84828501613bc8565b91505092915050565b60008060408385031215613cd657600080fd5b6000613ce485828601613bb3565b9250506020613cf585828601613c85565b9150509250929050565b600060208284031215613d1157600080fd5b600082013567ffffffffffffffff811115613d2b57600080fd5b613d3784828501613c31565b91505092915050565b60008060408385031215613d5357600080fd5b600083013567ffffffffffffffff811115613d6d57600080fd5b613d7985828601613c31565b9250506020613d8a85828601613c85565b9150509250929050565b600080600060608486031215613da957600080fd5b600084013567ffffffffffffffff811115613dc357600080fd5b613dcf86828701613c31565b9350506020613de086828701613c85565b925050604084013567ffffffffffffffff811115613dfd57600080fd5b613e0986828701613bdd565b9150509250925092565b600080600060608486031215613e2857600080fd5b600084013567ffffffffffffffff811115613e4257600080fd5b613e4e86828701613c31565b9350506020613e5f86828701613c85565b9250506040613e7086828701613c85565b9150509250925092565b6000613e868383613fe8565b60208301905092915050565b6000613e9e8383613ff7565b60208301905092915050565b6000613eb68383614831565b905092915050565b6000613ec982614d88565b613ed38185614de7565b9350613ede83614d5e565b8060005b83811015613f0f578151613ef68882613e7a565b9750613f0183614dc0565b925050600181019050613ee2565b5085935050505092915050565b613f2581614d93565b613f2f8184614df8565b9250613f3a82614d6e565b8060005b83811015613f6b578151613f528782613e92565b9650613f5d83614dcd565b925050600181019050613f3e565b505050505050565b6000613f7e82614d9f565b613f888185614e03565b935083602082028501613f9a85614d78565b8060005b85811015613fd65784840389528151613fb78582613eaa565b9450613fc283614dda565b925060208a01995050600181019050613f9e565b50829750879550505050505092915050565b613ff181614e53565b82525050565b61400081614e5f565b82525050565b61400f81614ea6565b82525050565b61401e81614ea6565b82525050565b600061402f82614db5565b6140398185614e36565b9350614049818560208601614ec7565b80840191505092915050565b600061406082614daa565b61406a8185614e14565b935061407a818560208601614ec7565b61408381614efa565b840191505092915050565b600061409982614daa565b6140a38185614e36565b93506140b3818560208601614ec7565b80840191505092915050565b60006140cc601883614e25565b91507f496e636f7272656374206368756e6b20706f736974696f6e00000000000000006000830152602082019050919050565b600061410c601583614e25565b91507f4469726563746f7279206e6f74206372656174656400000000000000000000006000830152602082019050919050565b600061414c602483614e25565b91507f4e6f7420656e6f756768206d656d6f727920696e207468652046696c6573746f60008301527f72616765000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006141b2601b83614e25565b91507f48617368206861736e2774206265656e2063616c63756c6174656400000000006000830152602082019050919050565b60006141f2601983614e25565b91507f4368756e6b20697320616c72656164792075706c6f61646564000000000000006000830152602082019050919050565b6000614232601683614e25565b91507f496e636f7272656374206368756e6b206c656e677468000000000000000000006000830152602082019050919050565b6000614272600f83614e25565b91507f46696c65206e6f742065786973747300000000000000000000000000000000006000830152602082019050919050565b60006142b2600e83614e25565b91507f496e76616c69642073656e6465720000000000000000000000000000000000006000830152602082019050919050565b60006142f2601883614e25565b91507f4469726563746f7279206973206e6f742064656c6574656400000000000000006000830152602082019050919050565b6000614332601083614e25565b91507f46696c65206e6f742064656c65746564000000000000000000000000000000006000830152602082019050919050565b6000614372601383614e25565b91507f496e76616c69642073746f7261676550617468000000000000000000000000006000830152602082019050919050565b60006143b2600c83614e25565b91507f496e76616c6964207061746800000000000000000000000000000000000000006000830152602082019050919050565b60006143f2600183614e36565b91507f2e000000000000000000000000000000000000000000000000000000000000006000830152600182019050919050565b6000614432601683614e25565b91507f496e76616c6964206469726563746f7279206e616d65000000000000000000006000830152602082019050919050565b6000614472601583614e25565b91507f4368756e6b207761736e27742075706c6f6164656400000000000000000000006000830152602082019050919050565b60006144b2602683614e25565b91507f436f756c64206e6f742072657365727665206c657373207468616e207573656460008301527f20737061636500000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614518601683614e25565b91507f4469726563746f7279206973206e6f7420656d707479000000000000000000006000830152602082019050919050565b6000614558602383614e25565b91507f46696c65206861736e2774206265656e2075706c6f6164656420636f7272656360008301527f746c7900000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006145be601183614e25565b91507f4368756e6b207761736e277420726561640000000000000000000000000000006000830152602082019050919050565b60006145fe601883614e25565b91507f46696c656e616d652073686f756c64206265203c2032353600000000000000006000830152602082019050919050565b600061463e601f83614e25565b91507f46696c652073686f756c64206265206c657373207468616e20313030204d42006000830152602082019050919050565b600061467e600283614e36565b91507f2e2e0000000000000000000000000000000000000000000000000000000000006000830152600282019050919050565b60006146be601183614e25565b91507f4469726563746f72792069732066756c6c0000000000000000000000000000006000830152602082019050919050565b60006146fe600e83614e25565b91507f46696c65206e6f7420666f756e640000000000000000000000000000000000006000830152602082019050919050565b600061473e601883614e25565b91507f46696c65206f72206469726563746f72792065786973747300000000000000006000830152602082019050919050565b600061477e601883614e25565b91507f45564d206572726f7220696e2067657446696c6553697a6500000000000000006000830152602082019050919050565b60006147be601083614e25565b91507f46696c65206e6f742063726561746564000000000000000000000000000000006000830152602082019050919050565b60006147fe601983614e25565b91507f46696c65206861736e2774206265656e2075706c6f61646564000000000000006000830152602082019050919050565b600060a083016000830151848203600086015261484e8282614055565b91505060208301516148636020860182613fe8565b50604083015161487660408601826148ae565b5060608301516148896060860182614006565b50608083015184820360808601526148a18282613ebe565b9150508091505092915050565b6148b781614e9c565b82525050565b6148c681614e9c565b82525050565b60006148d8828461408e565b915081905092915050565b60006148ef8284614024565b915081905092915050565b6000614905826143e5565b9150819050919050565b600061491a82614671565b9150819050919050565b6000621000008201905061493b6000830184613f1c565b92915050565b6000602082019050818103600083015261495b8184613f73565b905092915050565b60006020820190506149786000830184614015565b92915050565b60006020820190508181036000830152614997816140bf565b9050919050565b600060208201905081810360008301526149b7816140ff565b9050919050565b600060208201905081810360008301526149d78161413f565b9050919050565b600060208201905081810360008301526149f7816141a5565b9050919050565b60006020820190508181036000830152614a17816141e5565b9050919050565b60006020820190508181036000830152614a3781614225565b9050919050565b60006020820190508181036000830152614a5781614265565b9050919050565b60006020820190508181036000830152614a77816142a5565b9050919050565b60006020820190508181036000830152614a97816142e5565b9050919050565b60006020820190508181036000830152614ab781614325565b9050919050565b60006020820190508181036000830152614ad781614365565b9050919050565b60006020820190508181036000830152614af7816143a5565b9050919050565b60006020820190508181036000830152614b1781614425565b9050919050565b60006020820190508181036000830152614b3781614465565b9050919050565b60006020820190508181036000830152614b57816144a5565b9050919050565b60006020820190508181036000830152614b778161450b565b9050919050565b60006020820190508181036000830152614b978161454b565b9050919050565b60006020820190508181036000830152614bb7816145b1565b9050919050565b60006020820190508181036000830152614bd7816145f1565b9050919050565b60006020820190508181036000830152614bf781614631565b9050919050565b60006020820190508181036000830152614c17816146b1565b9050919050565b60006020820190508181036000830152614c37816146f1565b9050919050565b60006020820190508181036000830152614c5781614731565b9050919050565b60006020820190508181036000830152614c7781614771565b9050919050565b60006020820190508181036000830152614c97816147b1565b9050919050565b60006020820190508181036000830152614cb7816147f1565b9050919050565b6000602082019050614cd360008301846148bd565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614cfc57600080fd5b8060405250919050565b600067ffffffffffffffff821115614d1d57600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614d4957600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050919050565b6000819050602082019050919050565b600081519050919050565b60006180009050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614e4c82614e7c565b9050919050565b60008115159050919050565b6000819050919050565b6000819050614e7782614f0b565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000614eb182614e69565b9050919050565b82818337600083830152505050565b60005b83811015614ee5578082015181840152602081019050614eca565b83811115614ef4576000848401525b50505050565b6000601f19601f8301169050919050565b60038110614f1557fe5b50565b614f2181614e41565b8114614f2c57600080fd5b50565b614f3881614e9c565b8114614f4357600080fd5b5056fea365627a7a723158202ae226b25ad72f9cff2d74c6dc7bcfb78530ab1d2438f48a8dab67499b37a8e56c6578706572696d656e74616cf564736f6c634300050d0040", + "nonce": "0", + "storage": { + "0x0": "2868903936" + } + }, + "0x69362535ec535F0643cBf62D16aDeDCAf32Ee6F8": { + "balance": "0", + "code": "0x608060405234801561001057600080fd5b50600436106100b45760003560e01c806379210e8e1161007157806379210e8e1461017757806381a8235a146101a757806385aeeb17146101c35780639a9a5593146101f3578063a99100541461020f578063b57321221461022b576100b4565b806307c6e7d3146100b9578063122f4fba146100d55780631c6ec7a9146101055780631cfe4e3b14610121578063373dedb41461013d57806361e46db51461015b575b600080fd5b6100d360048036036100ce9190810190613e0d565b61025b565b005b6100ef60048036036100ea9190810190613e0d565b610804565b6040516100fc9190614ab1565b60405180910390f35b61011f600480360361011a9190810190613e0d565b610b43565b005b61013b60048036036101369190810190613dd1565b610f72565b005b610145611190565b6040516101529190614e2c565b60405180910390f35b61017560048036036101709190810190613ea2565b611199565b005b610191600480360361018c9190810190613f21565b6113f9565b60405161019e9190614a72565b60405180910390f35b6101c160048036036101bc9190810190613e0d565b6116f9565b005b6101dd60048036036101d89190810190613e0d565b61189e565b6040516101ea9190614a8f565b60405180910390f35b61020d60048036036102089190810190613e4e565b611b9d565b005b61022960048036036102249190810190613e0d565b61213a565b005b61024560048036036102409190810190613e0d565b612790565b6040516102529190614e2c565b60405180910390f35b6000339050606061026b83612a10565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b825181101561037c576000826001018460018403815181106102d557fe5b60200260200101516040516102ea9190614a1a565b90815260200160405180910390205411610339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161033090614c2c565b60405180910390fd5b8160020183600183038151811061034c57fe5b60200260200101516040516103619190614a1a565b908152602001604051809103902091508060010190506102b7565b506060600183511161038e57846103a7565b8260018451038151811061039e57fe5b60200260200101515b9050600082600101826040516103bd9190614a31565b9081526020016040518091039020541161040c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161040390614c2c565b60405180910390fd5b600082600201826040516104209190614a31565b90815260200160405180910390206000018054905014610475576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161046c90614cac565b60405180910390fd5b60006104818587612c10565b9050806104c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ba90614bcc565b60405180910390fd5b6104cb613996565b836000016001856000018054905003815481106104e457fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156105965780601f1061056b57610100808354040283529160200191610596565b820191906000526020600020905b81548152906001019060200180831161057957829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff1660028111156105e257fe5b60028111156105ed57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561066557602002820191906000526020600020906000905b82829054906101000a900460ff1615158152602001906001019060208260000104928301926001038202915080841161062f5790505b50505050508152505090508084600001600186600101866040516106899190614a31565b90815260200160405180910390205403815481106106a357fe5b906000526020600020906005020160008201518160000190805190602001906106cd9291906139d2565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561071c57fe5b0217905550608082015181600401908051906020019061073d929190613a52565b5090505083600101836040516107539190614a31565b9081526020016040518091039020548460010182600001516040516107789190614a1a565b9081526020016040518091039020819055506000846001018460405161079e9190614a31565b908152602001604051809103902081905550836000018054809190600190036107c79190613af8565b5083600201836040516107da9190614a31565b9081526020016040518091039020600080820160006107f99190613b2a565b505050505050505050565b600080606061081284612c74565b91509150606061082182612a10565b90506000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b82518110156109065760008260010184600184038151811061088b57fe5b60200260200101516040516108a09190614a1a565b90815260200160405180910390205414156108c357600095505050505050610b3e565b816002018360018303815181106108d657fe5b60200260200101516040516108eb9190614a1a565b9081526020016040518091039020915080600101905061086d565b50606060018351116109185783610931565b8260018451038151811061092857fe5b60200260200101515b9050600082600101826040516109479190614a31565b908152602001604051809103902054141561096a57600095505050505050610b3e565b610972613996565b826000016001846001018460405161098a9190614a31565b90815260200160405180910390205403815481106109a457fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610a565780601f10610a2b57610100808354040283529160200191610a56565b820191906000526020600020905b815481529060010190602001808311610a3957829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115610aa257fe5b6002811115610aad57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015610b2557602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411610aef5790505b5050505050815250509050806060015196505050505050505b919050565b600160009054906101000a900460ff16610b85576120006002819055506210000060038190555060018060006101000a81548160ff0219169083151502179055505b6000815111610bc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc090614c2c565b60405180910390fd5b60003390506060610bd983612a10565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015610cea57600082600101846001840381518110610c4357fe5b6020026020010151604051610c589190614a1a565b90815260200160405180910390205411610ca7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9e90614c2c565b60405180910390fd5b81600201836001830381518110610cba57fe5b6020026020010151604051610ccf9190614a1a565b90815260200160405180910390209150806001019050610c25565b50600254816000018054905010610d36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2d90614d4c565b60405180910390fd5b60606001835111610d475784610d60565b82600184510381518110610d5757fe5b60200260200101515b905060008260010182604051610d769190614a31565b90815260200160405180910390205414610dc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbc90614d8c565b60405180910390fd5b610dce81612ff6565b610e0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0490614c4c565b60405180910390fd5b6000610e1985876130d7565b905080610e5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5290614aec565b60405180910390fd5b610e63613996565b82816000018190525060008160200190151590811515815250508360000181908060018154018082558091505090600182039060005260206000209060050201600090919290919091506000820151816000019080519060200190610ec99291906139d2565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff02191690836002811115610f1857fe5b02179055506080820151816004019080519060200190610f39929190613a52565b5050505083600001805490508460010184604051610f579190614a31565b90815260200160405180910390208190555050505050505050565b610f7a61313b565b73ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161480610fdf57503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614155b61101e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101590614bac565b60405180910390fd5b80600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411156110a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109790614c8c565b60405180910390fd5b600054600754820111156110e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e090614b0c565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460076000828254039250508190555080600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550806007600082825401925050819055505050565b60008054905090565b600033905060006111aa82866131d4565b9050600160028111156111b957fe5b8160030160009054906101000a900460ff1660028111156111d657fe5b14611216576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120d90614d6c565b60405180910390fd5b6000600354858161122357fe5b061480156112345750806002015484105b611273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126a90614acc565b60405180910390fd5b600354848260020154031080156112905750838160020154038351145b8061129d57506003548351145b6112dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d390614b6c565b60405180910390fd5b600015158160040160035486816112ef57fe5b04815481106112fa57fe5b90600052602060002090602091828204019190069054906101000a900460ff1615151461135c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135390614b4c565b60405180910390fd5b600061136a838787876133d3565b9050806113ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a390614c6c565b60405180910390fd5b60018260040160035487816113bd57fe5b04815481106113c857fe5b90600052602060002090602091828204019190066101000a81548160ff021916908315150217905550505050505050565b611401613b4e565b6000606061140e86612c74565b9150915061141a613996565b61142483836131d4565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156114c85780601f1061149d576101008083540402835291602001916114c8565b820191906000526020600020905b8154815290600101906020018083116114ab57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561151457fe5b600281111561151f57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561159757602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116115615790505b50505050508152505090506002808111156115ae57fe5b816060015160028111156115be57fe5b146115fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f590614e0c565b60405180910390fd5b60035485111580156116105750600085115b61164f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164690614b6c565b60405180910390fd5b80604001518587011115611698576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168f90614acc565b60405180910390fd5b60006116a684848989613484565b8096508192505050806116ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e590614cec565b60405180910390fd5b505050509392505050565b6000339050600061170a82846131d4565b90506001600281111561171957fe5b8160030160009054906101000a900460ff16600281111561173657fe5b14611776576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176d90614d6c565b60405180910390fd5b60006001905060008260040180549050905060008090505b818110156117e157600015158460040182815481106117a957fe5b90600052602060002090602091828204019190069054906101000a900460ff16151514156117d657600092505b80600101905061178e565b5081611822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181990614ccc565b60405180910390fd5b60028360030160006101000a81548160ff0219169083600281111561184357fe5b021790555060006118548587613517565b905080611896576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188d90614b2c565b60405180910390fd5b505050505050565b6060600060606118ad84612c74565b9150915060606118bc82612a10565b90506000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008090505b82518110156119c65760008260010184838151811061192257fe5b60200260200101516040516119379190614a1a565b90815260200160405180910390205411611986576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197d90614c2c565b60405180910390fd5b8160020183828151811061199657fe5b60200260200101516040516119ab9190614a1a565b90815260200160405180910390209150806001019050611907565b5080600001805480602002602001604051908101604052809291908181526020016000905b82821015611b8e57838290600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611aa75780601f10611a7c57610100808354040283529160200191611aa7565b820191906000526020600020905b815481529060010190602001808311611a8a57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115611af357fe5b6002811115611afe57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015611b7657602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411611b405790505b505050505081525050815260200190600101906119eb565b50505050945050505050919050565b600160009054906101000a900460ff16611bdf576120006002819055506210000060038190555060018060006101000a81548160ff0219169083151502179055505b60003390506305f5e100821115611c2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2290614d2c565b60405180910390fd5b600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205483011115611cee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce590614dac565b60405180910390fd5b6060611cf984612a10565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015611e0a57600082600101846001840381518110611d6357fe5b6020026020010151604051611d789190614a1a565b90815260200160405180910390205411611dc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dbe90614c2c565b60405180910390fd5b81600201836001830381518110611dda57fe5b6020026020010151604051611def9190614a1a565b90815260200160405180910390209150806001019050611d45565b50600254816000018054905010611e56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4d90614d4c565b60405180910390fd5b60606001835111611e675785611e80565b82600184510381518110611e7757fe5b60200260200101515b905060008260010182604051611e969190614a31565b90815260200160405180910390205414611ee5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611edc90614d8c565b60405180910390fd5b611eee81612ff6565b611f2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2490614d0c565b60405180910390fd5b6000611f3a85888861357b565b905080611f7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7390614dec565b60405180910390fd5b6060600354600160035489010381611f9057fe5b04604051908082528060200260200182016040528015611fbf5781602001602082028038833980820191505090505b509050836000016040518060a0016040528085815260200160011515815260200189815260200160016002811115611ff357fe5b8152602001838152509080600181540180825580915050906001820390600052602060002090600502016000909192909190915060008201518160000190805190602001906120439291906139d2565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561209257fe5b021790555060808201518160040190805190602001906120b3929190613a52565b50505050836000018054905084600101846040516120d19190614a31565b90815260200160405180910390208190555086600560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505050505050505050565b6000339050612147613996565b61215182846131d4565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156121f55780601f106121ca576101008083540402835291602001916121f5565b820191906000526020600020905b8154815290600101906020018083116121d857829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561224157fe5b600281111561224c57fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156122c457602002820191906000526020600020906000905b82829054906101000a900460ff1615158152602001906001019060208260000104928301926001038202915080841161228e5790505b5050505050815250509050600060028111156122dc57fe5b816060015160028111156122ec57fe5b141561232d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232490614b8c565b60405180910390fd5b600061233983856135e8565b90508061237b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161237290614bec565b60405180910390fd5b606061238685612a10565b90506000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b825181101561241e57816002018360018303815181106123ee57fe5b60200260200101516040516124039190614a1a565b908152602001604051809103902091508060010190506123d2565b50600060018260010186600001516040516124399190614a1a565b908152602001604051809103902054039050612453613996565b8260000160018460000180549050038154811061246c57fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561251e5780601f106124f35761010080835404028352916020019161251e565b820191906000526020600020905b81548152906001019060200180831161250157829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561256a57fe5b600281111561257557fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156125ed57602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116125b75790505b50505050508152505090508083600001838154811061260857fe5b906000526020600020906005020160008201518160000190805190602001906126329291906139d2565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561268157fe5b021790555060808201518160040190805190602001906126a2929190613a52565b50905050826000018054809190600190036126bd9190613af8565b508260010186600001516040516126d49190614a1a565b9081526020016040518091039020548360010182600001516040516126f99190614a1a565b90815260200160405180910390208190555060008360010187600001516040516127239190614a1a565b9081526020016040518091039020819055508560400151600560008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505050505050505050565b600080606061279e84612c74565b915091506127aa613996565b6127b483836131d4565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156128585780601f1061282d57610100808354040283529160200191612858565b820191906000526020600020905b81548152906001019060200180831161283b57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff1660028111156128a457fe5b60028111156128af57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561292757602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116128f15790505b50505050508152505090506001600281111561293f57fe5b8160600151600281111561294f57fe5b1480612974575060028081111561296257fe5b8160600151600281111561297257fe5b145b6129b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129aa90614d6c565b60405180910390fd5b60006129bf848461364c565b809650819250505080612a07576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129fe90614dcc565b60405180910390fd5b50505050919050565b6060612a1a613b73565b612a23836136b5565b9050612a2d613b73565b612a6b6040518060400160405280600181526020017f2f000000000000000000000000000000000000000000000000000000000000008152506136b5565b905060606001612a8483856136e390919063ffffffff16565b01604051908082528060200260200182016040528015612ab857816020015b6060815260200190600190039081612aa35790505b50905060008090505b8151811015612b0957612ae5612ae0848661375890919063ffffffff16565b613772565b828281518110612af157fe5b60200260200101819052508080600101915050612ac1565b50600081600183510381518110612b1c57fe5b6020026020010151511415612b875780600182510381518110612b3b57fe5b6020026020010160608152506001815103604051908082528060200260200182016040528015612b7f57816020015b6060815260200190600190039081612b6a5790505b509350612bc0565b8051604051908082528060200260200182016040528015612bbc57816020015b6060815260200190600190039081612ba75790505b5093505b60008090505b8451811015612c0757818181518110612bdb57fe5b6020026020010151858281518110612bef57fe5b60200260200101819052508080600101915050612bc6565b50505050919050565b60008060016020601f85510181612c2357fe5b040190506040518481526020810160005b83811015612c55578060200286015181602002830152806001019050612c34565b50602082602085026040018460006010600019f1935050505092915050565b6000606060006028905080845111612cc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cb890614c0c565b60405180910390fd5b6060816040519080825280601f01601f191660200182016040528015612cf65781602001600182028038833980820191505090505b50905060008090505b82811015612d6657858181518110612d1357fe5b602001015160f81c60f81b828281518110612d2a57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050612cff565b50600080905060008090505b83811015612e95576000838281518110612d8857fe5b602001015160f81c60f81b60f81c60ff16905060308110158015612dad575060398111155b80612dc6575060418110158015612dc55750605a8111155b5b80612ddf575060618110158015612dde575060668111155b5b612e1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e1590614c0c565b60405180910390fd5b60308110158015612e30575060398111155b15612e415760308103601084020192505b60418110158015612e535750605a8111155b15612e645760378103601084020192505b60618110158015612e76575060668111155b15612e875760578103601084020192505b508080600101915050612d72565b508094507f2f00000000000000000000000000000000000000000000000000000000000000868481518110612ec657fe5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612f33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f2a90614c0c565b60405180910390fd5b6000600184885103039050806040519080825280601f01601f191660200182016040528015612f715781602001600182028038833980820191505090505b50945060008090505b81811015612fec5760008860018784010181518110612f9557fe5b602001015160f81c60f81b905080878381518110612faf57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350508080600101915050612f7a565b5050505050915091565b600060405160200161300790614a5d565b604051602081830303815290604052805190602001208260405160200161302e9190614a31565b604051602081830303815290604052805190602001201480613099575060405160200161305a90614a48565b60405160208183030381529060405280519060200120826040516020016130819190614a31565b60405160208183030381529060405280519060200120145b806130a5575060008251145b156130b357600090506130d2565b60008251905060ff8111156130cc5760009150506130d2565b60019150505b919050565b60008060016020601f855101816130ea57fe5b040190506040518481526020810160005b8381101561311c5780602002860151816020028301528060010190506130fb565b5060208260208502604001846000600f600019f1935050505092915050565b600073d2001000000000000000000000000000000000d273ffffffffffffffffffffffffffffffffffffffff166383e781fe6040518163ffffffff1660e01b815260040160206040518083038186803b15801561319757600080fd5b505afa1580156131ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506131cf9190810190613da8565b905090565b600060606131e183612a10565b90506000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b82518110156132f25760008260010184600184038151811061324b57fe5b60200260200101516040516132609190614a1a565b908152602001604051809103902054116132af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132a690614c2c565b60405180910390fd5b816002018360018303815181106132c257fe5b60200260200101516040516132d79190614a1a565b9081526020016040518091039020915080600101905061322d565b5060606001835111613304578461331d565b8260018451038151811061331457fe5b60200260200101515b9050600082600101826040516133339190614a31565b90815260200160405180910390205411613382576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161337990614c2c565b60405180910390fd5b6000826000016001846001018460405161339c9190614a31565b90815260200160405180910390205403815481106133b657fe5b906000526020600020906005020190508094505050505092915050565b60008060016020601f855101816133e657fe5b04019050600060016020601f885101816133fc57fe5b040190506040518781526020810160005b8381101561342e57806020028901518160200283015280600101905061340d565b50868360200282015260005b84811015613460578060200287015181856001010160200283015280600101905061343a565b50602082848601602002606001846000600c600019f1945050505050949350505050565b600061348e613b4e565b600060016020601f885101816134a057fe5b0401905060006020601f8601816134b357fe5b0490506040518881526020810160005b848110156134e457806020028a0151816020028301528060010190506134c3565b5083602002810188815287816020015283602002868660030160200285600a600019fa9650505050505094509492505050565b60008060016020601f8551018161352a57fe5b040190506040518481526020810160005b8381101561355c57806020028601518160200283015280600101905061353b565b50602082602085026040018460006011600019f1935050505092915050565b60008060016020601f8651018161358e57fe5b040190506040518581526020810160005b838110156135c057806020028701518160200283015280600101905061359f565b50846020840282015260208260208502604001846000600b600019f193505050509392505050565b60008060016020601f855101816135fb57fe5b040190506040518481526020810160005b8381101561362d57806020028601518160200283015280600101905061360c565b5060208260208502604001846000600e600019f1935050505092915050565b600080600060016020601f8651018161366157fe5b040190506040518581526020810160005b83811015613693578060200287015181602002830152806001019050613672565b506020826020850260200184600d600019fa9450815193505050509250929050565b6136bd613b73565b600060208301905060405180604001604052808451815260200182815250915050919050565b600080826000015161370785600001518660200151866000015187602001516137d4565b0190505b8360000151846020015101811161375157818060010192505082600001516137498560200151830386600001510383866000015187602001516137d4565b01905061370b565b5092915050565b613760613b73565b61376b8383836138af565b5092915050565b60608082600001516040519080825280601f01601f1916602001820160405280156137ac5781602001600182028038833980820191505090505b50905060006020820190506137ca818560200151866000015161394d565b8192505050919050565b600080849050600086851161389f576020851161385957600060018660200360080260020a031960001b905060008186511690506000878a8a0103905060008386511690505b82811461384b57818610613838578a8a0196505050505050506138a7565b858060010196505083865116905061381a565b8596505050505050506138a7565b60008585209050600091505b858803821161389d57600086842090508082141561388957839450505050506138a7565b600184019350508180600101925050613865565b505b868601925050505b949350505050565b6138b7613b73565b60006138d585600001518660200151866000015187602001516137d4565b90508460200151836020018181525050846020015181038360000181815250508460000151856020015101811415613917576000856000018181525050613942565b8360000151836000015101856000018181510391508181525050836000015181018560200181815250505b829150509392505050565b5b60208110613971578151835260208301925060208201915060208103905061394e565b60006001826020036101000a0390508019835116818551168181178652505050505050565b6040518060a001604052806060815260200160001515815260200160008152602001600060028111156139c557fe5b8152602001606081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613a1357805160ff1916838001178555613a41565b82800160010185558215613a41579182015b82811115613a40578251825591602001919060010190613a25565b5b509050613a4e9190613b8d565b5090565b82805482825590600052602060002090601f01602090048101928215613ae75791602002820160005b83821115613ab857835183826101000a81548160ff0219169083151502179055509260200192600101602081600001049283019260010302613a7b565b8015613ae55782816101000a81549060ff0219169055600101602081600001049283019260010302613ab8565b505b509050613af49190613bb2565b5090565b815481835581811115613b2557600502816005028360005260206000209182019101613b249190613be2565b5b505050565b5080546000825560050290600052602060002090810190613b4b9190613be2565b50565b6040518062100000016040528061800090602082028038833980820191505090505090565b604051806040016040528060008152602001600081525090565b613baf91905b80821115613bab576000816000905550600101613b93565b5090565b90565b613bdf91905b80821115613bdb57600081816101000a81549060ff021916905550600101613bb8565b5090565b90565b613c4e91905b80821115613c4a5760008082016000613c019190613c51565b6001820160006101000a81549060ff021916905560028201600090556003820160006101000a81549060ff0219169055600482016000613c419190613c99565b50600501613be8565b5090565b90565b50805460018160011615610100020316600290046000825580601f10613c775750613c96565b601f016020900490600052602060002090810190613c959190613b8d565b5b50565b50805460008255601f016020900490600052602060002090810190613cbe9190613b8d565b50565b600081359050613cd081615086565b92915050565b600081519050613ce581615086565b92915050565b600082601f830112613cfc57600080fd5b8135613d0f613d0a82614e74565b614e47565b91508082526020830160208301858383011115613d2b57600080fd5b613d36838284615026565b50505092915050565b600082601f830112613d5057600080fd5b8135613d63613d5e82614ea0565b614e47565b91508082526020830160208301858383011115613d7f57600080fd5b613d8a838284615026565b50505092915050565b600081359050613da28161509d565b92915050565b600060208284031215613dba57600080fd5b6000613dc884828501613cd6565b91505092915050565b60008060408385031215613de457600080fd5b6000613df285828601613cc1565b9250506020613e0385828601613d93565b9150509250929050565b600060208284031215613e1f57600080fd5b600082013567ffffffffffffffff811115613e3957600080fd5b613e4584828501613d3f565b91505092915050565b60008060408385031215613e6157600080fd5b600083013567ffffffffffffffff811115613e7b57600080fd5b613e8785828601613d3f565b9250506020613e9885828601613d93565b9150509250929050565b600080600060608486031215613eb757600080fd5b600084013567ffffffffffffffff811115613ed157600080fd5b613edd86828701613d3f565b9350506020613eee86828701613d93565b925050604084013567ffffffffffffffff811115613f0b57600080fd5b613f1786828701613ceb565b9150509250925092565b600080600060608486031215613f3657600080fd5b600084013567ffffffffffffffff811115613f5057600080fd5b613f5c86828701613d3f565b9350506020613f6d86828701613d93565b9250506040613f7e86828701613d93565b9150509250925092565b6000613f9483836140f6565b60208301905092915050565b6000613fac8383614105565b60208301905092915050565b6000613fc4838361497f565b905092915050565b6000613fd782614ef6565b613fe18185614f55565b9350613fec83614ecc565b8060005b8381101561401d5781516140048882613f88565b975061400f83614f2e565b925050600181019050613ff0565b5085935050505092915050565b61403381614f01565b61403d8184614f66565b925061404882614edc565b8060005b838110156140795781516140608782613fa0565b965061406b83614f3b565b92505060018101905061404c565b505050505050565b600061408c82614f0d565b6140968185614f71565b9350836020820285016140a885614ee6565b8060005b858110156140e457848403895281516140c58582613fb8565b94506140d083614f48565b925060208a019950506001810190506140ac565b50829750879550505050505092915050565b6140ff81614fc1565b82525050565b61410e81614fcd565b82525050565b61411d81615014565b82525050565b61412c81615014565b82525050565b600061413d82614f23565b6141478185614fa4565b9350614157818560208601615035565b80840191505092915050565b600061416e82614f18565b6141788185614f82565b9350614188818560208601615035565b61419181615068565b840191505092915050565b60006141a782614f18565b6141b18185614fa4565b93506141c1818560208601615035565b80840191505092915050565b60006141da601883614f93565b91507f496e636f7272656374206368756e6b20706f736974696f6e00000000000000006000830152602082019050919050565b600061421a601583614f93565b91507f4469726563746f7279206e6f74206372656174656400000000000000000000006000830152602082019050919050565b600061425a602483614f93565b91507f4e6f7420656e6f756768206d656d6f727920696e207468652046696c6573746f60008301527f72616765000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006142c0601b83614f93565b91507f48617368206861736e2774206265656e2063616c63756c6174656400000000006000830152602082019050919050565b6000614300601983614f93565b91507f4368756e6b20697320616c72656164792075706c6f61646564000000000000006000830152602082019050919050565b6000614340601683614f93565b91507f496e636f7272656374206368756e6b206c656e677468000000000000000000006000830152602082019050919050565b6000614380600f83614f93565b91507f46696c65206e6f742065786973747300000000000000000000000000000000006000830152602082019050919050565b60006143c0600e83614f93565b91507f496e76616c69642073656e6465720000000000000000000000000000000000006000830152602082019050919050565b6000614400601883614f93565b91507f4469726563746f7279206973206e6f742064656c6574656400000000000000006000830152602082019050919050565b6000614440601083614f93565b91507f46696c65206e6f742064656c65746564000000000000000000000000000000006000830152602082019050919050565b6000614480601383614f93565b91507f496e76616c69642073746f7261676550617468000000000000000000000000006000830152602082019050919050565b60006144c0600c83614f93565b91507f496e76616c6964207061746800000000000000000000000000000000000000006000830152602082019050919050565b6000614500600183614fa4565b91507f2e000000000000000000000000000000000000000000000000000000000000006000830152600182019050919050565b6000614540601683614f93565b91507f496e76616c6964206469726563746f7279206e616d65000000000000000000006000830152602082019050919050565b6000614580601583614f93565b91507f4368756e6b207761736e27742075706c6f6164656400000000000000000000006000830152602082019050919050565b60006145c0602683614f93565b91507f436f756c64206e6f742072657365727665206c657373207468616e207573656460008301527f20737061636500000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614626601683614f93565b91507f4469726563746f7279206973206e6f7420656d707479000000000000000000006000830152602082019050919050565b6000614666602383614f93565b91507f46696c65206861736e2774206265656e2075706c6f6164656420636f7272656360008301527f746c7900000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006146cc601183614f93565b91507f4368756e6b207761736e277420726561640000000000000000000000000000006000830152602082019050919050565b600061470c601883614f93565b91507f46696c656e616d652073686f756c64206265203c2032353600000000000000006000830152602082019050919050565b600061474c601f83614f93565b91507f46696c652073686f756c64206265206c657373207468616e20313030204d42006000830152602082019050919050565b600061478c600283614fa4565b91507f2e2e0000000000000000000000000000000000000000000000000000000000006000830152600282019050919050565b60006147cc601183614f93565b91507f4469726563746f72792069732066756c6c0000000000000000000000000000006000830152602082019050919050565b600061480c600e83614f93565b91507f46696c65206e6f7420666f756e640000000000000000000000000000000000006000830152602082019050919050565b600061484c601883614f93565b91507f46696c65206f72206469726563746f72792065786973747300000000000000006000830152602082019050919050565b600061488c601983614f93565b91507f4e6f7420656e6f756768207265736572766564207370616365000000000000006000830152602082019050919050565b60006148cc601883614f93565b91507f45564d206572726f7220696e2067657446696c6553697a6500000000000000006000830152602082019050919050565b600061490c601083614f93565b91507f46696c65206e6f742063726561746564000000000000000000000000000000006000830152602082019050919050565b600061494c601983614f93565b91507f46696c65206861736e2774206265656e2075706c6f61646564000000000000006000830152602082019050919050565b600060a083016000830151848203600086015261499c8282614163565b91505060208301516149b160208601826140f6565b5060408301516149c460408601826149fc565b5060608301516149d76060860182614114565b50608083015184820360808601526149ef8282613fcc565b9150508091505092915050565b614a058161500a565b82525050565b614a148161500a565b82525050565b6000614a26828461419c565b915081905092915050565b6000614a3d8284614132565b915081905092915050565b6000614a53826144f3565b9150819050919050565b6000614a688261477f565b9150819050919050565b60006210000082019050614a89600083018461402a565b92915050565b60006020820190508181036000830152614aa98184614081565b905092915050565b6000602082019050614ac66000830184614123565b92915050565b60006020820190508181036000830152614ae5816141cd565b9050919050565b60006020820190508181036000830152614b058161420d565b9050919050565b60006020820190508181036000830152614b258161424d565b9050919050565b60006020820190508181036000830152614b45816142b3565b9050919050565b60006020820190508181036000830152614b65816142f3565b9050919050565b60006020820190508181036000830152614b8581614333565b9050919050565b60006020820190508181036000830152614ba581614373565b9050919050565b60006020820190508181036000830152614bc5816143b3565b9050919050565b60006020820190508181036000830152614be5816143f3565b9050919050565b60006020820190508181036000830152614c0581614433565b9050919050565b60006020820190508181036000830152614c2581614473565b9050919050565b60006020820190508181036000830152614c45816144b3565b9050919050565b60006020820190508181036000830152614c6581614533565b9050919050565b60006020820190508181036000830152614c8581614573565b9050919050565b60006020820190508181036000830152614ca5816145b3565b9050919050565b60006020820190508181036000830152614cc581614619565b9050919050565b60006020820190508181036000830152614ce581614659565b9050919050565b60006020820190508181036000830152614d05816146bf565b9050919050565b60006020820190508181036000830152614d25816146ff565b9050919050565b60006020820190508181036000830152614d458161473f565b9050919050565b60006020820190508181036000830152614d65816147bf565b9050919050565b60006020820190508181036000830152614d85816147ff565b9050919050565b60006020820190508181036000830152614da58161483f565b9050919050565b60006020820190508181036000830152614dc58161487f565b9050919050565b60006020820190508181036000830152614de5816148bf565b9050919050565b60006020820190508181036000830152614e05816148ff565b9050919050565b60006020820190508181036000830152614e258161493f565b9050919050565b6000602082019050614e416000830184614a0b565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614e6a57600080fd5b8060405250919050565b600067ffffffffffffffff821115614e8b57600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614eb757600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050919050565b6000819050602082019050919050565b600081519050919050565b60006180009050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614fba82614fea565b9050919050565b60008115159050919050565b6000819050919050565b6000819050614fe582615079565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061501f82614fd7565b9050919050565b82818337600083830152505050565b60005b83811015615053578082015181840152602081019050615038565b83811115615062576000848401525b50505050565b6000601f19601f8301169050919050565b6003811061508357fe5b50565b61508f81614faf565b811461509a57600080fd5b50565b6150a68161500a565b81146150b157600080fd5b5056fea365627a7a72315820314a90e541327f2678eaf7815f54348c3702e4fa45cdf1d5595b378d08af86896c6578706572696d656e74616cf564736f6c634300050d0040", + "nonce": "0", + "storage": { + "0x0": "2868903936" + } + }, + "0x69bfcdcb98c9562e0a2faee3ecdfd65e8a0adb19": { + "balance": "1000000000000000000000000000000" + }, + "0x6a37ad7dceec4595eea9f03b82d2710e738343ac": { + "balance": "1000000000000000000000000000000" + }, + "0x6b806862a977a0e22ed1752f858e5332647121c8": { + "balance": "1000000000000000000000000000000" + }, + "0x6c0ef9084a57df13c175afea32ea47a510c5506e": { + "balance": "1000000000000000000000000000000" + }, + "0x6cd5e637266e18d3e888ee99451eb828c6b491f4": { + "balance": "1000000000000000000000000000000" + }, + "0x6d0d7f0ff51917bd84a5f7270d31a894282aaf4b": { + "balance": "1000000000000000000000000000000" + }, + "0x6d8092cb926daf29236f866cd31c327ff73323d1": { + "balance": "1000000000000000000000000000000" + }, + "0x6d80aAC61F6d92c7F4A3c412850474ba963B698E": { + "balance": "1000000000000000000000" + }, + "0x6fec280c0ab320715b17d70e8b02c2d4141c1372": { + "balance": "1000000000000000000000000000000" + }, + "0x733ad609ef2e742334d96266fbc13733f1cf5e4a": { + "balance": "1000000000000000000000000000000" + }, + "0x7525198d8cd1121d57358a0b0ed037e924581a76": { + "balance": "1000000000000000000000000000000" + }, + "0x765708943c3b791563d1e3f0533b6d7e7d769e4d": { + "balance": "1000000000000000000000000000000" + }, + "0x7685d04f0b7657017b77efa004a14ff9f022acab": { + "balance": "1000000000000000000000000000000" + }, + "0x76b545cb6a2fc671f741950eeb27627e69a1e69b": { + "balance": "1000000000000000000000000000000" + }, + "0x77a0bc73442d3d9cb993e8d9752f95babf0ccaa6": { + "balance": "1000000000000000000000000000000" + }, + "0x7a89A6c323FaCfF0ADeF7EEF3e491aD4044d0592": { + "balance": "100000000000000000000000" + }, + "0x7e7E68F04D1799Fa25C8cff57314c8a5d3942e69": { + "balance": "1000000000000000000000000" + }, + "0x811d701d14539d190a8593fe901eafe8eff511f5": { + "balance": "1000000000000000000000000000000" + }, + "0x81dcbd71da28fafb9ca99ff5a22bfcebba84fecc": { + "balance": "100000000000000000000000" + }, + "0x83c1479d2a32d9ed9fa699289b6c2db56b7cd045": { + "balance": "1000000000000000000000000000000" + }, + "0x85b33f0853ab8eaa4e602bdfd724d44bc2731e90": { + "balance": "1000000000000000000000000000000" + }, + "0x863f816036e3cbba90855196c9d1e339fcff1650": { + "balance": "1000000000000000000000000000000" + }, + "0x87ea381878572d63b3453033d7540abddd191186": { + "balance": "1000000000000000000000000000000" + }, + "0x88fd5e01078629cc194c933d9631b9448fe10b1d": { + "balance": "1000000000000000000000000000000" + }, + "0x8945e48bd056f45c8b57f9025d2674bb03a24035": { + "balance": "1000000000000000000000000000000" + }, + "0x8a920edc1021ce76c22774e0e83723a6e51c2439": { + "balance": "1000000000000000000000000000000" + }, + "0x8e6081e272c8f4d49f5b29157b52f68cbd6307ad": { + "balance": "1000000000000000000000000000000" + }, + "0x8fe24dbbf9884bd458d8cfac528b4ad70e82497d": { + "balance": "1000000000000000000000000000000" + }, + "0x90431f3f75b26657f74abbb5c759b12e78f916cc": { + "balance": "1000000000000000000000000000000" + }, + "0x907cd0881E50d359bb9Fd120B1A5A143b1C97De6": { + "balance": "1000000000000000000000000000000000000000000000000000000000" + }, + "0x94c6e5746971d6aebeaa42cbbe2feca0f6b5b24f": { + "balance": "1000000000000000000000000000000" + }, + "0x96672f9e982936e1904b15c948cc81bf18027db6": { + "balance": "1000000000000000000000000000000" + }, + "0x97b921ba45e0aa8830701aa62050a83ee00a1bb8": { + "balance": "1000000000000000000000000000000" + }, + "0x98e50c97baf98dc6a81bdb95067339a269a36fc1": { + "balance": "1000000000000000000000000000000" + }, + "0x9b77f28285a49601169a33332f08aa309d97edd0": { + "balance": "1000000000000000000000000000000" + }, + "0x9f62f4215cd277ca40dede101b4ccb29290de6bb": { + "balance": "1000000000000000000000000000000" + }, + "0xD1001000000000000000000000000000000000D1": { + "balance": "0", + "code": "0x608060405260043610603f576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680636d4ce63c146044575b600080fd5b348015604f57600080fd5b506056606c565b6040518082815260200191505060405180910390f35b60006001600060048152602001908152602001600020600060098152602001908152602001600020600101549050905600a165627a7a723058208fe64219becc0bcab1c8f854f05804ebb6bb555da5dbc49e8f7021c31d77636a0029", + "nonce": "0", + "storage": { + "0x3b4da637a1b0e6dbfc6795f2b7f0cb29eebb91b3af4dcc335e1633f6b4af810b": "1111" + } + }, + "0xD3001000000000000000000000000000000000D3": { + "balance": "0", + "code": "0x60806040526004361061007b5760003560e01c80639623609d1161004e5780639623609d1461013657806399a88ec4146101f5578063f2fde38b14610230578063f3b7dead146102635761007b565b8063204e1c7a14610080578063715018a6146100cf5780637eff275e146100e65780638da5cb5b14610121575b600080fd5b34801561008c57600080fd5b506100b3600480360360208110156100a357600080fd5b50356001600160a01b0316610296565b604080516001600160a01b039092168252519081900360200190f35b3480156100db57600080fd5b506100e4610328565b005b3480156100f257600080fd5b506100e46004803603604081101561010957600080fd5b506001600160a01b03813581169160200135166103ca565b34801561012d57600080fd5b506100b3610496565b6100e46004803603606081101561014c57600080fd5b6001600160a01b03823581169260208101359091169181019060608101604082013564010000000081111561018057600080fd5b82018360208201111561019257600080fd5b803590602001918460018302840111640100000000831117156101b457600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506104a5945050505050565b34801561020157600080fd5b506100e46004803603604081101561021857600080fd5b506001600160a01b03813581169160200135166105dd565b34801561023c57600080fd5b506100e46004803603602081101561025357600080fd5b50356001600160a01b031661068d565b34801561026f57600080fd5b506100b36004803603602081101561028657600080fd5b50356001600160a01b0316610785565b6000806060836001600160a01b03166040518080635c60da1b60e01b8152506004019050600060405180830381855afa9150503d80600081146102f5576040519150601f19603f3d011682016040523d82523d6000602084013e6102fa565b606091505b50915091508161030957600080fd5b80806020019051602081101561031e57600080fd5b5051949350505050565b6103306107e4565b6000546001600160a01b03908116911614610380576040805162461bcd60e51b8152602060048201819052602482015260008051602061080f833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6103d26107e4565b6000546001600160a01b03908116911614610422576040805162461bcd60e51b8152602060048201819052602482015260008051602061080f833981519152604482015290519081900360640190fd5b816001600160a01b0316638f283970826040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050600060405180830381600087803b15801561047a57600080fd5b505af115801561048e573d6000803e3d6000fd5b505050505050565b6000546001600160a01b031690565b6104ad6107e4565b6000546001600160a01b039081169116146104fd576040805162461bcd60e51b8152602060048201819052602482015260008051602061080f833981519152604482015290519081900360640190fd5b826001600160a01b0316634f1ef2863484846040518463ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561057357818101518382015260200161055b565b50505050905090810190601f1680156105a05780820380516001836020036101000a031916815260200191505b5093505050506000604051808303818588803b1580156105bf57600080fd5b505af11580156105d3573d6000803e3d6000fd5b5050505050505050565b6105e56107e4565b6000546001600160a01b03908116911614610635576040805162461bcd60e51b8152602060048201819052602482015260008051602061080f833981519152604482015290519081900360640190fd5b816001600160a01b0316633659cfe6826040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050600060405180830381600087803b15801561047a57600080fd5b6106956107e4565b6000546001600160a01b039081169116146106e5576040805162461bcd60e51b8152602060048201819052602482015260008051602061080f833981519152604482015290519081900360640190fd5b6001600160a01b03811661072a5760405162461bcd60e51b81526004018080602001828103825260268152602001806107e96026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000806060836001600160a01b031660405180806303e1469160e61b8152506004019050600060405180830381855afa9150503d80600081146102f5576040519150601f19603f3d011682016040523d82523d6000602084013e6102fa565b339056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a26469706673582212201d968ac32bef5562c6b4f1bd5d2f2a74c14d07ce008ca6fdc5a3bd0f5fc265f564736f6c63430006080033", + "nonce": "0", + "storage": { + "0x0": "0x907cd0881E50d359bb9Fd120B1A5A143b1C97De6" + } + }, + "0xD3002000000000000000000000000000000000D3": { + "balance": "0", + "code": "0x60806040526004361061004e5760003560e01c80633659cfe6146100655780634f1ef286146100985780635c60da1b146101185780638f28397014610149578063f851a4401461017c5761005d565b3661005d5761005b610191565b005b61005b610191565b34801561007157600080fd5b5061005b6004803603602081101561008857600080fd5b50356001600160a01b03166101ab565b61005b600480360360408110156100ae57600080fd5b6001600160a01b0382351691908101906040810160208201356401000000008111156100d957600080fd5b8201836020820111156100eb57600080fd5b8035906020019184600183028401116401000000008311171561010d57600080fd5b5090925090506101e5565b34801561012457600080fd5b5061012d610292565b604080516001600160a01b039092168252519081900360200190f35b34801561015557600080fd5b5061005b6004803603602081101561016c57600080fd5b50356001600160a01b03166102cf565b34801561018857600080fd5b5061012d610389565b6101996103ba565b6101a96101a461041a565b61043f565b565b6101b3610463565b6001600160a01b0316336001600160a01b031614156101da576101d581610488565b6101e2565b6101e2610191565b50565b6101ed610463565b6001600160a01b0316336001600160a01b031614156102855761020f83610488565b6000836001600160a01b031683836040518083838082843760405192019450600093509091505080830381855af49150503d806000811461026c576040519150601f19603f3d011682016040523d82523d6000602084013e610271565b606091505b505090508061027f57600080fd5b5061028d565b61028d610191565b505050565b600061029c610463565b6001600160a01b0316336001600160a01b031614156102c4576102bd61041a565b90506102cc565b6102cc610191565b90565b6102d7610463565b6001600160a01b0316336001600160a01b031614156101da576001600160a01b0381166103355760405162461bcd60e51b81526004018080602001828103825260368152602001806105876036913960400191505060405180910390fd5b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f61035e610463565b604080516001600160a01b03928316815291841660208301528051918290030190a16101d5816104c8565b6000610393610463565b6001600160a01b0316336001600160a01b031614156102c4576102bd610463565b3b151590565b6103c2610463565b6001600160a01b0316336001600160a01b031614156104125760405162461bcd60e51b81526004018080602001828103825260328152602001806105556032913960400191505060405180910390fd5b6101a96101a9565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b3660008037600080366000845af43d6000803e80801561045e573d6000f35b3d6000fd5b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b610491816104ec565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610355565b6104f5816103b4565b6105305760405162461bcd60e51b815260040180806020018281038252603b8152602001806105bd603b913960400191505060405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5556fe43616e6e6f742063616c6c2066616c6c6261636b2066756e6374696f6e2066726f6d207468652070726f78792061646d696e43616e6e6f74206368616e6765207468652061646d696e206f6620612070726f787920746f20746865207a65726f206164647265737343616e6e6f742073657420612070726f787920696d706c656d656e746174696f6e20746f2061206e6f6e2d636f6e74726163742061646472657373a26469706673582212206e221e2a3547bd97244b05ed46430b1b078ba097cb2a4e25ec3d79cf9ac9f02c64736f6c63430006080033", + "nonce": "0", + "storage": { + "0x0": "1000000", + "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0xD3003000000000000000000000000000000000D3", + "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "0xD3001000000000000000000000000000000000D3" + } + }, + "0xD3003000000000000000000000000000000000D3": { + "balance": "0", + "code": "0x608060405234801561001057600080fd5b50600436106100b45760003560e01c806379210e8e1161007157806379210e8e1461017757806381a8235a146101a757806385aeeb17146101c35780639a9a5593146101f3578063a99100541461020f578063b57321221461022b576100b4565b806307c6e7d3146100b9578063122f4fba146100d55780631c6ec7a9146101055780631cfe4e3b14610121578063373dedb41461013d57806361e46db51461015b575b600080fd5b6100d360048036036100ce9190810190613e94565b61025b565b005b6100ef60048036036100ea9190810190613e94565b610862565b6040516100fc9190614b38565b60405180910390f35b61011f600480360361011a9190810190613e94565b610ba1565b005b61013b60048036036101369190810190613e58565b610fce565b005b6101456111ec565b6040516101529190614eb3565b60405180910390f35b61017560048036036101709190810190613f29565b6111f6565b005b610191600480360361018c9190810190613fa8565b611456565b60405161019e9190614af9565b60405180910390f35b6101c160048036036101bc9190810190613e94565b611756565b005b6101dd60048036036101d89190810190613e94565b6118fb565b6040516101ea9190614b16565b60405180910390f35b61020d60048036036102089190810190613ed5565b611bfa565b005b61022960048036036102249190810190613e94565b612195565b005b61024560048036036102409190810190613e94565b612849565b6040516102529190614eb3565b60405180910390f35b6000339050606061026b83612ac9565b90506000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b825181101561037c576000826001018460018403815181106102d557fe5b60200260200101516040516102ea9190614aa1565b90815260200160405180910390205411610339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161033090614cb3565b60405180910390fd5b8160020183600183038151811061034c57fe5b60200260200101516040516103619190614aa1565b908152602001604051809103902091508060010190506102b7565b506060600183511161038e57846103a7565b8260018451038151811061039e57fe5b60200260200101515b9050600082600101826040516103bd9190614ab8565b9081526020016040518091039020541161040c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161040390614cb3565b60405180910390fd5b600082600201826040516104209190614ab8565b90815260200160405180910390206000018054905014610475576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161046c90614d33565b60405180910390fd5b60006104818587612cc9565b9050806104c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ba90614c53565b60405180910390fd5b6104cb613a4f565b836000016001856000018054905003815481106104e457fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156105965780601f1061056b57610100808354040283529160200191610596565b820191906000526020600020905b81548152906001019060200180831161057957829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff1660028111156105e257fe5b60028111156105ed57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561066557602002820191906000526020600020906000905b82829054906101000a900460ff1615158152602001906001019060208260000104928301926001038202915080841161062f5790505b50505050508152505090508084600001600186600101866040516106899190614ab8565b90815260200160405180910390205403815481106106a357fe5b906000526020600020906005020160008201518160000190805190602001906106cd929190613a8b565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561071c57fe5b0217905550608082015181600401908051906020019061073d929190613b0b565b5090505083600101836040516107539190614ab8565b9081526020016040518091039020548460010182600001516040516107789190614aa1565b9081526020016040518091039020819055506000846001018460405161079e9190614ab8565b908152602001604051809103902081905550836000018054806107bd57fe5b6001900381819060005260206000209060050201600080820160006107e29190613bb1565b6001820160006101000a81549060ff021916905560028201600090556003820160006101000a81549060ff02191690556004820160006108229190613bf9565b5050905583600201836040516108389190614ab8565b9081526020016040518091039020600080820160006108579190613c21565b505050505050505050565b600080606061087084612d2d565b91509150606061087f82612ac9565b90506000600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015610964576000826001018460018403815181106108e957fe5b60200260200101516040516108fe9190614aa1565b908152602001604051809103902054141561092157600095505050505050610b9c565b8160020183600183038151811061093457fe5b60200260200101516040516109499190614aa1565b908152602001604051809103902091508060010190506108cb565b5060606001835111610976578361098f565b8260018451038151811061098657fe5b60200260200101515b9050600082600101826040516109a59190614ab8565b90815260200160405180910390205414156109c857600095505050505050610b9c565b6109d0613a4f565b82600001600184600101846040516109e89190614ab8565b9081526020016040518091039020540381548110610a0257fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610ab45780601f10610a8957610100808354040283529160200191610ab4565b820191906000526020600020905b815481529060010190602001808311610a9757829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115610b0057fe5b6002811115610b0b57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015610b8357602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411610b4d5790505b5050505050815250509050806060015196505050505050505b919050565b600360009054906101000a900460ff16610be457612000600481905550621000006005819055506001600360006101000a81548160ff0219169083151502179055505b6000815111610c28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1f90614cb3565b60405180910390fd5b60003390506060610c3883612ac9565b90506000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015610d4957600082600101846001840381518110610ca257fe5b6020026020010151604051610cb79190614aa1565b90815260200160405180910390205411610d06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cfd90614cb3565b60405180910390fd5b81600201836001830381518110610d1957fe5b6020026020010151604051610d2e9190614aa1565b90815260200160405180910390209150806001019050610c84565b50600454816000018054905010610d95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8c90614dd3565b60405180910390fd5b60606001835111610da65784610dbf565b82600184510381518110610db657fe5b60200260200101515b905060008260010182604051610dd59190614ab8565b90815260200160405180910390205414610e24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1b90614e13565b60405180910390fd5b610e2d816130af565b610e6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6390614cd3565b60405180910390fd5b6000610e788587613190565b905080610eba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb190614b73565b60405180910390fd5b610ec2613a4f565b8281600001819052506000816020019015159081151581525050836000018190806001815401808255809150506001900390600052602060002090600502016000909190919091506000820151816000019080519060200190610f26929190613a8b565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff02191690836002811115610f7557fe5b02179055506080820151816004019080519060200190610f96929190613b0b565b50505083600001805490508460010184604051610fb39190614ab8565b90815260200160405180910390208190555050505050505050565b610fd66131f4565b73ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16148061103b57503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614155b61107a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107190614c33565b60405180910390fd5b80600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411156110fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f390614d13565b60405180910390fd5b60025460095482011115611145576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113c90614b93565b60405180910390fd5b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460096000828254039250508190555080600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550806009600082825401925050819055505050565b6000600254905090565b60003390506000611207828661328d565b90506001600281111561121657fe5b8160030160009054906101000a900460ff16600281111561123357fe5b14611273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126a90614df3565b60405180910390fd5b6000600554858161128057fe5b061480156112915750806002015484105b6112d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c790614b53565b60405180910390fd5b600554848260020154031080156112ed5750838160020154038351145b806112fa57506005548351145b611339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133090614bf3565b60405180910390fd5b6000151581600401600554868161134c57fe5b048154811061135757fe5b90600052602060002090602091828204019190069054906101000a900460ff161515146113b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b090614bd3565b60405180910390fd5b60006113c78387878761348c565b905080611409576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140090614cf3565b60405180910390fd5b600182600401600554878161141a57fe5b048154811061142557fe5b90600052602060002090602091828204019190066101000a81548160ff021916908315150217905550505050505050565b61145e613c45565b6000606061146b86612d2d565b91509150611477613a4f565b611481838361328d565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156115255780601f106114fa57610100808354040283529160200191611525565b820191906000526020600020905b81548152906001019060200180831161150857829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561157157fe5b600281111561157c57fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156115f457602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116115be5790505b505050505081525050905060028081111561160b57fe5b8160600151600281111561161b57fe5b1461165b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165290614e93565b60405180910390fd5b600554851115801561166d5750600085115b6116ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a390614bf3565b60405180910390fd5b806040015185870111156116f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ec90614b53565b60405180910390fd5b60006117038484898961353d565b80965081925050508061174b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174290614d73565b60405180910390fd5b505050509392505050565b60003390506000611767828461328d565b90506001600281111561177657fe5b8160030160009054906101000a900460ff16600281111561179357fe5b146117d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ca90614df3565b60405180910390fd5b60006001905060008260040180549050905060008090505b8181101561183e576000151584600401828154811061180657fe5b90600052602060002090602091828204019190069054906101000a900460ff161515141561183357600092505b8060010190506117eb565b508161187f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187690614d53565b60405180910390fd5b60028360030160006101000a81548160ff021916908360028111156118a057fe5b021790555060006118b185876135d0565b9050806118f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ea90614bb3565b60405180910390fd5b505050505050565b60606000606061190a84612d2d565b91509150606061191982612ac9565b90506000600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008090505b8251811015611a235760008260010184838151811061197f57fe5b60200260200101516040516119949190614aa1565b908152602001604051809103902054116119e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119da90614cb3565b60405180910390fd5b816002018382815181106119f357fe5b6020026020010151604051611a089190614aa1565b90815260200160405180910390209150806001019050611964565b5080600001805480602002602001604051908101604052809291908181526020016000905b82821015611beb57838290600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611b045780601f10611ad957610100808354040283529160200191611b04565b820191906000526020600020905b815481529060010190602001808311611ae757829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115611b5057fe5b6002811115611b5b57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015611bd357602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411611b9d5790505b50505050508152505081526020019060010190611a48565b50505050945050505050919050565b600360009054906101000a900460ff16611c3d57612000600481905550621000006005819055506001600360006101000a81548160ff0219169083151502179055505b60003390506305f5e100821115611c89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8090614db3565b60405180910390fd5b600660008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205483011115611d4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4390614e33565b60405180910390fd5b6060611d5784612ac9565b90506000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015611e6857600082600101846001840381518110611dc157fe5b6020026020010151604051611dd69190614aa1565b90815260200160405180910390205411611e25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1c90614cb3565b60405180910390fd5b81600201836001830381518110611e3857fe5b6020026020010151604051611e4d9190614aa1565b90815260200160405180910390209150806001019050611da3565b50600454816000018054905010611eb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eab90614dd3565b60405180910390fd5b60606001835111611ec55785611ede565b82600184510381518110611ed557fe5b60200260200101515b905060008260010182604051611ef49190614ab8565b90815260200160405180910390205414611f43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3a90614e13565b60405180910390fd5b611f4c816130af565b611f8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8290614d93565b60405180910390fd5b6000611f98858888613634565b905080611fda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd190614e73565b60405180910390fd5b6060600554600160055489010381611fee57fe5b0460405190808252806020026020018201604052801561201d5781602001602082028038833980820191505090505b509050836000016040518060a001604052808581526020016001151581526020018981526020016001600281111561205157fe5b8152602001838152509080600181540180825580915050600190039060005260206000209060050201600090919091909150600082015181600001908051906020019061209f929190613a8b565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff021916908360028111156120ee57fe5b0217905550608082015181600401908051906020019061210f929190613b0b565b5050508360000180549050846001018460405161212c9190614ab8565b90815260200160405180910390208190555086600760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505050505050505050565b60003390506121a2613a4f565b6121ac828461328d565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156122505780601f1061222557610100808354040283529160200191612250565b820191906000526020600020905b81548152906001019060200180831161223357829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561229c57fe5b60028111156122a757fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561231f57602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116122e95790505b50505050508152505090506000600281111561233757fe5b8160600151600281111561234757fe5b1415612388576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161237f90614c13565b60405180910390fd5b600061239483856136a1565b9050806123d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123cd90614c73565b60405180910390fd5b60606123e185612ac9565b90506000600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015612479578160020183600183038151811061244957fe5b602002602001015160405161245e9190614aa1565b9081526020016040518091039020915080600101905061242d565b50600060018260010186600001516040516124949190614aa1565b9081526020016040518091039020540390506124ae613a4f565b826000016001846000018054905003815481106124c757fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156125795780601f1061254e57610100808354040283529160200191612579565b820191906000526020600020905b81548152906001019060200180831161255c57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff1660028111156125c557fe5b60028111156125d057fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561264857602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116126125790505b50505050508152505090508083600001838154811061266357fe5b9060005260206000209060050201600082015181600001908051906020019061268d929190613a8b565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff021916908360028111156126dc57fe5b021790555060808201518160040190805190602001906126fd929190613b0b565b509050508260000180548061270e57fe5b6001900381819060005260206000209060050201600080820160006127339190613bb1565b6001820160006101000a81549060ff021916905560028201600090556003820160006101000a81549060ff02191690556004820160006127739190613bf9565b5050905582600101866000015160405161278d9190614aa1565b9081526020016040518091039020548360010182600001516040516127b29190614aa1565b90815260200160405180910390208190555060008360010187600001516040516127dc9190614aa1565b9081526020016040518091039020819055508560400151600760008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505050505050505050565b600080606061285784612d2d565b91509150612863613a4f565b61286d838361328d565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156129115780601f106128e657610100808354040283529160200191612911565b820191906000526020600020905b8154815290600101906020018083116128f457829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561295d57fe5b600281111561296857fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156129e057602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116129aa5790505b5050505050815250509050600160028111156129f857fe5b81606001516002811115612a0857fe5b1480612a2d5750600280811115612a1b57fe5b81606001516002811115612a2b57fe5b145b612a6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a6390614df3565b60405180910390fd5b6000612a788484613705565b809650819250505080612ac0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ab790614e53565b60405180910390fd5b50505050919050565b6060612ad3613c6a565b612adc8361376e565b9050612ae6613c6a565b612b246040518060400160405280600181526020017f2f0000000000000000000000000000000000000000000000000000000000000081525061376e565b905060606001612b3d838561379c90919063ffffffff16565b01604051908082528060200260200182016040528015612b7157816020015b6060815260200190600190039081612b5c5790505b50905060008090505b8151811015612bc257612b9e612b99848661381190919063ffffffff16565b61382b565b828281518110612baa57fe5b60200260200101819052508080600101915050612b7a565b50600081600183510381518110612bd557fe5b6020026020010151511415612c405780600182510381518110612bf457fe5b6020026020010160608152506001815103604051908082528060200260200182016040528015612c3857816020015b6060815260200190600190039081612c235790505b509350612c79565b8051604051908082528060200260200182016040528015612c7557816020015b6060815260200190600190039081612c605790505b5093505b60008090505b8451811015612cc057818181518110612c9457fe5b6020026020010151858281518110612ca857fe5b60200260200101819052508080600101915050612c7f565b50505050919050565b60008060016020601f85510181612cdc57fe5b040190506040518481526020810160005b83811015612d0e578060200286015181602002830152806001019050612ced565b50602082602085026040018460006010600019f1935050505092915050565b6000606060006028905080845111612d7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d7190614c93565b60405180910390fd5b6060816040519080825280601f01601f191660200182016040528015612daf5781602001600182028038833980820191505090505b50905060008090505b82811015612e1f57858181518110612dcc57fe5b602001015160f81c60f81b828281518110612de357fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050612db8565b50600080905060008090505b83811015612f4e576000838281518110612e4157fe5b602001015160f81c60f81b60f81c60ff16905060308110158015612e66575060398111155b80612e7f575060418110158015612e7e5750605a8111155b5b80612e98575060618110158015612e97575060668111155b5b612ed7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ece90614c93565b60405180910390fd5b60308110158015612ee9575060398111155b15612efa5760308103601084020192505b60418110158015612f0c5750605a8111155b15612f1d5760378103601084020192505b60618110158015612f2f575060668111155b15612f405760578103601084020192505b508080600101915050612e2b565b508094507f2f00000000000000000000000000000000000000000000000000000000000000868481518110612f7f57fe5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612fec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fe390614c93565b60405180910390fd5b6000600184885103039050806040519080825280601f01601f19166020018201604052801561302a5781602001600182028038833980820191505090505b50945060008090505b818110156130a5576000886001878401018151811061304e57fe5b602001015160f81c60f81b90508087838151811061306857fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350508080600101915050613033565b5050505050915091565b60006040516020016130c090614ae4565b60405160208183030381529060405280519060200120826040516020016130e79190614ab8565b604051602081830303815290604052805190602001201480613152575060405160200161311390614acf565b604051602081830303815290604052805190602001208260405160200161313a9190614ab8565b60405160208183030381529060405280519060200120145b8061315e575060008251145b1561316c576000905061318b565b60008251905060ff81111561318557600091505061318b565b60019150505b919050565b60008060016020601f855101816131a357fe5b040190506040518481526020810160005b838110156131d55780602002860151816020028301528060010190506131b4565b5060208260208502604001846000600f600019f1935050505092915050565b600073d2001000000000000000000000000000000000d273ffffffffffffffffffffffffffffffffffffffff166383e781fe6040518163ffffffff1660e01b815260040160206040518083038186803b15801561325057600080fd5b505afa158015613264573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506132889190810190613e2f565b905090565b6000606061329a83612ac9565b90506000600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b82518110156133ab5760008260010184600184038151811061330457fe5b60200260200101516040516133199190614aa1565b90815260200160405180910390205411613368576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161335f90614cb3565b60405180910390fd5b8160020183600183038151811061337b57fe5b60200260200101516040516133909190614aa1565b908152602001604051809103902091508060010190506132e6565b50606060018351116133bd57846133d6565b826001845103815181106133cd57fe5b60200260200101515b9050600082600101826040516133ec9190614ab8565b9081526020016040518091039020541161343b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161343290614cb3565b60405180910390fd5b600082600001600184600101846040516134559190614ab8565b908152602001604051809103902054038154811061346f57fe5b906000526020600020906005020190508094505050505092915050565b60008060016020601f8551018161349f57fe5b04019050600060016020601f885101816134b557fe5b040190506040518781526020810160005b838110156134e75780602002890151816020028301528060010190506134c6565b50868360200282015260005b8481101561351957806020028701518185600101016020028301528060010190506134f3565b50602082848601602002606001846000600c600019f1945050505050949350505050565b6000613547613c45565b600060016020601f8851018161355957fe5b0401905060006020601f86018161356c57fe5b0490506040518881526020810160005b8481101561359d57806020028a01518160200283015280600101905061357c565b5083602002810188815287816020015283602002868660030160200285600a600019fa9650505050505094509492505050565b60008060016020601f855101816135e357fe5b040190506040518481526020810160005b838110156136155780602002860151816020028301528060010190506135f4565b50602082602085026040018460006011600019f1935050505092915050565b60008060016020601f8651018161364757fe5b040190506040518581526020810160005b83811015613679578060200287015181602002830152806001019050613658565b50846020840282015260208260208502604001846000600b600019f193505050509392505050565b60008060016020601f855101816136b457fe5b040190506040518481526020810160005b838110156136e65780602002860151816020028301528060010190506136c5565b5060208260208502604001846000600e600019f1935050505092915050565b600080600060016020601f8651018161371a57fe5b040190506040518581526020810160005b8381101561374c57806020028701518160200283015280600101905061372b565b506020826020850260200184600d600019fa9450815193505050509250929050565b613776613c6a565b600060208301905060405180604001604052808451815260200182815250915050919050565b60008082600001516137c0856000015186602001518660000151876020015161388d565b0190505b8360000151846020015101811161380a578180600101925050826000015161380285602001518303866000015103838660000151876020015161388d565b0190506137c4565b5092915050565b613819613c6a565b613824838383613968565b5092915050565b60608082600001516040519080825280601f01601f1916602001820160405280156138655781602001600182028038833980820191505090505b50905060006020820190506138838185602001518660000151613a06565b8192505050919050565b6000808490506000868511613958576020851161391257600060018660200360080260020a031960001b905060008186511690506000878a8a0103905060008386511690505b828114613904578186106138f1578a8a019650505050505050613960565b85806001019650508386511690506138d3565b859650505050505050613960565b60008585209050600091505b85880382116139565760008684209050808214156139425783945050505050613960565b60018401935050818060010192505061391e565b505b868601925050505b949350505050565b613970613c6a565b600061398e856000015186602001518660000151876020015161388d565b905084602001518360200181815250508460200151810383600001818152505084600001518560200151018114156139d05760008560000181815250506139fb565b8360000151836000015101856000018181510391508181525050836000015181018560200181815250505b829150509392505050565b5b60208110613a2a5781518352602083019250602082019150602081039050613a07565b60006001826020036101000a0390508019835116818551168181178652505050505050565b6040518060a00160405280606081526020016000151581526020016000815260200160006002811115613a7e57fe5b8152602001606081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613acc57805160ff1916838001178555613afa565b82800160010185558215613afa579182015b82811115613af9578251825591602001919060010190613ade565b5b509050613b079190613c84565b5090565b82805482825590600052602060002090601f01602090048101928215613ba05791602002820160005b83821115613b7157835183826101000a81548160ff0219169083151502179055509260200192600101602081600001049283019260010302613b34565b8015613b9e5782816101000a81549060ff0219169055600101602081600001049283019260010302613b71565b505b509050613bad9190613ca9565b5090565b50805460018160011615610100020316600290046000825580601f10613bd75750613bf6565b601f016020900490600052602060002090810190613bf59190613c84565b5b50565b50805460008255601f016020900490600052602060002090810190613c1e9190613c84565b50565b5080546000825560050290600052602060002090810190613c429190613cd9565b50565b6040518062100000016040528061800090602082028038833980820191505090505090565b604051806040016040528060008152602001600081525090565b613ca691905b80821115613ca2576000816000905550600101613c8a565b5090565b90565b613cd691905b80821115613cd257600081816101000a81549060ff021916905550600101613caf565b5090565b90565b613d4591905b80821115613d415760008082016000613cf89190613bb1565b6001820160006101000a81549060ff021916905560028201600090556003820160006101000a81549060ff0219169055600482016000613d389190613bf9565b50600501613cdf565b5090565b90565b600081359050613d578161510d565b92915050565b600081519050613d6c8161510d565b92915050565b600082601f830112613d8357600080fd5b8135613d96613d9182614efb565b614ece565b91508082526020830160208301858383011115613db257600080fd5b613dbd8382846150ad565b50505092915050565b600082601f830112613dd757600080fd5b8135613dea613de582614f27565b614ece565b91508082526020830160208301858383011115613e0657600080fd5b613e118382846150ad565b50505092915050565b600081359050613e2981615124565b92915050565b600060208284031215613e4157600080fd5b6000613e4f84828501613d5d565b91505092915050565b60008060408385031215613e6b57600080fd5b6000613e7985828601613d48565b9250506020613e8a85828601613e1a565b9150509250929050565b600060208284031215613ea657600080fd5b600082013567ffffffffffffffff811115613ec057600080fd5b613ecc84828501613dc6565b91505092915050565b60008060408385031215613ee857600080fd5b600083013567ffffffffffffffff811115613f0257600080fd5b613f0e85828601613dc6565b9250506020613f1f85828601613e1a565b9150509250929050565b600080600060608486031215613f3e57600080fd5b600084013567ffffffffffffffff811115613f5857600080fd5b613f6486828701613dc6565b9350506020613f7586828701613e1a565b925050604084013567ffffffffffffffff811115613f9257600080fd5b613f9e86828701613d72565b9150509250925092565b600080600060608486031215613fbd57600080fd5b600084013567ffffffffffffffff811115613fd757600080fd5b613fe386828701613dc6565b9350506020613ff486828701613e1a565b925050604061400586828701613e1a565b9150509250925092565b600061401b838361417d565b60208301905092915050565b6000614033838361418c565b60208301905092915050565b600061404b8383614a06565b905092915050565b600061405e82614f7d565b6140688185614fdc565b935061407383614f53565b8060005b838110156140a457815161408b888261400f565b975061409683614fb5565b925050600181019050614077565b5085935050505092915050565b6140ba81614f88565b6140c48184614fed565b92506140cf82614f63565b8060005b838110156141005781516140e78782614027565b96506140f283614fc2565b9250506001810190506140d3565b505050505050565b600061411382614f94565b61411d8185614ff8565b93508360208202850161412f85614f6d565b8060005b8581101561416b578484038952815161414c858261403f565b945061415783614fcf565b925060208a01995050600181019050614133565b50829750879550505050505092915050565b61418681615048565b82525050565b61419581615054565b82525050565b6141a48161509b565b82525050565b6141b38161509b565b82525050565b60006141c482614faa565b6141ce818561502b565b93506141de8185602086016150bc565b80840191505092915050565b60006141f582614f9f565b6141ff8185615009565b935061420f8185602086016150bc565b614218816150ef565b840191505092915050565b600061422e82614f9f565b614238818561502b565b93506142488185602086016150bc565b80840191505092915050565b600061426160188361501a565b91507f496e636f7272656374206368756e6b20706f736974696f6e00000000000000006000830152602082019050919050565b60006142a160158361501a565b91507f4469726563746f7279206e6f74206372656174656400000000000000000000006000830152602082019050919050565b60006142e160248361501a565b91507f4e6f7420656e6f756768206d656d6f727920696e207468652046696c6573746f60008301527f72616765000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614347601b8361501a565b91507f48617368206861736e2774206265656e2063616c63756c6174656400000000006000830152602082019050919050565b600061438760198361501a565b91507f4368756e6b20697320616c72656164792075706c6f61646564000000000000006000830152602082019050919050565b60006143c760168361501a565b91507f496e636f7272656374206368756e6b206c656e677468000000000000000000006000830152602082019050919050565b6000614407600f8361501a565b91507f46696c65206e6f742065786973747300000000000000000000000000000000006000830152602082019050919050565b6000614447600e8361501a565b91507f496e76616c69642073656e6465720000000000000000000000000000000000006000830152602082019050919050565b600061448760188361501a565b91507f4469726563746f7279206973206e6f742064656c6574656400000000000000006000830152602082019050919050565b60006144c760108361501a565b91507f46696c65206e6f742064656c65746564000000000000000000000000000000006000830152602082019050919050565b600061450760138361501a565b91507f496e76616c69642073746f7261676550617468000000000000000000000000006000830152602082019050919050565b6000614547600c8361501a565b91507f496e76616c6964207061746800000000000000000000000000000000000000006000830152602082019050919050565b600061458760018361502b565b91507f2e000000000000000000000000000000000000000000000000000000000000006000830152600182019050919050565b60006145c760168361501a565b91507f496e76616c6964206469726563746f7279206e616d65000000000000000000006000830152602082019050919050565b600061460760158361501a565b91507f4368756e6b207761736e27742075706c6f6164656400000000000000000000006000830152602082019050919050565b600061464760268361501a565b91507f436f756c64206e6f742072657365727665206c657373207468616e207573656460008301527f20737061636500000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006146ad60168361501a565b91507f4469726563746f7279206973206e6f7420656d707479000000000000000000006000830152602082019050919050565b60006146ed60238361501a565b91507f46696c65206861736e2774206265656e2075706c6f6164656420636f7272656360008301527f746c7900000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061475360118361501a565b91507f4368756e6b207761736e277420726561640000000000000000000000000000006000830152602082019050919050565b600061479360188361501a565b91507f46696c656e616d652073686f756c64206265203c2032353600000000000000006000830152602082019050919050565b60006147d3601f8361501a565b91507f46696c652073686f756c64206265206c657373207468616e20313030204d42006000830152602082019050919050565b600061481360028361502b565b91507f2e2e0000000000000000000000000000000000000000000000000000000000006000830152600282019050919050565b600061485360118361501a565b91507f4469726563746f72792069732066756c6c0000000000000000000000000000006000830152602082019050919050565b6000614893600e8361501a565b91507f46696c65206e6f7420666f756e640000000000000000000000000000000000006000830152602082019050919050565b60006148d360188361501a565b91507f46696c65206f72206469726563746f72792065786973747300000000000000006000830152602082019050919050565b600061491360198361501a565b91507f4e6f7420656e6f756768207265736572766564207370616365000000000000006000830152602082019050919050565b600061495360188361501a565b91507f45564d206572726f7220696e2067657446696c6553697a6500000000000000006000830152602082019050919050565b600061499360108361501a565b91507f46696c65206e6f742063726561746564000000000000000000000000000000006000830152602082019050919050565b60006149d360198361501a565b91507f46696c65206861736e2774206265656e2075706c6f61646564000000000000006000830152602082019050919050565b600060a0830160008301518482036000860152614a2382826141ea565b9150506020830151614a38602086018261417d565b506040830151614a4b6040860182614a83565b506060830151614a5e606086018261419b565b5060808301518482036080860152614a768282614053565b9150508091505092915050565b614a8c81615091565b82525050565b614a9b81615091565b82525050565b6000614aad8284614223565b915081905092915050565b6000614ac482846141b9565b915081905092915050565b6000614ada8261457a565b9150819050919050565b6000614aef82614806565b9150819050919050565b60006210000082019050614b1060008301846140b1565b92915050565b60006020820190508181036000830152614b308184614108565b905092915050565b6000602082019050614b4d60008301846141aa565b92915050565b60006020820190508181036000830152614b6c81614254565b9050919050565b60006020820190508181036000830152614b8c81614294565b9050919050565b60006020820190508181036000830152614bac816142d4565b9050919050565b60006020820190508181036000830152614bcc8161433a565b9050919050565b60006020820190508181036000830152614bec8161437a565b9050919050565b60006020820190508181036000830152614c0c816143ba565b9050919050565b60006020820190508181036000830152614c2c816143fa565b9050919050565b60006020820190508181036000830152614c4c8161443a565b9050919050565b60006020820190508181036000830152614c6c8161447a565b9050919050565b60006020820190508181036000830152614c8c816144ba565b9050919050565b60006020820190508181036000830152614cac816144fa565b9050919050565b60006020820190508181036000830152614ccc8161453a565b9050919050565b60006020820190508181036000830152614cec816145ba565b9050919050565b60006020820190508181036000830152614d0c816145fa565b9050919050565b60006020820190508181036000830152614d2c8161463a565b9050919050565b60006020820190508181036000830152614d4c816146a0565b9050919050565b60006020820190508181036000830152614d6c816146e0565b9050919050565b60006020820190508181036000830152614d8c81614746565b9050919050565b60006020820190508181036000830152614dac81614786565b9050919050565b60006020820190508181036000830152614dcc816147c6565b9050919050565b60006020820190508181036000830152614dec81614846565b9050919050565b60006020820190508181036000830152614e0c81614886565b9050919050565b60006020820190508181036000830152614e2c816148c6565b9050919050565b60006020820190508181036000830152614e4c81614906565b9050919050565b60006020820190508181036000830152614e6c81614946565b9050919050565b60006020820190508181036000830152614e8c81614986565b9050919050565b60006020820190508181036000830152614eac816149c6565b9050919050565b6000602082019050614ec86000830184614a92565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614ef157600080fd5b8060405250919050565b600067ffffffffffffffff821115614f1257600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614f3e57600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050919050565b6000819050602082019050919050565b600081519050919050565b60006180009050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061504182615071565b9050919050565b60008115159050919050565b6000819050919050565b600081905061506c82615100565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006150a68261505e565b9050919050565b82818337600083830152505050565b60005b838110156150da5780820151818401526020810190506150bf565b838111156150e9576000848401525b50505050565b6000601f19601f8301169050919050565b6003811061510a57fe5b50565b61511681615036565b811461512157600080fd5b50565b61512d81615091565b811461513857600080fd5b5056fea2646970667358221220a549ad9e778ae8bb3048c0a1805e77745871cc1560637ae1c3ebccb76638d9c464736f6c63430006020033", + "nonce": "0", + "storage": {} + }, + "0xa096b05a489831db893fc53aacc7ed20efb36382": { + "balance": "1000000000000000000000000000000" + }, + "0xa1cd651d99283be60e2a9d2e3bc8a90aedb8244f": { + "balance": "1000000000000000000000000000000" + }, + "0xa2969e82619021ea407338f8bdf7c6f2bd679673": { + "balance": "1000000000000000000000000000000" + }, + "0xa3597b1162b6559cb5e966904b63e762ece756a4": { + "balance": "1000000000000000000000000000000" + }, + "0xa68f946090c600eda6f139783077ee802afeb990": { + "balance": "1000000000000000000000000000000" + }, + "0xa6d50055592cecb795bc1ed3b9ea57ed426b0b7c": { + "balance": "1000000000000000000000000000000" + }, + "0xa7c0789bdeee38c6b59111a789dfb6b815489847": { + "balance": "1000000000000000000000000000000" + }, + "0xa8c813ee806b4c8537ff5f16084d44db18ea9ab1": { + "balance": "1000000000000000000000000000000" + }, + "0xaa6a87bbb74bc1f3cb40c1efb7fc171ee6407560": { + "balance": "1000000000000000000000000000000" + }, + "0xabf920b89f5a2487fdb70be17fd01a99a0602e62": { + "balance": "1000000000000000000000000000000" + }, + "0xac5df92da5171ba24a9618018b4f79494040334b": { + "balance": "1000000000000000000000000000000" + }, + "0xaf97a8318a1a51d5daeeb9650024b63ee44f45bd": { + "balance": "1000000000000000000000000000000" + }, + "0xb28c45b98ae43a5e9ee5509c97ea037b5de5d6d9": { + "balance": "1000000000000000000000000000000" + }, + "0xb64989ab32b089da3da103b93e6781d6d5dd10b4": { + "balance": "1000000000000000000000000000000" + }, + "0xb67e6f4a21f93c250fa6ff0cb142bd14dd4ca8eb": { + "balance": "1000000000000000000000000000000" + }, + "0xb70603c505f85130b5b2e73cd82d196dfd7d8b5e": { + "balance": "1000000000000000000000000000000" + }, + "0xb942414cae2a1ab1056657b905845c0ab6b6280a": { + "balance": "1000000000000000000000000000000" + }, + "0xbee0e5c1961d51be9bd670876caa9c90ba7d9016": { + "balance": "1000000000000000000000000000000" + }, + "0xbf2d8cebdeeb8ad8fed7b2a75f35922106f8d75c": { + "balance": "1000000000000000000000000000000" + }, + "0xbf5aa678b969c0871e2fbcf09c3dbb5d5865ac1e": { + "balance": "1000000000000000000000000000000" + }, + "0xc12bcedd9bcad9120150122cd50f39576ecccc08": { + "balance": "1000000000000000000000000000000" + }, + "0xc2d3852f3292acb81bd164dbae5f1e2a87535150": { + "balance": "1000000000000000000000000000000" + }, + "0xc3820490201e94d76b44655d2df713fec29d9795": { + "balance": "1000000000000000000000000000000" + }, + "0xc58744e2eceefd45cc5469f0e0a708ad24ddbbdb": { + "balance": "1000000000000000000000000000000" + }, + "0xc7865200e8e51ba1c8d695f327deed432930f2cc": { + "balance": "1000000000000000000000000000000" + }, + "0xc8e4d709eb3eb335dc69c9fbf2d24d447cb86105": { + "balance": "1000000000000000000000000000000" + }, + "0xc98af661e44c5bf31d2f8bdff4bbf2808ed4e991": { + "balance": "1000000000000000000000000000000" + }, + "0xca4409573a5129a72edf85d6c51e26760fc9c903": { + "balance": "100000000000000000000000" + }, + "0xcc33e23b04b74f7ba8fbe315083182224af973fa": { + "balance": "1000000000000000000000000000000" + }, + "0xce1c62d0a77600fb2f959b4da76fcb9b3b9430a3": { + "balance": "1000000000000000000000000000000" + }, + "0xd1b6c947fb14060b38945584714491592e84875d": { + "balance": "1000000000000000000000000000000" + }, + "0xd23cd6a9ddcc3470300003621bbac1e06a7919d5": { + "balance": "1000000000000000000000000000000" + }, + "0xd2c5b39B4e735C17612Bb5a08FD024ccc5dBCb23": { + "balance": "100000000000000000000000" + }, + "0xd2cd302eb060e375a65d65946692a3ac2d838d35": { + "balance": "1000000000000000000000000000000" + }, + "0xd2e75c41ced8699e3176f6e335355701a2568b7b": { + "balance": "1000000000000000000000000000000" + }, + "0xd3d38f4cb0aeb4c7c2527ddaeec2ab3b910c8528": { + "balance": "1000000000000000000000000000000" + }, + "0xd5b561a27cca5049650a14ab93dbf1a20c0cefc1": { + "balance": "1000000000000000000000000000000" + }, + "0xd90045420b8abc37b3f9304ed2b385fc1b7fa8c5": { + "balance": "1000000000000000000000000000000" + }, + "0xd951bf4cff429062702a7d8699a5f0bf14845d9b": { + "balance": "1000000000000000000000000000000" + }, + "0xdc6a269c58e58a93a22b5df8cdf1af630c47481f": { + "balance": "1000000000000000000000000000000" + }, + "0xdc6d02ef4003a4f2d0ccff65ae1a2d8157fbb23e": { + "balance": "1000000000000000000000000000000" + }, + "0xde14aca36acc62c305a7ee571da37840a408e600": { + "balance": "1000000000000000000000000000000" + }, + "0xdee32ae508cf783f53ab8bc39d878fe323cdfae3": { + "balance": "1000000000000000000000000000000" + }, + "0xe083a100d51fc4f38aae4a3a68404c36ad96c612": { + "balance": "1000000000000000000000000000000" + }, + "0xe1607990ce800407e3c206e58de4917977181d4d": { + "balance": "1000000000000000000000000000000" + }, + "0xe25e5b63dfd4cf59b81eddf64f1195858634b8a6": { + "balance": "1000000000000000000000000000000" + }, + "0xe372377decb3bdc0c7f5272d38ce0ba2a54934fe": { + "balance": "1000000000000000000000000000000" + }, + "0xe3cc6ec63b5652d1594bc63bb293f4e80f76dbdd": { + "balance": "1000000000000000000000000000000" + }, + "0xe3da7c014286258944ab20a31e4d861b4c9262f1": { + "balance": "1000000000000000000000000000000" + }, + "0xe8b57f330d56081c856e618210fbedb414925ff0": { + "balance": "1000000000000000000000000000000" + }, + "0xe91ac72a568e752eb7c9f5235100586ce97c8cc1": { + "balance": "1000000000000000000000000000000" + }, + "0xf184c8c243a178c1748a0af45caedeca476105b4": { + "balance": "1000000000000000000000000000000" + }, + "0xf1a5912ff318aebf312cdb54c75642a9e632703c": { + "balance": "1000000000000000000000000000000" + }, + "0xf2197b153b4c9086fc5410431fbf7960d284c65e": { + "balance": "1000000000000000000000000000000" + }, + "0xf36620e71327f4a55d550d46e030ccf0c728f154": { + "balance": "1000000000000000000000000000000" + }, + "0xf9817fB82fc767aA9A4A97a1901676244b88ce0E": { + "balance": "100000000000000000000000" + }, + "0xfa723938fa8da1a8a2114ad409a11581761ee40d": { + "balance": "1000000000000000000000000000000" + }, + "0xfa7a8c69810eaf16a395d2a93b3ab51efeed2a1c": { + "balance": "1000000000000000000000000000000" + }, + "0xfaa1038074941571524934ba52d312e88b3577f5": { + "balance": "1000000000000000000000000000000" + }, + "0xfe14077c26a507496b7208384d459e21c49c4212": { + "balance": "1000000000000000000000000000000" + }, + "0xfe275c9b5ac792327da509b27eb9614196dfb07d": { + "balance": "1000000000000000000000000000000" + }, + "0xfe2c5aa110fff89361806ea7ee080bfffba0d3dd": { + "balance": "1000000000000000000000000000000" + }, + "0xfe3d4f1fc038f4f756ba44995129cd45c9e0e861": { + "balance": "1000000000000000000000000000000" + }, + "0xfee314cdc84ecfaa675e41b3559c0101e1eba6b8": { + "balance": "1000000000000000000000000000000" + } + }, + "genesis": { + "author": "0x0000000000000000000000000000000000000001", + "difficulty": "0x0", + "extraData": "0x11bbe8db4e347b4e8c937c1c8370e4b5ed33adb3db69cbdb7a38e1e50b1b82fa", + "gasLimit": "0xFFFFFFFFF", + "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000abc", + "nonce": "0x0000000000000042", + "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "timestamp": "0x00" + }, + "params": { + "EIP150ForkBlock": "0x00", + "EIP158ForkBlock": "0x00", + "accountStartNonce": "0x00", + "blockReward": "0x4563918244F40000", + "byzantiumForkBlock": "0x0", + "chainID": "0x12345", + "constantinopleForkBlock": "0x0", + "daoHardforkBlock": "0x0", + "difficultyBoundDivisor": "0x0800", + "durationLimit": "0x0d", + "externalGasDifficulty": "0x01", + "gasLimitBoundDivisor": "0x0400", + "homesteadForkBlock": "0x0", + "maxGasLimit": "0xFFFFFFFFF", + "maximumExtraDataSize": "0x20", + "minGasLimit": "0xFFFFFFFFF", + "minimumDifficulty": "0x0", + "networkID": "12313219", + "tieBreakingGas": false + }, + "sealEngine": "Ethash", + "skaleConfig": { + "nodeInfo": { + "basePort": 1731, + "bindIP": "0.0.0.0", + "collectionDuration": 10, + "collectionQueueSize": 2, + "db-path": "/tmp/test_eth_6_of_16", + "ecdsaKeyName": "", + "httpRpcPort": 1734, + "httpsRpcPort": 1239, + "logLevel": "info", + "logLevelProposal": "info", + "maxCacheSize": 2000, + "maxOpenLeveldbFiles": 25, + "minCacheSize": 1000, + "nodeID": 1606, + "nodeName": "Node1", + "rotateAfterBlock": 0, + "testSignatures": true, + "transactionQueueSize": 10000, + "wsRpcPort": 1733, + "wssRpcPort": 1738 + }, + "sChain": { + "EIP1559TransactionsPatchTimestamp": 1, + "contractStorageLimit": 10000000000, + "contractStoragePatchTimestamp": 1, + "contractStorageZeroValuePatchTimestamp": 1, + "correctForkInPowPatchTimestamp": 1, + "emptyBlockIntervalMs": 10000, + "fastConsensusPatchTimestamp": 1, + "flexibleDeploymentPatchTimestamp": 1, + "levelDBReopenIntervalMs": 1, + "multiTransactionMode": false, + "nodes": [ + { + "basePort": 1231, + "ip": "127.0.0.1", + "nodeID": 1601, + "publicKey": "", + "schainIndex": 1 + }, + { + "basePort": 1331, + "ip": "127.0.0.1", + "nodeID": 1602, + "publicKey": "", + "schainIndex": 2 + }, + { + "basePort": 1431, + "ip": "127.0.0.1", + "nodeID": 1603, + "publicKey": "", + "schainIndex": 3 + }, + { + "basePort": 1531, + "ip": "127.0.0.1", + "nodeID": 1604, + "publicKey": "", + "schainIndex": 4 + }, + { + "basePort": 1631, + "ip": "127.0.0.1", + "nodeID": 1605, + "publicKey": "", + "schainIndex": 5 + }, + { + "basePort": 1731, + "ip": "127.0.0.1", + "nodeID": 1606, + "publicKey": "", + "schainIndex": 6 + }, + { + "basePort": 1831, + "ip": "127.0.0.1", + "nodeID": 1607, + "publicKey": "", + "schainIndex": 7 + }, + { + "basePort": 1931, + "ip": "127.0.0.1", + "nodeID": 1608, + "publicKey": "", + "schainIndex": 8 + }, + { + "basePort": 2031, + "ip": "127.0.0.1", + "nodeID": 1609, + "publicKey": "", + "schainIndex": 9 + }, + { + "basePort": 2131, + "ip": "127.0.0.1", + "nodeID": 1610, + "publicKey": "", + "schainIndex": 10 + }, + { + "basePort": 2231, + "ip": "127.0.0.1", + "nodeID": 1611, + "publicKey": "", + "schainIndex": 11 + }, + { + "basePort": 2331, + "ip": "127.0.0.1", + "nodeID": 1612, + "publicKey": "", + "schainIndex": 12 + }, + { + "basePort": 2431, + "ip": "127.0.0.1", + "nodeID": 1613, + "publicKey": "", + "schainIndex": 13 + }, + { + "basePort": 2531, + "ip": "127.0.0.1", + "nodeID": 1614, + "publicKey": "", + "schainIndex": 14 + }, + { + "basePort": 2631, + "ip": "127.0.0.1", + "nodeID": 1615, + "publicKey": "", + "schainIndex": 15 + }, + { + "basePort": 2731, + "ip": "127.0.0.1", + "nodeID": 1616, + "publicKey": "", + "schainIndex": 16 + } + ], + "powCheckPatchTimestamp": 1, + "precompiledConfigPatchTimestamp": 1, + "pushZeroPatchTimestamp": 1, + "revertableFSPatchTimestamp": 1, + "schainID": 5, + "schainName": "TestChain", + "schainOwner": "0x907cd0881E50d359bb9Fd120B1A5A143b1C97De6", + "skipInvalidTransactionsPatchTimestamp": 1, + "storageDestructionPatchTimestamp": 1, + "verifyBlsSyncPatchTimestamp": 1, + "verifyDaSigsPatchTimestamp": 1 + } + }, + "unddos": { + "origins": [ + { + "ban_lengthy": 0, + "ban_peak": 0, + "max_calls_per_minute": 1000000000, + "max_calls_per_second": 1000000000, + "max_ws_conn": 65535, + "origin": [ + "*" + ] + } + ] + } +} \ No newline at end of file diff --git a/test/historicstate/configs/test_7_of_16.json b/test/historicstate/configs/test_7_of_16.json new file mode 100644 index 000000000..9fbf192f7 --- /dev/null +++ b/test/historicstate/configs/test_7_of_16.json @@ -0,0 +1,910 @@ +{ + "accounts": { + "0000000000000000000000000000000000000001": { + "precompiled": { + "linear": { + "base": 3000, + "word": 0 + }, + "name": "ecrecover" + } + }, + "0000000000000000000000000000000000000002": { + "precompiled": { + "linear": { + "base": 60, + "word": 12 + }, + "name": "sha256" + } + }, + "0000000000000000000000000000000000000003": { + "precompiled": { + "linear": { + "base": 600, + "word": 120 + }, + "name": "ripemd160" + } + }, + "0000000000000000000000000000000000000004": { + "precompiled": { + "linear": { + "base": 15, + "word": 3 + }, + "name": "identity" + } + }, + "0000000000000000000000000000000000000005": { + "precompiled": { + "name": "modexp", + "startingBlock": "0x2dc6c0" + } + }, + "0000000000000000000000000000000000000006": { + "precompiled": { + "linear": { + "base": 500, + "word": 0 + }, + "name": "alt_bn128_G1_add", + "startingBlock": "0x2dc6c0" + } + }, + "0000000000000000000000000000000000000007": { + "precompiled": { + "linear": { + "base": 40000, + "word": 0 + }, + "name": "alt_bn128_G1_mul", + "startingBlock": "0x2dc6c0" + } + }, + "0000000000000000000000000000000000000008": { + "precompiled": { + "name": "alt_bn128_pairing_product", + "startingBlock": "0x2dc6c0" + } + }, + "000000000000000000000000000000000000000A": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "readChunk", + "startingBlock": "0x0" + } + }, + "000000000000000000000000000000000000000B": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "createFile", + "restrictAccess": [ + "69362535ec535F0643cBf62D16aDeDCAf32Ee6F7" + ], + "startingBlock": "0x0" + } + }, + "000000000000000000000000000000000000000C": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "uploadChunk", + "startingBlock": "0x0" + } + }, + "000000000000000000000000000000000000000D": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "getFileSize", + "startingBlock": "0x0" + } + }, + "000000000000000000000000000000000000000E": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "deleteFile", + "startingBlock": "0x0" + } + }, + "000000000000000000000000000000000000000F": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "createDirectory", + "startingBlock": "0x0" + } + }, + "0000000000000000000000000000000000000010": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "deleteDirectory", + "startingBlock": "0x0" + } + }, + "0x006d8e49ce0b9eb5646e34a4d91934801b9044fd": { + "balance": "1000000000000000000000000000000" + }, + "0x0150b461b06922a5030784ba888962c28bb1f188": { + "balance": "1000000000000000000000000000000" + }, + "0x03309956988ae70152ae4469daf99b0cac2306c5": { + "balance": "1000000000000000000000000000000" + }, + "0x06104a85a380895b6dd4030113806df2b044905e": { + "balance": "1000000000000000000000000000000" + }, + "0x079cf317ef40b16141784b6fabff812d64f7c0fd": { + "balance": "1000000000000000000000000000000" + }, + "0x0966454f51166c68b73b2865473c8fb2fcdefdd5": { + "balance": "1000000000000000000000000000000" + }, + "0x099452fedc71897880f584b1bc1706efc4e76e36": { + "balance": "1000000000000000000000000000000" + }, + "0x0aa6a44690ef52354e976990292cf9c5cd36ad59": { + "balance": "1000000000000000000000000000000" + }, + "0x0fbbe17a0e5a61ee3e8661f442d7f6b177c49820": { + "balance": "1000000000000000000000000000000" + }, + "0x1239fe658b410dbbac5bbd572035f5041542f9e5": { + "balance": "1000000000000000000000000000000" + }, + "0x12d5d7340a93be7be28ea7a3ae198242f8e1282c": { + "balance": "1000000000000000000000000000000" + }, + "0x137048b9fa4f1234d6519271b2c5ec64f480db0f": { + "balance": "1000000000000000000000000000000" + }, + "0x13867af77a63048e17380e39248ada90521e97e4": { + "balance": "1000000000000000000000000000000" + }, + "0x138ea4bdf0382c2deffd5b0bff0afe59f471467f": { + "balance": "1000000000000000000000000000000" + }, + "0x13d19c55ee0a212249d26b9d741ff6d7f416db01": { + "balance": "1000000000000000000000000000000" + }, + "0x157d38b52196b248e9fe6a2172e32ce2b8c078e6": { + "balance": "1000000000000000000000000000000" + }, + "0x16e8c390f8e576161cfe966f2c3e5dd303eb9039": { + "balance": "1000000000000000000000000000000" + }, + "0x194cb9991d3d94c43e400becf21dfea45e7b3b4c": { + "balance": "1000000000000000000000000000000" + }, + "0x1C9abe4ff0CcECa40fc404c74AB7d4923fEF8901": { + "balance": "100000000000000000000000" + }, + "0x1a66fc89809112c20aa76a993db712fa9e003e4e": { + "balance": "1000000000000000000000000000000" + }, + "0x1f1d6041e12a18cf1202019f146f2fc150915e8d": { + "balance": "1000000000000000000000000000000" + }, + "0x1feaf1671c1f0faf0d44c152f72dc755db932569": { + "balance": "1000000000000000000000000000000" + }, + "0x236bf02dfafaf03851a4e6f5d69052f4884cec32": { + "balance": "1000000000000000000000000000000" + }, + "0x26d88f6a8b659be4165ee53774a057e41b5201c9": { + "balance": "1000000000000000000000000000000" + }, + "0x28353685b0b986a724b92113debb3d8cd9a6b263": { + "balance": "1000000000000000000000000000000" + }, + "0x29d83322219fdfb821459d5fdf796360faf3166a": { + "balance": "1000000000000000000000000000000" + }, + "0x2bee474be207bdbeac83d6672da5ed2fd417eac9": { + "balance": "1000000000000000000000000000000" + }, + "0x2d93455b07bccf38e8d019f7f43a2c2d70b46b4e": { + "balance": "1000000000000000000000000000000" + }, + "0x2f971bd38806c3ca45ae0a125d1267118bf5619c": { + "balance": "1000000000000000000000000000000" + }, + "0x30aaab366dfac8331f3e827495c789cde9b437c0": { + "balance": "1000000000000000000000000000000" + }, + "0x32ea0400dc2d20664cc4744b2fab04ecb709445c": { + "balance": "1000000000000000000000000000000" + }, + "0x3760dc9594ccac0f33ade5cc5371402131696341": { + "balance": "1000000000000000000000000000000" + }, + "0x38855e430611bc179cd777a8704679ffc43921de": { + "balance": "1000000000000000000000000000000" + }, + "0x3a921471a2397644c37c88ef9572c421ab37145d": { + "balance": "1000000000000000000000000000000" + }, + "0x3bcca8a8471d55a1a668bc163c0336e4a57e5c99": { + "balance": "1000000000000000000000000000000" + }, + "0x3d46ee560227c1d73cd6042b47fc8fddd8a06ecb": { + "balance": "1000000000000000000000000000000" + }, + "0x3f5bdf5d4c274c82b8d17aa2810b00d2cf050f24": { + "balance": "1000000000000000000000000000000" + }, + "0x3ffe1c9183e0f97f52a816405a7d2350624ec88b": { + "balance": "1000000000000000000000000000000" + }, + "0x426ec5f07847674aada3856609d8baaa16805d88": { + "balance": "1000000000000000000000000000000" + }, + "0x482d7f53cba6ae73a354533673c48e2dfd560949": { + "balance": "1000000000000000000000000000000" + }, + "0x48acbd6a2724eadcc2a11144ab84b6a617d1a241": { + "balance": "1000000000000000000000000000000" + }, + "0x49ef89840e400026eb5c8d79bd1b0adc152fe86d": { + "balance": "1000000000000000000000000000000" + }, + "0x4bf989fa6572af36b190032505506f1db888357f": { + "balance": "1000000000000000000000000000000" + }, + "0x4cf9b195f7cb5f86694d9b399fe21a5f34616fd3": { + "balance": "1000000000000000000000000000000" + }, + "0x4e9b85904bca60aeb5b916ca86ac622096908427": { + "balance": "1000000000000000000000000000000" + }, + "0x50120c17d7b59200e9b76e89e4e3de2f0cd00090": { + "balance": "1000000000000000000000000000000" + }, + "0x54db355342c35085a1a53184162b2fddd0a43b0f": { + "balance": "1000000000000000000000000000000" + }, + "0x54e228d8fea148cfe2b109b3b152ff21321d09a2": { + "balance": "1000000000000000000000000000000" + }, + "0x5667601b7dcde6f24d06bccc4f291cb06976f4ee": { + "balance": "1000000000000000000000000000000" + }, + "0x57829f2ecca390cd9d1c41f92328bad4d1073bbb": { + "balance": "1000000000000000000000000000000" + }, + "0x5EF25557E2ed6AFfF321B266C93e95A0B4B05AbC": { + "balance": "1000000000000000000000000" + }, + "0x5a3adad4382b3eb1e0c65f2de2845901081039b5": { + "balance": "1000000000000000000000000000000" + }, + "0x5cdb7392efdce502ccc6fba5c3c1dd1653967b4d": { + "balance": "1000000000000000000000000000000" + }, + "0x5d012c13b2854bda8b7b6580e97e52751884f827": { + "balance": "1000000000000000000000000000000" + }, + "0x5d9326c6504833d84f8a0d65ded59b1a6e768ca2": { + "balance": "1000000000000000000000000000000" + }, + "0x60268f799d8f1808e4a32c2eb898e73a8881f6f0": { + "balance": "1000000000000000000000000000000" + }, + "0x605ba4a05d779f9869bd9a10234c22f516766cfe": { + "balance": "1000000000000000000000000000000" + }, + "0x6093f0f2a7b5148b71603ac439adbc4c0e5aa5da": { + "balance": "1000000000000000000000000000000" + }, + "0x6196d135CdDb9d73A0756C1E44b5b02B11acf594": { + "balance": "2000000000000000000000", + "code": "", + "nonce": "5076", + "storage": {} + }, + "0x62712ceccb50f62ca4c5402fff6da9c819c866cf": { + "balance": "1000000000000000000000000000000" + }, + "0x62971de462ea1ec0d3b43a6a85b6fb975e6c6f64": { + "balance": "1000000000000000000000000000000" + }, + "0x62cf32dfb9eb6358dc5deb006aef1d75fb153e5f": { + "balance": "1000000000000000000000000000000" + }, + "0x62d8b22c1d71577829b2fee20a5c3fff43aed0ec": { + "balance": "100000000000000000000000" + }, + "0x6314956b78bb2eaed1c49b3ae71d4d0ec501cfab": { + "balance": "1000000000000000000000000000000" + }, + "0x661bda4daeba3ce9ac2aa30b80d463580f90d31a": { + "balance": "1000000000000000000000000000000" + }, + "0x66c5a87f4a49DD75e970055A265E8dd5C3F8f852": { + "balance": "1000000000000000000000" + }, + "0x66cd465ddcd85504c0d2cfb1728acee994d55a3f": { + "balance": "1000000000000000000000000000000" + }, + "0x68bca79ae7aae796027ff843d2303444da5cf5d8": { + "balance": "1000000000000000000000000000000" + }, + "0x6923877b65e24966efa9efd1207822fa2eaf601a": { + "balance": "1000000000000000000000000000000" + }, + "0x69362535ec535F0643cBf62D16aDeDCAf32Ee6F7": { + "balance": "0", + "code": "0x608060405234801561001057600080fd5b50600436106100b45760003560e01c806379210e8e1161007157806379210e8e1461017757806381a8235a146101a757806385aeeb17146101c35780639a9a5593146101f3578063a99100541461020f578063b57321221461022b576100b4565b806307c6e7d3146100b9578063122f4fba146100d55780631c6ec7a9146101055780631cfe4e3b14610121578063373dedb41461013d57806361e46db51461015b575b600080fd5b6100d360048036036100ce9190810190613cff565b61025b565b005b6100ef60048036036100ea9190810190613cff565b610804565b6040516100fc9190614963565b60405180910390f35b61011f600480360361011a9190810190613cff565b610b43565b005b61013b60048036036101369190810190613cc3565b610f72565b005b610145611190565b6040516101529190614cbe565b60405180910390f35b61017560048036036101709190810190613d94565b611199565b005b610191600480360361018c9190810190613e13565b6113f9565b60405161019e9190614924565b60405180910390f35b6101c160048036036101bc9190810190613cff565b6116f9565b005b6101dd60048036036101d89190810190613cff565b61189e565b6040516101ea9190614941565b60405180910390f35b61020d60048036036102089190810190613d40565b611b9d565b005b61022960048036036102249190810190613cff565b61202c565b005b61024560048036036102409190810190613cff565b612682565b6040516102529190614cbe565b60405180910390f35b6000339050606061026b83612902565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b825181101561037c576000826001018460018403815181106102d557fe5b60200260200101516040516102ea91906148cc565b90815260200160405180910390205411610339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161033090614ade565b60405180910390fd5b8160020183600183038151811061034c57fe5b602002602001015160405161036191906148cc565b908152602001604051809103902091508060010190506102b7565b506060600183511161038e57846103a7565b8260018451038151811061039e57fe5b60200260200101515b9050600082600101826040516103bd91906148e3565b9081526020016040518091039020541161040c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161040390614ade565b60405180910390fd5b6000826002018260405161042091906148e3565b90815260200160405180910390206000018054905014610475576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161046c90614b5e565b60405180910390fd5b60006104818587612b02565b9050806104c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ba90614a7e565b60405180910390fd5b6104cb613888565b836000016001856000018054905003815481106104e457fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156105965780601f1061056b57610100808354040283529160200191610596565b820191906000526020600020905b81548152906001019060200180831161057957829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff1660028111156105e257fe5b60028111156105ed57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561066557602002820191906000526020600020906000905b82829054906101000a900460ff1615158152602001906001019060208260000104928301926001038202915080841161062f5790505b505050505081525050905080846000016001866001018660405161068991906148e3565b90815260200160405180910390205403815481106106a357fe5b906000526020600020906005020160008201518160000190805190602001906106cd9291906138c4565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561071c57fe5b0217905550608082015181600401908051906020019061073d929190613944565b50905050836001018360405161075391906148e3565b90815260200160405180910390205484600101826000015160405161077891906148cc565b9081526020016040518091039020819055506000846001018460405161079e91906148e3565b908152602001604051809103902081905550836000018054809190600190036107c791906139ea565b5083600201836040516107da91906148e3565b9081526020016040518091039020600080820160006107f99190613a1c565b505050505050505050565b600080606061081284612b66565b91509150606061082182612902565b90506000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b82518110156109065760008260010184600184038151811061088b57fe5b60200260200101516040516108a091906148cc565b90815260200160405180910390205414156108c357600095505050505050610b3e565b816002018360018303815181106108d657fe5b60200260200101516040516108eb91906148cc565b9081526020016040518091039020915080600101905061086d565b50606060018351116109185783610931565b8260018451038151811061092857fe5b60200260200101515b90506000826001018260405161094791906148e3565b908152602001604051809103902054141561096a57600095505050505050610b3e565b610972613888565b826000016001846001018460405161098a91906148e3565b90815260200160405180910390205403815481106109a457fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610a565780601f10610a2b57610100808354040283529160200191610a56565b820191906000526020600020905b815481529060010190602001808311610a3957829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115610aa257fe5b6002811115610aad57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015610b2557602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411610aef5790505b5050505050815250509050806060015196505050505050505b919050565b600160009054906101000a900460ff16610b85576120006002819055506210000060038190555060018060006101000a81548160ff0219169083151502179055505b6000815111610bc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc090614ade565b60405180910390fd5b60003390506060610bd983612902565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015610cea57600082600101846001840381518110610c4357fe5b6020026020010151604051610c5891906148cc565b90815260200160405180910390205411610ca7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9e90614ade565b60405180910390fd5b81600201836001830381518110610cba57fe5b6020026020010151604051610ccf91906148cc565b90815260200160405180910390209150806001019050610c25565b50600254816000018054905010610d36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2d90614bfe565b60405180910390fd5b60606001835111610d475784610d60565b82600184510381518110610d5757fe5b60200260200101515b905060008260010182604051610d7691906148e3565b90815260200160405180910390205414610dc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbc90614c3e565b60405180910390fd5b610dce81612ee8565b610e0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0490614afe565b60405180910390fd5b6000610e198587612fc9565b905080610e5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e529061499e565b60405180910390fd5b610e63613888565b82816000018190525060008160200190151590811515815250508360000181908060018154018082558091505090600182039060005260206000209060050201600090919290919091506000820151816000019080519060200190610ec99291906138c4565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff02191690836002811115610f1857fe5b02179055506080820151816004019080519060200190610f39929190613944565b5050505083600001805490508460010184604051610f5791906148e3565b90815260200160405180910390208190555050505050505050565b610f7a61302d565b73ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161480610fdf57503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614155b61101e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101590614a5e565b60405180910390fd5b80600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411156110a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109790614b3e565b60405180910390fd5b600054600754820111156110e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e0906149be565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460076000828254039250508190555080600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550806007600082825401925050819055505050565b60008054905090565b600033905060006111aa82866130c6565b9050600160028111156111b957fe5b8160030160009054906101000a900460ff1660028111156111d657fe5b14611216576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120d90614c1e565b60405180910390fd5b6000600354858161122357fe5b061480156112345750806002015484105b611273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126a9061497e565b60405180910390fd5b600354848260020154031080156112905750838160020154038351145b8061129d57506003548351145b6112dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d390614a1e565b60405180910390fd5b600015158160040160035486816112ef57fe5b04815481106112fa57fe5b90600052602060002090602091828204019190069054906101000a900460ff1615151461135c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611353906149fe565b60405180910390fd5b600061136a838787876132c5565b9050806113ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a390614b1e565b60405180910390fd5b60018260040160035487816113bd57fe5b04815481106113c857fe5b90600052602060002090602091828204019190066101000a81548160ff021916908315150217905550505050505050565b611401613a40565b6000606061140e86612b66565b9150915061141a613888565b61142483836130c6565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156114c85780601f1061149d576101008083540402835291602001916114c8565b820191906000526020600020905b8154815290600101906020018083116114ab57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561151457fe5b600281111561151f57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561159757602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116115615790505b50505050508152505090506002808111156115ae57fe5b816060015160028111156115be57fe5b146115fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f590614c9e565b60405180910390fd5b60035485111580156116105750600085115b61164f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164690614a1e565b60405180910390fd5b80604001518587011115611698576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168f9061497e565b60405180910390fd5b60006116a684848989613376565b8096508192505050806116ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e590614b9e565b60405180910390fd5b505050509392505050565b6000339050600061170a82846130c6565b90506001600281111561171957fe5b8160030160009054906101000a900460ff16600281111561173657fe5b14611776576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176d90614c1e565b60405180910390fd5b60006001905060008260040180549050905060008090505b818110156117e157600015158460040182815481106117a957fe5b90600052602060002090602091828204019190069054906101000a900460ff16151514156117d657600092505b80600101905061178e565b5081611822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181990614b7e565b60405180910390fd5b60028360030160006101000a81548160ff0219169083600281111561184357fe5b021790555060006118548587613409565b905080611896576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188d906149de565b60405180910390fd5b505050505050565b6060600060606118ad84612b66565b9150915060606118bc82612902565b90506000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008090505b82518110156119c65760008260010184838151811061192257fe5b602002602001015160405161193791906148cc565b90815260200160405180910390205411611986576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197d90614ade565b60405180910390fd5b8160020183828151811061199657fe5b60200260200101516040516119ab91906148cc565b90815260200160405180910390209150806001019050611907565b5080600001805480602002602001604051908101604052809291908181526020016000905b82821015611b8e57838290600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611aa75780601f10611a7c57610100808354040283529160200191611aa7565b820191906000526020600020905b815481529060010190602001808311611a8a57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115611af357fe5b6002811115611afe57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015611b7657602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411611b405790505b505050505081525050815260200190600101906119eb565b50505050945050505050919050565b600160009054906101000a900460ff16611bdf576120006002819055506210000060038190555060018060006101000a81548160ff0219169083151502179055505b60003390506305f5e100821115611c2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2290614bde565b60405180910390fd5b6060611c3684612902565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015611d4757600082600101846001840381518110611ca057fe5b6020026020010151604051611cb591906148cc565b90815260200160405180910390205411611d04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cfb90614ade565b60405180910390fd5b81600201836001830381518110611d1757fe5b6020026020010151604051611d2c91906148cc565b90815260200160405180910390209150806001019050611c82565b5060606001835111611d595785611d72565b82600184510381518110611d6957fe5b60200260200101515b905060008260010182604051611d8891906148e3565b90815260200160405180910390205414611dd7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dce90614c3e565b60405180910390fd5b611de081612ee8565b611e1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1690614bbe565b60405180910390fd5b6000611e2c85888861346d565b905080611e6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6590614c7e565b60405180910390fd5b6060600354600160035489010381611e8257fe5b04604051908082528060200260200182016040528015611eb15781602001602082028038833980820191505090505b509050836000016040518060a0016040528085815260200160011515815260200189815260200160016002811115611ee557fe5b815260200183815250908060018154018082558091505090600182039060005260206000209060050201600090919290919091506000820151816000019080519060200190611f359291906138c4565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff02191690836002811115611f8457fe5b02179055506080820151816004019080519060200190611fa5929190613944565b5050505083600001805490508460010184604051611fc391906148e3565b90815260200160405180910390208190555086600560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505050505050505050565b6000339050612039613888565b61204382846130c6565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156120e75780601f106120bc576101008083540402835291602001916120e7565b820191906000526020600020905b8154815290600101906020018083116120ca57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561213357fe5b600281111561213e57fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156121b657602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116121805790505b5050505050815250509050600060028111156121ce57fe5b816060015160028111156121de57fe5b141561221f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221690614a3e565b60405180910390fd5b600061222b83856134da565b90508061226d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226490614a9e565b60405180910390fd5b606061227885612902565b90506000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b825181101561231057816002018360018303815181106122e057fe5b60200260200101516040516122f591906148cc565b908152602001604051809103902091508060010190506122c4565b506000600182600101866000015160405161232b91906148cc565b908152602001604051809103902054039050612345613888565b8260000160018460000180549050038154811061235e57fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156124105780601f106123e557610100808354040283529160200191612410565b820191906000526020600020905b8154815290600101906020018083116123f357829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561245c57fe5b600281111561246757fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156124df57602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116124a95790505b5050505050815250509050808360000183815481106124fa57fe5b906000526020600020906005020160008201518160000190805190602001906125249291906138c4565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561257357fe5b02179055506080820151816004019080519060200190612594929190613944565b50905050826000018054809190600190036125af91906139ea565b508260010186600001516040516125c691906148cc565b9081526020016040518091039020548360010182600001516040516125eb91906148cc565b908152602001604051809103902081905550600083600101876000015160405161261591906148cc565b9081526020016040518091039020819055508560400151600560008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505050505050505050565b600080606061269084612b66565b9150915061269c613888565b6126a683836130c6565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561274a5780601f1061271f5761010080835404028352916020019161274a565b820191906000526020600020905b81548152906001019060200180831161272d57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561279657fe5b60028111156127a157fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561281957602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116127e35790505b50505050508152505090506001600281111561283157fe5b8160600151600281111561284157fe5b1480612866575060028081111561285457fe5b8160600151600281111561286457fe5b145b6128a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161289c90614c1e565b60405180910390fd5b60006128b1848461353e565b8096508192505050806128f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128f090614c5e565b60405180910390fd5b50505050919050565b606061290c613a65565b612915836135a7565b905061291f613a65565b61295d6040518060400160405280600181526020017f2f000000000000000000000000000000000000000000000000000000000000008152506135a7565b90506060600161297683856135d590919063ffffffff16565b016040519080825280602002602001820160405280156129aa57816020015b60608152602001906001900390816129955790505b50905060008090505b81518110156129fb576129d76129d2848661364a90919063ffffffff16565b613664565b8282815181106129e357fe5b602002602001018190525080806001019150506129b3565b50600081600183510381518110612a0e57fe5b6020026020010151511415612a795780600182510381518110612a2d57fe5b6020026020010160608152506001815103604051908082528060200260200182016040528015612a7157816020015b6060815260200190600190039081612a5c5790505b509350612ab2565b8051604051908082528060200260200182016040528015612aae57816020015b6060815260200190600190039081612a995790505b5093505b60008090505b8451811015612af957818181518110612acd57fe5b6020026020010151858281518110612ae157fe5b60200260200101819052508080600101915050612ab8565b50505050919050565b60008060016020601f85510181612b1557fe5b040190506040518481526020810160005b83811015612b47578060200286015181602002830152806001019050612b26565b50602082602085026040018460006010600019f1935050505092915050565b6000606060006028905080845111612bb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612baa90614abe565b60405180910390fd5b6060816040519080825280601f01601f191660200182016040528015612be85781602001600182028038833980820191505090505b50905060008090505b82811015612c5857858181518110612c0557fe5b602001015160f81c60f81b828281518110612c1c57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050612bf1565b50600080905060008090505b83811015612d87576000838281518110612c7a57fe5b602001015160f81c60f81b60f81c60ff16905060308110158015612c9f575060398111155b80612cb8575060418110158015612cb75750605a8111155b5b80612cd1575060618110158015612cd0575060668111155b5b612d10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d0790614abe565b60405180910390fd5b60308110158015612d22575060398111155b15612d335760308103601084020192505b60418110158015612d455750605a8111155b15612d565760378103601084020192505b60618110158015612d68575060668111155b15612d795760578103601084020192505b508080600101915050612c64565b508094507f2f00000000000000000000000000000000000000000000000000000000000000868481518110612db857fe5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612e25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e1c90614abe565b60405180910390fd5b6000600184885103039050806040519080825280601f01601f191660200182016040528015612e635781602001600182028038833980820191505090505b50945060008090505b81811015612ede5760008860018784010181518110612e8757fe5b602001015160f81c60f81b905080878381518110612ea157fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350508080600101915050612e6c565b5050505050915091565b6000604051602001612ef99061490f565b6040516020818303038152906040528051906020012082604051602001612f2091906148e3565b604051602081830303815290604052805190602001201480612f8b5750604051602001612f4c906148fa565b6040516020818303038152906040528051906020012082604051602001612f7391906148e3565b60405160208183030381529060405280519060200120145b80612f97575060008251145b15612fa55760009050612fc4565b60008251905060ff811115612fbe576000915050612fc4565b60019150505b919050565b60008060016020601f85510181612fdc57fe5b040190506040518481526020810160005b8381101561300e578060200286015181602002830152806001019050612fed565b5060208260208502604001846000600f600019f1935050505092915050565b600073d2001000000000000000000000000000000000d273ffffffffffffffffffffffffffffffffffffffff166383e781fe6040518163ffffffff1660e01b815260040160206040518083038186803b15801561308957600080fd5b505afa15801561309d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506130c19190810190613c9a565b905090565b600060606130d383612902565b90506000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b82518110156131e45760008260010184600184038151811061313d57fe5b602002602001015160405161315291906148cc565b908152602001604051809103902054116131a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161319890614ade565b60405180910390fd5b816002018360018303815181106131b457fe5b60200260200101516040516131c991906148cc565b9081526020016040518091039020915080600101905061311f565b50606060018351116131f6578461320f565b8260018451038151811061320657fe5b60200260200101515b90506000826001018260405161322591906148e3565b90815260200160405180910390205411613274576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161326b90614ade565b60405180910390fd5b6000826000016001846001018460405161328e91906148e3565b90815260200160405180910390205403815481106132a857fe5b906000526020600020906005020190508094505050505092915050565b60008060016020601f855101816132d857fe5b04019050600060016020601f885101816132ee57fe5b040190506040518781526020810160005b838110156133205780602002890151816020028301528060010190506132ff565b50868360200282015260005b84811015613352578060200287015181856001010160200283015280600101905061332c565b50602082848601602002606001846000600c600019f1945050505050949350505050565b6000613380613a40565b600060016020601f8851018161339257fe5b0401905060006020601f8601816133a557fe5b0490506040518881526020810160005b848110156133d657806020028a0151816020028301528060010190506133b5565b5083602002810188815287816020015283602002868660030160200285600a600019fa9650505050505094509492505050565b60008060016020601f8551018161341c57fe5b040190506040518481526020810160005b8381101561344e57806020028601518160200283015280600101905061342d565b50602082602085026040018460006011600019f1935050505092915050565b60008060016020601f8651018161348057fe5b040190506040518581526020810160005b838110156134b2578060200287015181602002830152806001019050613491565b50846020840282015260208260208502604001846000600b600019f193505050509392505050565b60008060016020601f855101816134ed57fe5b040190506040518481526020810160005b8381101561351f5780602002860151816020028301528060010190506134fe565b5060208260208502604001846000600e600019f1935050505092915050565b600080600060016020601f8651018161355357fe5b040190506040518581526020810160005b83811015613585578060200287015181602002830152806001019050613564565b506020826020850260200184600d600019fa9450815193505050509250929050565b6135af613a65565b600060208301905060405180604001604052808451815260200182815250915050919050565b60008082600001516135f985600001518660200151866000015187602001516136c6565b0190505b83600001518460200151018111613643578180600101925050826000015161363b8560200151830386600001510383866000015187602001516136c6565b0190506135fd565b5092915050565b613652613a65565b61365d8383836137a1565b5092915050565b60608082600001516040519080825280601f01601f19166020018201604052801561369e5781602001600182028038833980820191505090505b50905060006020820190506136bc818560200151866000015161383f565b8192505050919050565b6000808490506000868511613791576020851161374b57600060018660200360080260020a031960001b905060008186511690506000878a8a0103905060008386511690505b82811461373d5781861061372a578a8a019650505050505050613799565b858060010196505083865116905061370c565b859650505050505050613799565b60008585209050600091505b858803821161378f57600086842090508082141561377b5783945050505050613799565b600184019350508180600101925050613757565b505b868601925050505b949350505050565b6137a9613a65565b60006137c785600001518660200151866000015187602001516136c6565b90508460200151836020018181525050846020015181038360000181815250508460000151856020015101811415613809576000856000018181525050613834565b8360000151836000015101856000018181510391508181525050836000015181018560200181815250505b829150509392505050565b5b602081106138635781518352602083019250602082019150602081039050613840565b60006001826020036101000a0390508019835116818551168181178652505050505050565b6040518060a001604052806060815260200160001515815260200160008152602001600060028111156138b757fe5b8152602001606081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061390557805160ff1916838001178555613933565b82800160010185558215613933579182015b82811115613932578251825591602001919060010190613917565b5b5090506139409190613a7f565b5090565b82805482825590600052602060002090601f016020900481019282156139d95791602002820160005b838211156139aa57835183826101000a81548160ff021916908315150217905550926020019260010160208160000104928301926001030261396d565b80156139d75782816101000a81549060ff02191690556001016020816000010492830192600103026139aa565b505b5090506139e69190613aa4565b5090565b815481835581811115613a1757600502816005028360005260206000209182019101613a169190613ad4565b5b505050565b5080546000825560050290600052602060002090810190613a3d9190613ad4565b50565b6040518062100000016040528061800090602082028038833980820191505090505090565b604051806040016040528060008152602001600081525090565b613aa191905b80821115613a9d576000816000905550600101613a85565b5090565b90565b613ad191905b80821115613acd57600081816101000a81549060ff021916905550600101613aaa565b5090565b90565b613b4091905b80821115613b3c5760008082016000613af39190613b43565b6001820160006101000a81549060ff021916905560028201600090556003820160006101000a81549060ff0219169055600482016000613b339190613b8b565b50600501613ada565b5090565b90565b50805460018160011615610100020316600290046000825580601f10613b695750613b88565b601f016020900490600052602060002090810190613b879190613a7f565b5b50565b50805460008255601f016020900490600052602060002090810190613bb09190613a7f565b50565b600081359050613bc281614f18565b92915050565b600081519050613bd781614f18565b92915050565b600082601f830112613bee57600080fd5b8135613c01613bfc82614d06565b614cd9565b91508082526020830160208301858383011115613c1d57600080fd5b613c28838284614eb8565b50505092915050565b600082601f830112613c4257600080fd5b8135613c55613c5082614d32565b614cd9565b91508082526020830160208301858383011115613c7157600080fd5b613c7c838284614eb8565b50505092915050565b600081359050613c9481614f2f565b92915050565b600060208284031215613cac57600080fd5b6000613cba84828501613bc8565b91505092915050565b60008060408385031215613cd657600080fd5b6000613ce485828601613bb3565b9250506020613cf585828601613c85565b9150509250929050565b600060208284031215613d1157600080fd5b600082013567ffffffffffffffff811115613d2b57600080fd5b613d3784828501613c31565b91505092915050565b60008060408385031215613d5357600080fd5b600083013567ffffffffffffffff811115613d6d57600080fd5b613d7985828601613c31565b9250506020613d8a85828601613c85565b9150509250929050565b600080600060608486031215613da957600080fd5b600084013567ffffffffffffffff811115613dc357600080fd5b613dcf86828701613c31565b9350506020613de086828701613c85565b925050604084013567ffffffffffffffff811115613dfd57600080fd5b613e0986828701613bdd565b9150509250925092565b600080600060608486031215613e2857600080fd5b600084013567ffffffffffffffff811115613e4257600080fd5b613e4e86828701613c31565b9350506020613e5f86828701613c85565b9250506040613e7086828701613c85565b9150509250925092565b6000613e868383613fe8565b60208301905092915050565b6000613e9e8383613ff7565b60208301905092915050565b6000613eb68383614831565b905092915050565b6000613ec982614d88565b613ed38185614de7565b9350613ede83614d5e565b8060005b83811015613f0f578151613ef68882613e7a565b9750613f0183614dc0565b925050600181019050613ee2565b5085935050505092915050565b613f2581614d93565b613f2f8184614df8565b9250613f3a82614d6e565b8060005b83811015613f6b578151613f528782613e92565b9650613f5d83614dcd565b925050600181019050613f3e565b505050505050565b6000613f7e82614d9f565b613f888185614e03565b935083602082028501613f9a85614d78565b8060005b85811015613fd65784840389528151613fb78582613eaa565b9450613fc283614dda565b925060208a01995050600181019050613f9e565b50829750879550505050505092915050565b613ff181614e53565b82525050565b61400081614e5f565b82525050565b61400f81614ea6565b82525050565b61401e81614ea6565b82525050565b600061402f82614db5565b6140398185614e36565b9350614049818560208601614ec7565b80840191505092915050565b600061406082614daa565b61406a8185614e14565b935061407a818560208601614ec7565b61408381614efa565b840191505092915050565b600061409982614daa565b6140a38185614e36565b93506140b3818560208601614ec7565b80840191505092915050565b60006140cc601883614e25565b91507f496e636f7272656374206368756e6b20706f736974696f6e00000000000000006000830152602082019050919050565b600061410c601583614e25565b91507f4469726563746f7279206e6f74206372656174656400000000000000000000006000830152602082019050919050565b600061414c602483614e25565b91507f4e6f7420656e6f756768206d656d6f727920696e207468652046696c6573746f60008301527f72616765000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006141b2601b83614e25565b91507f48617368206861736e2774206265656e2063616c63756c6174656400000000006000830152602082019050919050565b60006141f2601983614e25565b91507f4368756e6b20697320616c72656164792075706c6f61646564000000000000006000830152602082019050919050565b6000614232601683614e25565b91507f496e636f7272656374206368756e6b206c656e677468000000000000000000006000830152602082019050919050565b6000614272600f83614e25565b91507f46696c65206e6f742065786973747300000000000000000000000000000000006000830152602082019050919050565b60006142b2600e83614e25565b91507f496e76616c69642073656e6465720000000000000000000000000000000000006000830152602082019050919050565b60006142f2601883614e25565b91507f4469726563746f7279206973206e6f742064656c6574656400000000000000006000830152602082019050919050565b6000614332601083614e25565b91507f46696c65206e6f742064656c65746564000000000000000000000000000000006000830152602082019050919050565b6000614372601383614e25565b91507f496e76616c69642073746f7261676550617468000000000000000000000000006000830152602082019050919050565b60006143b2600c83614e25565b91507f496e76616c6964207061746800000000000000000000000000000000000000006000830152602082019050919050565b60006143f2600183614e36565b91507f2e000000000000000000000000000000000000000000000000000000000000006000830152600182019050919050565b6000614432601683614e25565b91507f496e76616c6964206469726563746f7279206e616d65000000000000000000006000830152602082019050919050565b6000614472601583614e25565b91507f4368756e6b207761736e27742075706c6f6164656400000000000000000000006000830152602082019050919050565b60006144b2602683614e25565b91507f436f756c64206e6f742072657365727665206c657373207468616e207573656460008301527f20737061636500000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614518601683614e25565b91507f4469726563746f7279206973206e6f7420656d707479000000000000000000006000830152602082019050919050565b6000614558602383614e25565b91507f46696c65206861736e2774206265656e2075706c6f6164656420636f7272656360008301527f746c7900000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006145be601183614e25565b91507f4368756e6b207761736e277420726561640000000000000000000000000000006000830152602082019050919050565b60006145fe601883614e25565b91507f46696c656e616d652073686f756c64206265203c2032353600000000000000006000830152602082019050919050565b600061463e601f83614e25565b91507f46696c652073686f756c64206265206c657373207468616e20313030204d42006000830152602082019050919050565b600061467e600283614e36565b91507f2e2e0000000000000000000000000000000000000000000000000000000000006000830152600282019050919050565b60006146be601183614e25565b91507f4469726563746f72792069732066756c6c0000000000000000000000000000006000830152602082019050919050565b60006146fe600e83614e25565b91507f46696c65206e6f7420666f756e640000000000000000000000000000000000006000830152602082019050919050565b600061473e601883614e25565b91507f46696c65206f72206469726563746f72792065786973747300000000000000006000830152602082019050919050565b600061477e601883614e25565b91507f45564d206572726f7220696e2067657446696c6553697a6500000000000000006000830152602082019050919050565b60006147be601083614e25565b91507f46696c65206e6f742063726561746564000000000000000000000000000000006000830152602082019050919050565b60006147fe601983614e25565b91507f46696c65206861736e2774206265656e2075706c6f61646564000000000000006000830152602082019050919050565b600060a083016000830151848203600086015261484e8282614055565b91505060208301516148636020860182613fe8565b50604083015161487660408601826148ae565b5060608301516148896060860182614006565b50608083015184820360808601526148a18282613ebe565b9150508091505092915050565b6148b781614e9c565b82525050565b6148c681614e9c565b82525050565b60006148d8828461408e565b915081905092915050565b60006148ef8284614024565b915081905092915050565b6000614905826143e5565b9150819050919050565b600061491a82614671565b9150819050919050565b6000621000008201905061493b6000830184613f1c565b92915050565b6000602082019050818103600083015261495b8184613f73565b905092915050565b60006020820190506149786000830184614015565b92915050565b60006020820190508181036000830152614997816140bf565b9050919050565b600060208201905081810360008301526149b7816140ff565b9050919050565b600060208201905081810360008301526149d78161413f565b9050919050565b600060208201905081810360008301526149f7816141a5565b9050919050565b60006020820190508181036000830152614a17816141e5565b9050919050565b60006020820190508181036000830152614a3781614225565b9050919050565b60006020820190508181036000830152614a5781614265565b9050919050565b60006020820190508181036000830152614a77816142a5565b9050919050565b60006020820190508181036000830152614a97816142e5565b9050919050565b60006020820190508181036000830152614ab781614325565b9050919050565b60006020820190508181036000830152614ad781614365565b9050919050565b60006020820190508181036000830152614af7816143a5565b9050919050565b60006020820190508181036000830152614b1781614425565b9050919050565b60006020820190508181036000830152614b3781614465565b9050919050565b60006020820190508181036000830152614b57816144a5565b9050919050565b60006020820190508181036000830152614b778161450b565b9050919050565b60006020820190508181036000830152614b978161454b565b9050919050565b60006020820190508181036000830152614bb7816145b1565b9050919050565b60006020820190508181036000830152614bd7816145f1565b9050919050565b60006020820190508181036000830152614bf781614631565b9050919050565b60006020820190508181036000830152614c17816146b1565b9050919050565b60006020820190508181036000830152614c37816146f1565b9050919050565b60006020820190508181036000830152614c5781614731565b9050919050565b60006020820190508181036000830152614c7781614771565b9050919050565b60006020820190508181036000830152614c97816147b1565b9050919050565b60006020820190508181036000830152614cb7816147f1565b9050919050565b6000602082019050614cd360008301846148bd565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614cfc57600080fd5b8060405250919050565b600067ffffffffffffffff821115614d1d57600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614d4957600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050919050565b6000819050602082019050919050565b600081519050919050565b60006180009050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614e4c82614e7c565b9050919050565b60008115159050919050565b6000819050919050565b6000819050614e7782614f0b565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000614eb182614e69565b9050919050565b82818337600083830152505050565b60005b83811015614ee5578082015181840152602081019050614eca565b83811115614ef4576000848401525b50505050565b6000601f19601f8301169050919050565b60038110614f1557fe5b50565b614f2181614e41565b8114614f2c57600080fd5b50565b614f3881614e9c565b8114614f4357600080fd5b5056fea365627a7a723158202ae226b25ad72f9cff2d74c6dc7bcfb78530ab1d2438f48a8dab67499b37a8e56c6578706572696d656e74616cf564736f6c634300050d0040", + "nonce": "0", + "storage": { + "0x0": "2868903936" + } + }, + "0x69362535ec535F0643cBf62D16aDeDCAf32Ee6F8": { + "balance": "0", + "code": "0x608060405234801561001057600080fd5b50600436106100b45760003560e01c806379210e8e1161007157806379210e8e1461017757806381a8235a146101a757806385aeeb17146101c35780639a9a5593146101f3578063a99100541461020f578063b57321221461022b576100b4565b806307c6e7d3146100b9578063122f4fba146100d55780631c6ec7a9146101055780631cfe4e3b14610121578063373dedb41461013d57806361e46db51461015b575b600080fd5b6100d360048036036100ce9190810190613e0d565b61025b565b005b6100ef60048036036100ea9190810190613e0d565b610804565b6040516100fc9190614ab1565b60405180910390f35b61011f600480360361011a9190810190613e0d565b610b43565b005b61013b60048036036101369190810190613dd1565b610f72565b005b610145611190565b6040516101529190614e2c565b60405180910390f35b61017560048036036101709190810190613ea2565b611199565b005b610191600480360361018c9190810190613f21565b6113f9565b60405161019e9190614a72565b60405180910390f35b6101c160048036036101bc9190810190613e0d565b6116f9565b005b6101dd60048036036101d89190810190613e0d565b61189e565b6040516101ea9190614a8f565b60405180910390f35b61020d60048036036102089190810190613e4e565b611b9d565b005b61022960048036036102249190810190613e0d565b61213a565b005b61024560048036036102409190810190613e0d565b612790565b6040516102529190614e2c565b60405180910390f35b6000339050606061026b83612a10565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b825181101561037c576000826001018460018403815181106102d557fe5b60200260200101516040516102ea9190614a1a565b90815260200160405180910390205411610339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161033090614c2c565b60405180910390fd5b8160020183600183038151811061034c57fe5b60200260200101516040516103619190614a1a565b908152602001604051809103902091508060010190506102b7565b506060600183511161038e57846103a7565b8260018451038151811061039e57fe5b60200260200101515b9050600082600101826040516103bd9190614a31565b9081526020016040518091039020541161040c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161040390614c2c565b60405180910390fd5b600082600201826040516104209190614a31565b90815260200160405180910390206000018054905014610475576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161046c90614cac565b60405180910390fd5b60006104818587612c10565b9050806104c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ba90614bcc565b60405180910390fd5b6104cb613996565b836000016001856000018054905003815481106104e457fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156105965780601f1061056b57610100808354040283529160200191610596565b820191906000526020600020905b81548152906001019060200180831161057957829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff1660028111156105e257fe5b60028111156105ed57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561066557602002820191906000526020600020906000905b82829054906101000a900460ff1615158152602001906001019060208260000104928301926001038202915080841161062f5790505b50505050508152505090508084600001600186600101866040516106899190614a31565b90815260200160405180910390205403815481106106a357fe5b906000526020600020906005020160008201518160000190805190602001906106cd9291906139d2565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561071c57fe5b0217905550608082015181600401908051906020019061073d929190613a52565b5090505083600101836040516107539190614a31565b9081526020016040518091039020548460010182600001516040516107789190614a1a565b9081526020016040518091039020819055506000846001018460405161079e9190614a31565b908152602001604051809103902081905550836000018054809190600190036107c79190613af8565b5083600201836040516107da9190614a31565b9081526020016040518091039020600080820160006107f99190613b2a565b505050505050505050565b600080606061081284612c74565b91509150606061082182612a10565b90506000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b82518110156109065760008260010184600184038151811061088b57fe5b60200260200101516040516108a09190614a1a565b90815260200160405180910390205414156108c357600095505050505050610b3e565b816002018360018303815181106108d657fe5b60200260200101516040516108eb9190614a1a565b9081526020016040518091039020915080600101905061086d565b50606060018351116109185783610931565b8260018451038151811061092857fe5b60200260200101515b9050600082600101826040516109479190614a31565b908152602001604051809103902054141561096a57600095505050505050610b3e565b610972613996565b826000016001846001018460405161098a9190614a31565b90815260200160405180910390205403815481106109a457fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610a565780601f10610a2b57610100808354040283529160200191610a56565b820191906000526020600020905b815481529060010190602001808311610a3957829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115610aa257fe5b6002811115610aad57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015610b2557602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411610aef5790505b5050505050815250509050806060015196505050505050505b919050565b600160009054906101000a900460ff16610b85576120006002819055506210000060038190555060018060006101000a81548160ff0219169083151502179055505b6000815111610bc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc090614c2c565b60405180910390fd5b60003390506060610bd983612a10565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015610cea57600082600101846001840381518110610c4357fe5b6020026020010151604051610c589190614a1a565b90815260200160405180910390205411610ca7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9e90614c2c565b60405180910390fd5b81600201836001830381518110610cba57fe5b6020026020010151604051610ccf9190614a1a565b90815260200160405180910390209150806001019050610c25565b50600254816000018054905010610d36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2d90614d4c565b60405180910390fd5b60606001835111610d475784610d60565b82600184510381518110610d5757fe5b60200260200101515b905060008260010182604051610d769190614a31565b90815260200160405180910390205414610dc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbc90614d8c565b60405180910390fd5b610dce81612ff6565b610e0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0490614c4c565b60405180910390fd5b6000610e1985876130d7565b905080610e5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5290614aec565b60405180910390fd5b610e63613996565b82816000018190525060008160200190151590811515815250508360000181908060018154018082558091505090600182039060005260206000209060050201600090919290919091506000820151816000019080519060200190610ec99291906139d2565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff02191690836002811115610f1857fe5b02179055506080820151816004019080519060200190610f39929190613a52565b5050505083600001805490508460010184604051610f579190614a31565b90815260200160405180910390208190555050505050505050565b610f7a61313b565b73ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161480610fdf57503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614155b61101e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101590614bac565b60405180910390fd5b80600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411156110a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109790614c8c565b60405180910390fd5b600054600754820111156110e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e090614b0c565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460076000828254039250508190555080600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550806007600082825401925050819055505050565b60008054905090565b600033905060006111aa82866131d4565b9050600160028111156111b957fe5b8160030160009054906101000a900460ff1660028111156111d657fe5b14611216576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120d90614d6c565b60405180910390fd5b6000600354858161122357fe5b061480156112345750806002015484105b611273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126a90614acc565b60405180910390fd5b600354848260020154031080156112905750838160020154038351145b8061129d57506003548351145b6112dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d390614b6c565b60405180910390fd5b600015158160040160035486816112ef57fe5b04815481106112fa57fe5b90600052602060002090602091828204019190069054906101000a900460ff1615151461135c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135390614b4c565b60405180910390fd5b600061136a838787876133d3565b9050806113ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a390614c6c565b60405180910390fd5b60018260040160035487816113bd57fe5b04815481106113c857fe5b90600052602060002090602091828204019190066101000a81548160ff021916908315150217905550505050505050565b611401613b4e565b6000606061140e86612c74565b9150915061141a613996565b61142483836131d4565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156114c85780601f1061149d576101008083540402835291602001916114c8565b820191906000526020600020905b8154815290600101906020018083116114ab57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561151457fe5b600281111561151f57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561159757602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116115615790505b50505050508152505090506002808111156115ae57fe5b816060015160028111156115be57fe5b146115fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f590614e0c565b60405180910390fd5b60035485111580156116105750600085115b61164f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164690614b6c565b60405180910390fd5b80604001518587011115611698576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168f90614acc565b60405180910390fd5b60006116a684848989613484565b8096508192505050806116ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e590614cec565b60405180910390fd5b505050509392505050565b6000339050600061170a82846131d4565b90506001600281111561171957fe5b8160030160009054906101000a900460ff16600281111561173657fe5b14611776576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176d90614d6c565b60405180910390fd5b60006001905060008260040180549050905060008090505b818110156117e157600015158460040182815481106117a957fe5b90600052602060002090602091828204019190069054906101000a900460ff16151514156117d657600092505b80600101905061178e565b5081611822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181990614ccc565b60405180910390fd5b60028360030160006101000a81548160ff0219169083600281111561184357fe5b021790555060006118548587613517565b905080611896576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188d90614b2c565b60405180910390fd5b505050505050565b6060600060606118ad84612c74565b9150915060606118bc82612a10565b90506000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008090505b82518110156119c65760008260010184838151811061192257fe5b60200260200101516040516119379190614a1a565b90815260200160405180910390205411611986576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197d90614c2c565b60405180910390fd5b8160020183828151811061199657fe5b60200260200101516040516119ab9190614a1a565b90815260200160405180910390209150806001019050611907565b5080600001805480602002602001604051908101604052809291908181526020016000905b82821015611b8e57838290600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611aa75780601f10611a7c57610100808354040283529160200191611aa7565b820191906000526020600020905b815481529060010190602001808311611a8a57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115611af357fe5b6002811115611afe57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015611b7657602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411611b405790505b505050505081525050815260200190600101906119eb565b50505050945050505050919050565b600160009054906101000a900460ff16611bdf576120006002819055506210000060038190555060018060006101000a81548160ff0219169083151502179055505b60003390506305f5e100821115611c2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2290614d2c565b60405180910390fd5b600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205483011115611cee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce590614dac565b60405180910390fd5b6060611cf984612a10565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015611e0a57600082600101846001840381518110611d6357fe5b6020026020010151604051611d789190614a1a565b90815260200160405180910390205411611dc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dbe90614c2c565b60405180910390fd5b81600201836001830381518110611dda57fe5b6020026020010151604051611def9190614a1a565b90815260200160405180910390209150806001019050611d45565b50600254816000018054905010611e56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4d90614d4c565b60405180910390fd5b60606001835111611e675785611e80565b82600184510381518110611e7757fe5b60200260200101515b905060008260010182604051611e969190614a31565b90815260200160405180910390205414611ee5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611edc90614d8c565b60405180910390fd5b611eee81612ff6565b611f2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2490614d0c565b60405180910390fd5b6000611f3a85888861357b565b905080611f7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7390614dec565b60405180910390fd5b6060600354600160035489010381611f9057fe5b04604051908082528060200260200182016040528015611fbf5781602001602082028038833980820191505090505b509050836000016040518060a0016040528085815260200160011515815260200189815260200160016002811115611ff357fe5b8152602001838152509080600181540180825580915050906001820390600052602060002090600502016000909192909190915060008201518160000190805190602001906120439291906139d2565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561209257fe5b021790555060808201518160040190805190602001906120b3929190613a52565b50505050836000018054905084600101846040516120d19190614a31565b90815260200160405180910390208190555086600560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505050505050505050565b6000339050612147613996565b61215182846131d4565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156121f55780601f106121ca576101008083540402835291602001916121f5565b820191906000526020600020905b8154815290600101906020018083116121d857829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561224157fe5b600281111561224c57fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156122c457602002820191906000526020600020906000905b82829054906101000a900460ff1615158152602001906001019060208260000104928301926001038202915080841161228e5790505b5050505050815250509050600060028111156122dc57fe5b816060015160028111156122ec57fe5b141561232d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232490614b8c565b60405180910390fd5b600061233983856135e8565b90508061237b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161237290614bec565b60405180910390fd5b606061238685612a10565b90506000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b825181101561241e57816002018360018303815181106123ee57fe5b60200260200101516040516124039190614a1a565b908152602001604051809103902091508060010190506123d2565b50600060018260010186600001516040516124399190614a1a565b908152602001604051809103902054039050612453613996565b8260000160018460000180549050038154811061246c57fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561251e5780601f106124f35761010080835404028352916020019161251e565b820191906000526020600020905b81548152906001019060200180831161250157829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561256a57fe5b600281111561257557fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156125ed57602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116125b75790505b50505050508152505090508083600001838154811061260857fe5b906000526020600020906005020160008201518160000190805190602001906126329291906139d2565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561268157fe5b021790555060808201518160040190805190602001906126a2929190613a52565b50905050826000018054809190600190036126bd9190613af8565b508260010186600001516040516126d49190614a1a565b9081526020016040518091039020548360010182600001516040516126f99190614a1a565b90815260200160405180910390208190555060008360010187600001516040516127239190614a1a565b9081526020016040518091039020819055508560400151600560008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505050505050505050565b600080606061279e84612c74565b915091506127aa613996565b6127b483836131d4565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156128585780601f1061282d57610100808354040283529160200191612858565b820191906000526020600020905b81548152906001019060200180831161283b57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff1660028111156128a457fe5b60028111156128af57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561292757602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116128f15790505b50505050508152505090506001600281111561293f57fe5b8160600151600281111561294f57fe5b1480612974575060028081111561296257fe5b8160600151600281111561297257fe5b145b6129b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129aa90614d6c565b60405180910390fd5b60006129bf848461364c565b809650819250505080612a07576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129fe90614dcc565b60405180910390fd5b50505050919050565b6060612a1a613b73565b612a23836136b5565b9050612a2d613b73565b612a6b6040518060400160405280600181526020017f2f000000000000000000000000000000000000000000000000000000000000008152506136b5565b905060606001612a8483856136e390919063ffffffff16565b01604051908082528060200260200182016040528015612ab857816020015b6060815260200190600190039081612aa35790505b50905060008090505b8151811015612b0957612ae5612ae0848661375890919063ffffffff16565b613772565b828281518110612af157fe5b60200260200101819052508080600101915050612ac1565b50600081600183510381518110612b1c57fe5b6020026020010151511415612b875780600182510381518110612b3b57fe5b6020026020010160608152506001815103604051908082528060200260200182016040528015612b7f57816020015b6060815260200190600190039081612b6a5790505b509350612bc0565b8051604051908082528060200260200182016040528015612bbc57816020015b6060815260200190600190039081612ba75790505b5093505b60008090505b8451811015612c0757818181518110612bdb57fe5b6020026020010151858281518110612bef57fe5b60200260200101819052508080600101915050612bc6565b50505050919050565b60008060016020601f85510181612c2357fe5b040190506040518481526020810160005b83811015612c55578060200286015181602002830152806001019050612c34565b50602082602085026040018460006010600019f1935050505092915050565b6000606060006028905080845111612cc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cb890614c0c565b60405180910390fd5b6060816040519080825280601f01601f191660200182016040528015612cf65781602001600182028038833980820191505090505b50905060008090505b82811015612d6657858181518110612d1357fe5b602001015160f81c60f81b828281518110612d2a57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050612cff565b50600080905060008090505b83811015612e95576000838281518110612d8857fe5b602001015160f81c60f81b60f81c60ff16905060308110158015612dad575060398111155b80612dc6575060418110158015612dc55750605a8111155b5b80612ddf575060618110158015612dde575060668111155b5b612e1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e1590614c0c565b60405180910390fd5b60308110158015612e30575060398111155b15612e415760308103601084020192505b60418110158015612e535750605a8111155b15612e645760378103601084020192505b60618110158015612e76575060668111155b15612e875760578103601084020192505b508080600101915050612d72565b508094507f2f00000000000000000000000000000000000000000000000000000000000000868481518110612ec657fe5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612f33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f2a90614c0c565b60405180910390fd5b6000600184885103039050806040519080825280601f01601f191660200182016040528015612f715781602001600182028038833980820191505090505b50945060008090505b81811015612fec5760008860018784010181518110612f9557fe5b602001015160f81c60f81b905080878381518110612faf57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350508080600101915050612f7a565b5050505050915091565b600060405160200161300790614a5d565b604051602081830303815290604052805190602001208260405160200161302e9190614a31565b604051602081830303815290604052805190602001201480613099575060405160200161305a90614a48565b60405160208183030381529060405280519060200120826040516020016130819190614a31565b60405160208183030381529060405280519060200120145b806130a5575060008251145b156130b357600090506130d2565b60008251905060ff8111156130cc5760009150506130d2565b60019150505b919050565b60008060016020601f855101816130ea57fe5b040190506040518481526020810160005b8381101561311c5780602002860151816020028301528060010190506130fb565b5060208260208502604001846000600f600019f1935050505092915050565b600073d2001000000000000000000000000000000000d273ffffffffffffffffffffffffffffffffffffffff166383e781fe6040518163ffffffff1660e01b815260040160206040518083038186803b15801561319757600080fd5b505afa1580156131ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506131cf9190810190613da8565b905090565b600060606131e183612a10565b90506000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b82518110156132f25760008260010184600184038151811061324b57fe5b60200260200101516040516132609190614a1a565b908152602001604051809103902054116132af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132a690614c2c565b60405180910390fd5b816002018360018303815181106132c257fe5b60200260200101516040516132d79190614a1a565b9081526020016040518091039020915080600101905061322d565b5060606001835111613304578461331d565b8260018451038151811061331457fe5b60200260200101515b9050600082600101826040516133339190614a31565b90815260200160405180910390205411613382576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161337990614c2c565b60405180910390fd5b6000826000016001846001018460405161339c9190614a31565b90815260200160405180910390205403815481106133b657fe5b906000526020600020906005020190508094505050505092915050565b60008060016020601f855101816133e657fe5b04019050600060016020601f885101816133fc57fe5b040190506040518781526020810160005b8381101561342e57806020028901518160200283015280600101905061340d565b50868360200282015260005b84811015613460578060200287015181856001010160200283015280600101905061343a565b50602082848601602002606001846000600c600019f1945050505050949350505050565b600061348e613b4e565b600060016020601f885101816134a057fe5b0401905060006020601f8601816134b357fe5b0490506040518881526020810160005b848110156134e457806020028a0151816020028301528060010190506134c3565b5083602002810188815287816020015283602002868660030160200285600a600019fa9650505050505094509492505050565b60008060016020601f8551018161352a57fe5b040190506040518481526020810160005b8381101561355c57806020028601518160200283015280600101905061353b565b50602082602085026040018460006011600019f1935050505092915050565b60008060016020601f8651018161358e57fe5b040190506040518581526020810160005b838110156135c057806020028701518160200283015280600101905061359f565b50846020840282015260208260208502604001846000600b600019f193505050509392505050565b60008060016020601f855101816135fb57fe5b040190506040518481526020810160005b8381101561362d57806020028601518160200283015280600101905061360c565b5060208260208502604001846000600e600019f1935050505092915050565b600080600060016020601f8651018161366157fe5b040190506040518581526020810160005b83811015613693578060200287015181602002830152806001019050613672565b506020826020850260200184600d600019fa9450815193505050509250929050565b6136bd613b73565b600060208301905060405180604001604052808451815260200182815250915050919050565b600080826000015161370785600001518660200151866000015187602001516137d4565b0190505b8360000151846020015101811161375157818060010192505082600001516137498560200151830386600001510383866000015187602001516137d4565b01905061370b565b5092915050565b613760613b73565b61376b8383836138af565b5092915050565b60608082600001516040519080825280601f01601f1916602001820160405280156137ac5781602001600182028038833980820191505090505b50905060006020820190506137ca818560200151866000015161394d565b8192505050919050565b600080849050600086851161389f576020851161385957600060018660200360080260020a031960001b905060008186511690506000878a8a0103905060008386511690505b82811461384b57818610613838578a8a0196505050505050506138a7565b858060010196505083865116905061381a565b8596505050505050506138a7565b60008585209050600091505b858803821161389d57600086842090508082141561388957839450505050506138a7565b600184019350508180600101925050613865565b505b868601925050505b949350505050565b6138b7613b73565b60006138d585600001518660200151866000015187602001516137d4565b90508460200151836020018181525050846020015181038360000181815250508460000151856020015101811415613917576000856000018181525050613942565b8360000151836000015101856000018181510391508181525050836000015181018560200181815250505b829150509392505050565b5b60208110613971578151835260208301925060208201915060208103905061394e565b60006001826020036101000a0390508019835116818551168181178652505050505050565b6040518060a001604052806060815260200160001515815260200160008152602001600060028111156139c557fe5b8152602001606081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613a1357805160ff1916838001178555613a41565b82800160010185558215613a41579182015b82811115613a40578251825591602001919060010190613a25565b5b509050613a4e9190613b8d565b5090565b82805482825590600052602060002090601f01602090048101928215613ae75791602002820160005b83821115613ab857835183826101000a81548160ff0219169083151502179055509260200192600101602081600001049283019260010302613a7b565b8015613ae55782816101000a81549060ff0219169055600101602081600001049283019260010302613ab8565b505b509050613af49190613bb2565b5090565b815481835581811115613b2557600502816005028360005260206000209182019101613b249190613be2565b5b505050565b5080546000825560050290600052602060002090810190613b4b9190613be2565b50565b6040518062100000016040528061800090602082028038833980820191505090505090565b604051806040016040528060008152602001600081525090565b613baf91905b80821115613bab576000816000905550600101613b93565b5090565b90565b613bdf91905b80821115613bdb57600081816101000a81549060ff021916905550600101613bb8565b5090565b90565b613c4e91905b80821115613c4a5760008082016000613c019190613c51565b6001820160006101000a81549060ff021916905560028201600090556003820160006101000a81549060ff0219169055600482016000613c419190613c99565b50600501613be8565b5090565b90565b50805460018160011615610100020316600290046000825580601f10613c775750613c96565b601f016020900490600052602060002090810190613c959190613b8d565b5b50565b50805460008255601f016020900490600052602060002090810190613cbe9190613b8d565b50565b600081359050613cd081615086565b92915050565b600081519050613ce581615086565b92915050565b600082601f830112613cfc57600080fd5b8135613d0f613d0a82614e74565b614e47565b91508082526020830160208301858383011115613d2b57600080fd5b613d36838284615026565b50505092915050565b600082601f830112613d5057600080fd5b8135613d63613d5e82614ea0565b614e47565b91508082526020830160208301858383011115613d7f57600080fd5b613d8a838284615026565b50505092915050565b600081359050613da28161509d565b92915050565b600060208284031215613dba57600080fd5b6000613dc884828501613cd6565b91505092915050565b60008060408385031215613de457600080fd5b6000613df285828601613cc1565b9250506020613e0385828601613d93565b9150509250929050565b600060208284031215613e1f57600080fd5b600082013567ffffffffffffffff811115613e3957600080fd5b613e4584828501613d3f565b91505092915050565b60008060408385031215613e6157600080fd5b600083013567ffffffffffffffff811115613e7b57600080fd5b613e8785828601613d3f565b9250506020613e9885828601613d93565b9150509250929050565b600080600060608486031215613eb757600080fd5b600084013567ffffffffffffffff811115613ed157600080fd5b613edd86828701613d3f565b9350506020613eee86828701613d93565b925050604084013567ffffffffffffffff811115613f0b57600080fd5b613f1786828701613ceb565b9150509250925092565b600080600060608486031215613f3657600080fd5b600084013567ffffffffffffffff811115613f5057600080fd5b613f5c86828701613d3f565b9350506020613f6d86828701613d93565b9250506040613f7e86828701613d93565b9150509250925092565b6000613f9483836140f6565b60208301905092915050565b6000613fac8383614105565b60208301905092915050565b6000613fc4838361497f565b905092915050565b6000613fd782614ef6565b613fe18185614f55565b9350613fec83614ecc565b8060005b8381101561401d5781516140048882613f88565b975061400f83614f2e565b925050600181019050613ff0565b5085935050505092915050565b61403381614f01565b61403d8184614f66565b925061404882614edc565b8060005b838110156140795781516140608782613fa0565b965061406b83614f3b565b92505060018101905061404c565b505050505050565b600061408c82614f0d565b6140968185614f71565b9350836020820285016140a885614ee6565b8060005b858110156140e457848403895281516140c58582613fb8565b94506140d083614f48565b925060208a019950506001810190506140ac565b50829750879550505050505092915050565b6140ff81614fc1565b82525050565b61410e81614fcd565b82525050565b61411d81615014565b82525050565b61412c81615014565b82525050565b600061413d82614f23565b6141478185614fa4565b9350614157818560208601615035565b80840191505092915050565b600061416e82614f18565b6141788185614f82565b9350614188818560208601615035565b61419181615068565b840191505092915050565b60006141a782614f18565b6141b18185614fa4565b93506141c1818560208601615035565b80840191505092915050565b60006141da601883614f93565b91507f496e636f7272656374206368756e6b20706f736974696f6e00000000000000006000830152602082019050919050565b600061421a601583614f93565b91507f4469726563746f7279206e6f74206372656174656400000000000000000000006000830152602082019050919050565b600061425a602483614f93565b91507f4e6f7420656e6f756768206d656d6f727920696e207468652046696c6573746f60008301527f72616765000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006142c0601b83614f93565b91507f48617368206861736e2774206265656e2063616c63756c6174656400000000006000830152602082019050919050565b6000614300601983614f93565b91507f4368756e6b20697320616c72656164792075706c6f61646564000000000000006000830152602082019050919050565b6000614340601683614f93565b91507f496e636f7272656374206368756e6b206c656e677468000000000000000000006000830152602082019050919050565b6000614380600f83614f93565b91507f46696c65206e6f742065786973747300000000000000000000000000000000006000830152602082019050919050565b60006143c0600e83614f93565b91507f496e76616c69642073656e6465720000000000000000000000000000000000006000830152602082019050919050565b6000614400601883614f93565b91507f4469726563746f7279206973206e6f742064656c6574656400000000000000006000830152602082019050919050565b6000614440601083614f93565b91507f46696c65206e6f742064656c65746564000000000000000000000000000000006000830152602082019050919050565b6000614480601383614f93565b91507f496e76616c69642073746f7261676550617468000000000000000000000000006000830152602082019050919050565b60006144c0600c83614f93565b91507f496e76616c6964207061746800000000000000000000000000000000000000006000830152602082019050919050565b6000614500600183614fa4565b91507f2e000000000000000000000000000000000000000000000000000000000000006000830152600182019050919050565b6000614540601683614f93565b91507f496e76616c6964206469726563746f7279206e616d65000000000000000000006000830152602082019050919050565b6000614580601583614f93565b91507f4368756e6b207761736e27742075706c6f6164656400000000000000000000006000830152602082019050919050565b60006145c0602683614f93565b91507f436f756c64206e6f742072657365727665206c657373207468616e207573656460008301527f20737061636500000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614626601683614f93565b91507f4469726563746f7279206973206e6f7420656d707479000000000000000000006000830152602082019050919050565b6000614666602383614f93565b91507f46696c65206861736e2774206265656e2075706c6f6164656420636f7272656360008301527f746c7900000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006146cc601183614f93565b91507f4368756e6b207761736e277420726561640000000000000000000000000000006000830152602082019050919050565b600061470c601883614f93565b91507f46696c656e616d652073686f756c64206265203c2032353600000000000000006000830152602082019050919050565b600061474c601f83614f93565b91507f46696c652073686f756c64206265206c657373207468616e20313030204d42006000830152602082019050919050565b600061478c600283614fa4565b91507f2e2e0000000000000000000000000000000000000000000000000000000000006000830152600282019050919050565b60006147cc601183614f93565b91507f4469726563746f72792069732066756c6c0000000000000000000000000000006000830152602082019050919050565b600061480c600e83614f93565b91507f46696c65206e6f7420666f756e640000000000000000000000000000000000006000830152602082019050919050565b600061484c601883614f93565b91507f46696c65206f72206469726563746f72792065786973747300000000000000006000830152602082019050919050565b600061488c601983614f93565b91507f4e6f7420656e6f756768207265736572766564207370616365000000000000006000830152602082019050919050565b60006148cc601883614f93565b91507f45564d206572726f7220696e2067657446696c6553697a6500000000000000006000830152602082019050919050565b600061490c601083614f93565b91507f46696c65206e6f742063726561746564000000000000000000000000000000006000830152602082019050919050565b600061494c601983614f93565b91507f46696c65206861736e2774206265656e2075706c6f61646564000000000000006000830152602082019050919050565b600060a083016000830151848203600086015261499c8282614163565b91505060208301516149b160208601826140f6565b5060408301516149c460408601826149fc565b5060608301516149d76060860182614114565b50608083015184820360808601526149ef8282613fcc565b9150508091505092915050565b614a058161500a565b82525050565b614a148161500a565b82525050565b6000614a26828461419c565b915081905092915050565b6000614a3d8284614132565b915081905092915050565b6000614a53826144f3565b9150819050919050565b6000614a688261477f565b9150819050919050565b60006210000082019050614a89600083018461402a565b92915050565b60006020820190508181036000830152614aa98184614081565b905092915050565b6000602082019050614ac66000830184614123565b92915050565b60006020820190508181036000830152614ae5816141cd565b9050919050565b60006020820190508181036000830152614b058161420d565b9050919050565b60006020820190508181036000830152614b258161424d565b9050919050565b60006020820190508181036000830152614b45816142b3565b9050919050565b60006020820190508181036000830152614b65816142f3565b9050919050565b60006020820190508181036000830152614b8581614333565b9050919050565b60006020820190508181036000830152614ba581614373565b9050919050565b60006020820190508181036000830152614bc5816143b3565b9050919050565b60006020820190508181036000830152614be5816143f3565b9050919050565b60006020820190508181036000830152614c0581614433565b9050919050565b60006020820190508181036000830152614c2581614473565b9050919050565b60006020820190508181036000830152614c45816144b3565b9050919050565b60006020820190508181036000830152614c6581614533565b9050919050565b60006020820190508181036000830152614c8581614573565b9050919050565b60006020820190508181036000830152614ca5816145b3565b9050919050565b60006020820190508181036000830152614cc581614619565b9050919050565b60006020820190508181036000830152614ce581614659565b9050919050565b60006020820190508181036000830152614d05816146bf565b9050919050565b60006020820190508181036000830152614d25816146ff565b9050919050565b60006020820190508181036000830152614d458161473f565b9050919050565b60006020820190508181036000830152614d65816147bf565b9050919050565b60006020820190508181036000830152614d85816147ff565b9050919050565b60006020820190508181036000830152614da58161483f565b9050919050565b60006020820190508181036000830152614dc58161487f565b9050919050565b60006020820190508181036000830152614de5816148bf565b9050919050565b60006020820190508181036000830152614e05816148ff565b9050919050565b60006020820190508181036000830152614e258161493f565b9050919050565b6000602082019050614e416000830184614a0b565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614e6a57600080fd5b8060405250919050565b600067ffffffffffffffff821115614e8b57600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614eb757600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050919050565b6000819050602082019050919050565b600081519050919050565b60006180009050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614fba82614fea565b9050919050565b60008115159050919050565b6000819050919050565b6000819050614fe582615079565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061501f82614fd7565b9050919050565b82818337600083830152505050565b60005b83811015615053578082015181840152602081019050615038565b83811115615062576000848401525b50505050565b6000601f19601f8301169050919050565b6003811061508357fe5b50565b61508f81614faf565b811461509a57600080fd5b50565b6150a68161500a565b81146150b157600080fd5b5056fea365627a7a72315820314a90e541327f2678eaf7815f54348c3702e4fa45cdf1d5595b378d08af86896c6578706572696d656e74616cf564736f6c634300050d0040", + "nonce": "0", + "storage": { + "0x0": "2868903936" + } + }, + "0x69bfcdcb98c9562e0a2faee3ecdfd65e8a0adb19": { + "balance": "1000000000000000000000000000000" + }, + "0x6a37ad7dceec4595eea9f03b82d2710e738343ac": { + "balance": "1000000000000000000000000000000" + }, + "0x6b806862a977a0e22ed1752f858e5332647121c8": { + "balance": "1000000000000000000000000000000" + }, + "0x6c0ef9084a57df13c175afea32ea47a510c5506e": { + "balance": "1000000000000000000000000000000" + }, + "0x6cd5e637266e18d3e888ee99451eb828c6b491f4": { + "balance": "1000000000000000000000000000000" + }, + "0x6d0d7f0ff51917bd84a5f7270d31a894282aaf4b": { + "balance": "1000000000000000000000000000000" + }, + "0x6d8092cb926daf29236f866cd31c327ff73323d1": { + "balance": "1000000000000000000000000000000" + }, + "0x6d80aAC61F6d92c7F4A3c412850474ba963B698E": { + "balance": "1000000000000000000000" + }, + "0x6fec280c0ab320715b17d70e8b02c2d4141c1372": { + "balance": "1000000000000000000000000000000" + }, + "0x733ad609ef2e742334d96266fbc13733f1cf5e4a": { + "balance": "1000000000000000000000000000000" + }, + "0x7525198d8cd1121d57358a0b0ed037e924581a76": { + "balance": "1000000000000000000000000000000" + }, + "0x765708943c3b791563d1e3f0533b6d7e7d769e4d": { + "balance": "1000000000000000000000000000000" + }, + "0x7685d04f0b7657017b77efa004a14ff9f022acab": { + "balance": "1000000000000000000000000000000" + }, + "0x76b545cb6a2fc671f741950eeb27627e69a1e69b": { + "balance": "1000000000000000000000000000000" + }, + "0x77a0bc73442d3d9cb993e8d9752f95babf0ccaa6": { + "balance": "1000000000000000000000000000000" + }, + "0x7a89A6c323FaCfF0ADeF7EEF3e491aD4044d0592": { + "balance": "100000000000000000000000" + }, + "0x7e7E68F04D1799Fa25C8cff57314c8a5d3942e69": { + "balance": "1000000000000000000000000" + }, + "0x811d701d14539d190a8593fe901eafe8eff511f5": { + "balance": "1000000000000000000000000000000" + }, + "0x81dcbd71da28fafb9ca99ff5a22bfcebba84fecc": { + "balance": "100000000000000000000000" + }, + "0x83c1479d2a32d9ed9fa699289b6c2db56b7cd045": { + "balance": "1000000000000000000000000000000" + }, + "0x85b33f0853ab8eaa4e602bdfd724d44bc2731e90": { + "balance": "1000000000000000000000000000000" + }, + "0x863f816036e3cbba90855196c9d1e339fcff1650": { + "balance": "1000000000000000000000000000000" + }, + "0x87ea381878572d63b3453033d7540abddd191186": { + "balance": "1000000000000000000000000000000" + }, + "0x88fd5e01078629cc194c933d9631b9448fe10b1d": { + "balance": "1000000000000000000000000000000" + }, + "0x8945e48bd056f45c8b57f9025d2674bb03a24035": { + "balance": "1000000000000000000000000000000" + }, + "0x8a920edc1021ce76c22774e0e83723a6e51c2439": { + "balance": "1000000000000000000000000000000" + }, + "0x8e6081e272c8f4d49f5b29157b52f68cbd6307ad": { + "balance": "1000000000000000000000000000000" + }, + "0x8fe24dbbf9884bd458d8cfac528b4ad70e82497d": { + "balance": "1000000000000000000000000000000" + }, + "0x90431f3f75b26657f74abbb5c759b12e78f916cc": { + "balance": "1000000000000000000000000000000" + }, + "0x907cd0881E50d359bb9Fd120B1A5A143b1C97De6": { + "balance": "1000000000000000000000000000000000000000000000000000000000" + }, + "0x94c6e5746971d6aebeaa42cbbe2feca0f6b5b24f": { + "balance": "1000000000000000000000000000000" + }, + "0x96672f9e982936e1904b15c948cc81bf18027db6": { + "balance": "1000000000000000000000000000000" + }, + "0x97b921ba45e0aa8830701aa62050a83ee00a1bb8": { + "balance": "1000000000000000000000000000000" + }, + "0x98e50c97baf98dc6a81bdb95067339a269a36fc1": { + "balance": "1000000000000000000000000000000" + }, + "0x9b77f28285a49601169a33332f08aa309d97edd0": { + "balance": "1000000000000000000000000000000" + }, + "0x9f62f4215cd277ca40dede101b4ccb29290de6bb": { + "balance": "1000000000000000000000000000000" + }, + "0xD1001000000000000000000000000000000000D1": { + "balance": "0", + "code": "0x608060405260043610603f576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680636d4ce63c146044575b600080fd5b348015604f57600080fd5b506056606c565b6040518082815260200191505060405180910390f35b60006001600060048152602001908152602001600020600060098152602001908152602001600020600101549050905600a165627a7a723058208fe64219becc0bcab1c8f854f05804ebb6bb555da5dbc49e8f7021c31d77636a0029", + "nonce": "0", + "storage": { + "0x3b4da637a1b0e6dbfc6795f2b7f0cb29eebb91b3af4dcc335e1633f6b4af810b": "1111" + } + }, + "0xD3001000000000000000000000000000000000D3": { + "balance": "0", + "code": "0x60806040526004361061007b5760003560e01c80639623609d1161004e5780639623609d1461013657806399a88ec4146101f5578063f2fde38b14610230578063f3b7dead146102635761007b565b8063204e1c7a14610080578063715018a6146100cf5780637eff275e146100e65780638da5cb5b14610121575b600080fd5b34801561008c57600080fd5b506100b3600480360360208110156100a357600080fd5b50356001600160a01b0316610296565b604080516001600160a01b039092168252519081900360200190f35b3480156100db57600080fd5b506100e4610328565b005b3480156100f257600080fd5b506100e46004803603604081101561010957600080fd5b506001600160a01b03813581169160200135166103ca565b34801561012d57600080fd5b506100b3610496565b6100e46004803603606081101561014c57600080fd5b6001600160a01b03823581169260208101359091169181019060608101604082013564010000000081111561018057600080fd5b82018360208201111561019257600080fd5b803590602001918460018302840111640100000000831117156101b457600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506104a5945050505050565b34801561020157600080fd5b506100e46004803603604081101561021857600080fd5b506001600160a01b03813581169160200135166105dd565b34801561023c57600080fd5b506100e46004803603602081101561025357600080fd5b50356001600160a01b031661068d565b34801561026f57600080fd5b506100b36004803603602081101561028657600080fd5b50356001600160a01b0316610785565b6000806060836001600160a01b03166040518080635c60da1b60e01b8152506004019050600060405180830381855afa9150503d80600081146102f5576040519150601f19603f3d011682016040523d82523d6000602084013e6102fa565b606091505b50915091508161030957600080fd5b80806020019051602081101561031e57600080fd5b5051949350505050565b6103306107e4565b6000546001600160a01b03908116911614610380576040805162461bcd60e51b8152602060048201819052602482015260008051602061080f833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6103d26107e4565b6000546001600160a01b03908116911614610422576040805162461bcd60e51b8152602060048201819052602482015260008051602061080f833981519152604482015290519081900360640190fd5b816001600160a01b0316638f283970826040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050600060405180830381600087803b15801561047a57600080fd5b505af115801561048e573d6000803e3d6000fd5b505050505050565b6000546001600160a01b031690565b6104ad6107e4565b6000546001600160a01b039081169116146104fd576040805162461bcd60e51b8152602060048201819052602482015260008051602061080f833981519152604482015290519081900360640190fd5b826001600160a01b0316634f1ef2863484846040518463ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561057357818101518382015260200161055b565b50505050905090810190601f1680156105a05780820380516001836020036101000a031916815260200191505b5093505050506000604051808303818588803b1580156105bf57600080fd5b505af11580156105d3573d6000803e3d6000fd5b5050505050505050565b6105e56107e4565b6000546001600160a01b03908116911614610635576040805162461bcd60e51b8152602060048201819052602482015260008051602061080f833981519152604482015290519081900360640190fd5b816001600160a01b0316633659cfe6826040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050600060405180830381600087803b15801561047a57600080fd5b6106956107e4565b6000546001600160a01b039081169116146106e5576040805162461bcd60e51b8152602060048201819052602482015260008051602061080f833981519152604482015290519081900360640190fd5b6001600160a01b03811661072a5760405162461bcd60e51b81526004018080602001828103825260268152602001806107e96026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000806060836001600160a01b031660405180806303e1469160e61b8152506004019050600060405180830381855afa9150503d80600081146102f5576040519150601f19603f3d011682016040523d82523d6000602084013e6102fa565b339056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a26469706673582212201d968ac32bef5562c6b4f1bd5d2f2a74c14d07ce008ca6fdc5a3bd0f5fc265f564736f6c63430006080033", + "nonce": "0", + "storage": { + "0x0": "0x907cd0881E50d359bb9Fd120B1A5A143b1C97De6" + } + }, + "0xD3002000000000000000000000000000000000D3": { + "balance": "0", + "code": "0x60806040526004361061004e5760003560e01c80633659cfe6146100655780634f1ef286146100985780635c60da1b146101185780638f28397014610149578063f851a4401461017c5761005d565b3661005d5761005b610191565b005b61005b610191565b34801561007157600080fd5b5061005b6004803603602081101561008857600080fd5b50356001600160a01b03166101ab565b61005b600480360360408110156100ae57600080fd5b6001600160a01b0382351691908101906040810160208201356401000000008111156100d957600080fd5b8201836020820111156100eb57600080fd5b8035906020019184600183028401116401000000008311171561010d57600080fd5b5090925090506101e5565b34801561012457600080fd5b5061012d610292565b604080516001600160a01b039092168252519081900360200190f35b34801561015557600080fd5b5061005b6004803603602081101561016c57600080fd5b50356001600160a01b03166102cf565b34801561018857600080fd5b5061012d610389565b6101996103ba565b6101a96101a461041a565b61043f565b565b6101b3610463565b6001600160a01b0316336001600160a01b031614156101da576101d581610488565b6101e2565b6101e2610191565b50565b6101ed610463565b6001600160a01b0316336001600160a01b031614156102855761020f83610488565b6000836001600160a01b031683836040518083838082843760405192019450600093509091505080830381855af49150503d806000811461026c576040519150601f19603f3d011682016040523d82523d6000602084013e610271565b606091505b505090508061027f57600080fd5b5061028d565b61028d610191565b505050565b600061029c610463565b6001600160a01b0316336001600160a01b031614156102c4576102bd61041a565b90506102cc565b6102cc610191565b90565b6102d7610463565b6001600160a01b0316336001600160a01b031614156101da576001600160a01b0381166103355760405162461bcd60e51b81526004018080602001828103825260368152602001806105876036913960400191505060405180910390fd5b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f61035e610463565b604080516001600160a01b03928316815291841660208301528051918290030190a16101d5816104c8565b6000610393610463565b6001600160a01b0316336001600160a01b031614156102c4576102bd610463565b3b151590565b6103c2610463565b6001600160a01b0316336001600160a01b031614156104125760405162461bcd60e51b81526004018080602001828103825260328152602001806105556032913960400191505060405180910390fd5b6101a96101a9565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b3660008037600080366000845af43d6000803e80801561045e573d6000f35b3d6000fd5b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b610491816104ec565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610355565b6104f5816103b4565b6105305760405162461bcd60e51b815260040180806020018281038252603b8152602001806105bd603b913960400191505060405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5556fe43616e6e6f742063616c6c2066616c6c6261636b2066756e6374696f6e2066726f6d207468652070726f78792061646d696e43616e6e6f74206368616e6765207468652061646d696e206f6620612070726f787920746f20746865207a65726f206164647265737343616e6e6f742073657420612070726f787920696d706c656d656e746174696f6e20746f2061206e6f6e2d636f6e74726163742061646472657373a26469706673582212206e221e2a3547bd97244b05ed46430b1b078ba097cb2a4e25ec3d79cf9ac9f02c64736f6c63430006080033", + "nonce": "0", + "storage": { + "0x0": "1000000", + "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0xD3003000000000000000000000000000000000D3", + "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "0xD3001000000000000000000000000000000000D3" + } + }, + "0xD3003000000000000000000000000000000000D3": { + "balance": "0", + "code": "0x608060405234801561001057600080fd5b50600436106100b45760003560e01c806379210e8e1161007157806379210e8e1461017757806381a8235a146101a757806385aeeb17146101c35780639a9a5593146101f3578063a99100541461020f578063b57321221461022b576100b4565b806307c6e7d3146100b9578063122f4fba146100d55780631c6ec7a9146101055780631cfe4e3b14610121578063373dedb41461013d57806361e46db51461015b575b600080fd5b6100d360048036036100ce9190810190613e94565b61025b565b005b6100ef60048036036100ea9190810190613e94565b610862565b6040516100fc9190614b38565b60405180910390f35b61011f600480360361011a9190810190613e94565b610ba1565b005b61013b60048036036101369190810190613e58565b610fce565b005b6101456111ec565b6040516101529190614eb3565b60405180910390f35b61017560048036036101709190810190613f29565b6111f6565b005b610191600480360361018c9190810190613fa8565b611456565b60405161019e9190614af9565b60405180910390f35b6101c160048036036101bc9190810190613e94565b611756565b005b6101dd60048036036101d89190810190613e94565b6118fb565b6040516101ea9190614b16565b60405180910390f35b61020d60048036036102089190810190613ed5565b611bfa565b005b61022960048036036102249190810190613e94565b612195565b005b61024560048036036102409190810190613e94565b612849565b6040516102529190614eb3565b60405180910390f35b6000339050606061026b83612ac9565b90506000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b825181101561037c576000826001018460018403815181106102d557fe5b60200260200101516040516102ea9190614aa1565b90815260200160405180910390205411610339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161033090614cb3565b60405180910390fd5b8160020183600183038151811061034c57fe5b60200260200101516040516103619190614aa1565b908152602001604051809103902091508060010190506102b7565b506060600183511161038e57846103a7565b8260018451038151811061039e57fe5b60200260200101515b9050600082600101826040516103bd9190614ab8565b9081526020016040518091039020541161040c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161040390614cb3565b60405180910390fd5b600082600201826040516104209190614ab8565b90815260200160405180910390206000018054905014610475576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161046c90614d33565b60405180910390fd5b60006104818587612cc9565b9050806104c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ba90614c53565b60405180910390fd5b6104cb613a4f565b836000016001856000018054905003815481106104e457fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156105965780601f1061056b57610100808354040283529160200191610596565b820191906000526020600020905b81548152906001019060200180831161057957829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff1660028111156105e257fe5b60028111156105ed57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561066557602002820191906000526020600020906000905b82829054906101000a900460ff1615158152602001906001019060208260000104928301926001038202915080841161062f5790505b50505050508152505090508084600001600186600101866040516106899190614ab8565b90815260200160405180910390205403815481106106a357fe5b906000526020600020906005020160008201518160000190805190602001906106cd929190613a8b565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561071c57fe5b0217905550608082015181600401908051906020019061073d929190613b0b565b5090505083600101836040516107539190614ab8565b9081526020016040518091039020548460010182600001516040516107789190614aa1565b9081526020016040518091039020819055506000846001018460405161079e9190614ab8565b908152602001604051809103902081905550836000018054806107bd57fe5b6001900381819060005260206000209060050201600080820160006107e29190613bb1565b6001820160006101000a81549060ff021916905560028201600090556003820160006101000a81549060ff02191690556004820160006108229190613bf9565b5050905583600201836040516108389190614ab8565b9081526020016040518091039020600080820160006108579190613c21565b505050505050505050565b600080606061087084612d2d565b91509150606061087f82612ac9565b90506000600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015610964576000826001018460018403815181106108e957fe5b60200260200101516040516108fe9190614aa1565b908152602001604051809103902054141561092157600095505050505050610b9c565b8160020183600183038151811061093457fe5b60200260200101516040516109499190614aa1565b908152602001604051809103902091508060010190506108cb565b5060606001835111610976578361098f565b8260018451038151811061098657fe5b60200260200101515b9050600082600101826040516109a59190614ab8565b90815260200160405180910390205414156109c857600095505050505050610b9c565b6109d0613a4f565b82600001600184600101846040516109e89190614ab8565b9081526020016040518091039020540381548110610a0257fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610ab45780601f10610a8957610100808354040283529160200191610ab4565b820191906000526020600020905b815481529060010190602001808311610a9757829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115610b0057fe5b6002811115610b0b57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015610b8357602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411610b4d5790505b5050505050815250509050806060015196505050505050505b919050565b600360009054906101000a900460ff16610be457612000600481905550621000006005819055506001600360006101000a81548160ff0219169083151502179055505b6000815111610c28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1f90614cb3565b60405180910390fd5b60003390506060610c3883612ac9565b90506000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015610d4957600082600101846001840381518110610ca257fe5b6020026020010151604051610cb79190614aa1565b90815260200160405180910390205411610d06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cfd90614cb3565b60405180910390fd5b81600201836001830381518110610d1957fe5b6020026020010151604051610d2e9190614aa1565b90815260200160405180910390209150806001019050610c84565b50600454816000018054905010610d95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8c90614dd3565b60405180910390fd5b60606001835111610da65784610dbf565b82600184510381518110610db657fe5b60200260200101515b905060008260010182604051610dd59190614ab8565b90815260200160405180910390205414610e24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1b90614e13565b60405180910390fd5b610e2d816130af565b610e6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6390614cd3565b60405180910390fd5b6000610e788587613190565b905080610eba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb190614b73565b60405180910390fd5b610ec2613a4f565b8281600001819052506000816020019015159081151581525050836000018190806001815401808255809150506001900390600052602060002090600502016000909190919091506000820151816000019080519060200190610f26929190613a8b565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff02191690836002811115610f7557fe5b02179055506080820151816004019080519060200190610f96929190613b0b565b50505083600001805490508460010184604051610fb39190614ab8565b90815260200160405180910390208190555050505050505050565b610fd66131f4565b73ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16148061103b57503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614155b61107a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107190614c33565b60405180910390fd5b80600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411156110fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f390614d13565b60405180910390fd5b60025460095482011115611145576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113c90614b93565b60405180910390fd5b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460096000828254039250508190555080600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550806009600082825401925050819055505050565b6000600254905090565b60003390506000611207828661328d565b90506001600281111561121657fe5b8160030160009054906101000a900460ff16600281111561123357fe5b14611273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126a90614df3565b60405180910390fd5b6000600554858161128057fe5b061480156112915750806002015484105b6112d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c790614b53565b60405180910390fd5b600554848260020154031080156112ed5750838160020154038351145b806112fa57506005548351145b611339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133090614bf3565b60405180910390fd5b6000151581600401600554868161134c57fe5b048154811061135757fe5b90600052602060002090602091828204019190069054906101000a900460ff161515146113b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b090614bd3565b60405180910390fd5b60006113c78387878761348c565b905080611409576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140090614cf3565b60405180910390fd5b600182600401600554878161141a57fe5b048154811061142557fe5b90600052602060002090602091828204019190066101000a81548160ff021916908315150217905550505050505050565b61145e613c45565b6000606061146b86612d2d565b91509150611477613a4f565b611481838361328d565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156115255780601f106114fa57610100808354040283529160200191611525565b820191906000526020600020905b81548152906001019060200180831161150857829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561157157fe5b600281111561157c57fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156115f457602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116115be5790505b505050505081525050905060028081111561160b57fe5b8160600151600281111561161b57fe5b1461165b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165290614e93565b60405180910390fd5b600554851115801561166d5750600085115b6116ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a390614bf3565b60405180910390fd5b806040015185870111156116f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ec90614b53565b60405180910390fd5b60006117038484898961353d565b80965081925050508061174b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174290614d73565b60405180910390fd5b505050509392505050565b60003390506000611767828461328d565b90506001600281111561177657fe5b8160030160009054906101000a900460ff16600281111561179357fe5b146117d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ca90614df3565b60405180910390fd5b60006001905060008260040180549050905060008090505b8181101561183e576000151584600401828154811061180657fe5b90600052602060002090602091828204019190069054906101000a900460ff161515141561183357600092505b8060010190506117eb565b508161187f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187690614d53565b60405180910390fd5b60028360030160006101000a81548160ff021916908360028111156118a057fe5b021790555060006118b185876135d0565b9050806118f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ea90614bb3565b60405180910390fd5b505050505050565b60606000606061190a84612d2d565b91509150606061191982612ac9565b90506000600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008090505b8251811015611a235760008260010184838151811061197f57fe5b60200260200101516040516119949190614aa1565b908152602001604051809103902054116119e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119da90614cb3565b60405180910390fd5b816002018382815181106119f357fe5b6020026020010151604051611a089190614aa1565b90815260200160405180910390209150806001019050611964565b5080600001805480602002602001604051908101604052809291908181526020016000905b82821015611beb57838290600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611b045780601f10611ad957610100808354040283529160200191611b04565b820191906000526020600020905b815481529060010190602001808311611ae757829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115611b5057fe5b6002811115611b5b57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015611bd357602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411611b9d5790505b50505050508152505081526020019060010190611a48565b50505050945050505050919050565b600360009054906101000a900460ff16611c3d57612000600481905550621000006005819055506001600360006101000a81548160ff0219169083151502179055505b60003390506305f5e100821115611c89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8090614db3565b60405180910390fd5b600660008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205483011115611d4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4390614e33565b60405180910390fd5b6060611d5784612ac9565b90506000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015611e6857600082600101846001840381518110611dc157fe5b6020026020010151604051611dd69190614aa1565b90815260200160405180910390205411611e25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1c90614cb3565b60405180910390fd5b81600201836001830381518110611e3857fe5b6020026020010151604051611e4d9190614aa1565b90815260200160405180910390209150806001019050611da3565b50600454816000018054905010611eb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eab90614dd3565b60405180910390fd5b60606001835111611ec55785611ede565b82600184510381518110611ed557fe5b60200260200101515b905060008260010182604051611ef49190614ab8565b90815260200160405180910390205414611f43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3a90614e13565b60405180910390fd5b611f4c816130af565b611f8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8290614d93565b60405180910390fd5b6000611f98858888613634565b905080611fda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd190614e73565b60405180910390fd5b6060600554600160055489010381611fee57fe5b0460405190808252806020026020018201604052801561201d5781602001602082028038833980820191505090505b509050836000016040518060a001604052808581526020016001151581526020018981526020016001600281111561205157fe5b8152602001838152509080600181540180825580915050600190039060005260206000209060050201600090919091909150600082015181600001908051906020019061209f929190613a8b565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff021916908360028111156120ee57fe5b0217905550608082015181600401908051906020019061210f929190613b0b565b5050508360000180549050846001018460405161212c9190614ab8565b90815260200160405180910390208190555086600760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505050505050505050565b60003390506121a2613a4f565b6121ac828461328d565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156122505780601f1061222557610100808354040283529160200191612250565b820191906000526020600020905b81548152906001019060200180831161223357829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561229c57fe5b60028111156122a757fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561231f57602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116122e95790505b50505050508152505090506000600281111561233757fe5b8160600151600281111561234757fe5b1415612388576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161237f90614c13565b60405180910390fd5b600061239483856136a1565b9050806123d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123cd90614c73565b60405180910390fd5b60606123e185612ac9565b90506000600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015612479578160020183600183038151811061244957fe5b602002602001015160405161245e9190614aa1565b9081526020016040518091039020915080600101905061242d565b50600060018260010186600001516040516124949190614aa1565b9081526020016040518091039020540390506124ae613a4f565b826000016001846000018054905003815481106124c757fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156125795780601f1061254e57610100808354040283529160200191612579565b820191906000526020600020905b81548152906001019060200180831161255c57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff1660028111156125c557fe5b60028111156125d057fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561264857602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116126125790505b50505050508152505090508083600001838154811061266357fe5b9060005260206000209060050201600082015181600001908051906020019061268d929190613a8b565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff021916908360028111156126dc57fe5b021790555060808201518160040190805190602001906126fd929190613b0b565b509050508260000180548061270e57fe5b6001900381819060005260206000209060050201600080820160006127339190613bb1565b6001820160006101000a81549060ff021916905560028201600090556003820160006101000a81549060ff02191690556004820160006127739190613bf9565b5050905582600101866000015160405161278d9190614aa1565b9081526020016040518091039020548360010182600001516040516127b29190614aa1565b90815260200160405180910390208190555060008360010187600001516040516127dc9190614aa1565b9081526020016040518091039020819055508560400151600760008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505050505050505050565b600080606061285784612d2d565b91509150612863613a4f565b61286d838361328d565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156129115780601f106128e657610100808354040283529160200191612911565b820191906000526020600020905b8154815290600101906020018083116128f457829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561295d57fe5b600281111561296857fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156129e057602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116129aa5790505b5050505050815250509050600160028111156129f857fe5b81606001516002811115612a0857fe5b1480612a2d5750600280811115612a1b57fe5b81606001516002811115612a2b57fe5b145b612a6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a6390614df3565b60405180910390fd5b6000612a788484613705565b809650819250505080612ac0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ab790614e53565b60405180910390fd5b50505050919050565b6060612ad3613c6a565b612adc8361376e565b9050612ae6613c6a565b612b246040518060400160405280600181526020017f2f0000000000000000000000000000000000000000000000000000000000000081525061376e565b905060606001612b3d838561379c90919063ffffffff16565b01604051908082528060200260200182016040528015612b7157816020015b6060815260200190600190039081612b5c5790505b50905060008090505b8151811015612bc257612b9e612b99848661381190919063ffffffff16565b61382b565b828281518110612baa57fe5b60200260200101819052508080600101915050612b7a565b50600081600183510381518110612bd557fe5b6020026020010151511415612c405780600182510381518110612bf457fe5b6020026020010160608152506001815103604051908082528060200260200182016040528015612c3857816020015b6060815260200190600190039081612c235790505b509350612c79565b8051604051908082528060200260200182016040528015612c7557816020015b6060815260200190600190039081612c605790505b5093505b60008090505b8451811015612cc057818181518110612c9457fe5b6020026020010151858281518110612ca857fe5b60200260200101819052508080600101915050612c7f565b50505050919050565b60008060016020601f85510181612cdc57fe5b040190506040518481526020810160005b83811015612d0e578060200286015181602002830152806001019050612ced565b50602082602085026040018460006010600019f1935050505092915050565b6000606060006028905080845111612d7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d7190614c93565b60405180910390fd5b6060816040519080825280601f01601f191660200182016040528015612daf5781602001600182028038833980820191505090505b50905060008090505b82811015612e1f57858181518110612dcc57fe5b602001015160f81c60f81b828281518110612de357fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050612db8565b50600080905060008090505b83811015612f4e576000838281518110612e4157fe5b602001015160f81c60f81b60f81c60ff16905060308110158015612e66575060398111155b80612e7f575060418110158015612e7e5750605a8111155b5b80612e98575060618110158015612e97575060668111155b5b612ed7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ece90614c93565b60405180910390fd5b60308110158015612ee9575060398111155b15612efa5760308103601084020192505b60418110158015612f0c5750605a8111155b15612f1d5760378103601084020192505b60618110158015612f2f575060668111155b15612f405760578103601084020192505b508080600101915050612e2b565b508094507f2f00000000000000000000000000000000000000000000000000000000000000868481518110612f7f57fe5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612fec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fe390614c93565b60405180910390fd5b6000600184885103039050806040519080825280601f01601f19166020018201604052801561302a5781602001600182028038833980820191505090505b50945060008090505b818110156130a5576000886001878401018151811061304e57fe5b602001015160f81c60f81b90508087838151811061306857fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350508080600101915050613033565b5050505050915091565b60006040516020016130c090614ae4565b60405160208183030381529060405280519060200120826040516020016130e79190614ab8565b604051602081830303815290604052805190602001201480613152575060405160200161311390614acf565b604051602081830303815290604052805190602001208260405160200161313a9190614ab8565b60405160208183030381529060405280519060200120145b8061315e575060008251145b1561316c576000905061318b565b60008251905060ff81111561318557600091505061318b565b60019150505b919050565b60008060016020601f855101816131a357fe5b040190506040518481526020810160005b838110156131d55780602002860151816020028301528060010190506131b4565b5060208260208502604001846000600f600019f1935050505092915050565b600073d2001000000000000000000000000000000000d273ffffffffffffffffffffffffffffffffffffffff166383e781fe6040518163ffffffff1660e01b815260040160206040518083038186803b15801561325057600080fd5b505afa158015613264573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506132889190810190613e2f565b905090565b6000606061329a83612ac9565b90506000600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b82518110156133ab5760008260010184600184038151811061330457fe5b60200260200101516040516133199190614aa1565b90815260200160405180910390205411613368576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161335f90614cb3565b60405180910390fd5b8160020183600183038151811061337b57fe5b60200260200101516040516133909190614aa1565b908152602001604051809103902091508060010190506132e6565b50606060018351116133bd57846133d6565b826001845103815181106133cd57fe5b60200260200101515b9050600082600101826040516133ec9190614ab8565b9081526020016040518091039020541161343b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161343290614cb3565b60405180910390fd5b600082600001600184600101846040516134559190614ab8565b908152602001604051809103902054038154811061346f57fe5b906000526020600020906005020190508094505050505092915050565b60008060016020601f8551018161349f57fe5b04019050600060016020601f885101816134b557fe5b040190506040518781526020810160005b838110156134e75780602002890151816020028301528060010190506134c6565b50868360200282015260005b8481101561351957806020028701518185600101016020028301528060010190506134f3565b50602082848601602002606001846000600c600019f1945050505050949350505050565b6000613547613c45565b600060016020601f8851018161355957fe5b0401905060006020601f86018161356c57fe5b0490506040518881526020810160005b8481101561359d57806020028a01518160200283015280600101905061357c565b5083602002810188815287816020015283602002868660030160200285600a600019fa9650505050505094509492505050565b60008060016020601f855101816135e357fe5b040190506040518481526020810160005b838110156136155780602002860151816020028301528060010190506135f4565b50602082602085026040018460006011600019f1935050505092915050565b60008060016020601f8651018161364757fe5b040190506040518581526020810160005b83811015613679578060200287015181602002830152806001019050613658565b50846020840282015260208260208502604001846000600b600019f193505050509392505050565b60008060016020601f855101816136b457fe5b040190506040518481526020810160005b838110156136e65780602002860151816020028301528060010190506136c5565b5060208260208502604001846000600e600019f1935050505092915050565b600080600060016020601f8651018161371a57fe5b040190506040518581526020810160005b8381101561374c57806020028701518160200283015280600101905061372b565b506020826020850260200184600d600019fa9450815193505050509250929050565b613776613c6a565b600060208301905060405180604001604052808451815260200182815250915050919050565b60008082600001516137c0856000015186602001518660000151876020015161388d565b0190505b8360000151846020015101811161380a578180600101925050826000015161380285602001518303866000015103838660000151876020015161388d565b0190506137c4565b5092915050565b613819613c6a565b613824838383613968565b5092915050565b60608082600001516040519080825280601f01601f1916602001820160405280156138655781602001600182028038833980820191505090505b50905060006020820190506138838185602001518660000151613a06565b8192505050919050565b6000808490506000868511613958576020851161391257600060018660200360080260020a031960001b905060008186511690506000878a8a0103905060008386511690505b828114613904578186106138f1578a8a019650505050505050613960565b85806001019650508386511690506138d3565b859650505050505050613960565b60008585209050600091505b85880382116139565760008684209050808214156139425783945050505050613960565b60018401935050818060010192505061391e565b505b868601925050505b949350505050565b613970613c6a565b600061398e856000015186602001518660000151876020015161388d565b905084602001518360200181815250508460200151810383600001818152505084600001518560200151018114156139d05760008560000181815250506139fb565b8360000151836000015101856000018181510391508181525050836000015181018560200181815250505b829150509392505050565b5b60208110613a2a5781518352602083019250602082019150602081039050613a07565b60006001826020036101000a0390508019835116818551168181178652505050505050565b6040518060a00160405280606081526020016000151581526020016000815260200160006002811115613a7e57fe5b8152602001606081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613acc57805160ff1916838001178555613afa565b82800160010185558215613afa579182015b82811115613af9578251825591602001919060010190613ade565b5b509050613b079190613c84565b5090565b82805482825590600052602060002090601f01602090048101928215613ba05791602002820160005b83821115613b7157835183826101000a81548160ff0219169083151502179055509260200192600101602081600001049283019260010302613b34565b8015613b9e5782816101000a81549060ff0219169055600101602081600001049283019260010302613b71565b505b509050613bad9190613ca9565b5090565b50805460018160011615610100020316600290046000825580601f10613bd75750613bf6565b601f016020900490600052602060002090810190613bf59190613c84565b5b50565b50805460008255601f016020900490600052602060002090810190613c1e9190613c84565b50565b5080546000825560050290600052602060002090810190613c429190613cd9565b50565b6040518062100000016040528061800090602082028038833980820191505090505090565b604051806040016040528060008152602001600081525090565b613ca691905b80821115613ca2576000816000905550600101613c8a565b5090565b90565b613cd691905b80821115613cd257600081816101000a81549060ff021916905550600101613caf565b5090565b90565b613d4591905b80821115613d415760008082016000613cf89190613bb1565b6001820160006101000a81549060ff021916905560028201600090556003820160006101000a81549060ff0219169055600482016000613d389190613bf9565b50600501613cdf565b5090565b90565b600081359050613d578161510d565b92915050565b600081519050613d6c8161510d565b92915050565b600082601f830112613d8357600080fd5b8135613d96613d9182614efb565b614ece565b91508082526020830160208301858383011115613db257600080fd5b613dbd8382846150ad565b50505092915050565b600082601f830112613dd757600080fd5b8135613dea613de582614f27565b614ece565b91508082526020830160208301858383011115613e0657600080fd5b613e118382846150ad565b50505092915050565b600081359050613e2981615124565b92915050565b600060208284031215613e4157600080fd5b6000613e4f84828501613d5d565b91505092915050565b60008060408385031215613e6b57600080fd5b6000613e7985828601613d48565b9250506020613e8a85828601613e1a565b9150509250929050565b600060208284031215613ea657600080fd5b600082013567ffffffffffffffff811115613ec057600080fd5b613ecc84828501613dc6565b91505092915050565b60008060408385031215613ee857600080fd5b600083013567ffffffffffffffff811115613f0257600080fd5b613f0e85828601613dc6565b9250506020613f1f85828601613e1a565b9150509250929050565b600080600060608486031215613f3e57600080fd5b600084013567ffffffffffffffff811115613f5857600080fd5b613f6486828701613dc6565b9350506020613f7586828701613e1a565b925050604084013567ffffffffffffffff811115613f9257600080fd5b613f9e86828701613d72565b9150509250925092565b600080600060608486031215613fbd57600080fd5b600084013567ffffffffffffffff811115613fd757600080fd5b613fe386828701613dc6565b9350506020613ff486828701613e1a565b925050604061400586828701613e1a565b9150509250925092565b600061401b838361417d565b60208301905092915050565b6000614033838361418c565b60208301905092915050565b600061404b8383614a06565b905092915050565b600061405e82614f7d565b6140688185614fdc565b935061407383614f53565b8060005b838110156140a457815161408b888261400f565b975061409683614fb5565b925050600181019050614077565b5085935050505092915050565b6140ba81614f88565b6140c48184614fed565b92506140cf82614f63565b8060005b838110156141005781516140e78782614027565b96506140f283614fc2565b9250506001810190506140d3565b505050505050565b600061411382614f94565b61411d8185614ff8565b93508360208202850161412f85614f6d565b8060005b8581101561416b578484038952815161414c858261403f565b945061415783614fcf565b925060208a01995050600181019050614133565b50829750879550505050505092915050565b61418681615048565b82525050565b61419581615054565b82525050565b6141a48161509b565b82525050565b6141b38161509b565b82525050565b60006141c482614faa565b6141ce818561502b565b93506141de8185602086016150bc565b80840191505092915050565b60006141f582614f9f565b6141ff8185615009565b935061420f8185602086016150bc565b614218816150ef565b840191505092915050565b600061422e82614f9f565b614238818561502b565b93506142488185602086016150bc565b80840191505092915050565b600061426160188361501a565b91507f496e636f7272656374206368756e6b20706f736974696f6e00000000000000006000830152602082019050919050565b60006142a160158361501a565b91507f4469726563746f7279206e6f74206372656174656400000000000000000000006000830152602082019050919050565b60006142e160248361501a565b91507f4e6f7420656e6f756768206d656d6f727920696e207468652046696c6573746f60008301527f72616765000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614347601b8361501a565b91507f48617368206861736e2774206265656e2063616c63756c6174656400000000006000830152602082019050919050565b600061438760198361501a565b91507f4368756e6b20697320616c72656164792075706c6f61646564000000000000006000830152602082019050919050565b60006143c760168361501a565b91507f496e636f7272656374206368756e6b206c656e677468000000000000000000006000830152602082019050919050565b6000614407600f8361501a565b91507f46696c65206e6f742065786973747300000000000000000000000000000000006000830152602082019050919050565b6000614447600e8361501a565b91507f496e76616c69642073656e6465720000000000000000000000000000000000006000830152602082019050919050565b600061448760188361501a565b91507f4469726563746f7279206973206e6f742064656c6574656400000000000000006000830152602082019050919050565b60006144c760108361501a565b91507f46696c65206e6f742064656c65746564000000000000000000000000000000006000830152602082019050919050565b600061450760138361501a565b91507f496e76616c69642073746f7261676550617468000000000000000000000000006000830152602082019050919050565b6000614547600c8361501a565b91507f496e76616c6964207061746800000000000000000000000000000000000000006000830152602082019050919050565b600061458760018361502b565b91507f2e000000000000000000000000000000000000000000000000000000000000006000830152600182019050919050565b60006145c760168361501a565b91507f496e76616c6964206469726563746f7279206e616d65000000000000000000006000830152602082019050919050565b600061460760158361501a565b91507f4368756e6b207761736e27742075706c6f6164656400000000000000000000006000830152602082019050919050565b600061464760268361501a565b91507f436f756c64206e6f742072657365727665206c657373207468616e207573656460008301527f20737061636500000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006146ad60168361501a565b91507f4469726563746f7279206973206e6f7420656d707479000000000000000000006000830152602082019050919050565b60006146ed60238361501a565b91507f46696c65206861736e2774206265656e2075706c6f6164656420636f7272656360008301527f746c7900000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061475360118361501a565b91507f4368756e6b207761736e277420726561640000000000000000000000000000006000830152602082019050919050565b600061479360188361501a565b91507f46696c656e616d652073686f756c64206265203c2032353600000000000000006000830152602082019050919050565b60006147d3601f8361501a565b91507f46696c652073686f756c64206265206c657373207468616e20313030204d42006000830152602082019050919050565b600061481360028361502b565b91507f2e2e0000000000000000000000000000000000000000000000000000000000006000830152600282019050919050565b600061485360118361501a565b91507f4469726563746f72792069732066756c6c0000000000000000000000000000006000830152602082019050919050565b6000614893600e8361501a565b91507f46696c65206e6f7420666f756e640000000000000000000000000000000000006000830152602082019050919050565b60006148d360188361501a565b91507f46696c65206f72206469726563746f72792065786973747300000000000000006000830152602082019050919050565b600061491360198361501a565b91507f4e6f7420656e6f756768207265736572766564207370616365000000000000006000830152602082019050919050565b600061495360188361501a565b91507f45564d206572726f7220696e2067657446696c6553697a6500000000000000006000830152602082019050919050565b600061499360108361501a565b91507f46696c65206e6f742063726561746564000000000000000000000000000000006000830152602082019050919050565b60006149d360198361501a565b91507f46696c65206861736e2774206265656e2075706c6f61646564000000000000006000830152602082019050919050565b600060a0830160008301518482036000860152614a2382826141ea565b9150506020830151614a38602086018261417d565b506040830151614a4b6040860182614a83565b506060830151614a5e606086018261419b565b5060808301518482036080860152614a768282614053565b9150508091505092915050565b614a8c81615091565b82525050565b614a9b81615091565b82525050565b6000614aad8284614223565b915081905092915050565b6000614ac482846141b9565b915081905092915050565b6000614ada8261457a565b9150819050919050565b6000614aef82614806565b9150819050919050565b60006210000082019050614b1060008301846140b1565b92915050565b60006020820190508181036000830152614b308184614108565b905092915050565b6000602082019050614b4d60008301846141aa565b92915050565b60006020820190508181036000830152614b6c81614254565b9050919050565b60006020820190508181036000830152614b8c81614294565b9050919050565b60006020820190508181036000830152614bac816142d4565b9050919050565b60006020820190508181036000830152614bcc8161433a565b9050919050565b60006020820190508181036000830152614bec8161437a565b9050919050565b60006020820190508181036000830152614c0c816143ba565b9050919050565b60006020820190508181036000830152614c2c816143fa565b9050919050565b60006020820190508181036000830152614c4c8161443a565b9050919050565b60006020820190508181036000830152614c6c8161447a565b9050919050565b60006020820190508181036000830152614c8c816144ba565b9050919050565b60006020820190508181036000830152614cac816144fa565b9050919050565b60006020820190508181036000830152614ccc8161453a565b9050919050565b60006020820190508181036000830152614cec816145ba565b9050919050565b60006020820190508181036000830152614d0c816145fa565b9050919050565b60006020820190508181036000830152614d2c8161463a565b9050919050565b60006020820190508181036000830152614d4c816146a0565b9050919050565b60006020820190508181036000830152614d6c816146e0565b9050919050565b60006020820190508181036000830152614d8c81614746565b9050919050565b60006020820190508181036000830152614dac81614786565b9050919050565b60006020820190508181036000830152614dcc816147c6565b9050919050565b60006020820190508181036000830152614dec81614846565b9050919050565b60006020820190508181036000830152614e0c81614886565b9050919050565b60006020820190508181036000830152614e2c816148c6565b9050919050565b60006020820190508181036000830152614e4c81614906565b9050919050565b60006020820190508181036000830152614e6c81614946565b9050919050565b60006020820190508181036000830152614e8c81614986565b9050919050565b60006020820190508181036000830152614eac816149c6565b9050919050565b6000602082019050614ec86000830184614a92565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614ef157600080fd5b8060405250919050565b600067ffffffffffffffff821115614f1257600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614f3e57600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050919050565b6000819050602082019050919050565b600081519050919050565b60006180009050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061504182615071565b9050919050565b60008115159050919050565b6000819050919050565b600081905061506c82615100565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006150a68261505e565b9050919050565b82818337600083830152505050565b60005b838110156150da5780820151818401526020810190506150bf565b838111156150e9576000848401525b50505050565b6000601f19601f8301169050919050565b6003811061510a57fe5b50565b61511681615036565b811461512157600080fd5b50565b61512d81615091565b811461513857600080fd5b5056fea2646970667358221220a549ad9e778ae8bb3048c0a1805e77745871cc1560637ae1c3ebccb76638d9c464736f6c63430006020033", + "nonce": "0", + "storage": {} + }, + "0xa096b05a489831db893fc53aacc7ed20efb36382": { + "balance": "1000000000000000000000000000000" + }, + "0xa1cd651d99283be60e2a9d2e3bc8a90aedb8244f": { + "balance": "1000000000000000000000000000000" + }, + "0xa2969e82619021ea407338f8bdf7c6f2bd679673": { + "balance": "1000000000000000000000000000000" + }, + "0xa3597b1162b6559cb5e966904b63e762ece756a4": { + "balance": "1000000000000000000000000000000" + }, + "0xa68f946090c600eda6f139783077ee802afeb990": { + "balance": "1000000000000000000000000000000" + }, + "0xa6d50055592cecb795bc1ed3b9ea57ed426b0b7c": { + "balance": "1000000000000000000000000000000" + }, + "0xa7c0789bdeee38c6b59111a789dfb6b815489847": { + "balance": "1000000000000000000000000000000" + }, + "0xa8c813ee806b4c8537ff5f16084d44db18ea9ab1": { + "balance": "1000000000000000000000000000000" + }, + "0xaa6a87bbb74bc1f3cb40c1efb7fc171ee6407560": { + "balance": "1000000000000000000000000000000" + }, + "0xabf920b89f5a2487fdb70be17fd01a99a0602e62": { + "balance": "1000000000000000000000000000000" + }, + "0xac5df92da5171ba24a9618018b4f79494040334b": { + "balance": "1000000000000000000000000000000" + }, + "0xaf97a8318a1a51d5daeeb9650024b63ee44f45bd": { + "balance": "1000000000000000000000000000000" + }, + "0xb28c45b98ae43a5e9ee5509c97ea037b5de5d6d9": { + "balance": "1000000000000000000000000000000" + }, + "0xb64989ab32b089da3da103b93e6781d6d5dd10b4": { + "balance": "1000000000000000000000000000000" + }, + "0xb67e6f4a21f93c250fa6ff0cb142bd14dd4ca8eb": { + "balance": "1000000000000000000000000000000" + }, + "0xb70603c505f85130b5b2e73cd82d196dfd7d8b5e": { + "balance": "1000000000000000000000000000000" + }, + "0xb942414cae2a1ab1056657b905845c0ab6b6280a": { + "balance": "1000000000000000000000000000000" + }, + "0xbee0e5c1961d51be9bd670876caa9c90ba7d9016": { + "balance": "1000000000000000000000000000000" + }, + "0xbf2d8cebdeeb8ad8fed7b2a75f35922106f8d75c": { + "balance": "1000000000000000000000000000000" + }, + "0xbf5aa678b969c0871e2fbcf09c3dbb5d5865ac1e": { + "balance": "1000000000000000000000000000000" + }, + "0xc12bcedd9bcad9120150122cd50f39576ecccc08": { + "balance": "1000000000000000000000000000000" + }, + "0xc2d3852f3292acb81bd164dbae5f1e2a87535150": { + "balance": "1000000000000000000000000000000" + }, + "0xc3820490201e94d76b44655d2df713fec29d9795": { + "balance": "1000000000000000000000000000000" + }, + "0xc58744e2eceefd45cc5469f0e0a708ad24ddbbdb": { + "balance": "1000000000000000000000000000000" + }, + "0xc7865200e8e51ba1c8d695f327deed432930f2cc": { + "balance": "1000000000000000000000000000000" + }, + "0xc8e4d709eb3eb335dc69c9fbf2d24d447cb86105": { + "balance": "1000000000000000000000000000000" + }, + "0xc98af661e44c5bf31d2f8bdff4bbf2808ed4e991": { + "balance": "1000000000000000000000000000000" + }, + "0xca4409573a5129a72edf85d6c51e26760fc9c903": { + "balance": "100000000000000000000000" + }, + "0xcc33e23b04b74f7ba8fbe315083182224af973fa": { + "balance": "1000000000000000000000000000000" + }, + "0xce1c62d0a77600fb2f959b4da76fcb9b3b9430a3": { + "balance": "1000000000000000000000000000000" + }, + "0xd1b6c947fb14060b38945584714491592e84875d": { + "balance": "1000000000000000000000000000000" + }, + "0xd23cd6a9ddcc3470300003621bbac1e06a7919d5": { + "balance": "1000000000000000000000000000000" + }, + "0xd2c5b39B4e735C17612Bb5a08FD024ccc5dBCb23": { + "balance": "100000000000000000000000" + }, + "0xd2cd302eb060e375a65d65946692a3ac2d838d35": { + "balance": "1000000000000000000000000000000" + }, + "0xd2e75c41ced8699e3176f6e335355701a2568b7b": { + "balance": "1000000000000000000000000000000" + }, + "0xd3d38f4cb0aeb4c7c2527ddaeec2ab3b910c8528": { + "balance": "1000000000000000000000000000000" + }, + "0xd5b561a27cca5049650a14ab93dbf1a20c0cefc1": { + "balance": "1000000000000000000000000000000" + }, + "0xd90045420b8abc37b3f9304ed2b385fc1b7fa8c5": { + "balance": "1000000000000000000000000000000" + }, + "0xd951bf4cff429062702a7d8699a5f0bf14845d9b": { + "balance": "1000000000000000000000000000000" + }, + "0xdc6a269c58e58a93a22b5df8cdf1af630c47481f": { + "balance": "1000000000000000000000000000000" + }, + "0xdc6d02ef4003a4f2d0ccff65ae1a2d8157fbb23e": { + "balance": "1000000000000000000000000000000" + }, + "0xde14aca36acc62c305a7ee571da37840a408e600": { + "balance": "1000000000000000000000000000000" + }, + "0xdee32ae508cf783f53ab8bc39d878fe323cdfae3": { + "balance": "1000000000000000000000000000000" + }, + "0xe083a100d51fc4f38aae4a3a68404c36ad96c612": { + "balance": "1000000000000000000000000000000" + }, + "0xe1607990ce800407e3c206e58de4917977181d4d": { + "balance": "1000000000000000000000000000000" + }, + "0xe25e5b63dfd4cf59b81eddf64f1195858634b8a6": { + "balance": "1000000000000000000000000000000" + }, + "0xe372377decb3bdc0c7f5272d38ce0ba2a54934fe": { + "balance": "1000000000000000000000000000000" + }, + "0xe3cc6ec63b5652d1594bc63bb293f4e80f76dbdd": { + "balance": "1000000000000000000000000000000" + }, + "0xe3da7c014286258944ab20a31e4d861b4c9262f1": { + "balance": "1000000000000000000000000000000" + }, + "0xe8b57f330d56081c856e618210fbedb414925ff0": { + "balance": "1000000000000000000000000000000" + }, + "0xe91ac72a568e752eb7c9f5235100586ce97c8cc1": { + "balance": "1000000000000000000000000000000" + }, + "0xf184c8c243a178c1748a0af45caedeca476105b4": { + "balance": "1000000000000000000000000000000" + }, + "0xf1a5912ff318aebf312cdb54c75642a9e632703c": { + "balance": "1000000000000000000000000000000" + }, + "0xf2197b153b4c9086fc5410431fbf7960d284c65e": { + "balance": "1000000000000000000000000000000" + }, + "0xf36620e71327f4a55d550d46e030ccf0c728f154": { + "balance": "1000000000000000000000000000000" + }, + "0xf9817fB82fc767aA9A4A97a1901676244b88ce0E": { + "balance": "100000000000000000000000" + }, + "0xfa723938fa8da1a8a2114ad409a11581761ee40d": { + "balance": "1000000000000000000000000000000" + }, + "0xfa7a8c69810eaf16a395d2a93b3ab51efeed2a1c": { + "balance": "1000000000000000000000000000000" + }, + "0xfaa1038074941571524934ba52d312e88b3577f5": { + "balance": "1000000000000000000000000000000" + }, + "0xfe14077c26a507496b7208384d459e21c49c4212": { + "balance": "1000000000000000000000000000000" + }, + "0xfe275c9b5ac792327da509b27eb9614196dfb07d": { + "balance": "1000000000000000000000000000000" + }, + "0xfe2c5aa110fff89361806ea7ee080bfffba0d3dd": { + "balance": "1000000000000000000000000000000" + }, + "0xfe3d4f1fc038f4f756ba44995129cd45c9e0e861": { + "balance": "1000000000000000000000000000000" + }, + "0xfee314cdc84ecfaa675e41b3559c0101e1eba6b8": { + "balance": "1000000000000000000000000000000" + } + }, + "genesis": { + "author": "0x0000000000000000000000000000000000000001", + "difficulty": "0x0", + "extraData": "0x11bbe8db4e347b4e8c937c1c8370e4b5ed33adb3db69cbdb7a38e1e50b1b82fa", + "gasLimit": "0xFFFFFFFFF", + "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000abc", + "nonce": "0x0000000000000042", + "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "timestamp": "0x00" + }, + "params": { + "EIP150ForkBlock": "0x00", + "EIP158ForkBlock": "0x00", + "accountStartNonce": "0x00", + "blockReward": "0x4563918244F40000", + "byzantiumForkBlock": "0x0", + "chainID": "0x12345", + "constantinopleForkBlock": "0x0", + "daoHardforkBlock": "0x0", + "difficultyBoundDivisor": "0x0800", + "durationLimit": "0x0d", + "externalGasDifficulty": "0x01", + "gasLimitBoundDivisor": "0x0400", + "homesteadForkBlock": "0x0", + "maxGasLimit": "0xFFFFFFFFF", + "maximumExtraDataSize": "0x20", + "minGasLimit": "0xFFFFFFFFF", + "minimumDifficulty": "0x0", + "networkID": "12313219", + "tieBreakingGas": false + }, + "sealEngine": "Ethash", + "skaleConfig": { + "nodeInfo": { + "basePort": 1831, + "bindIP": "0.0.0.0", + "collectionDuration": 10, + "collectionQueueSize": 2, + "db-path": "/tmp/test_eth_7_of_16", + "ecdsaKeyName": "", + "httpRpcPort": 1834, + "httpsRpcPort": 1239, + "logLevel": "info", + "logLevelProposal": "info", + "maxCacheSize": 2000, + "maxOpenLeveldbFiles": 25, + "minCacheSize": 1000, + "nodeID": 1607, + "nodeName": "Node1", + "rotateAfterBlock": 0, + "testSignatures": true, + "transactionQueueSize": 10000, + "wsRpcPort": 1833, + "wssRpcPort": 1838 + }, + "sChain": { + "EIP1559TransactionsPatchTimestamp": 1, + "contractStorageLimit": 10000000000, + "contractStoragePatchTimestamp": 1, + "contractStorageZeroValuePatchTimestamp": 1, + "correctForkInPowPatchTimestamp": 1, + "emptyBlockIntervalMs": 10000, + "fastConsensusPatchTimestamp": 1, + "flexibleDeploymentPatchTimestamp": 1, + "levelDBReopenIntervalMs": 1, + "multiTransactionMode": false, + "nodes": [ + { + "basePort": 1231, + "ip": "127.0.0.1", + "nodeID": 1601, + "publicKey": "", + "schainIndex": 1 + }, + { + "basePort": 1331, + "ip": "127.0.0.1", + "nodeID": 1602, + "publicKey": "", + "schainIndex": 2 + }, + { + "basePort": 1431, + "ip": "127.0.0.1", + "nodeID": 1603, + "publicKey": "", + "schainIndex": 3 + }, + { + "basePort": 1531, + "ip": "127.0.0.1", + "nodeID": 1604, + "publicKey": "", + "schainIndex": 4 + }, + { + "basePort": 1631, + "ip": "127.0.0.1", + "nodeID": 1605, + "publicKey": "", + "schainIndex": 5 + }, + { + "basePort": 1731, + "ip": "127.0.0.1", + "nodeID": 1606, + "publicKey": "", + "schainIndex": 6 + }, + { + "basePort": 1831, + "ip": "127.0.0.1", + "nodeID": 1607, + "publicKey": "", + "schainIndex": 7 + }, + { + "basePort": 1931, + "ip": "127.0.0.1", + "nodeID": 1608, + "publicKey": "", + "schainIndex": 8 + }, + { + "basePort": 2031, + "ip": "127.0.0.1", + "nodeID": 1609, + "publicKey": "", + "schainIndex": 9 + }, + { + "basePort": 2131, + "ip": "127.0.0.1", + "nodeID": 1610, + "publicKey": "", + "schainIndex": 10 + }, + { + "basePort": 2231, + "ip": "127.0.0.1", + "nodeID": 1611, + "publicKey": "", + "schainIndex": 11 + }, + { + "basePort": 2331, + "ip": "127.0.0.1", + "nodeID": 1612, + "publicKey": "", + "schainIndex": 12 + }, + { + "basePort": 2431, + "ip": "127.0.0.1", + "nodeID": 1613, + "publicKey": "", + "schainIndex": 13 + }, + { + "basePort": 2531, + "ip": "127.0.0.1", + "nodeID": 1614, + "publicKey": "", + "schainIndex": 14 + }, + { + "basePort": 2631, + "ip": "127.0.0.1", + "nodeID": 1615, + "publicKey": "", + "schainIndex": 15 + }, + { + "basePort": 2731, + "ip": "127.0.0.1", + "nodeID": 1616, + "publicKey": "", + "schainIndex": 16 + } + ], + "powCheckPatchTimestamp": 1, + "precompiledConfigPatchTimestamp": 1, + "pushZeroPatchTimestamp": 1, + "revertableFSPatchTimestamp": 1, + "schainID": 5, + "schainName": "TestChain", + "schainOwner": "0x907cd0881E50d359bb9Fd120B1A5A143b1C97De6", + "skipInvalidTransactionsPatchTimestamp": 1, + "storageDestructionPatchTimestamp": 1, + "verifyBlsSyncPatchTimestamp": 1, + "verifyDaSigsPatchTimestamp": 1 + } + }, + "unddos": { + "origins": [ + { + "ban_lengthy": 0, + "ban_peak": 0, + "max_calls_per_minute": 1000000000, + "max_calls_per_second": 1000000000, + "max_ws_conn": 65535, + "origin": [ + "*" + ] + } + ] + } +} \ No newline at end of file diff --git a/test/historicstate/configs/test_8_of_16.json b/test/historicstate/configs/test_8_of_16.json new file mode 100644 index 000000000..71c02ae35 --- /dev/null +++ b/test/historicstate/configs/test_8_of_16.json @@ -0,0 +1,910 @@ +{ + "accounts": { + "0000000000000000000000000000000000000001": { + "precompiled": { + "linear": { + "base": 3000, + "word": 0 + }, + "name": "ecrecover" + } + }, + "0000000000000000000000000000000000000002": { + "precompiled": { + "linear": { + "base": 60, + "word": 12 + }, + "name": "sha256" + } + }, + "0000000000000000000000000000000000000003": { + "precompiled": { + "linear": { + "base": 600, + "word": 120 + }, + "name": "ripemd160" + } + }, + "0000000000000000000000000000000000000004": { + "precompiled": { + "linear": { + "base": 15, + "word": 3 + }, + "name": "identity" + } + }, + "0000000000000000000000000000000000000005": { + "precompiled": { + "name": "modexp", + "startingBlock": "0x2dc6c0" + } + }, + "0000000000000000000000000000000000000006": { + "precompiled": { + "linear": { + "base": 500, + "word": 0 + }, + "name": "alt_bn128_G1_add", + "startingBlock": "0x2dc6c0" + } + }, + "0000000000000000000000000000000000000007": { + "precompiled": { + "linear": { + "base": 40000, + "word": 0 + }, + "name": "alt_bn128_G1_mul", + "startingBlock": "0x2dc6c0" + } + }, + "0000000000000000000000000000000000000008": { + "precompiled": { + "name": "alt_bn128_pairing_product", + "startingBlock": "0x2dc6c0" + } + }, + "000000000000000000000000000000000000000A": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "readChunk", + "startingBlock": "0x0" + } + }, + "000000000000000000000000000000000000000B": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "createFile", + "restrictAccess": [ + "69362535ec535F0643cBf62D16aDeDCAf32Ee6F7" + ], + "startingBlock": "0x0" + } + }, + "000000000000000000000000000000000000000C": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "uploadChunk", + "startingBlock": "0x0" + } + }, + "000000000000000000000000000000000000000D": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "getFileSize", + "startingBlock": "0x0" + } + }, + "000000000000000000000000000000000000000E": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "deleteFile", + "startingBlock": "0x0" + } + }, + "000000000000000000000000000000000000000F": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "createDirectory", + "startingBlock": "0x0" + } + }, + "0000000000000000000000000000000000000010": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "deleteDirectory", + "startingBlock": "0x0" + } + }, + "0x006d8e49ce0b9eb5646e34a4d91934801b9044fd": { + "balance": "1000000000000000000000000000000" + }, + "0x0150b461b06922a5030784ba888962c28bb1f188": { + "balance": "1000000000000000000000000000000" + }, + "0x03309956988ae70152ae4469daf99b0cac2306c5": { + "balance": "1000000000000000000000000000000" + }, + "0x06104a85a380895b6dd4030113806df2b044905e": { + "balance": "1000000000000000000000000000000" + }, + "0x079cf317ef40b16141784b6fabff812d64f7c0fd": { + "balance": "1000000000000000000000000000000" + }, + "0x0966454f51166c68b73b2865473c8fb2fcdefdd5": { + "balance": "1000000000000000000000000000000" + }, + "0x099452fedc71897880f584b1bc1706efc4e76e36": { + "balance": "1000000000000000000000000000000" + }, + "0x0aa6a44690ef52354e976990292cf9c5cd36ad59": { + "balance": "1000000000000000000000000000000" + }, + "0x0fbbe17a0e5a61ee3e8661f442d7f6b177c49820": { + "balance": "1000000000000000000000000000000" + }, + "0x1239fe658b410dbbac5bbd572035f5041542f9e5": { + "balance": "1000000000000000000000000000000" + }, + "0x12d5d7340a93be7be28ea7a3ae198242f8e1282c": { + "balance": "1000000000000000000000000000000" + }, + "0x137048b9fa4f1234d6519271b2c5ec64f480db0f": { + "balance": "1000000000000000000000000000000" + }, + "0x13867af77a63048e17380e39248ada90521e97e4": { + "balance": "1000000000000000000000000000000" + }, + "0x138ea4bdf0382c2deffd5b0bff0afe59f471467f": { + "balance": "1000000000000000000000000000000" + }, + "0x13d19c55ee0a212249d26b9d741ff6d7f416db01": { + "balance": "1000000000000000000000000000000" + }, + "0x157d38b52196b248e9fe6a2172e32ce2b8c078e6": { + "balance": "1000000000000000000000000000000" + }, + "0x16e8c390f8e576161cfe966f2c3e5dd303eb9039": { + "balance": "1000000000000000000000000000000" + }, + "0x194cb9991d3d94c43e400becf21dfea45e7b3b4c": { + "balance": "1000000000000000000000000000000" + }, + "0x1C9abe4ff0CcECa40fc404c74AB7d4923fEF8901": { + "balance": "100000000000000000000000" + }, + "0x1a66fc89809112c20aa76a993db712fa9e003e4e": { + "balance": "1000000000000000000000000000000" + }, + "0x1f1d6041e12a18cf1202019f146f2fc150915e8d": { + "balance": "1000000000000000000000000000000" + }, + "0x1feaf1671c1f0faf0d44c152f72dc755db932569": { + "balance": "1000000000000000000000000000000" + }, + "0x236bf02dfafaf03851a4e6f5d69052f4884cec32": { + "balance": "1000000000000000000000000000000" + }, + "0x26d88f6a8b659be4165ee53774a057e41b5201c9": { + "balance": "1000000000000000000000000000000" + }, + "0x28353685b0b986a724b92113debb3d8cd9a6b263": { + "balance": "1000000000000000000000000000000" + }, + "0x29d83322219fdfb821459d5fdf796360faf3166a": { + "balance": "1000000000000000000000000000000" + }, + "0x2bee474be207bdbeac83d6672da5ed2fd417eac9": { + "balance": "1000000000000000000000000000000" + }, + "0x2d93455b07bccf38e8d019f7f43a2c2d70b46b4e": { + "balance": "1000000000000000000000000000000" + }, + "0x2f971bd38806c3ca45ae0a125d1267118bf5619c": { + "balance": "1000000000000000000000000000000" + }, + "0x30aaab366dfac8331f3e827495c789cde9b437c0": { + "balance": "1000000000000000000000000000000" + }, + "0x32ea0400dc2d20664cc4744b2fab04ecb709445c": { + "balance": "1000000000000000000000000000000" + }, + "0x3760dc9594ccac0f33ade5cc5371402131696341": { + "balance": "1000000000000000000000000000000" + }, + "0x38855e430611bc179cd777a8704679ffc43921de": { + "balance": "1000000000000000000000000000000" + }, + "0x3a921471a2397644c37c88ef9572c421ab37145d": { + "balance": "1000000000000000000000000000000" + }, + "0x3bcca8a8471d55a1a668bc163c0336e4a57e5c99": { + "balance": "1000000000000000000000000000000" + }, + "0x3d46ee560227c1d73cd6042b47fc8fddd8a06ecb": { + "balance": "1000000000000000000000000000000" + }, + "0x3f5bdf5d4c274c82b8d17aa2810b00d2cf050f24": { + "balance": "1000000000000000000000000000000" + }, + "0x3ffe1c9183e0f97f52a816405a7d2350624ec88b": { + "balance": "1000000000000000000000000000000" + }, + "0x426ec5f07847674aada3856609d8baaa16805d88": { + "balance": "1000000000000000000000000000000" + }, + "0x482d7f53cba6ae73a354533673c48e2dfd560949": { + "balance": "1000000000000000000000000000000" + }, + "0x48acbd6a2724eadcc2a11144ab84b6a617d1a241": { + "balance": "1000000000000000000000000000000" + }, + "0x49ef89840e400026eb5c8d79bd1b0adc152fe86d": { + "balance": "1000000000000000000000000000000" + }, + "0x4bf989fa6572af36b190032505506f1db888357f": { + "balance": "1000000000000000000000000000000" + }, + "0x4cf9b195f7cb5f86694d9b399fe21a5f34616fd3": { + "balance": "1000000000000000000000000000000" + }, + "0x4e9b85904bca60aeb5b916ca86ac622096908427": { + "balance": "1000000000000000000000000000000" + }, + "0x50120c17d7b59200e9b76e89e4e3de2f0cd00090": { + "balance": "1000000000000000000000000000000" + }, + "0x54db355342c35085a1a53184162b2fddd0a43b0f": { + "balance": "1000000000000000000000000000000" + }, + "0x54e228d8fea148cfe2b109b3b152ff21321d09a2": { + "balance": "1000000000000000000000000000000" + }, + "0x5667601b7dcde6f24d06bccc4f291cb06976f4ee": { + "balance": "1000000000000000000000000000000" + }, + "0x57829f2ecca390cd9d1c41f92328bad4d1073bbb": { + "balance": "1000000000000000000000000000000" + }, + "0x5EF25557E2ed6AFfF321B266C93e95A0B4B05AbC": { + "balance": "1000000000000000000000000" + }, + "0x5a3adad4382b3eb1e0c65f2de2845901081039b5": { + "balance": "1000000000000000000000000000000" + }, + "0x5cdb7392efdce502ccc6fba5c3c1dd1653967b4d": { + "balance": "1000000000000000000000000000000" + }, + "0x5d012c13b2854bda8b7b6580e97e52751884f827": { + "balance": "1000000000000000000000000000000" + }, + "0x5d9326c6504833d84f8a0d65ded59b1a6e768ca2": { + "balance": "1000000000000000000000000000000" + }, + "0x60268f799d8f1808e4a32c2eb898e73a8881f6f0": { + "balance": "1000000000000000000000000000000" + }, + "0x605ba4a05d779f9869bd9a10234c22f516766cfe": { + "balance": "1000000000000000000000000000000" + }, + "0x6093f0f2a7b5148b71603ac439adbc4c0e5aa5da": { + "balance": "1000000000000000000000000000000" + }, + "0x6196d135CdDb9d73A0756C1E44b5b02B11acf594": { + "balance": "2000000000000000000000", + "code": "", + "nonce": "5076", + "storage": {} + }, + "0x62712ceccb50f62ca4c5402fff6da9c819c866cf": { + "balance": "1000000000000000000000000000000" + }, + "0x62971de462ea1ec0d3b43a6a85b6fb975e6c6f64": { + "balance": "1000000000000000000000000000000" + }, + "0x62cf32dfb9eb6358dc5deb006aef1d75fb153e5f": { + "balance": "1000000000000000000000000000000" + }, + "0x62d8b22c1d71577829b2fee20a5c3fff43aed0ec": { + "balance": "100000000000000000000000" + }, + "0x6314956b78bb2eaed1c49b3ae71d4d0ec501cfab": { + "balance": "1000000000000000000000000000000" + }, + "0x661bda4daeba3ce9ac2aa30b80d463580f90d31a": { + "balance": "1000000000000000000000000000000" + }, + "0x66c5a87f4a49DD75e970055A265E8dd5C3F8f852": { + "balance": "1000000000000000000000" + }, + "0x66cd465ddcd85504c0d2cfb1728acee994d55a3f": { + "balance": "1000000000000000000000000000000" + }, + "0x68bca79ae7aae796027ff843d2303444da5cf5d8": { + "balance": "1000000000000000000000000000000" + }, + "0x6923877b65e24966efa9efd1207822fa2eaf601a": { + "balance": "1000000000000000000000000000000" + }, + "0x69362535ec535F0643cBf62D16aDeDCAf32Ee6F7": { + "balance": "0", + "code": "0x608060405234801561001057600080fd5b50600436106100b45760003560e01c806379210e8e1161007157806379210e8e1461017757806381a8235a146101a757806385aeeb17146101c35780639a9a5593146101f3578063a99100541461020f578063b57321221461022b576100b4565b806307c6e7d3146100b9578063122f4fba146100d55780631c6ec7a9146101055780631cfe4e3b14610121578063373dedb41461013d57806361e46db51461015b575b600080fd5b6100d360048036036100ce9190810190613cff565b61025b565b005b6100ef60048036036100ea9190810190613cff565b610804565b6040516100fc9190614963565b60405180910390f35b61011f600480360361011a9190810190613cff565b610b43565b005b61013b60048036036101369190810190613cc3565b610f72565b005b610145611190565b6040516101529190614cbe565b60405180910390f35b61017560048036036101709190810190613d94565b611199565b005b610191600480360361018c9190810190613e13565b6113f9565b60405161019e9190614924565b60405180910390f35b6101c160048036036101bc9190810190613cff565b6116f9565b005b6101dd60048036036101d89190810190613cff565b61189e565b6040516101ea9190614941565b60405180910390f35b61020d60048036036102089190810190613d40565b611b9d565b005b61022960048036036102249190810190613cff565b61202c565b005b61024560048036036102409190810190613cff565b612682565b6040516102529190614cbe565b60405180910390f35b6000339050606061026b83612902565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b825181101561037c576000826001018460018403815181106102d557fe5b60200260200101516040516102ea91906148cc565b90815260200160405180910390205411610339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161033090614ade565b60405180910390fd5b8160020183600183038151811061034c57fe5b602002602001015160405161036191906148cc565b908152602001604051809103902091508060010190506102b7565b506060600183511161038e57846103a7565b8260018451038151811061039e57fe5b60200260200101515b9050600082600101826040516103bd91906148e3565b9081526020016040518091039020541161040c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161040390614ade565b60405180910390fd5b6000826002018260405161042091906148e3565b90815260200160405180910390206000018054905014610475576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161046c90614b5e565b60405180910390fd5b60006104818587612b02565b9050806104c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ba90614a7e565b60405180910390fd5b6104cb613888565b836000016001856000018054905003815481106104e457fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156105965780601f1061056b57610100808354040283529160200191610596565b820191906000526020600020905b81548152906001019060200180831161057957829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff1660028111156105e257fe5b60028111156105ed57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561066557602002820191906000526020600020906000905b82829054906101000a900460ff1615158152602001906001019060208260000104928301926001038202915080841161062f5790505b505050505081525050905080846000016001866001018660405161068991906148e3565b90815260200160405180910390205403815481106106a357fe5b906000526020600020906005020160008201518160000190805190602001906106cd9291906138c4565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561071c57fe5b0217905550608082015181600401908051906020019061073d929190613944565b50905050836001018360405161075391906148e3565b90815260200160405180910390205484600101826000015160405161077891906148cc565b9081526020016040518091039020819055506000846001018460405161079e91906148e3565b908152602001604051809103902081905550836000018054809190600190036107c791906139ea565b5083600201836040516107da91906148e3565b9081526020016040518091039020600080820160006107f99190613a1c565b505050505050505050565b600080606061081284612b66565b91509150606061082182612902565b90506000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b82518110156109065760008260010184600184038151811061088b57fe5b60200260200101516040516108a091906148cc565b90815260200160405180910390205414156108c357600095505050505050610b3e565b816002018360018303815181106108d657fe5b60200260200101516040516108eb91906148cc565b9081526020016040518091039020915080600101905061086d565b50606060018351116109185783610931565b8260018451038151811061092857fe5b60200260200101515b90506000826001018260405161094791906148e3565b908152602001604051809103902054141561096a57600095505050505050610b3e565b610972613888565b826000016001846001018460405161098a91906148e3565b90815260200160405180910390205403815481106109a457fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610a565780601f10610a2b57610100808354040283529160200191610a56565b820191906000526020600020905b815481529060010190602001808311610a3957829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115610aa257fe5b6002811115610aad57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015610b2557602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411610aef5790505b5050505050815250509050806060015196505050505050505b919050565b600160009054906101000a900460ff16610b85576120006002819055506210000060038190555060018060006101000a81548160ff0219169083151502179055505b6000815111610bc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc090614ade565b60405180910390fd5b60003390506060610bd983612902565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015610cea57600082600101846001840381518110610c4357fe5b6020026020010151604051610c5891906148cc565b90815260200160405180910390205411610ca7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9e90614ade565b60405180910390fd5b81600201836001830381518110610cba57fe5b6020026020010151604051610ccf91906148cc565b90815260200160405180910390209150806001019050610c25565b50600254816000018054905010610d36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2d90614bfe565b60405180910390fd5b60606001835111610d475784610d60565b82600184510381518110610d5757fe5b60200260200101515b905060008260010182604051610d7691906148e3565b90815260200160405180910390205414610dc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbc90614c3e565b60405180910390fd5b610dce81612ee8565b610e0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0490614afe565b60405180910390fd5b6000610e198587612fc9565b905080610e5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e529061499e565b60405180910390fd5b610e63613888565b82816000018190525060008160200190151590811515815250508360000181908060018154018082558091505090600182039060005260206000209060050201600090919290919091506000820151816000019080519060200190610ec99291906138c4565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff02191690836002811115610f1857fe5b02179055506080820151816004019080519060200190610f39929190613944565b5050505083600001805490508460010184604051610f5791906148e3565b90815260200160405180910390208190555050505050505050565b610f7a61302d565b73ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161480610fdf57503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614155b61101e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101590614a5e565b60405180910390fd5b80600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411156110a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109790614b3e565b60405180910390fd5b600054600754820111156110e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e0906149be565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460076000828254039250508190555080600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550806007600082825401925050819055505050565b60008054905090565b600033905060006111aa82866130c6565b9050600160028111156111b957fe5b8160030160009054906101000a900460ff1660028111156111d657fe5b14611216576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120d90614c1e565b60405180910390fd5b6000600354858161122357fe5b061480156112345750806002015484105b611273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126a9061497e565b60405180910390fd5b600354848260020154031080156112905750838160020154038351145b8061129d57506003548351145b6112dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d390614a1e565b60405180910390fd5b600015158160040160035486816112ef57fe5b04815481106112fa57fe5b90600052602060002090602091828204019190069054906101000a900460ff1615151461135c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611353906149fe565b60405180910390fd5b600061136a838787876132c5565b9050806113ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a390614b1e565b60405180910390fd5b60018260040160035487816113bd57fe5b04815481106113c857fe5b90600052602060002090602091828204019190066101000a81548160ff021916908315150217905550505050505050565b611401613a40565b6000606061140e86612b66565b9150915061141a613888565b61142483836130c6565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156114c85780601f1061149d576101008083540402835291602001916114c8565b820191906000526020600020905b8154815290600101906020018083116114ab57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561151457fe5b600281111561151f57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561159757602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116115615790505b50505050508152505090506002808111156115ae57fe5b816060015160028111156115be57fe5b146115fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f590614c9e565b60405180910390fd5b60035485111580156116105750600085115b61164f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164690614a1e565b60405180910390fd5b80604001518587011115611698576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168f9061497e565b60405180910390fd5b60006116a684848989613376565b8096508192505050806116ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e590614b9e565b60405180910390fd5b505050509392505050565b6000339050600061170a82846130c6565b90506001600281111561171957fe5b8160030160009054906101000a900460ff16600281111561173657fe5b14611776576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176d90614c1e565b60405180910390fd5b60006001905060008260040180549050905060008090505b818110156117e157600015158460040182815481106117a957fe5b90600052602060002090602091828204019190069054906101000a900460ff16151514156117d657600092505b80600101905061178e565b5081611822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181990614b7e565b60405180910390fd5b60028360030160006101000a81548160ff0219169083600281111561184357fe5b021790555060006118548587613409565b905080611896576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188d906149de565b60405180910390fd5b505050505050565b6060600060606118ad84612b66565b9150915060606118bc82612902565b90506000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008090505b82518110156119c65760008260010184838151811061192257fe5b602002602001015160405161193791906148cc565b90815260200160405180910390205411611986576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197d90614ade565b60405180910390fd5b8160020183828151811061199657fe5b60200260200101516040516119ab91906148cc565b90815260200160405180910390209150806001019050611907565b5080600001805480602002602001604051908101604052809291908181526020016000905b82821015611b8e57838290600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611aa75780601f10611a7c57610100808354040283529160200191611aa7565b820191906000526020600020905b815481529060010190602001808311611a8a57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115611af357fe5b6002811115611afe57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015611b7657602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411611b405790505b505050505081525050815260200190600101906119eb565b50505050945050505050919050565b600160009054906101000a900460ff16611bdf576120006002819055506210000060038190555060018060006101000a81548160ff0219169083151502179055505b60003390506305f5e100821115611c2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2290614bde565b60405180910390fd5b6060611c3684612902565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015611d4757600082600101846001840381518110611ca057fe5b6020026020010151604051611cb591906148cc565b90815260200160405180910390205411611d04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cfb90614ade565b60405180910390fd5b81600201836001830381518110611d1757fe5b6020026020010151604051611d2c91906148cc565b90815260200160405180910390209150806001019050611c82565b5060606001835111611d595785611d72565b82600184510381518110611d6957fe5b60200260200101515b905060008260010182604051611d8891906148e3565b90815260200160405180910390205414611dd7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dce90614c3e565b60405180910390fd5b611de081612ee8565b611e1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1690614bbe565b60405180910390fd5b6000611e2c85888861346d565b905080611e6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6590614c7e565b60405180910390fd5b6060600354600160035489010381611e8257fe5b04604051908082528060200260200182016040528015611eb15781602001602082028038833980820191505090505b509050836000016040518060a0016040528085815260200160011515815260200189815260200160016002811115611ee557fe5b815260200183815250908060018154018082558091505090600182039060005260206000209060050201600090919290919091506000820151816000019080519060200190611f359291906138c4565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff02191690836002811115611f8457fe5b02179055506080820151816004019080519060200190611fa5929190613944565b5050505083600001805490508460010184604051611fc391906148e3565b90815260200160405180910390208190555086600560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505050505050505050565b6000339050612039613888565b61204382846130c6565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156120e75780601f106120bc576101008083540402835291602001916120e7565b820191906000526020600020905b8154815290600101906020018083116120ca57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561213357fe5b600281111561213e57fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156121b657602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116121805790505b5050505050815250509050600060028111156121ce57fe5b816060015160028111156121de57fe5b141561221f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221690614a3e565b60405180910390fd5b600061222b83856134da565b90508061226d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226490614a9e565b60405180910390fd5b606061227885612902565b90506000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b825181101561231057816002018360018303815181106122e057fe5b60200260200101516040516122f591906148cc565b908152602001604051809103902091508060010190506122c4565b506000600182600101866000015160405161232b91906148cc565b908152602001604051809103902054039050612345613888565b8260000160018460000180549050038154811061235e57fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156124105780601f106123e557610100808354040283529160200191612410565b820191906000526020600020905b8154815290600101906020018083116123f357829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561245c57fe5b600281111561246757fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156124df57602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116124a95790505b5050505050815250509050808360000183815481106124fa57fe5b906000526020600020906005020160008201518160000190805190602001906125249291906138c4565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561257357fe5b02179055506080820151816004019080519060200190612594929190613944565b50905050826000018054809190600190036125af91906139ea565b508260010186600001516040516125c691906148cc565b9081526020016040518091039020548360010182600001516040516125eb91906148cc565b908152602001604051809103902081905550600083600101876000015160405161261591906148cc565b9081526020016040518091039020819055508560400151600560008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505050505050505050565b600080606061269084612b66565b9150915061269c613888565b6126a683836130c6565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561274a5780601f1061271f5761010080835404028352916020019161274a565b820191906000526020600020905b81548152906001019060200180831161272d57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561279657fe5b60028111156127a157fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561281957602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116127e35790505b50505050508152505090506001600281111561283157fe5b8160600151600281111561284157fe5b1480612866575060028081111561285457fe5b8160600151600281111561286457fe5b145b6128a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161289c90614c1e565b60405180910390fd5b60006128b1848461353e565b8096508192505050806128f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128f090614c5e565b60405180910390fd5b50505050919050565b606061290c613a65565b612915836135a7565b905061291f613a65565b61295d6040518060400160405280600181526020017f2f000000000000000000000000000000000000000000000000000000000000008152506135a7565b90506060600161297683856135d590919063ffffffff16565b016040519080825280602002602001820160405280156129aa57816020015b60608152602001906001900390816129955790505b50905060008090505b81518110156129fb576129d76129d2848661364a90919063ffffffff16565b613664565b8282815181106129e357fe5b602002602001018190525080806001019150506129b3565b50600081600183510381518110612a0e57fe5b6020026020010151511415612a795780600182510381518110612a2d57fe5b6020026020010160608152506001815103604051908082528060200260200182016040528015612a7157816020015b6060815260200190600190039081612a5c5790505b509350612ab2565b8051604051908082528060200260200182016040528015612aae57816020015b6060815260200190600190039081612a995790505b5093505b60008090505b8451811015612af957818181518110612acd57fe5b6020026020010151858281518110612ae157fe5b60200260200101819052508080600101915050612ab8565b50505050919050565b60008060016020601f85510181612b1557fe5b040190506040518481526020810160005b83811015612b47578060200286015181602002830152806001019050612b26565b50602082602085026040018460006010600019f1935050505092915050565b6000606060006028905080845111612bb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612baa90614abe565b60405180910390fd5b6060816040519080825280601f01601f191660200182016040528015612be85781602001600182028038833980820191505090505b50905060008090505b82811015612c5857858181518110612c0557fe5b602001015160f81c60f81b828281518110612c1c57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050612bf1565b50600080905060008090505b83811015612d87576000838281518110612c7a57fe5b602001015160f81c60f81b60f81c60ff16905060308110158015612c9f575060398111155b80612cb8575060418110158015612cb75750605a8111155b5b80612cd1575060618110158015612cd0575060668111155b5b612d10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d0790614abe565b60405180910390fd5b60308110158015612d22575060398111155b15612d335760308103601084020192505b60418110158015612d455750605a8111155b15612d565760378103601084020192505b60618110158015612d68575060668111155b15612d795760578103601084020192505b508080600101915050612c64565b508094507f2f00000000000000000000000000000000000000000000000000000000000000868481518110612db857fe5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612e25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e1c90614abe565b60405180910390fd5b6000600184885103039050806040519080825280601f01601f191660200182016040528015612e635781602001600182028038833980820191505090505b50945060008090505b81811015612ede5760008860018784010181518110612e8757fe5b602001015160f81c60f81b905080878381518110612ea157fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350508080600101915050612e6c565b5050505050915091565b6000604051602001612ef99061490f565b6040516020818303038152906040528051906020012082604051602001612f2091906148e3565b604051602081830303815290604052805190602001201480612f8b5750604051602001612f4c906148fa565b6040516020818303038152906040528051906020012082604051602001612f7391906148e3565b60405160208183030381529060405280519060200120145b80612f97575060008251145b15612fa55760009050612fc4565b60008251905060ff811115612fbe576000915050612fc4565b60019150505b919050565b60008060016020601f85510181612fdc57fe5b040190506040518481526020810160005b8381101561300e578060200286015181602002830152806001019050612fed565b5060208260208502604001846000600f600019f1935050505092915050565b600073d2001000000000000000000000000000000000d273ffffffffffffffffffffffffffffffffffffffff166383e781fe6040518163ffffffff1660e01b815260040160206040518083038186803b15801561308957600080fd5b505afa15801561309d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506130c19190810190613c9a565b905090565b600060606130d383612902565b90506000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b82518110156131e45760008260010184600184038151811061313d57fe5b602002602001015160405161315291906148cc565b908152602001604051809103902054116131a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161319890614ade565b60405180910390fd5b816002018360018303815181106131b457fe5b60200260200101516040516131c991906148cc565b9081526020016040518091039020915080600101905061311f565b50606060018351116131f6578461320f565b8260018451038151811061320657fe5b60200260200101515b90506000826001018260405161322591906148e3565b90815260200160405180910390205411613274576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161326b90614ade565b60405180910390fd5b6000826000016001846001018460405161328e91906148e3565b90815260200160405180910390205403815481106132a857fe5b906000526020600020906005020190508094505050505092915050565b60008060016020601f855101816132d857fe5b04019050600060016020601f885101816132ee57fe5b040190506040518781526020810160005b838110156133205780602002890151816020028301528060010190506132ff565b50868360200282015260005b84811015613352578060200287015181856001010160200283015280600101905061332c565b50602082848601602002606001846000600c600019f1945050505050949350505050565b6000613380613a40565b600060016020601f8851018161339257fe5b0401905060006020601f8601816133a557fe5b0490506040518881526020810160005b848110156133d657806020028a0151816020028301528060010190506133b5565b5083602002810188815287816020015283602002868660030160200285600a600019fa9650505050505094509492505050565b60008060016020601f8551018161341c57fe5b040190506040518481526020810160005b8381101561344e57806020028601518160200283015280600101905061342d565b50602082602085026040018460006011600019f1935050505092915050565b60008060016020601f8651018161348057fe5b040190506040518581526020810160005b838110156134b2578060200287015181602002830152806001019050613491565b50846020840282015260208260208502604001846000600b600019f193505050509392505050565b60008060016020601f855101816134ed57fe5b040190506040518481526020810160005b8381101561351f5780602002860151816020028301528060010190506134fe565b5060208260208502604001846000600e600019f1935050505092915050565b600080600060016020601f8651018161355357fe5b040190506040518581526020810160005b83811015613585578060200287015181602002830152806001019050613564565b506020826020850260200184600d600019fa9450815193505050509250929050565b6135af613a65565b600060208301905060405180604001604052808451815260200182815250915050919050565b60008082600001516135f985600001518660200151866000015187602001516136c6565b0190505b83600001518460200151018111613643578180600101925050826000015161363b8560200151830386600001510383866000015187602001516136c6565b0190506135fd565b5092915050565b613652613a65565b61365d8383836137a1565b5092915050565b60608082600001516040519080825280601f01601f19166020018201604052801561369e5781602001600182028038833980820191505090505b50905060006020820190506136bc818560200151866000015161383f565b8192505050919050565b6000808490506000868511613791576020851161374b57600060018660200360080260020a031960001b905060008186511690506000878a8a0103905060008386511690505b82811461373d5781861061372a578a8a019650505050505050613799565b858060010196505083865116905061370c565b859650505050505050613799565b60008585209050600091505b858803821161378f57600086842090508082141561377b5783945050505050613799565b600184019350508180600101925050613757565b505b868601925050505b949350505050565b6137a9613a65565b60006137c785600001518660200151866000015187602001516136c6565b90508460200151836020018181525050846020015181038360000181815250508460000151856020015101811415613809576000856000018181525050613834565b8360000151836000015101856000018181510391508181525050836000015181018560200181815250505b829150509392505050565b5b602081106138635781518352602083019250602082019150602081039050613840565b60006001826020036101000a0390508019835116818551168181178652505050505050565b6040518060a001604052806060815260200160001515815260200160008152602001600060028111156138b757fe5b8152602001606081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061390557805160ff1916838001178555613933565b82800160010185558215613933579182015b82811115613932578251825591602001919060010190613917565b5b5090506139409190613a7f565b5090565b82805482825590600052602060002090601f016020900481019282156139d95791602002820160005b838211156139aa57835183826101000a81548160ff021916908315150217905550926020019260010160208160000104928301926001030261396d565b80156139d75782816101000a81549060ff02191690556001016020816000010492830192600103026139aa565b505b5090506139e69190613aa4565b5090565b815481835581811115613a1757600502816005028360005260206000209182019101613a169190613ad4565b5b505050565b5080546000825560050290600052602060002090810190613a3d9190613ad4565b50565b6040518062100000016040528061800090602082028038833980820191505090505090565b604051806040016040528060008152602001600081525090565b613aa191905b80821115613a9d576000816000905550600101613a85565b5090565b90565b613ad191905b80821115613acd57600081816101000a81549060ff021916905550600101613aaa565b5090565b90565b613b4091905b80821115613b3c5760008082016000613af39190613b43565b6001820160006101000a81549060ff021916905560028201600090556003820160006101000a81549060ff0219169055600482016000613b339190613b8b565b50600501613ada565b5090565b90565b50805460018160011615610100020316600290046000825580601f10613b695750613b88565b601f016020900490600052602060002090810190613b879190613a7f565b5b50565b50805460008255601f016020900490600052602060002090810190613bb09190613a7f565b50565b600081359050613bc281614f18565b92915050565b600081519050613bd781614f18565b92915050565b600082601f830112613bee57600080fd5b8135613c01613bfc82614d06565b614cd9565b91508082526020830160208301858383011115613c1d57600080fd5b613c28838284614eb8565b50505092915050565b600082601f830112613c4257600080fd5b8135613c55613c5082614d32565b614cd9565b91508082526020830160208301858383011115613c7157600080fd5b613c7c838284614eb8565b50505092915050565b600081359050613c9481614f2f565b92915050565b600060208284031215613cac57600080fd5b6000613cba84828501613bc8565b91505092915050565b60008060408385031215613cd657600080fd5b6000613ce485828601613bb3565b9250506020613cf585828601613c85565b9150509250929050565b600060208284031215613d1157600080fd5b600082013567ffffffffffffffff811115613d2b57600080fd5b613d3784828501613c31565b91505092915050565b60008060408385031215613d5357600080fd5b600083013567ffffffffffffffff811115613d6d57600080fd5b613d7985828601613c31565b9250506020613d8a85828601613c85565b9150509250929050565b600080600060608486031215613da957600080fd5b600084013567ffffffffffffffff811115613dc357600080fd5b613dcf86828701613c31565b9350506020613de086828701613c85565b925050604084013567ffffffffffffffff811115613dfd57600080fd5b613e0986828701613bdd565b9150509250925092565b600080600060608486031215613e2857600080fd5b600084013567ffffffffffffffff811115613e4257600080fd5b613e4e86828701613c31565b9350506020613e5f86828701613c85565b9250506040613e7086828701613c85565b9150509250925092565b6000613e868383613fe8565b60208301905092915050565b6000613e9e8383613ff7565b60208301905092915050565b6000613eb68383614831565b905092915050565b6000613ec982614d88565b613ed38185614de7565b9350613ede83614d5e565b8060005b83811015613f0f578151613ef68882613e7a565b9750613f0183614dc0565b925050600181019050613ee2565b5085935050505092915050565b613f2581614d93565b613f2f8184614df8565b9250613f3a82614d6e565b8060005b83811015613f6b578151613f528782613e92565b9650613f5d83614dcd565b925050600181019050613f3e565b505050505050565b6000613f7e82614d9f565b613f888185614e03565b935083602082028501613f9a85614d78565b8060005b85811015613fd65784840389528151613fb78582613eaa565b9450613fc283614dda565b925060208a01995050600181019050613f9e565b50829750879550505050505092915050565b613ff181614e53565b82525050565b61400081614e5f565b82525050565b61400f81614ea6565b82525050565b61401e81614ea6565b82525050565b600061402f82614db5565b6140398185614e36565b9350614049818560208601614ec7565b80840191505092915050565b600061406082614daa565b61406a8185614e14565b935061407a818560208601614ec7565b61408381614efa565b840191505092915050565b600061409982614daa565b6140a38185614e36565b93506140b3818560208601614ec7565b80840191505092915050565b60006140cc601883614e25565b91507f496e636f7272656374206368756e6b20706f736974696f6e00000000000000006000830152602082019050919050565b600061410c601583614e25565b91507f4469726563746f7279206e6f74206372656174656400000000000000000000006000830152602082019050919050565b600061414c602483614e25565b91507f4e6f7420656e6f756768206d656d6f727920696e207468652046696c6573746f60008301527f72616765000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006141b2601b83614e25565b91507f48617368206861736e2774206265656e2063616c63756c6174656400000000006000830152602082019050919050565b60006141f2601983614e25565b91507f4368756e6b20697320616c72656164792075706c6f61646564000000000000006000830152602082019050919050565b6000614232601683614e25565b91507f496e636f7272656374206368756e6b206c656e677468000000000000000000006000830152602082019050919050565b6000614272600f83614e25565b91507f46696c65206e6f742065786973747300000000000000000000000000000000006000830152602082019050919050565b60006142b2600e83614e25565b91507f496e76616c69642073656e6465720000000000000000000000000000000000006000830152602082019050919050565b60006142f2601883614e25565b91507f4469726563746f7279206973206e6f742064656c6574656400000000000000006000830152602082019050919050565b6000614332601083614e25565b91507f46696c65206e6f742064656c65746564000000000000000000000000000000006000830152602082019050919050565b6000614372601383614e25565b91507f496e76616c69642073746f7261676550617468000000000000000000000000006000830152602082019050919050565b60006143b2600c83614e25565b91507f496e76616c6964207061746800000000000000000000000000000000000000006000830152602082019050919050565b60006143f2600183614e36565b91507f2e000000000000000000000000000000000000000000000000000000000000006000830152600182019050919050565b6000614432601683614e25565b91507f496e76616c6964206469726563746f7279206e616d65000000000000000000006000830152602082019050919050565b6000614472601583614e25565b91507f4368756e6b207761736e27742075706c6f6164656400000000000000000000006000830152602082019050919050565b60006144b2602683614e25565b91507f436f756c64206e6f742072657365727665206c657373207468616e207573656460008301527f20737061636500000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614518601683614e25565b91507f4469726563746f7279206973206e6f7420656d707479000000000000000000006000830152602082019050919050565b6000614558602383614e25565b91507f46696c65206861736e2774206265656e2075706c6f6164656420636f7272656360008301527f746c7900000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006145be601183614e25565b91507f4368756e6b207761736e277420726561640000000000000000000000000000006000830152602082019050919050565b60006145fe601883614e25565b91507f46696c656e616d652073686f756c64206265203c2032353600000000000000006000830152602082019050919050565b600061463e601f83614e25565b91507f46696c652073686f756c64206265206c657373207468616e20313030204d42006000830152602082019050919050565b600061467e600283614e36565b91507f2e2e0000000000000000000000000000000000000000000000000000000000006000830152600282019050919050565b60006146be601183614e25565b91507f4469726563746f72792069732066756c6c0000000000000000000000000000006000830152602082019050919050565b60006146fe600e83614e25565b91507f46696c65206e6f7420666f756e640000000000000000000000000000000000006000830152602082019050919050565b600061473e601883614e25565b91507f46696c65206f72206469726563746f72792065786973747300000000000000006000830152602082019050919050565b600061477e601883614e25565b91507f45564d206572726f7220696e2067657446696c6553697a6500000000000000006000830152602082019050919050565b60006147be601083614e25565b91507f46696c65206e6f742063726561746564000000000000000000000000000000006000830152602082019050919050565b60006147fe601983614e25565b91507f46696c65206861736e2774206265656e2075706c6f61646564000000000000006000830152602082019050919050565b600060a083016000830151848203600086015261484e8282614055565b91505060208301516148636020860182613fe8565b50604083015161487660408601826148ae565b5060608301516148896060860182614006565b50608083015184820360808601526148a18282613ebe565b9150508091505092915050565b6148b781614e9c565b82525050565b6148c681614e9c565b82525050565b60006148d8828461408e565b915081905092915050565b60006148ef8284614024565b915081905092915050565b6000614905826143e5565b9150819050919050565b600061491a82614671565b9150819050919050565b6000621000008201905061493b6000830184613f1c565b92915050565b6000602082019050818103600083015261495b8184613f73565b905092915050565b60006020820190506149786000830184614015565b92915050565b60006020820190508181036000830152614997816140bf565b9050919050565b600060208201905081810360008301526149b7816140ff565b9050919050565b600060208201905081810360008301526149d78161413f565b9050919050565b600060208201905081810360008301526149f7816141a5565b9050919050565b60006020820190508181036000830152614a17816141e5565b9050919050565b60006020820190508181036000830152614a3781614225565b9050919050565b60006020820190508181036000830152614a5781614265565b9050919050565b60006020820190508181036000830152614a77816142a5565b9050919050565b60006020820190508181036000830152614a97816142e5565b9050919050565b60006020820190508181036000830152614ab781614325565b9050919050565b60006020820190508181036000830152614ad781614365565b9050919050565b60006020820190508181036000830152614af7816143a5565b9050919050565b60006020820190508181036000830152614b1781614425565b9050919050565b60006020820190508181036000830152614b3781614465565b9050919050565b60006020820190508181036000830152614b57816144a5565b9050919050565b60006020820190508181036000830152614b778161450b565b9050919050565b60006020820190508181036000830152614b978161454b565b9050919050565b60006020820190508181036000830152614bb7816145b1565b9050919050565b60006020820190508181036000830152614bd7816145f1565b9050919050565b60006020820190508181036000830152614bf781614631565b9050919050565b60006020820190508181036000830152614c17816146b1565b9050919050565b60006020820190508181036000830152614c37816146f1565b9050919050565b60006020820190508181036000830152614c5781614731565b9050919050565b60006020820190508181036000830152614c7781614771565b9050919050565b60006020820190508181036000830152614c97816147b1565b9050919050565b60006020820190508181036000830152614cb7816147f1565b9050919050565b6000602082019050614cd360008301846148bd565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614cfc57600080fd5b8060405250919050565b600067ffffffffffffffff821115614d1d57600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614d4957600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050919050565b6000819050602082019050919050565b600081519050919050565b60006180009050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614e4c82614e7c565b9050919050565b60008115159050919050565b6000819050919050565b6000819050614e7782614f0b565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000614eb182614e69565b9050919050565b82818337600083830152505050565b60005b83811015614ee5578082015181840152602081019050614eca565b83811115614ef4576000848401525b50505050565b6000601f19601f8301169050919050565b60038110614f1557fe5b50565b614f2181614e41565b8114614f2c57600080fd5b50565b614f3881614e9c565b8114614f4357600080fd5b5056fea365627a7a723158202ae226b25ad72f9cff2d74c6dc7bcfb78530ab1d2438f48a8dab67499b37a8e56c6578706572696d656e74616cf564736f6c634300050d0040", + "nonce": "0", + "storage": { + "0x0": "2868903936" + } + }, + "0x69362535ec535F0643cBf62D16aDeDCAf32Ee6F8": { + "balance": "0", + "code": "0x608060405234801561001057600080fd5b50600436106100b45760003560e01c806379210e8e1161007157806379210e8e1461017757806381a8235a146101a757806385aeeb17146101c35780639a9a5593146101f3578063a99100541461020f578063b57321221461022b576100b4565b806307c6e7d3146100b9578063122f4fba146100d55780631c6ec7a9146101055780631cfe4e3b14610121578063373dedb41461013d57806361e46db51461015b575b600080fd5b6100d360048036036100ce9190810190613e0d565b61025b565b005b6100ef60048036036100ea9190810190613e0d565b610804565b6040516100fc9190614ab1565b60405180910390f35b61011f600480360361011a9190810190613e0d565b610b43565b005b61013b60048036036101369190810190613dd1565b610f72565b005b610145611190565b6040516101529190614e2c565b60405180910390f35b61017560048036036101709190810190613ea2565b611199565b005b610191600480360361018c9190810190613f21565b6113f9565b60405161019e9190614a72565b60405180910390f35b6101c160048036036101bc9190810190613e0d565b6116f9565b005b6101dd60048036036101d89190810190613e0d565b61189e565b6040516101ea9190614a8f565b60405180910390f35b61020d60048036036102089190810190613e4e565b611b9d565b005b61022960048036036102249190810190613e0d565b61213a565b005b61024560048036036102409190810190613e0d565b612790565b6040516102529190614e2c565b60405180910390f35b6000339050606061026b83612a10565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b825181101561037c576000826001018460018403815181106102d557fe5b60200260200101516040516102ea9190614a1a565b90815260200160405180910390205411610339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161033090614c2c565b60405180910390fd5b8160020183600183038151811061034c57fe5b60200260200101516040516103619190614a1a565b908152602001604051809103902091508060010190506102b7565b506060600183511161038e57846103a7565b8260018451038151811061039e57fe5b60200260200101515b9050600082600101826040516103bd9190614a31565b9081526020016040518091039020541161040c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161040390614c2c565b60405180910390fd5b600082600201826040516104209190614a31565b90815260200160405180910390206000018054905014610475576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161046c90614cac565b60405180910390fd5b60006104818587612c10565b9050806104c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ba90614bcc565b60405180910390fd5b6104cb613996565b836000016001856000018054905003815481106104e457fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156105965780601f1061056b57610100808354040283529160200191610596565b820191906000526020600020905b81548152906001019060200180831161057957829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff1660028111156105e257fe5b60028111156105ed57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561066557602002820191906000526020600020906000905b82829054906101000a900460ff1615158152602001906001019060208260000104928301926001038202915080841161062f5790505b50505050508152505090508084600001600186600101866040516106899190614a31565b90815260200160405180910390205403815481106106a357fe5b906000526020600020906005020160008201518160000190805190602001906106cd9291906139d2565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561071c57fe5b0217905550608082015181600401908051906020019061073d929190613a52565b5090505083600101836040516107539190614a31565b9081526020016040518091039020548460010182600001516040516107789190614a1a565b9081526020016040518091039020819055506000846001018460405161079e9190614a31565b908152602001604051809103902081905550836000018054809190600190036107c79190613af8565b5083600201836040516107da9190614a31565b9081526020016040518091039020600080820160006107f99190613b2a565b505050505050505050565b600080606061081284612c74565b91509150606061082182612a10565b90506000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b82518110156109065760008260010184600184038151811061088b57fe5b60200260200101516040516108a09190614a1a565b90815260200160405180910390205414156108c357600095505050505050610b3e565b816002018360018303815181106108d657fe5b60200260200101516040516108eb9190614a1a565b9081526020016040518091039020915080600101905061086d565b50606060018351116109185783610931565b8260018451038151811061092857fe5b60200260200101515b9050600082600101826040516109479190614a31565b908152602001604051809103902054141561096a57600095505050505050610b3e565b610972613996565b826000016001846001018460405161098a9190614a31565b90815260200160405180910390205403815481106109a457fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610a565780601f10610a2b57610100808354040283529160200191610a56565b820191906000526020600020905b815481529060010190602001808311610a3957829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115610aa257fe5b6002811115610aad57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015610b2557602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411610aef5790505b5050505050815250509050806060015196505050505050505b919050565b600160009054906101000a900460ff16610b85576120006002819055506210000060038190555060018060006101000a81548160ff0219169083151502179055505b6000815111610bc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc090614c2c565b60405180910390fd5b60003390506060610bd983612a10565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015610cea57600082600101846001840381518110610c4357fe5b6020026020010151604051610c589190614a1a565b90815260200160405180910390205411610ca7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9e90614c2c565b60405180910390fd5b81600201836001830381518110610cba57fe5b6020026020010151604051610ccf9190614a1a565b90815260200160405180910390209150806001019050610c25565b50600254816000018054905010610d36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2d90614d4c565b60405180910390fd5b60606001835111610d475784610d60565b82600184510381518110610d5757fe5b60200260200101515b905060008260010182604051610d769190614a31565b90815260200160405180910390205414610dc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbc90614d8c565b60405180910390fd5b610dce81612ff6565b610e0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0490614c4c565b60405180910390fd5b6000610e1985876130d7565b905080610e5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5290614aec565b60405180910390fd5b610e63613996565b82816000018190525060008160200190151590811515815250508360000181908060018154018082558091505090600182039060005260206000209060050201600090919290919091506000820151816000019080519060200190610ec99291906139d2565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff02191690836002811115610f1857fe5b02179055506080820151816004019080519060200190610f39929190613a52565b5050505083600001805490508460010184604051610f579190614a31565b90815260200160405180910390208190555050505050505050565b610f7a61313b565b73ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161480610fdf57503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614155b61101e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101590614bac565b60405180910390fd5b80600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411156110a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109790614c8c565b60405180910390fd5b600054600754820111156110e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e090614b0c565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460076000828254039250508190555080600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550806007600082825401925050819055505050565b60008054905090565b600033905060006111aa82866131d4565b9050600160028111156111b957fe5b8160030160009054906101000a900460ff1660028111156111d657fe5b14611216576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120d90614d6c565b60405180910390fd5b6000600354858161122357fe5b061480156112345750806002015484105b611273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126a90614acc565b60405180910390fd5b600354848260020154031080156112905750838160020154038351145b8061129d57506003548351145b6112dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d390614b6c565b60405180910390fd5b600015158160040160035486816112ef57fe5b04815481106112fa57fe5b90600052602060002090602091828204019190069054906101000a900460ff1615151461135c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135390614b4c565b60405180910390fd5b600061136a838787876133d3565b9050806113ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a390614c6c565b60405180910390fd5b60018260040160035487816113bd57fe5b04815481106113c857fe5b90600052602060002090602091828204019190066101000a81548160ff021916908315150217905550505050505050565b611401613b4e565b6000606061140e86612c74565b9150915061141a613996565b61142483836131d4565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156114c85780601f1061149d576101008083540402835291602001916114c8565b820191906000526020600020905b8154815290600101906020018083116114ab57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561151457fe5b600281111561151f57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561159757602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116115615790505b50505050508152505090506002808111156115ae57fe5b816060015160028111156115be57fe5b146115fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f590614e0c565b60405180910390fd5b60035485111580156116105750600085115b61164f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164690614b6c565b60405180910390fd5b80604001518587011115611698576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168f90614acc565b60405180910390fd5b60006116a684848989613484565b8096508192505050806116ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e590614cec565b60405180910390fd5b505050509392505050565b6000339050600061170a82846131d4565b90506001600281111561171957fe5b8160030160009054906101000a900460ff16600281111561173657fe5b14611776576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176d90614d6c565b60405180910390fd5b60006001905060008260040180549050905060008090505b818110156117e157600015158460040182815481106117a957fe5b90600052602060002090602091828204019190069054906101000a900460ff16151514156117d657600092505b80600101905061178e565b5081611822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181990614ccc565b60405180910390fd5b60028360030160006101000a81548160ff0219169083600281111561184357fe5b021790555060006118548587613517565b905080611896576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188d90614b2c565b60405180910390fd5b505050505050565b6060600060606118ad84612c74565b9150915060606118bc82612a10565b90506000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008090505b82518110156119c65760008260010184838151811061192257fe5b60200260200101516040516119379190614a1a565b90815260200160405180910390205411611986576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197d90614c2c565b60405180910390fd5b8160020183828151811061199657fe5b60200260200101516040516119ab9190614a1a565b90815260200160405180910390209150806001019050611907565b5080600001805480602002602001604051908101604052809291908181526020016000905b82821015611b8e57838290600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611aa75780601f10611a7c57610100808354040283529160200191611aa7565b820191906000526020600020905b815481529060010190602001808311611a8a57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115611af357fe5b6002811115611afe57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015611b7657602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411611b405790505b505050505081525050815260200190600101906119eb565b50505050945050505050919050565b600160009054906101000a900460ff16611bdf576120006002819055506210000060038190555060018060006101000a81548160ff0219169083151502179055505b60003390506305f5e100821115611c2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2290614d2c565b60405180910390fd5b600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205483011115611cee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce590614dac565b60405180910390fd5b6060611cf984612a10565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015611e0a57600082600101846001840381518110611d6357fe5b6020026020010151604051611d789190614a1a565b90815260200160405180910390205411611dc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dbe90614c2c565b60405180910390fd5b81600201836001830381518110611dda57fe5b6020026020010151604051611def9190614a1a565b90815260200160405180910390209150806001019050611d45565b50600254816000018054905010611e56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4d90614d4c565b60405180910390fd5b60606001835111611e675785611e80565b82600184510381518110611e7757fe5b60200260200101515b905060008260010182604051611e969190614a31565b90815260200160405180910390205414611ee5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611edc90614d8c565b60405180910390fd5b611eee81612ff6565b611f2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2490614d0c565b60405180910390fd5b6000611f3a85888861357b565b905080611f7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7390614dec565b60405180910390fd5b6060600354600160035489010381611f9057fe5b04604051908082528060200260200182016040528015611fbf5781602001602082028038833980820191505090505b509050836000016040518060a0016040528085815260200160011515815260200189815260200160016002811115611ff357fe5b8152602001838152509080600181540180825580915050906001820390600052602060002090600502016000909192909190915060008201518160000190805190602001906120439291906139d2565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561209257fe5b021790555060808201518160040190805190602001906120b3929190613a52565b50505050836000018054905084600101846040516120d19190614a31565b90815260200160405180910390208190555086600560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505050505050505050565b6000339050612147613996565b61215182846131d4565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156121f55780601f106121ca576101008083540402835291602001916121f5565b820191906000526020600020905b8154815290600101906020018083116121d857829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561224157fe5b600281111561224c57fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156122c457602002820191906000526020600020906000905b82829054906101000a900460ff1615158152602001906001019060208260000104928301926001038202915080841161228e5790505b5050505050815250509050600060028111156122dc57fe5b816060015160028111156122ec57fe5b141561232d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232490614b8c565b60405180910390fd5b600061233983856135e8565b90508061237b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161237290614bec565b60405180910390fd5b606061238685612a10565b90506000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b825181101561241e57816002018360018303815181106123ee57fe5b60200260200101516040516124039190614a1a565b908152602001604051809103902091508060010190506123d2565b50600060018260010186600001516040516124399190614a1a565b908152602001604051809103902054039050612453613996565b8260000160018460000180549050038154811061246c57fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561251e5780601f106124f35761010080835404028352916020019161251e565b820191906000526020600020905b81548152906001019060200180831161250157829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561256a57fe5b600281111561257557fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156125ed57602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116125b75790505b50505050508152505090508083600001838154811061260857fe5b906000526020600020906005020160008201518160000190805190602001906126329291906139d2565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561268157fe5b021790555060808201518160040190805190602001906126a2929190613a52565b50905050826000018054809190600190036126bd9190613af8565b508260010186600001516040516126d49190614a1a565b9081526020016040518091039020548360010182600001516040516126f99190614a1a565b90815260200160405180910390208190555060008360010187600001516040516127239190614a1a565b9081526020016040518091039020819055508560400151600560008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505050505050505050565b600080606061279e84612c74565b915091506127aa613996565b6127b483836131d4565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156128585780601f1061282d57610100808354040283529160200191612858565b820191906000526020600020905b81548152906001019060200180831161283b57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff1660028111156128a457fe5b60028111156128af57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561292757602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116128f15790505b50505050508152505090506001600281111561293f57fe5b8160600151600281111561294f57fe5b1480612974575060028081111561296257fe5b8160600151600281111561297257fe5b145b6129b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129aa90614d6c565b60405180910390fd5b60006129bf848461364c565b809650819250505080612a07576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129fe90614dcc565b60405180910390fd5b50505050919050565b6060612a1a613b73565b612a23836136b5565b9050612a2d613b73565b612a6b6040518060400160405280600181526020017f2f000000000000000000000000000000000000000000000000000000000000008152506136b5565b905060606001612a8483856136e390919063ffffffff16565b01604051908082528060200260200182016040528015612ab857816020015b6060815260200190600190039081612aa35790505b50905060008090505b8151811015612b0957612ae5612ae0848661375890919063ffffffff16565b613772565b828281518110612af157fe5b60200260200101819052508080600101915050612ac1565b50600081600183510381518110612b1c57fe5b6020026020010151511415612b875780600182510381518110612b3b57fe5b6020026020010160608152506001815103604051908082528060200260200182016040528015612b7f57816020015b6060815260200190600190039081612b6a5790505b509350612bc0565b8051604051908082528060200260200182016040528015612bbc57816020015b6060815260200190600190039081612ba75790505b5093505b60008090505b8451811015612c0757818181518110612bdb57fe5b6020026020010151858281518110612bef57fe5b60200260200101819052508080600101915050612bc6565b50505050919050565b60008060016020601f85510181612c2357fe5b040190506040518481526020810160005b83811015612c55578060200286015181602002830152806001019050612c34565b50602082602085026040018460006010600019f1935050505092915050565b6000606060006028905080845111612cc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cb890614c0c565b60405180910390fd5b6060816040519080825280601f01601f191660200182016040528015612cf65781602001600182028038833980820191505090505b50905060008090505b82811015612d6657858181518110612d1357fe5b602001015160f81c60f81b828281518110612d2a57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050612cff565b50600080905060008090505b83811015612e95576000838281518110612d8857fe5b602001015160f81c60f81b60f81c60ff16905060308110158015612dad575060398111155b80612dc6575060418110158015612dc55750605a8111155b5b80612ddf575060618110158015612dde575060668111155b5b612e1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e1590614c0c565b60405180910390fd5b60308110158015612e30575060398111155b15612e415760308103601084020192505b60418110158015612e535750605a8111155b15612e645760378103601084020192505b60618110158015612e76575060668111155b15612e875760578103601084020192505b508080600101915050612d72565b508094507f2f00000000000000000000000000000000000000000000000000000000000000868481518110612ec657fe5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612f33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f2a90614c0c565b60405180910390fd5b6000600184885103039050806040519080825280601f01601f191660200182016040528015612f715781602001600182028038833980820191505090505b50945060008090505b81811015612fec5760008860018784010181518110612f9557fe5b602001015160f81c60f81b905080878381518110612faf57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350508080600101915050612f7a565b5050505050915091565b600060405160200161300790614a5d565b604051602081830303815290604052805190602001208260405160200161302e9190614a31565b604051602081830303815290604052805190602001201480613099575060405160200161305a90614a48565b60405160208183030381529060405280519060200120826040516020016130819190614a31565b60405160208183030381529060405280519060200120145b806130a5575060008251145b156130b357600090506130d2565b60008251905060ff8111156130cc5760009150506130d2565b60019150505b919050565b60008060016020601f855101816130ea57fe5b040190506040518481526020810160005b8381101561311c5780602002860151816020028301528060010190506130fb565b5060208260208502604001846000600f600019f1935050505092915050565b600073d2001000000000000000000000000000000000d273ffffffffffffffffffffffffffffffffffffffff166383e781fe6040518163ffffffff1660e01b815260040160206040518083038186803b15801561319757600080fd5b505afa1580156131ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506131cf9190810190613da8565b905090565b600060606131e183612a10565b90506000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b82518110156132f25760008260010184600184038151811061324b57fe5b60200260200101516040516132609190614a1a565b908152602001604051809103902054116132af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132a690614c2c565b60405180910390fd5b816002018360018303815181106132c257fe5b60200260200101516040516132d79190614a1a565b9081526020016040518091039020915080600101905061322d565b5060606001835111613304578461331d565b8260018451038151811061331457fe5b60200260200101515b9050600082600101826040516133339190614a31565b90815260200160405180910390205411613382576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161337990614c2c565b60405180910390fd5b6000826000016001846001018460405161339c9190614a31565b90815260200160405180910390205403815481106133b657fe5b906000526020600020906005020190508094505050505092915050565b60008060016020601f855101816133e657fe5b04019050600060016020601f885101816133fc57fe5b040190506040518781526020810160005b8381101561342e57806020028901518160200283015280600101905061340d565b50868360200282015260005b84811015613460578060200287015181856001010160200283015280600101905061343a565b50602082848601602002606001846000600c600019f1945050505050949350505050565b600061348e613b4e565b600060016020601f885101816134a057fe5b0401905060006020601f8601816134b357fe5b0490506040518881526020810160005b848110156134e457806020028a0151816020028301528060010190506134c3565b5083602002810188815287816020015283602002868660030160200285600a600019fa9650505050505094509492505050565b60008060016020601f8551018161352a57fe5b040190506040518481526020810160005b8381101561355c57806020028601518160200283015280600101905061353b565b50602082602085026040018460006011600019f1935050505092915050565b60008060016020601f8651018161358e57fe5b040190506040518581526020810160005b838110156135c057806020028701518160200283015280600101905061359f565b50846020840282015260208260208502604001846000600b600019f193505050509392505050565b60008060016020601f855101816135fb57fe5b040190506040518481526020810160005b8381101561362d57806020028601518160200283015280600101905061360c565b5060208260208502604001846000600e600019f1935050505092915050565b600080600060016020601f8651018161366157fe5b040190506040518581526020810160005b83811015613693578060200287015181602002830152806001019050613672565b506020826020850260200184600d600019fa9450815193505050509250929050565b6136bd613b73565b600060208301905060405180604001604052808451815260200182815250915050919050565b600080826000015161370785600001518660200151866000015187602001516137d4565b0190505b8360000151846020015101811161375157818060010192505082600001516137498560200151830386600001510383866000015187602001516137d4565b01905061370b565b5092915050565b613760613b73565b61376b8383836138af565b5092915050565b60608082600001516040519080825280601f01601f1916602001820160405280156137ac5781602001600182028038833980820191505090505b50905060006020820190506137ca818560200151866000015161394d565b8192505050919050565b600080849050600086851161389f576020851161385957600060018660200360080260020a031960001b905060008186511690506000878a8a0103905060008386511690505b82811461384b57818610613838578a8a0196505050505050506138a7565b858060010196505083865116905061381a565b8596505050505050506138a7565b60008585209050600091505b858803821161389d57600086842090508082141561388957839450505050506138a7565b600184019350508180600101925050613865565b505b868601925050505b949350505050565b6138b7613b73565b60006138d585600001518660200151866000015187602001516137d4565b90508460200151836020018181525050846020015181038360000181815250508460000151856020015101811415613917576000856000018181525050613942565b8360000151836000015101856000018181510391508181525050836000015181018560200181815250505b829150509392505050565b5b60208110613971578151835260208301925060208201915060208103905061394e565b60006001826020036101000a0390508019835116818551168181178652505050505050565b6040518060a001604052806060815260200160001515815260200160008152602001600060028111156139c557fe5b8152602001606081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613a1357805160ff1916838001178555613a41565b82800160010185558215613a41579182015b82811115613a40578251825591602001919060010190613a25565b5b509050613a4e9190613b8d565b5090565b82805482825590600052602060002090601f01602090048101928215613ae75791602002820160005b83821115613ab857835183826101000a81548160ff0219169083151502179055509260200192600101602081600001049283019260010302613a7b565b8015613ae55782816101000a81549060ff0219169055600101602081600001049283019260010302613ab8565b505b509050613af49190613bb2565b5090565b815481835581811115613b2557600502816005028360005260206000209182019101613b249190613be2565b5b505050565b5080546000825560050290600052602060002090810190613b4b9190613be2565b50565b6040518062100000016040528061800090602082028038833980820191505090505090565b604051806040016040528060008152602001600081525090565b613baf91905b80821115613bab576000816000905550600101613b93565b5090565b90565b613bdf91905b80821115613bdb57600081816101000a81549060ff021916905550600101613bb8565b5090565b90565b613c4e91905b80821115613c4a5760008082016000613c019190613c51565b6001820160006101000a81549060ff021916905560028201600090556003820160006101000a81549060ff0219169055600482016000613c419190613c99565b50600501613be8565b5090565b90565b50805460018160011615610100020316600290046000825580601f10613c775750613c96565b601f016020900490600052602060002090810190613c959190613b8d565b5b50565b50805460008255601f016020900490600052602060002090810190613cbe9190613b8d565b50565b600081359050613cd081615086565b92915050565b600081519050613ce581615086565b92915050565b600082601f830112613cfc57600080fd5b8135613d0f613d0a82614e74565b614e47565b91508082526020830160208301858383011115613d2b57600080fd5b613d36838284615026565b50505092915050565b600082601f830112613d5057600080fd5b8135613d63613d5e82614ea0565b614e47565b91508082526020830160208301858383011115613d7f57600080fd5b613d8a838284615026565b50505092915050565b600081359050613da28161509d565b92915050565b600060208284031215613dba57600080fd5b6000613dc884828501613cd6565b91505092915050565b60008060408385031215613de457600080fd5b6000613df285828601613cc1565b9250506020613e0385828601613d93565b9150509250929050565b600060208284031215613e1f57600080fd5b600082013567ffffffffffffffff811115613e3957600080fd5b613e4584828501613d3f565b91505092915050565b60008060408385031215613e6157600080fd5b600083013567ffffffffffffffff811115613e7b57600080fd5b613e8785828601613d3f565b9250506020613e9885828601613d93565b9150509250929050565b600080600060608486031215613eb757600080fd5b600084013567ffffffffffffffff811115613ed157600080fd5b613edd86828701613d3f565b9350506020613eee86828701613d93565b925050604084013567ffffffffffffffff811115613f0b57600080fd5b613f1786828701613ceb565b9150509250925092565b600080600060608486031215613f3657600080fd5b600084013567ffffffffffffffff811115613f5057600080fd5b613f5c86828701613d3f565b9350506020613f6d86828701613d93565b9250506040613f7e86828701613d93565b9150509250925092565b6000613f9483836140f6565b60208301905092915050565b6000613fac8383614105565b60208301905092915050565b6000613fc4838361497f565b905092915050565b6000613fd782614ef6565b613fe18185614f55565b9350613fec83614ecc565b8060005b8381101561401d5781516140048882613f88565b975061400f83614f2e565b925050600181019050613ff0565b5085935050505092915050565b61403381614f01565b61403d8184614f66565b925061404882614edc565b8060005b838110156140795781516140608782613fa0565b965061406b83614f3b565b92505060018101905061404c565b505050505050565b600061408c82614f0d565b6140968185614f71565b9350836020820285016140a885614ee6565b8060005b858110156140e457848403895281516140c58582613fb8565b94506140d083614f48565b925060208a019950506001810190506140ac565b50829750879550505050505092915050565b6140ff81614fc1565b82525050565b61410e81614fcd565b82525050565b61411d81615014565b82525050565b61412c81615014565b82525050565b600061413d82614f23565b6141478185614fa4565b9350614157818560208601615035565b80840191505092915050565b600061416e82614f18565b6141788185614f82565b9350614188818560208601615035565b61419181615068565b840191505092915050565b60006141a782614f18565b6141b18185614fa4565b93506141c1818560208601615035565b80840191505092915050565b60006141da601883614f93565b91507f496e636f7272656374206368756e6b20706f736974696f6e00000000000000006000830152602082019050919050565b600061421a601583614f93565b91507f4469726563746f7279206e6f74206372656174656400000000000000000000006000830152602082019050919050565b600061425a602483614f93565b91507f4e6f7420656e6f756768206d656d6f727920696e207468652046696c6573746f60008301527f72616765000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006142c0601b83614f93565b91507f48617368206861736e2774206265656e2063616c63756c6174656400000000006000830152602082019050919050565b6000614300601983614f93565b91507f4368756e6b20697320616c72656164792075706c6f61646564000000000000006000830152602082019050919050565b6000614340601683614f93565b91507f496e636f7272656374206368756e6b206c656e677468000000000000000000006000830152602082019050919050565b6000614380600f83614f93565b91507f46696c65206e6f742065786973747300000000000000000000000000000000006000830152602082019050919050565b60006143c0600e83614f93565b91507f496e76616c69642073656e6465720000000000000000000000000000000000006000830152602082019050919050565b6000614400601883614f93565b91507f4469726563746f7279206973206e6f742064656c6574656400000000000000006000830152602082019050919050565b6000614440601083614f93565b91507f46696c65206e6f742064656c65746564000000000000000000000000000000006000830152602082019050919050565b6000614480601383614f93565b91507f496e76616c69642073746f7261676550617468000000000000000000000000006000830152602082019050919050565b60006144c0600c83614f93565b91507f496e76616c6964207061746800000000000000000000000000000000000000006000830152602082019050919050565b6000614500600183614fa4565b91507f2e000000000000000000000000000000000000000000000000000000000000006000830152600182019050919050565b6000614540601683614f93565b91507f496e76616c6964206469726563746f7279206e616d65000000000000000000006000830152602082019050919050565b6000614580601583614f93565b91507f4368756e6b207761736e27742075706c6f6164656400000000000000000000006000830152602082019050919050565b60006145c0602683614f93565b91507f436f756c64206e6f742072657365727665206c657373207468616e207573656460008301527f20737061636500000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614626601683614f93565b91507f4469726563746f7279206973206e6f7420656d707479000000000000000000006000830152602082019050919050565b6000614666602383614f93565b91507f46696c65206861736e2774206265656e2075706c6f6164656420636f7272656360008301527f746c7900000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006146cc601183614f93565b91507f4368756e6b207761736e277420726561640000000000000000000000000000006000830152602082019050919050565b600061470c601883614f93565b91507f46696c656e616d652073686f756c64206265203c2032353600000000000000006000830152602082019050919050565b600061474c601f83614f93565b91507f46696c652073686f756c64206265206c657373207468616e20313030204d42006000830152602082019050919050565b600061478c600283614fa4565b91507f2e2e0000000000000000000000000000000000000000000000000000000000006000830152600282019050919050565b60006147cc601183614f93565b91507f4469726563746f72792069732066756c6c0000000000000000000000000000006000830152602082019050919050565b600061480c600e83614f93565b91507f46696c65206e6f7420666f756e640000000000000000000000000000000000006000830152602082019050919050565b600061484c601883614f93565b91507f46696c65206f72206469726563746f72792065786973747300000000000000006000830152602082019050919050565b600061488c601983614f93565b91507f4e6f7420656e6f756768207265736572766564207370616365000000000000006000830152602082019050919050565b60006148cc601883614f93565b91507f45564d206572726f7220696e2067657446696c6553697a6500000000000000006000830152602082019050919050565b600061490c601083614f93565b91507f46696c65206e6f742063726561746564000000000000000000000000000000006000830152602082019050919050565b600061494c601983614f93565b91507f46696c65206861736e2774206265656e2075706c6f61646564000000000000006000830152602082019050919050565b600060a083016000830151848203600086015261499c8282614163565b91505060208301516149b160208601826140f6565b5060408301516149c460408601826149fc565b5060608301516149d76060860182614114565b50608083015184820360808601526149ef8282613fcc565b9150508091505092915050565b614a058161500a565b82525050565b614a148161500a565b82525050565b6000614a26828461419c565b915081905092915050565b6000614a3d8284614132565b915081905092915050565b6000614a53826144f3565b9150819050919050565b6000614a688261477f565b9150819050919050565b60006210000082019050614a89600083018461402a565b92915050565b60006020820190508181036000830152614aa98184614081565b905092915050565b6000602082019050614ac66000830184614123565b92915050565b60006020820190508181036000830152614ae5816141cd565b9050919050565b60006020820190508181036000830152614b058161420d565b9050919050565b60006020820190508181036000830152614b258161424d565b9050919050565b60006020820190508181036000830152614b45816142b3565b9050919050565b60006020820190508181036000830152614b65816142f3565b9050919050565b60006020820190508181036000830152614b8581614333565b9050919050565b60006020820190508181036000830152614ba581614373565b9050919050565b60006020820190508181036000830152614bc5816143b3565b9050919050565b60006020820190508181036000830152614be5816143f3565b9050919050565b60006020820190508181036000830152614c0581614433565b9050919050565b60006020820190508181036000830152614c2581614473565b9050919050565b60006020820190508181036000830152614c45816144b3565b9050919050565b60006020820190508181036000830152614c6581614533565b9050919050565b60006020820190508181036000830152614c8581614573565b9050919050565b60006020820190508181036000830152614ca5816145b3565b9050919050565b60006020820190508181036000830152614cc581614619565b9050919050565b60006020820190508181036000830152614ce581614659565b9050919050565b60006020820190508181036000830152614d05816146bf565b9050919050565b60006020820190508181036000830152614d25816146ff565b9050919050565b60006020820190508181036000830152614d458161473f565b9050919050565b60006020820190508181036000830152614d65816147bf565b9050919050565b60006020820190508181036000830152614d85816147ff565b9050919050565b60006020820190508181036000830152614da58161483f565b9050919050565b60006020820190508181036000830152614dc58161487f565b9050919050565b60006020820190508181036000830152614de5816148bf565b9050919050565b60006020820190508181036000830152614e05816148ff565b9050919050565b60006020820190508181036000830152614e258161493f565b9050919050565b6000602082019050614e416000830184614a0b565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614e6a57600080fd5b8060405250919050565b600067ffffffffffffffff821115614e8b57600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614eb757600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050919050565b6000819050602082019050919050565b600081519050919050565b60006180009050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614fba82614fea565b9050919050565b60008115159050919050565b6000819050919050565b6000819050614fe582615079565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061501f82614fd7565b9050919050565b82818337600083830152505050565b60005b83811015615053578082015181840152602081019050615038565b83811115615062576000848401525b50505050565b6000601f19601f8301169050919050565b6003811061508357fe5b50565b61508f81614faf565b811461509a57600080fd5b50565b6150a68161500a565b81146150b157600080fd5b5056fea365627a7a72315820314a90e541327f2678eaf7815f54348c3702e4fa45cdf1d5595b378d08af86896c6578706572696d656e74616cf564736f6c634300050d0040", + "nonce": "0", + "storage": { + "0x0": "2868903936" + } + }, + "0x69bfcdcb98c9562e0a2faee3ecdfd65e8a0adb19": { + "balance": "1000000000000000000000000000000" + }, + "0x6a37ad7dceec4595eea9f03b82d2710e738343ac": { + "balance": "1000000000000000000000000000000" + }, + "0x6b806862a977a0e22ed1752f858e5332647121c8": { + "balance": "1000000000000000000000000000000" + }, + "0x6c0ef9084a57df13c175afea32ea47a510c5506e": { + "balance": "1000000000000000000000000000000" + }, + "0x6cd5e637266e18d3e888ee99451eb828c6b491f4": { + "balance": "1000000000000000000000000000000" + }, + "0x6d0d7f0ff51917bd84a5f7270d31a894282aaf4b": { + "balance": "1000000000000000000000000000000" + }, + "0x6d8092cb926daf29236f866cd31c327ff73323d1": { + "balance": "1000000000000000000000000000000" + }, + "0x6d80aAC61F6d92c7F4A3c412850474ba963B698E": { + "balance": "1000000000000000000000" + }, + "0x6fec280c0ab320715b17d70e8b02c2d4141c1372": { + "balance": "1000000000000000000000000000000" + }, + "0x733ad609ef2e742334d96266fbc13733f1cf5e4a": { + "balance": "1000000000000000000000000000000" + }, + "0x7525198d8cd1121d57358a0b0ed037e924581a76": { + "balance": "1000000000000000000000000000000" + }, + "0x765708943c3b791563d1e3f0533b6d7e7d769e4d": { + "balance": "1000000000000000000000000000000" + }, + "0x7685d04f0b7657017b77efa004a14ff9f022acab": { + "balance": "1000000000000000000000000000000" + }, + "0x76b545cb6a2fc671f741950eeb27627e69a1e69b": { + "balance": "1000000000000000000000000000000" + }, + "0x77a0bc73442d3d9cb993e8d9752f95babf0ccaa6": { + "balance": "1000000000000000000000000000000" + }, + "0x7a89A6c323FaCfF0ADeF7EEF3e491aD4044d0592": { + "balance": "100000000000000000000000" + }, + "0x7e7E68F04D1799Fa25C8cff57314c8a5d3942e69": { + "balance": "1000000000000000000000000" + }, + "0x811d701d14539d190a8593fe901eafe8eff511f5": { + "balance": "1000000000000000000000000000000" + }, + "0x81dcbd71da28fafb9ca99ff5a22bfcebba84fecc": { + "balance": "100000000000000000000000" + }, + "0x83c1479d2a32d9ed9fa699289b6c2db56b7cd045": { + "balance": "1000000000000000000000000000000" + }, + "0x85b33f0853ab8eaa4e602bdfd724d44bc2731e90": { + "balance": "1000000000000000000000000000000" + }, + "0x863f816036e3cbba90855196c9d1e339fcff1650": { + "balance": "1000000000000000000000000000000" + }, + "0x87ea381878572d63b3453033d7540abddd191186": { + "balance": "1000000000000000000000000000000" + }, + "0x88fd5e01078629cc194c933d9631b9448fe10b1d": { + "balance": "1000000000000000000000000000000" + }, + "0x8945e48bd056f45c8b57f9025d2674bb03a24035": { + "balance": "1000000000000000000000000000000" + }, + "0x8a920edc1021ce76c22774e0e83723a6e51c2439": { + "balance": "1000000000000000000000000000000" + }, + "0x8e6081e272c8f4d49f5b29157b52f68cbd6307ad": { + "balance": "1000000000000000000000000000000" + }, + "0x8fe24dbbf9884bd458d8cfac528b4ad70e82497d": { + "balance": "1000000000000000000000000000000" + }, + "0x90431f3f75b26657f74abbb5c759b12e78f916cc": { + "balance": "1000000000000000000000000000000" + }, + "0x907cd0881E50d359bb9Fd120B1A5A143b1C97De6": { + "balance": "1000000000000000000000000000000000000000000000000000000000" + }, + "0x94c6e5746971d6aebeaa42cbbe2feca0f6b5b24f": { + "balance": "1000000000000000000000000000000" + }, + "0x96672f9e982936e1904b15c948cc81bf18027db6": { + "balance": "1000000000000000000000000000000" + }, + "0x97b921ba45e0aa8830701aa62050a83ee00a1bb8": { + "balance": "1000000000000000000000000000000" + }, + "0x98e50c97baf98dc6a81bdb95067339a269a36fc1": { + "balance": "1000000000000000000000000000000" + }, + "0x9b77f28285a49601169a33332f08aa309d97edd0": { + "balance": "1000000000000000000000000000000" + }, + "0x9f62f4215cd277ca40dede101b4ccb29290de6bb": { + "balance": "1000000000000000000000000000000" + }, + "0xD1001000000000000000000000000000000000D1": { + "balance": "0", + "code": "0x608060405260043610603f576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680636d4ce63c146044575b600080fd5b348015604f57600080fd5b506056606c565b6040518082815260200191505060405180910390f35b60006001600060048152602001908152602001600020600060098152602001908152602001600020600101549050905600a165627a7a723058208fe64219becc0bcab1c8f854f05804ebb6bb555da5dbc49e8f7021c31d77636a0029", + "nonce": "0", + "storage": { + "0x3b4da637a1b0e6dbfc6795f2b7f0cb29eebb91b3af4dcc335e1633f6b4af810b": "1111" + } + }, + "0xD3001000000000000000000000000000000000D3": { + "balance": "0", + "code": "0x60806040526004361061007b5760003560e01c80639623609d1161004e5780639623609d1461013657806399a88ec4146101f5578063f2fde38b14610230578063f3b7dead146102635761007b565b8063204e1c7a14610080578063715018a6146100cf5780637eff275e146100e65780638da5cb5b14610121575b600080fd5b34801561008c57600080fd5b506100b3600480360360208110156100a357600080fd5b50356001600160a01b0316610296565b604080516001600160a01b039092168252519081900360200190f35b3480156100db57600080fd5b506100e4610328565b005b3480156100f257600080fd5b506100e46004803603604081101561010957600080fd5b506001600160a01b03813581169160200135166103ca565b34801561012d57600080fd5b506100b3610496565b6100e46004803603606081101561014c57600080fd5b6001600160a01b03823581169260208101359091169181019060608101604082013564010000000081111561018057600080fd5b82018360208201111561019257600080fd5b803590602001918460018302840111640100000000831117156101b457600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506104a5945050505050565b34801561020157600080fd5b506100e46004803603604081101561021857600080fd5b506001600160a01b03813581169160200135166105dd565b34801561023c57600080fd5b506100e46004803603602081101561025357600080fd5b50356001600160a01b031661068d565b34801561026f57600080fd5b506100b36004803603602081101561028657600080fd5b50356001600160a01b0316610785565b6000806060836001600160a01b03166040518080635c60da1b60e01b8152506004019050600060405180830381855afa9150503d80600081146102f5576040519150601f19603f3d011682016040523d82523d6000602084013e6102fa565b606091505b50915091508161030957600080fd5b80806020019051602081101561031e57600080fd5b5051949350505050565b6103306107e4565b6000546001600160a01b03908116911614610380576040805162461bcd60e51b8152602060048201819052602482015260008051602061080f833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6103d26107e4565b6000546001600160a01b03908116911614610422576040805162461bcd60e51b8152602060048201819052602482015260008051602061080f833981519152604482015290519081900360640190fd5b816001600160a01b0316638f283970826040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050600060405180830381600087803b15801561047a57600080fd5b505af115801561048e573d6000803e3d6000fd5b505050505050565b6000546001600160a01b031690565b6104ad6107e4565b6000546001600160a01b039081169116146104fd576040805162461bcd60e51b8152602060048201819052602482015260008051602061080f833981519152604482015290519081900360640190fd5b826001600160a01b0316634f1ef2863484846040518463ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561057357818101518382015260200161055b565b50505050905090810190601f1680156105a05780820380516001836020036101000a031916815260200191505b5093505050506000604051808303818588803b1580156105bf57600080fd5b505af11580156105d3573d6000803e3d6000fd5b5050505050505050565b6105e56107e4565b6000546001600160a01b03908116911614610635576040805162461bcd60e51b8152602060048201819052602482015260008051602061080f833981519152604482015290519081900360640190fd5b816001600160a01b0316633659cfe6826040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050600060405180830381600087803b15801561047a57600080fd5b6106956107e4565b6000546001600160a01b039081169116146106e5576040805162461bcd60e51b8152602060048201819052602482015260008051602061080f833981519152604482015290519081900360640190fd5b6001600160a01b03811661072a5760405162461bcd60e51b81526004018080602001828103825260268152602001806107e96026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000806060836001600160a01b031660405180806303e1469160e61b8152506004019050600060405180830381855afa9150503d80600081146102f5576040519150601f19603f3d011682016040523d82523d6000602084013e6102fa565b339056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a26469706673582212201d968ac32bef5562c6b4f1bd5d2f2a74c14d07ce008ca6fdc5a3bd0f5fc265f564736f6c63430006080033", + "nonce": "0", + "storage": { + "0x0": "0x907cd0881E50d359bb9Fd120B1A5A143b1C97De6" + } + }, + "0xD3002000000000000000000000000000000000D3": { + "balance": "0", + "code": "0x60806040526004361061004e5760003560e01c80633659cfe6146100655780634f1ef286146100985780635c60da1b146101185780638f28397014610149578063f851a4401461017c5761005d565b3661005d5761005b610191565b005b61005b610191565b34801561007157600080fd5b5061005b6004803603602081101561008857600080fd5b50356001600160a01b03166101ab565b61005b600480360360408110156100ae57600080fd5b6001600160a01b0382351691908101906040810160208201356401000000008111156100d957600080fd5b8201836020820111156100eb57600080fd5b8035906020019184600183028401116401000000008311171561010d57600080fd5b5090925090506101e5565b34801561012457600080fd5b5061012d610292565b604080516001600160a01b039092168252519081900360200190f35b34801561015557600080fd5b5061005b6004803603602081101561016c57600080fd5b50356001600160a01b03166102cf565b34801561018857600080fd5b5061012d610389565b6101996103ba565b6101a96101a461041a565b61043f565b565b6101b3610463565b6001600160a01b0316336001600160a01b031614156101da576101d581610488565b6101e2565b6101e2610191565b50565b6101ed610463565b6001600160a01b0316336001600160a01b031614156102855761020f83610488565b6000836001600160a01b031683836040518083838082843760405192019450600093509091505080830381855af49150503d806000811461026c576040519150601f19603f3d011682016040523d82523d6000602084013e610271565b606091505b505090508061027f57600080fd5b5061028d565b61028d610191565b505050565b600061029c610463565b6001600160a01b0316336001600160a01b031614156102c4576102bd61041a565b90506102cc565b6102cc610191565b90565b6102d7610463565b6001600160a01b0316336001600160a01b031614156101da576001600160a01b0381166103355760405162461bcd60e51b81526004018080602001828103825260368152602001806105876036913960400191505060405180910390fd5b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f61035e610463565b604080516001600160a01b03928316815291841660208301528051918290030190a16101d5816104c8565b6000610393610463565b6001600160a01b0316336001600160a01b031614156102c4576102bd610463565b3b151590565b6103c2610463565b6001600160a01b0316336001600160a01b031614156104125760405162461bcd60e51b81526004018080602001828103825260328152602001806105556032913960400191505060405180910390fd5b6101a96101a9565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b3660008037600080366000845af43d6000803e80801561045e573d6000f35b3d6000fd5b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b610491816104ec565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610355565b6104f5816103b4565b6105305760405162461bcd60e51b815260040180806020018281038252603b8152602001806105bd603b913960400191505060405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5556fe43616e6e6f742063616c6c2066616c6c6261636b2066756e6374696f6e2066726f6d207468652070726f78792061646d696e43616e6e6f74206368616e6765207468652061646d696e206f6620612070726f787920746f20746865207a65726f206164647265737343616e6e6f742073657420612070726f787920696d706c656d656e746174696f6e20746f2061206e6f6e2d636f6e74726163742061646472657373a26469706673582212206e221e2a3547bd97244b05ed46430b1b078ba097cb2a4e25ec3d79cf9ac9f02c64736f6c63430006080033", + "nonce": "0", + "storage": { + "0x0": "1000000", + "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0xD3003000000000000000000000000000000000D3", + "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "0xD3001000000000000000000000000000000000D3" + } + }, + "0xD3003000000000000000000000000000000000D3": { + "balance": "0", + "code": "0x608060405234801561001057600080fd5b50600436106100b45760003560e01c806379210e8e1161007157806379210e8e1461017757806381a8235a146101a757806385aeeb17146101c35780639a9a5593146101f3578063a99100541461020f578063b57321221461022b576100b4565b806307c6e7d3146100b9578063122f4fba146100d55780631c6ec7a9146101055780631cfe4e3b14610121578063373dedb41461013d57806361e46db51461015b575b600080fd5b6100d360048036036100ce9190810190613e94565b61025b565b005b6100ef60048036036100ea9190810190613e94565b610862565b6040516100fc9190614b38565b60405180910390f35b61011f600480360361011a9190810190613e94565b610ba1565b005b61013b60048036036101369190810190613e58565b610fce565b005b6101456111ec565b6040516101529190614eb3565b60405180910390f35b61017560048036036101709190810190613f29565b6111f6565b005b610191600480360361018c9190810190613fa8565b611456565b60405161019e9190614af9565b60405180910390f35b6101c160048036036101bc9190810190613e94565b611756565b005b6101dd60048036036101d89190810190613e94565b6118fb565b6040516101ea9190614b16565b60405180910390f35b61020d60048036036102089190810190613ed5565b611bfa565b005b61022960048036036102249190810190613e94565b612195565b005b61024560048036036102409190810190613e94565b612849565b6040516102529190614eb3565b60405180910390f35b6000339050606061026b83612ac9565b90506000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b825181101561037c576000826001018460018403815181106102d557fe5b60200260200101516040516102ea9190614aa1565b90815260200160405180910390205411610339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161033090614cb3565b60405180910390fd5b8160020183600183038151811061034c57fe5b60200260200101516040516103619190614aa1565b908152602001604051809103902091508060010190506102b7565b506060600183511161038e57846103a7565b8260018451038151811061039e57fe5b60200260200101515b9050600082600101826040516103bd9190614ab8565b9081526020016040518091039020541161040c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161040390614cb3565b60405180910390fd5b600082600201826040516104209190614ab8565b90815260200160405180910390206000018054905014610475576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161046c90614d33565b60405180910390fd5b60006104818587612cc9565b9050806104c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ba90614c53565b60405180910390fd5b6104cb613a4f565b836000016001856000018054905003815481106104e457fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156105965780601f1061056b57610100808354040283529160200191610596565b820191906000526020600020905b81548152906001019060200180831161057957829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff1660028111156105e257fe5b60028111156105ed57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561066557602002820191906000526020600020906000905b82829054906101000a900460ff1615158152602001906001019060208260000104928301926001038202915080841161062f5790505b50505050508152505090508084600001600186600101866040516106899190614ab8565b90815260200160405180910390205403815481106106a357fe5b906000526020600020906005020160008201518160000190805190602001906106cd929190613a8b565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561071c57fe5b0217905550608082015181600401908051906020019061073d929190613b0b565b5090505083600101836040516107539190614ab8565b9081526020016040518091039020548460010182600001516040516107789190614aa1565b9081526020016040518091039020819055506000846001018460405161079e9190614ab8565b908152602001604051809103902081905550836000018054806107bd57fe5b6001900381819060005260206000209060050201600080820160006107e29190613bb1565b6001820160006101000a81549060ff021916905560028201600090556003820160006101000a81549060ff02191690556004820160006108229190613bf9565b5050905583600201836040516108389190614ab8565b9081526020016040518091039020600080820160006108579190613c21565b505050505050505050565b600080606061087084612d2d565b91509150606061087f82612ac9565b90506000600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015610964576000826001018460018403815181106108e957fe5b60200260200101516040516108fe9190614aa1565b908152602001604051809103902054141561092157600095505050505050610b9c565b8160020183600183038151811061093457fe5b60200260200101516040516109499190614aa1565b908152602001604051809103902091508060010190506108cb565b5060606001835111610976578361098f565b8260018451038151811061098657fe5b60200260200101515b9050600082600101826040516109a59190614ab8565b90815260200160405180910390205414156109c857600095505050505050610b9c565b6109d0613a4f565b82600001600184600101846040516109e89190614ab8565b9081526020016040518091039020540381548110610a0257fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610ab45780601f10610a8957610100808354040283529160200191610ab4565b820191906000526020600020905b815481529060010190602001808311610a9757829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115610b0057fe5b6002811115610b0b57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015610b8357602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411610b4d5790505b5050505050815250509050806060015196505050505050505b919050565b600360009054906101000a900460ff16610be457612000600481905550621000006005819055506001600360006101000a81548160ff0219169083151502179055505b6000815111610c28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1f90614cb3565b60405180910390fd5b60003390506060610c3883612ac9565b90506000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015610d4957600082600101846001840381518110610ca257fe5b6020026020010151604051610cb79190614aa1565b90815260200160405180910390205411610d06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cfd90614cb3565b60405180910390fd5b81600201836001830381518110610d1957fe5b6020026020010151604051610d2e9190614aa1565b90815260200160405180910390209150806001019050610c84565b50600454816000018054905010610d95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8c90614dd3565b60405180910390fd5b60606001835111610da65784610dbf565b82600184510381518110610db657fe5b60200260200101515b905060008260010182604051610dd59190614ab8565b90815260200160405180910390205414610e24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1b90614e13565b60405180910390fd5b610e2d816130af565b610e6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6390614cd3565b60405180910390fd5b6000610e788587613190565b905080610eba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb190614b73565b60405180910390fd5b610ec2613a4f565b8281600001819052506000816020019015159081151581525050836000018190806001815401808255809150506001900390600052602060002090600502016000909190919091506000820151816000019080519060200190610f26929190613a8b565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff02191690836002811115610f7557fe5b02179055506080820151816004019080519060200190610f96929190613b0b565b50505083600001805490508460010184604051610fb39190614ab8565b90815260200160405180910390208190555050505050505050565b610fd66131f4565b73ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16148061103b57503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614155b61107a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107190614c33565b60405180910390fd5b80600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411156110fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f390614d13565b60405180910390fd5b60025460095482011115611145576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113c90614b93565b60405180910390fd5b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460096000828254039250508190555080600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550806009600082825401925050819055505050565b6000600254905090565b60003390506000611207828661328d565b90506001600281111561121657fe5b8160030160009054906101000a900460ff16600281111561123357fe5b14611273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126a90614df3565b60405180910390fd5b6000600554858161128057fe5b061480156112915750806002015484105b6112d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c790614b53565b60405180910390fd5b600554848260020154031080156112ed5750838160020154038351145b806112fa57506005548351145b611339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133090614bf3565b60405180910390fd5b6000151581600401600554868161134c57fe5b048154811061135757fe5b90600052602060002090602091828204019190069054906101000a900460ff161515146113b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b090614bd3565b60405180910390fd5b60006113c78387878761348c565b905080611409576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140090614cf3565b60405180910390fd5b600182600401600554878161141a57fe5b048154811061142557fe5b90600052602060002090602091828204019190066101000a81548160ff021916908315150217905550505050505050565b61145e613c45565b6000606061146b86612d2d565b91509150611477613a4f565b611481838361328d565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156115255780601f106114fa57610100808354040283529160200191611525565b820191906000526020600020905b81548152906001019060200180831161150857829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561157157fe5b600281111561157c57fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156115f457602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116115be5790505b505050505081525050905060028081111561160b57fe5b8160600151600281111561161b57fe5b1461165b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165290614e93565b60405180910390fd5b600554851115801561166d5750600085115b6116ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a390614bf3565b60405180910390fd5b806040015185870111156116f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ec90614b53565b60405180910390fd5b60006117038484898961353d565b80965081925050508061174b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174290614d73565b60405180910390fd5b505050509392505050565b60003390506000611767828461328d565b90506001600281111561177657fe5b8160030160009054906101000a900460ff16600281111561179357fe5b146117d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ca90614df3565b60405180910390fd5b60006001905060008260040180549050905060008090505b8181101561183e576000151584600401828154811061180657fe5b90600052602060002090602091828204019190069054906101000a900460ff161515141561183357600092505b8060010190506117eb565b508161187f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187690614d53565b60405180910390fd5b60028360030160006101000a81548160ff021916908360028111156118a057fe5b021790555060006118b185876135d0565b9050806118f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ea90614bb3565b60405180910390fd5b505050505050565b60606000606061190a84612d2d565b91509150606061191982612ac9565b90506000600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008090505b8251811015611a235760008260010184838151811061197f57fe5b60200260200101516040516119949190614aa1565b908152602001604051809103902054116119e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119da90614cb3565b60405180910390fd5b816002018382815181106119f357fe5b6020026020010151604051611a089190614aa1565b90815260200160405180910390209150806001019050611964565b5080600001805480602002602001604051908101604052809291908181526020016000905b82821015611beb57838290600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611b045780601f10611ad957610100808354040283529160200191611b04565b820191906000526020600020905b815481529060010190602001808311611ae757829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115611b5057fe5b6002811115611b5b57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015611bd357602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411611b9d5790505b50505050508152505081526020019060010190611a48565b50505050945050505050919050565b600360009054906101000a900460ff16611c3d57612000600481905550621000006005819055506001600360006101000a81548160ff0219169083151502179055505b60003390506305f5e100821115611c89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8090614db3565b60405180910390fd5b600660008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205483011115611d4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4390614e33565b60405180910390fd5b6060611d5784612ac9565b90506000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015611e6857600082600101846001840381518110611dc157fe5b6020026020010151604051611dd69190614aa1565b90815260200160405180910390205411611e25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1c90614cb3565b60405180910390fd5b81600201836001830381518110611e3857fe5b6020026020010151604051611e4d9190614aa1565b90815260200160405180910390209150806001019050611da3565b50600454816000018054905010611eb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eab90614dd3565b60405180910390fd5b60606001835111611ec55785611ede565b82600184510381518110611ed557fe5b60200260200101515b905060008260010182604051611ef49190614ab8565b90815260200160405180910390205414611f43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3a90614e13565b60405180910390fd5b611f4c816130af565b611f8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8290614d93565b60405180910390fd5b6000611f98858888613634565b905080611fda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd190614e73565b60405180910390fd5b6060600554600160055489010381611fee57fe5b0460405190808252806020026020018201604052801561201d5781602001602082028038833980820191505090505b509050836000016040518060a001604052808581526020016001151581526020018981526020016001600281111561205157fe5b8152602001838152509080600181540180825580915050600190039060005260206000209060050201600090919091909150600082015181600001908051906020019061209f929190613a8b565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff021916908360028111156120ee57fe5b0217905550608082015181600401908051906020019061210f929190613b0b565b5050508360000180549050846001018460405161212c9190614ab8565b90815260200160405180910390208190555086600760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505050505050505050565b60003390506121a2613a4f565b6121ac828461328d565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156122505780601f1061222557610100808354040283529160200191612250565b820191906000526020600020905b81548152906001019060200180831161223357829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561229c57fe5b60028111156122a757fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561231f57602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116122e95790505b50505050508152505090506000600281111561233757fe5b8160600151600281111561234757fe5b1415612388576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161237f90614c13565b60405180910390fd5b600061239483856136a1565b9050806123d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123cd90614c73565b60405180910390fd5b60606123e185612ac9565b90506000600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015612479578160020183600183038151811061244957fe5b602002602001015160405161245e9190614aa1565b9081526020016040518091039020915080600101905061242d565b50600060018260010186600001516040516124949190614aa1565b9081526020016040518091039020540390506124ae613a4f565b826000016001846000018054905003815481106124c757fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156125795780601f1061254e57610100808354040283529160200191612579565b820191906000526020600020905b81548152906001019060200180831161255c57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff1660028111156125c557fe5b60028111156125d057fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561264857602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116126125790505b50505050508152505090508083600001838154811061266357fe5b9060005260206000209060050201600082015181600001908051906020019061268d929190613a8b565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff021916908360028111156126dc57fe5b021790555060808201518160040190805190602001906126fd929190613b0b565b509050508260000180548061270e57fe5b6001900381819060005260206000209060050201600080820160006127339190613bb1565b6001820160006101000a81549060ff021916905560028201600090556003820160006101000a81549060ff02191690556004820160006127739190613bf9565b5050905582600101866000015160405161278d9190614aa1565b9081526020016040518091039020548360010182600001516040516127b29190614aa1565b90815260200160405180910390208190555060008360010187600001516040516127dc9190614aa1565b9081526020016040518091039020819055508560400151600760008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505050505050505050565b600080606061285784612d2d565b91509150612863613a4f565b61286d838361328d565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156129115780601f106128e657610100808354040283529160200191612911565b820191906000526020600020905b8154815290600101906020018083116128f457829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561295d57fe5b600281111561296857fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156129e057602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116129aa5790505b5050505050815250509050600160028111156129f857fe5b81606001516002811115612a0857fe5b1480612a2d5750600280811115612a1b57fe5b81606001516002811115612a2b57fe5b145b612a6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a6390614df3565b60405180910390fd5b6000612a788484613705565b809650819250505080612ac0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ab790614e53565b60405180910390fd5b50505050919050565b6060612ad3613c6a565b612adc8361376e565b9050612ae6613c6a565b612b246040518060400160405280600181526020017f2f0000000000000000000000000000000000000000000000000000000000000081525061376e565b905060606001612b3d838561379c90919063ffffffff16565b01604051908082528060200260200182016040528015612b7157816020015b6060815260200190600190039081612b5c5790505b50905060008090505b8151811015612bc257612b9e612b99848661381190919063ffffffff16565b61382b565b828281518110612baa57fe5b60200260200101819052508080600101915050612b7a565b50600081600183510381518110612bd557fe5b6020026020010151511415612c405780600182510381518110612bf457fe5b6020026020010160608152506001815103604051908082528060200260200182016040528015612c3857816020015b6060815260200190600190039081612c235790505b509350612c79565b8051604051908082528060200260200182016040528015612c7557816020015b6060815260200190600190039081612c605790505b5093505b60008090505b8451811015612cc057818181518110612c9457fe5b6020026020010151858281518110612ca857fe5b60200260200101819052508080600101915050612c7f565b50505050919050565b60008060016020601f85510181612cdc57fe5b040190506040518481526020810160005b83811015612d0e578060200286015181602002830152806001019050612ced565b50602082602085026040018460006010600019f1935050505092915050565b6000606060006028905080845111612d7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d7190614c93565b60405180910390fd5b6060816040519080825280601f01601f191660200182016040528015612daf5781602001600182028038833980820191505090505b50905060008090505b82811015612e1f57858181518110612dcc57fe5b602001015160f81c60f81b828281518110612de357fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050612db8565b50600080905060008090505b83811015612f4e576000838281518110612e4157fe5b602001015160f81c60f81b60f81c60ff16905060308110158015612e66575060398111155b80612e7f575060418110158015612e7e5750605a8111155b5b80612e98575060618110158015612e97575060668111155b5b612ed7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ece90614c93565b60405180910390fd5b60308110158015612ee9575060398111155b15612efa5760308103601084020192505b60418110158015612f0c5750605a8111155b15612f1d5760378103601084020192505b60618110158015612f2f575060668111155b15612f405760578103601084020192505b508080600101915050612e2b565b508094507f2f00000000000000000000000000000000000000000000000000000000000000868481518110612f7f57fe5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612fec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fe390614c93565b60405180910390fd5b6000600184885103039050806040519080825280601f01601f19166020018201604052801561302a5781602001600182028038833980820191505090505b50945060008090505b818110156130a5576000886001878401018151811061304e57fe5b602001015160f81c60f81b90508087838151811061306857fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350508080600101915050613033565b5050505050915091565b60006040516020016130c090614ae4565b60405160208183030381529060405280519060200120826040516020016130e79190614ab8565b604051602081830303815290604052805190602001201480613152575060405160200161311390614acf565b604051602081830303815290604052805190602001208260405160200161313a9190614ab8565b60405160208183030381529060405280519060200120145b8061315e575060008251145b1561316c576000905061318b565b60008251905060ff81111561318557600091505061318b565b60019150505b919050565b60008060016020601f855101816131a357fe5b040190506040518481526020810160005b838110156131d55780602002860151816020028301528060010190506131b4565b5060208260208502604001846000600f600019f1935050505092915050565b600073d2001000000000000000000000000000000000d273ffffffffffffffffffffffffffffffffffffffff166383e781fe6040518163ffffffff1660e01b815260040160206040518083038186803b15801561325057600080fd5b505afa158015613264573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506132889190810190613e2f565b905090565b6000606061329a83612ac9565b90506000600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b82518110156133ab5760008260010184600184038151811061330457fe5b60200260200101516040516133199190614aa1565b90815260200160405180910390205411613368576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161335f90614cb3565b60405180910390fd5b8160020183600183038151811061337b57fe5b60200260200101516040516133909190614aa1565b908152602001604051809103902091508060010190506132e6565b50606060018351116133bd57846133d6565b826001845103815181106133cd57fe5b60200260200101515b9050600082600101826040516133ec9190614ab8565b9081526020016040518091039020541161343b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161343290614cb3565b60405180910390fd5b600082600001600184600101846040516134559190614ab8565b908152602001604051809103902054038154811061346f57fe5b906000526020600020906005020190508094505050505092915050565b60008060016020601f8551018161349f57fe5b04019050600060016020601f885101816134b557fe5b040190506040518781526020810160005b838110156134e75780602002890151816020028301528060010190506134c6565b50868360200282015260005b8481101561351957806020028701518185600101016020028301528060010190506134f3565b50602082848601602002606001846000600c600019f1945050505050949350505050565b6000613547613c45565b600060016020601f8851018161355957fe5b0401905060006020601f86018161356c57fe5b0490506040518881526020810160005b8481101561359d57806020028a01518160200283015280600101905061357c565b5083602002810188815287816020015283602002868660030160200285600a600019fa9650505050505094509492505050565b60008060016020601f855101816135e357fe5b040190506040518481526020810160005b838110156136155780602002860151816020028301528060010190506135f4565b50602082602085026040018460006011600019f1935050505092915050565b60008060016020601f8651018161364757fe5b040190506040518581526020810160005b83811015613679578060200287015181602002830152806001019050613658565b50846020840282015260208260208502604001846000600b600019f193505050509392505050565b60008060016020601f855101816136b457fe5b040190506040518481526020810160005b838110156136e65780602002860151816020028301528060010190506136c5565b5060208260208502604001846000600e600019f1935050505092915050565b600080600060016020601f8651018161371a57fe5b040190506040518581526020810160005b8381101561374c57806020028701518160200283015280600101905061372b565b506020826020850260200184600d600019fa9450815193505050509250929050565b613776613c6a565b600060208301905060405180604001604052808451815260200182815250915050919050565b60008082600001516137c0856000015186602001518660000151876020015161388d565b0190505b8360000151846020015101811161380a578180600101925050826000015161380285602001518303866000015103838660000151876020015161388d565b0190506137c4565b5092915050565b613819613c6a565b613824838383613968565b5092915050565b60608082600001516040519080825280601f01601f1916602001820160405280156138655781602001600182028038833980820191505090505b50905060006020820190506138838185602001518660000151613a06565b8192505050919050565b6000808490506000868511613958576020851161391257600060018660200360080260020a031960001b905060008186511690506000878a8a0103905060008386511690505b828114613904578186106138f1578a8a019650505050505050613960565b85806001019650508386511690506138d3565b859650505050505050613960565b60008585209050600091505b85880382116139565760008684209050808214156139425783945050505050613960565b60018401935050818060010192505061391e565b505b868601925050505b949350505050565b613970613c6a565b600061398e856000015186602001518660000151876020015161388d565b905084602001518360200181815250508460200151810383600001818152505084600001518560200151018114156139d05760008560000181815250506139fb565b8360000151836000015101856000018181510391508181525050836000015181018560200181815250505b829150509392505050565b5b60208110613a2a5781518352602083019250602082019150602081039050613a07565b60006001826020036101000a0390508019835116818551168181178652505050505050565b6040518060a00160405280606081526020016000151581526020016000815260200160006002811115613a7e57fe5b8152602001606081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613acc57805160ff1916838001178555613afa565b82800160010185558215613afa579182015b82811115613af9578251825591602001919060010190613ade565b5b509050613b079190613c84565b5090565b82805482825590600052602060002090601f01602090048101928215613ba05791602002820160005b83821115613b7157835183826101000a81548160ff0219169083151502179055509260200192600101602081600001049283019260010302613b34565b8015613b9e5782816101000a81549060ff0219169055600101602081600001049283019260010302613b71565b505b509050613bad9190613ca9565b5090565b50805460018160011615610100020316600290046000825580601f10613bd75750613bf6565b601f016020900490600052602060002090810190613bf59190613c84565b5b50565b50805460008255601f016020900490600052602060002090810190613c1e9190613c84565b50565b5080546000825560050290600052602060002090810190613c429190613cd9565b50565b6040518062100000016040528061800090602082028038833980820191505090505090565b604051806040016040528060008152602001600081525090565b613ca691905b80821115613ca2576000816000905550600101613c8a565b5090565b90565b613cd691905b80821115613cd257600081816101000a81549060ff021916905550600101613caf565b5090565b90565b613d4591905b80821115613d415760008082016000613cf89190613bb1565b6001820160006101000a81549060ff021916905560028201600090556003820160006101000a81549060ff0219169055600482016000613d389190613bf9565b50600501613cdf565b5090565b90565b600081359050613d578161510d565b92915050565b600081519050613d6c8161510d565b92915050565b600082601f830112613d8357600080fd5b8135613d96613d9182614efb565b614ece565b91508082526020830160208301858383011115613db257600080fd5b613dbd8382846150ad565b50505092915050565b600082601f830112613dd757600080fd5b8135613dea613de582614f27565b614ece565b91508082526020830160208301858383011115613e0657600080fd5b613e118382846150ad565b50505092915050565b600081359050613e2981615124565b92915050565b600060208284031215613e4157600080fd5b6000613e4f84828501613d5d565b91505092915050565b60008060408385031215613e6b57600080fd5b6000613e7985828601613d48565b9250506020613e8a85828601613e1a565b9150509250929050565b600060208284031215613ea657600080fd5b600082013567ffffffffffffffff811115613ec057600080fd5b613ecc84828501613dc6565b91505092915050565b60008060408385031215613ee857600080fd5b600083013567ffffffffffffffff811115613f0257600080fd5b613f0e85828601613dc6565b9250506020613f1f85828601613e1a565b9150509250929050565b600080600060608486031215613f3e57600080fd5b600084013567ffffffffffffffff811115613f5857600080fd5b613f6486828701613dc6565b9350506020613f7586828701613e1a565b925050604084013567ffffffffffffffff811115613f9257600080fd5b613f9e86828701613d72565b9150509250925092565b600080600060608486031215613fbd57600080fd5b600084013567ffffffffffffffff811115613fd757600080fd5b613fe386828701613dc6565b9350506020613ff486828701613e1a565b925050604061400586828701613e1a565b9150509250925092565b600061401b838361417d565b60208301905092915050565b6000614033838361418c565b60208301905092915050565b600061404b8383614a06565b905092915050565b600061405e82614f7d565b6140688185614fdc565b935061407383614f53565b8060005b838110156140a457815161408b888261400f565b975061409683614fb5565b925050600181019050614077565b5085935050505092915050565b6140ba81614f88565b6140c48184614fed565b92506140cf82614f63565b8060005b838110156141005781516140e78782614027565b96506140f283614fc2565b9250506001810190506140d3565b505050505050565b600061411382614f94565b61411d8185614ff8565b93508360208202850161412f85614f6d565b8060005b8581101561416b578484038952815161414c858261403f565b945061415783614fcf565b925060208a01995050600181019050614133565b50829750879550505050505092915050565b61418681615048565b82525050565b61419581615054565b82525050565b6141a48161509b565b82525050565b6141b38161509b565b82525050565b60006141c482614faa565b6141ce818561502b565b93506141de8185602086016150bc565b80840191505092915050565b60006141f582614f9f565b6141ff8185615009565b935061420f8185602086016150bc565b614218816150ef565b840191505092915050565b600061422e82614f9f565b614238818561502b565b93506142488185602086016150bc565b80840191505092915050565b600061426160188361501a565b91507f496e636f7272656374206368756e6b20706f736974696f6e00000000000000006000830152602082019050919050565b60006142a160158361501a565b91507f4469726563746f7279206e6f74206372656174656400000000000000000000006000830152602082019050919050565b60006142e160248361501a565b91507f4e6f7420656e6f756768206d656d6f727920696e207468652046696c6573746f60008301527f72616765000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614347601b8361501a565b91507f48617368206861736e2774206265656e2063616c63756c6174656400000000006000830152602082019050919050565b600061438760198361501a565b91507f4368756e6b20697320616c72656164792075706c6f61646564000000000000006000830152602082019050919050565b60006143c760168361501a565b91507f496e636f7272656374206368756e6b206c656e677468000000000000000000006000830152602082019050919050565b6000614407600f8361501a565b91507f46696c65206e6f742065786973747300000000000000000000000000000000006000830152602082019050919050565b6000614447600e8361501a565b91507f496e76616c69642073656e6465720000000000000000000000000000000000006000830152602082019050919050565b600061448760188361501a565b91507f4469726563746f7279206973206e6f742064656c6574656400000000000000006000830152602082019050919050565b60006144c760108361501a565b91507f46696c65206e6f742064656c65746564000000000000000000000000000000006000830152602082019050919050565b600061450760138361501a565b91507f496e76616c69642073746f7261676550617468000000000000000000000000006000830152602082019050919050565b6000614547600c8361501a565b91507f496e76616c6964207061746800000000000000000000000000000000000000006000830152602082019050919050565b600061458760018361502b565b91507f2e000000000000000000000000000000000000000000000000000000000000006000830152600182019050919050565b60006145c760168361501a565b91507f496e76616c6964206469726563746f7279206e616d65000000000000000000006000830152602082019050919050565b600061460760158361501a565b91507f4368756e6b207761736e27742075706c6f6164656400000000000000000000006000830152602082019050919050565b600061464760268361501a565b91507f436f756c64206e6f742072657365727665206c657373207468616e207573656460008301527f20737061636500000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006146ad60168361501a565b91507f4469726563746f7279206973206e6f7420656d707479000000000000000000006000830152602082019050919050565b60006146ed60238361501a565b91507f46696c65206861736e2774206265656e2075706c6f6164656420636f7272656360008301527f746c7900000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061475360118361501a565b91507f4368756e6b207761736e277420726561640000000000000000000000000000006000830152602082019050919050565b600061479360188361501a565b91507f46696c656e616d652073686f756c64206265203c2032353600000000000000006000830152602082019050919050565b60006147d3601f8361501a565b91507f46696c652073686f756c64206265206c657373207468616e20313030204d42006000830152602082019050919050565b600061481360028361502b565b91507f2e2e0000000000000000000000000000000000000000000000000000000000006000830152600282019050919050565b600061485360118361501a565b91507f4469726563746f72792069732066756c6c0000000000000000000000000000006000830152602082019050919050565b6000614893600e8361501a565b91507f46696c65206e6f7420666f756e640000000000000000000000000000000000006000830152602082019050919050565b60006148d360188361501a565b91507f46696c65206f72206469726563746f72792065786973747300000000000000006000830152602082019050919050565b600061491360198361501a565b91507f4e6f7420656e6f756768207265736572766564207370616365000000000000006000830152602082019050919050565b600061495360188361501a565b91507f45564d206572726f7220696e2067657446696c6553697a6500000000000000006000830152602082019050919050565b600061499360108361501a565b91507f46696c65206e6f742063726561746564000000000000000000000000000000006000830152602082019050919050565b60006149d360198361501a565b91507f46696c65206861736e2774206265656e2075706c6f61646564000000000000006000830152602082019050919050565b600060a0830160008301518482036000860152614a2382826141ea565b9150506020830151614a38602086018261417d565b506040830151614a4b6040860182614a83565b506060830151614a5e606086018261419b565b5060808301518482036080860152614a768282614053565b9150508091505092915050565b614a8c81615091565b82525050565b614a9b81615091565b82525050565b6000614aad8284614223565b915081905092915050565b6000614ac482846141b9565b915081905092915050565b6000614ada8261457a565b9150819050919050565b6000614aef82614806565b9150819050919050565b60006210000082019050614b1060008301846140b1565b92915050565b60006020820190508181036000830152614b308184614108565b905092915050565b6000602082019050614b4d60008301846141aa565b92915050565b60006020820190508181036000830152614b6c81614254565b9050919050565b60006020820190508181036000830152614b8c81614294565b9050919050565b60006020820190508181036000830152614bac816142d4565b9050919050565b60006020820190508181036000830152614bcc8161433a565b9050919050565b60006020820190508181036000830152614bec8161437a565b9050919050565b60006020820190508181036000830152614c0c816143ba565b9050919050565b60006020820190508181036000830152614c2c816143fa565b9050919050565b60006020820190508181036000830152614c4c8161443a565b9050919050565b60006020820190508181036000830152614c6c8161447a565b9050919050565b60006020820190508181036000830152614c8c816144ba565b9050919050565b60006020820190508181036000830152614cac816144fa565b9050919050565b60006020820190508181036000830152614ccc8161453a565b9050919050565b60006020820190508181036000830152614cec816145ba565b9050919050565b60006020820190508181036000830152614d0c816145fa565b9050919050565b60006020820190508181036000830152614d2c8161463a565b9050919050565b60006020820190508181036000830152614d4c816146a0565b9050919050565b60006020820190508181036000830152614d6c816146e0565b9050919050565b60006020820190508181036000830152614d8c81614746565b9050919050565b60006020820190508181036000830152614dac81614786565b9050919050565b60006020820190508181036000830152614dcc816147c6565b9050919050565b60006020820190508181036000830152614dec81614846565b9050919050565b60006020820190508181036000830152614e0c81614886565b9050919050565b60006020820190508181036000830152614e2c816148c6565b9050919050565b60006020820190508181036000830152614e4c81614906565b9050919050565b60006020820190508181036000830152614e6c81614946565b9050919050565b60006020820190508181036000830152614e8c81614986565b9050919050565b60006020820190508181036000830152614eac816149c6565b9050919050565b6000602082019050614ec86000830184614a92565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614ef157600080fd5b8060405250919050565b600067ffffffffffffffff821115614f1257600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614f3e57600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050919050565b6000819050602082019050919050565b600081519050919050565b60006180009050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061504182615071565b9050919050565b60008115159050919050565b6000819050919050565b600081905061506c82615100565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006150a68261505e565b9050919050565b82818337600083830152505050565b60005b838110156150da5780820151818401526020810190506150bf565b838111156150e9576000848401525b50505050565b6000601f19601f8301169050919050565b6003811061510a57fe5b50565b61511681615036565b811461512157600080fd5b50565b61512d81615091565b811461513857600080fd5b5056fea2646970667358221220a549ad9e778ae8bb3048c0a1805e77745871cc1560637ae1c3ebccb76638d9c464736f6c63430006020033", + "nonce": "0", + "storage": {} + }, + "0xa096b05a489831db893fc53aacc7ed20efb36382": { + "balance": "1000000000000000000000000000000" + }, + "0xa1cd651d99283be60e2a9d2e3bc8a90aedb8244f": { + "balance": "1000000000000000000000000000000" + }, + "0xa2969e82619021ea407338f8bdf7c6f2bd679673": { + "balance": "1000000000000000000000000000000" + }, + "0xa3597b1162b6559cb5e966904b63e762ece756a4": { + "balance": "1000000000000000000000000000000" + }, + "0xa68f946090c600eda6f139783077ee802afeb990": { + "balance": "1000000000000000000000000000000" + }, + "0xa6d50055592cecb795bc1ed3b9ea57ed426b0b7c": { + "balance": "1000000000000000000000000000000" + }, + "0xa7c0789bdeee38c6b59111a789dfb6b815489847": { + "balance": "1000000000000000000000000000000" + }, + "0xa8c813ee806b4c8537ff5f16084d44db18ea9ab1": { + "balance": "1000000000000000000000000000000" + }, + "0xaa6a87bbb74bc1f3cb40c1efb7fc171ee6407560": { + "balance": "1000000000000000000000000000000" + }, + "0xabf920b89f5a2487fdb70be17fd01a99a0602e62": { + "balance": "1000000000000000000000000000000" + }, + "0xac5df92da5171ba24a9618018b4f79494040334b": { + "balance": "1000000000000000000000000000000" + }, + "0xaf97a8318a1a51d5daeeb9650024b63ee44f45bd": { + "balance": "1000000000000000000000000000000" + }, + "0xb28c45b98ae43a5e9ee5509c97ea037b5de5d6d9": { + "balance": "1000000000000000000000000000000" + }, + "0xb64989ab32b089da3da103b93e6781d6d5dd10b4": { + "balance": "1000000000000000000000000000000" + }, + "0xb67e6f4a21f93c250fa6ff0cb142bd14dd4ca8eb": { + "balance": "1000000000000000000000000000000" + }, + "0xb70603c505f85130b5b2e73cd82d196dfd7d8b5e": { + "balance": "1000000000000000000000000000000" + }, + "0xb942414cae2a1ab1056657b905845c0ab6b6280a": { + "balance": "1000000000000000000000000000000" + }, + "0xbee0e5c1961d51be9bd670876caa9c90ba7d9016": { + "balance": "1000000000000000000000000000000" + }, + "0xbf2d8cebdeeb8ad8fed7b2a75f35922106f8d75c": { + "balance": "1000000000000000000000000000000" + }, + "0xbf5aa678b969c0871e2fbcf09c3dbb5d5865ac1e": { + "balance": "1000000000000000000000000000000" + }, + "0xc12bcedd9bcad9120150122cd50f39576ecccc08": { + "balance": "1000000000000000000000000000000" + }, + "0xc2d3852f3292acb81bd164dbae5f1e2a87535150": { + "balance": "1000000000000000000000000000000" + }, + "0xc3820490201e94d76b44655d2df713fec29d9795": { + "balance": "1000000000000000000000000000000" + }, + "0xc58744e2eceefd45cc5469f0e0a708ad24ddbbdb": { + "balance": "1000000000000000000000000000000" + }, + "0xc7865200e8e51ba1c8d695f327deed432930f2cc": { + "balance": "1000000000000000000000000000000" + }, + "0xc8e4d709eb3eb335dc69c9fbf2d24d447cb86105": { + "balance": "1000000000000000000000000000000" + }, + "0xc98af661e44c5bf31d2f8bdff4bbf2808ed4e991": { + "balance": "1000000000000000000000000000000" + }, + "0xca4409573a5129a72edf85d6c51e26760fc9c903": { + "balance": "100000000000000000000000" + }, + "0xcc33e23b04b74f7ba8fbe315083182224af973fa": { + "balance": "1000000000000000000000000000000" + }, + "0xce1c62d0a77600fb2f959b4da76fcb9b3b9430a3": { + "balance": "1000000000000000000000000000000" + }, + "0xd1b6c947fb14060b38945584714491592e84875d": { + "balance": "1000000000000000000000000000000" + }, + "0xd23cd6a9ddcc3470300003621bbac1e06a7919d5": { + "balance": "1000000000000000000000000000000" + }, + "0xd2c5b39B4e735C17612Bb5a08FD024ccc5dBCb23": { + "balance": "100000000000000000000000" + }, + "0xd2cd302eb060e375a65d65946692a3ac2d838d35": { + "balance": "1000000000000000000000000000000" + }, + "0xd2e75c41ced8699e3176f6e335355701a2568b7b": { + "balance": "1000000000000000000000000000000" + }, + "0xd3d38f4cb0aeb4c7c2527ddaeec2ab3b910c8528": { + "balance": "1000000000000000000000000000000" + }, + "0xd5b561a27cca5049650a14ab93dbf1a20c0cefc1": { + "balance": "1000000000000000000000000000000" + }, + "0xd90045420b8abc37b3f9304ed2b385fc1b7fa8c5": { + "balance": "1000000000000000000000000000000" + }, + "0xd951bf4cff429062702a7d8699a5f0bf14845d9b": { + "balance": "1000000000000000000000000000000" + }, + "0xdc6a269c58e58a93a22b5df8cdf1af630c47481f": { + "balance": "1000000000000000000000000000000" + }, + "0xdc6d02ef4003a4f2d0ccff65ae1a2d8157fbb23e": { + "balance": "1000000000000000000000000000000" + }, + "0xde14aca36acc62c305a7ee571da37840a408e600": { + "balance": "1000000000000000000000000000000" + }, + "0xdee32ae508cf783f53ab8bc39d878fe323cdfae3": { + "balance": "1000000000000000000000000000000" + }, + "0xe083a100d51fc4f38aae4a3a68404c36ad96c612": { + "balance": "1000000000000000000000000000000" + }, + "0xe1607990ce800407e3c206e58de4917977181d4d": { + "balance": "1000000000000000000000000000000" + }, + "0xe25e5b63dfd4cf59b81eddf64f1195858634b8a6": { + "balance": "1000000000000000000000000000000" + }, + "0xe372377decb3bdc0c7f5272d38ce0ba2a54934fe": { + "balance": "1000000000000000000000000000000" + }, + "0xe3cc6ec63b5652d1594bc63bb293f4e80f76dbdd": { + "balance": "1000000000000000000000000000000" + }, + "0xe3da7c014286258944ab20a31e4d861b4c9262f1": { + "balance": "1000000000000000000000000000000" + }, + "0xe8b57f330d56081c856e618210fbedb414925ff0": { + "balance": "1000000000000000000000000000000" + }, + "0xe91ac72a568e752eb7c9f5235100586ce97c8cc1": { + "balance": "1000000000000000000000000000000" + }, + "0xf184c8c243a178c1748a0af45caedeca476105b4": { + "balance": "1000000000000000000000000000000" + }, + "0xf1a5912ff318aebf312cdb54c75642a9e632703c": { + "balance": "1000000000000000000000000000000" + }, + "0xf2197b153b4c9086fc5410431fbf7960d284c65e": { + "balance": "1000000000000000000000000000000" + }, + "0xf36620e71327f4a55d550d46e030ccf0c728f154": { + "balance": "1000000000000000000000000000000" + }, + "0xf9817fB82fc767aA9A4A97a1901676244b88ce0E": { + "balance": "100000000000000000000000" + }, + "0xfa723938fa8da1a8a2114ad409a11581761ee40d": { + "balance": "1000000000000000000000000000000" + }, + "0xfa7a8c69810eaf16a395d2a93b3ab51efeed2a1c": { + "balance": "1000000000000000000000000000000" + }, + "0xfaa1038074941571524934ba52d312e88b3577f5": { + "balance": "1000000000000000000000000000000" + }, + "0xfe14077c26a507496b7208384d459e21c49c4212": { + "balance": "1000000000000000000000000000000" + }, + "0xfe275c9b5ac792327da509b27eb9614196dfb07d": { + "balance": "1000000000000000000000000000000" + }, + "0xfe2c5aa110fff89361806ea7ee080bfffba0d3dd": { + "balance": "1000000000000000000000000000000" + }, + "0xfe3d4f1fc038f4f756ba44995129cd45c9e0e861": { + "balance": "1000000000000000000000000000000" + }, + "0xfee314cdc84ecfaa675e41b3559c0101e1eba6b8": { + "balance": "1000000000000000000000000000000" + } + }, + "genesis": { + "author": "0x0000000000000000000000000000000000000001", + "difficulty": "0x0", + "extraData": "0x11bbe8db4e347b4e8c937c1c8370e4b5ed33adb3db69cbdb7a38e1e50b1b82fa", + "gasLimit": "0xFFFFFFFFF", + "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000abc", + "nonce": "0x0000000000000042", + "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "timestamp": "0x00" + }, + "params": { + "EIP150ForkBlock": "0x00", + "EIP158ForkBlock": "0x00", + "accountStartNonce": "0x00", + "blockReward": "0x4563918244F40000", + "byzantiumForkBlock": "0x0", + "chainID": "0x12345", + "constantinopleForkBlock": "0x0", + "daoHardforkBlock": "0x0", + "difficultyBoundDivisor": "0x0800", + "durationLimit": "0x0d", + "externalGasDifficulty": "0x01", + "gasLimitBoundDivisor": "0x0400", + "homesteadForkBlock": "0x0", + "maxGasLimit": "0xFFFFFFFFF", + "maximumExtraDataSize": "0x20", + "minGasLimit": "0xFFFFFFFFF", + "minimumDifficulty": "0x0", + "networkID": "12313219", + "tieBreakingGas": false + }, + "sealEngine": "Ethash", + "skaleConfig": { + "nodeInfo": { + "basePort": 1931, + "bindIP": "0.0.0.0", + "collectionDuration": 10, + "collectionQueueSize": 2, + "db-path": "/tmp/test_eth_8_of_16", + "ecdsaKeyName": "", + "httpRpcPort": 1934, + "httpsRpcPort": 1239, + "logLevel": "info", + "logLevelProposal": "info", + "maxCacheSize": 2000, + "maxOpenLeveldbFiles": 25, + "minCacheSize": 1000, + "nodeID": 1608, + "nodeName": "Node1", + "rotateAfterBlock": 0, + "testSignatures": true, + "transactionQueueSize": 10000, + "wsRpcPort": 1933, + "wssRpcPort": 1938 + }, + "sChain": { + "EIP1559TransactionsPatchTimestamp": 1, + "contractStorageLimit": 10000000000, + "contractStoragePatchTimestamp": 1, + "contractStorageZeroValuePatchTimestamp": 1, + "correctForkInPowPatchTimestamp": 1, + "emptyBlockIntervalMs": 10000, + "fastConsensusPatchTimestamp": 1, + "flexibleDeploymentPatchTimestamp": 1, + "levelDBReopenIntervalMs": 1, + "multiTransactionMode": false, + "nodes": [ + { + "basePort": 1231, + "ip": "127.0.0.1", + "nodeID": 1601, + "publicKey": "", + "schainIndex": 1 + }, + { + "basePort": 1331, + "ip": "127.0.0.1", + "nodeID": 1602, + "publicKey": "", + "schainIndex": 2 + }, + { + "basePort": 1431, + "ip": "127.0.0.1", + "nodeID": 1603, + "publicKey": "", + "schainIndex": 3 + }, + { + "basePort": 1531, + "ip": "127.0.0.1", + "nodeID": 1604, + "publicKey": "", + "schainIndex": 4 + }, + { + "basePort": 1631, + "ip": "127.0.0.1", + "nodeID": 1605, + "publicKey": "", + "schainIndex": 5 + }, + { + "basePort": 1731, + "ip": "127.0.0.1", + "nodeID": 1606, + "publicKey": "", + "schainIndex": 6 + }, + { + "basePort": 1831, + "ip": "127.0.0.1", + "nodeID": 1607, + "publicKey": "", + "schainIndex": 7 + }, + { + "basePort": 1931, + "ip": "127.0.0.1", + "nodeID": 1608, + "publicKey": "", + "schainIndex": 8 + }, + { + "basePort": 2031, + "ip": "127.0.0.1", + "nodeID": 1609, + "publicKey": "", + "schainIndex": 9 + }, + { + "basePort": 2131, + "ip": "127.0.0.1", + "nodeID": 1610, + "publicKey": "", + "schainIndex": 10 + }, + { + "basePort": 2231, + "ip": "127.0.0.1", + "nodeID": 1611, + "publicKey": "", + "schainIndex": 11 + }, + { + "basePort": 2331, + "ip": "127.0.0.1", + "nodeID": 1612, + "publicKey": "", + "schainIndex": 12 + }, + { + "basePort": 2431, + "ip": "127.0.0.1", + "nodeID": 1613, + "publicKey": "", + "schainIndex": 13 + }, + { + "basePort": 2531, + "ip": "127.0.0.1", + "nodeID": 1614, + "publicKey": "", + "schainIndex": 14 + }, + { + "basePort": 2631, + "ip": "127.0.0.1", + "nodeID": 1615, + "publicKey": "", + "schainIndex": 15 + }, + { + "basePort": 2731, + "ip": "127.0.0.1", + "nodeID": 1616, + "publicKey": "", + "schainIndex": 16 + } + ], + "powCheckPatchTimestamp": 1, + "precompiledConfigPatchTimestamp": 1, + "pushZeroPatchTimestamp": 1, + "revertableFSPatchTimestamp": 1, + "schainID": 5, + "schainName": "TestChain", + "schainOwner": "0x907cd0881E50d359bb9Fd120B1A5A143b1C97De6", + "skipInvalidTransactionsPatchTimestamp": 1, + "storageDestructionPatchTimestamp": 1, + "verifyBlsSyncPatchTimestamp": 1, + "verifyDaSigsPatchTimestamp": 1 + } + }, + "unddos": { + "origins": [ + { + "ban_lengthy": 0, + "ban_peak": 0, + "max_calls_per_minute": 1000000000, + "max_calls_per_second": 1000000000, + "max_ws_conn": 65535, + "origin": [ + "*" + ] + } + ] + } +} \ No newline at end of file diff --git a/test/historicstate/configs/test_9_of_16.json b/test/historicstate/configs/test_9_of_16.json new file mode 100644 index 000000000..d53dca104 --- /dev/null +++ b/test/historicstate/configs/test_9_of_16.json @@ -0,0 +1,910 @@ +{ + "accounts": { + "0000000000000000000000000000000000000001": { + "precompiled": { + "linear": { + "base": 3000, + "word": 0 + }, + "name": "ecrecover" + } + }, + "0000000000000000000000000000000000000002": { + "precompiled": { + "linear": { + "base": 60, + "word": 12 + }, + "name": "sha256" + } + }, + "0000000000000000000000000000000000000003": { + "precompiled": { + "linear": { + "base": 600, + "word": 120 + }, + "name": "ripemd160" + } + }, + "0000000000000000000000000000000000000004": { + "precompiled": { + "linear": { + "base": 15, + "word": 3 + }, + "name": "identity" + } + }, + "0000000000000000000000000000000000000005": { + "precompiled": { + "name": "modexp", + "startingBlock": "0x2dc6c0" + } + }, + "0000000000000000000000000000000000000006": { + "precompiled": { + "linear": { + "base": 500, + "word": 0 + }, + "name": "alt_bn128_G1_add", + "startingBlock": "0x2dc6c0" + } + }, + "0000000000000000000000000000000000000007": { + "precompiled": { + "linear": { + "base": 40000, + "word": 0 + }, + "name": "alt_bn128_G1_mul", + "startingBlock": "0x2dc6c0" + } + }, + "0000000000000000000000000000000000000008": { + "precompiled": { + "name": "alt_bn128_pairing_product", + "startingBlock": "0x2dc6c0" + } + }, + "000000000000000000000000000000000000000A": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "readChunk", + "startingBlock": "0x0" + } + }, + "000000000000000000000000000000000000000B": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "createFile", + "restrictAccess": [ + "69362535ec535F0643cBf62D16aDeDCAf32Ee6F7" + ], + "startingBlock": "0x0" + } + }, + "000000000000000000000000000000000000000C": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "uploadChunk", + "startingBlock": "0x0" + } + }, + "000000000000000000000000000000000000000D": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "getFileSize", + "startingBlock": "0x0" + } + }, + "000000000000000000000000000000000000000E": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "deleteFile", + "startingBlock": "0x0" + } + }, + "000000000000000000000000000000000000000F": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "createDirectory", + "startingBlock": "0x0" + } + }, + "0000000000000000000000000000000000000010": { + "precompiled": { + "linear": { + "base": 15, + "word": 0 + }, + "name": "deleteDirectory", + "startingBlock": "0x0" + } + }, + "0x006d8e49ce0b9eb5646e34a4d91934801b9044fd": { + "balance": "1000000000000000000000000000000" + }, + "0x0150b461b06922a5030784ba888962c28bb1f188": { + "balance": "1000000000000000000000000000000" + }, + "0x03309956988ae70152ae4469daf99b0cac2306c5": { + "balance": "1000000000000000000000000000000" + }, + "0x06104a85a380895b6dd4030113806df2b044905e": { + "balance": "1000000000000000000000000000000" + }, + "0x079cf317ef40b16141784b6fabff812d64f7c0fd": { + "balance": "1000000000000000000000000000000" + }, + "0x0966454f51166c68b73b2865473c8fb2fcdefdd5": { + "balance": "1000000000000000000000000000000" + }, + "0x099452fedc71897880f584b1bc1706efc4e76e36": { + "balance": "1000000000000000000000000000000" + }, + "0x0aa6a44690ef52354e976990292cf9c5cd36ad59": { + "balance": "1000000000000000000000000000000" + }, + "0x0fbbe17a0e5a61ee3e8661f442d7f6b177c49820": { + "balance": "1000000000000000000000000000000" + }, + "0x1239fe658b410dbbac5bbd572035f5041542f9e5": { + "balance": "1000000000000000000000000000000" + }, + "0x12d5d7340a93be7be28ea7a3ae198242f8e1282c": { + "balance": "1000000000000000000000000000000" + }, + "0x137048b9fa4f1234d6519271b2c5ec64f480db0f": { + "balance": "1000000000000000000000000000000" + }, + "0x13867af77a63048e17380e39248ada90521e97e4": { + "balance": "1000000000000000000000000000000" + }, + "0x138ea4bdf0382c2deffd5b0bff0afe59f471467f": { + "balance": "1000000000000000000000000000000" + }, + "0x13d19c55ee0a212249d26b9d741ff6d7f416db01": { + "balance": "1000000000000000000000000000000" + }, + "0x157d38b52196b248e9fe6a2172e32ce2b8c078e6": { + "balance": "1000000000000000000000000000000" + }, + "0x16e8c390f8e576161cfe966f2c3e5dd303eb9039": { + "balance": "1000000000000000000000000000000" + }, + "0x194cb9991d3d94c43e400becf21dfea45e7b3b4c": { + "balance": "1000000000000000000000000000000" + }, + "0x1C9abe4ff0CcECa40fc404c74AB7d4923fEF8901": { + "balance": "100000000000000000000000" + }, + "0x1a66fc89809112c20aa76a993db712fa9e003e4e": { + "balance": "1000000000000000000000000000000" + }, + "0x1f1d6041e12a18cf1202019f146f2fc150915e8d": { + "balance": "1000000000000000000000000000000" + }, + "0x1feaf1671c1f0faf0d44c152f72dc755db932569": { + "balance": "1000000000000000000000000000000" + }, + "0x236bf02dfafaf03851a4e6f5d69052f4884cec32": { + "balance": "1000000000000000000000000000000" + }, + "0x26d88f6a8b659be4165ee53774a057e41b5201c9": { + "balance": "1000000000000000000000000000000" + }, + "0x28353685b0b986a724b92113debb3d8cd9a6b263": { + "balance": "1000000000000000000000000000000" + }, + "0x29d83322219fdfb821459d5fdf796360faf3166a": { + "balance": "1000000000000000000000000000000" + }, + "0x2bee474be207bdbeac83d6672da5ed2fd417eac9": { + "balance": "1000000000000000000000000000000" + }, + "0x2d93455b07bccf38e8d019f7f43a2c2d70b46b4e": { + "balance": "1000000000000000000000000000000" + }, + "0x2f971bd38806c3ca45ae0a125d1267118bf5619c": { + "balance": "1000000000000000000000000000000" + }, + "0x30aaab366dfac8331f3e827495c789cde9b437c0": { + "balance": "1000000000000000000000000000000" + }, + "0x32ea0400dc2d20664cc4744b2fab04ecb709445c": { + "balance": "1000000000000000000000000000000" + }, + "0x3760dc9594ccac0f33ade5cc5371402131696341": { + "balance": "1000000000000000000000000000000" + }, + "0x38855e430611bc179cd777a8704679ffc43921de": { + "balance": "1000000000000000000000000000000" + }, + "0x3a921471a2397644c37c88ef9572c421ab37145d": { + "balance": "1000000000000000000000000000000" + }, + "0x3bcca8a8471d55a1a668bc163c0336e4a57e5c99": { + "balance": "1000000000000000000000000000000" + }, + "0x3d46ee560227c1d73cd6042b47fc8fddd8a06ecb": { + "balance": "1000000000000000000000000000000" + }, + "0x3f5bdf5d4c274c82b8d17aa2810b00d2cf050f24": { + "balance": "1000000000000000000000000000000" + }, + "0x3ffe1c9183e0f97f52a816405a7d2350624ec88b": { + "balance": "1000000000000000000000000000000" + }, + "0x426ec5f07847674aada3856609d8baaa16805d88": { + "balance": "1000000000000000000000000000000" + }, + "0x482d7f53cba6ae73a354533673c48e2dfd560949": { + "balance": "1000000000000000000000000000000" + }, + "0x48acbd6a2724eadcc2a11144ab84b6a617d1a241": { + "balance": "1000000000000000000000000000000" + }, + "0x49ef89840e400026eb5c8d79bd1b0adc152fe86d": { + "balance": "1000000000000000000000000000000" + }, + "0x4bf989fa6572af36b190032505506f1db888357f": { + "balance": "1000000000000000000000000000000" + }, + "0x4cf9b195f7cb5f86694d9b399fe21a5f34616fd3": { + "balance": "1000000000000000000000000000000" + }, + "0x4e9b85904bca60aeb5b916ca86ac622096908427": { + "balance": "1000000000000000000000000000000" + }, + "0x50120c17d7b59200e9b76e89e4e3de2f0cd00090": { + "balance": "1000000000000000000000000000000" + }, + "0x54db355342c35085a1a53184162b2fddd0a43b0f": { + "balance": "1000000000000000000000000000000" + }, + "0x54e228d8fea148cfe2b109b3b152ff21321d09a2": { + "balance": "1000000000000000000000000000000" + }, + "0x5667601b7dcde6f24d06bccc4f291cb06976f4ee": { + "balance": "1000000000000000000000000000000" + }, + "0x57829f2ecca390cd9d1c41f92328bad4d1073bbb": { + "balance": "1000000000000000000000000000000" + }, + "0x5EF25557E2ed6AFfF321B266C93e95A0B4B05AbC": { + "balance": "1000000000000000000000000" + }, + "0x5a3adad4382b3eb1e0c65f2de2845901081039b5": { + "balance": "1000000000000000000000000000000" + }, + "0x5cdb7392efdce502ccc6fba5c3c1dd1653967b4d": { + "balance": "1000000000000000000000000000000" + }, + "0x5d012c13b2854bda8b7b6580e97e52751884f827": { + "balance": "1000000000000000000000000000000" + }, + "0x5d9326c6504833d84f8a0d65ded59b1a6e768ca2": { + "balance": "1000000000000000000000000000000" + }, + "0x60268f799d8f1808e4a32c2eb898e73a8881f6f0": { + "balance": "1000000000000000000000000000000" + }, + "0x605ba4a05d779f9869bd9a10234c22f516766cfe": { + "balance": "1000000000000000000000000000000" + }, + "0x6093f0f2a7b5148b71603ac439adbc4c0e5aa5da": { + "balance": "1000000000000000000000000000000" + }, + "0x6196d135CdDb9d73A0756C1E44b5b02B11acf594": { + "balance": "2000000000000000000000", + "code": "", + "nonce": "5076", + "storage": {} + }, + "0x62712ceccb50f62ca4c5402fff6da9c819c866cf": { + "balance": "1000000000000000000000000000000" + }, + "0x62971de462ea1ec0d3b43a6a85b6fb975e6c6f64": { + "balance": "1000000000000000000000000000000" + }, + "0x62cf32dfb9eb6358dc5deb006aef1d75fb153e5f": { + "balance": "1000000000000000000000000000000" + }, + "0x62d8b22c1d71577829b2fee20a5c3fff43aed0ec": { + "balance": "100000000000000000000000" + }, + "0x6314956b78bb2eaed1c49b3ae71d4d0ec501cfab": { + "balance": "1000000000000000000000000000000" + }, + "0x661bda4daeba3ce9ac2aa30b80d463580f90d31a": { + "balance": "1000000000000000000000000000000" + }, + "0x66c5a87f4a49DD75e970055A265E8dd5C3F8f852": { + "balance": "1000000000000000000000" + }, + "0x66cd465ddcd85504c0d2cfb1728acee994d55a3f": { + "balance": "1000000000000000000000000000000" + }, + "0x68bca79ae7aae796027ff843d2303444da5cf5d8": { + "balance": "1000000000000000000000000000000" + }, + "0x6923877b65e24966efa9efd1207822fa2eaf601a": { + "balance": "1000000000000000000000000000000" + }, + "0x69362535ec535F0643cBf62D16aDeDCAf32Ee6F7": { + "balance": "0", + "code": "0x608060405234801561001057600080fd5b50600436106100b45760003560e01c806379210e8e1161007157806379210e8e1461017757806381a8235a146101a757806385aeeb17146101c35780639a9a5593146101f3578063a99100541461020f578063b57321221461022b576100b4565b806307c6e7d3146100b9578063122f4fba146100d55780631c6ec7a9146101055780631cfe4e3b14610121578063373dedb41461013d57806361e46db51461015b575b600080fd5b6100d360048036036100ce9190810190613cff565b61025b565b005b6100ef60048036036100ea9190810190613cff565b610804565b6040516100fc9190614963565b60405180910390f35b61011f600480360361011a9190810190613cff565b610b43565b005b61013b60048036036101369190810190613cc3565b610f72565b005b610145611190565b6040516101529190614cbe565b60405180910390f35b61017560048036036101709190810190613d94565b611199565b005b610191600480360361018c9190810190613e13565b6113f9565b60405161019e9190614924565b60405180910390f35b6101c160048036036101bc9190810190613cff565b6116f9565b005b6101dd60048036036101d89190810190613cff565b61189e565b6040516101ea9190614941565b60405180910390f35b61020d60048036036102089190810190613d40565b611b9d565b005b61022960048036036102249190810190613cff565b61202c565b005b61024560048036036102409190810190613cff565b612682565b6040516102529190614cbe565b60405180910390f35b6000339050606061026b83612902565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b825181101561037c576000826001018460018403815181106102d557fe5b60200260200101516040516102ea91906148cc565b90815260200160405180910390205411610339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161033090614ade565b60405180910390fd5b8160020183600183038151811061034c57fe5b602002602001015160405161036191906148cc565b908152602001604051809103902091508060010190506102b7565b506060600183511161038e57846103a7565b8260018451038151811061039e57fe5b60200260200101515b9050600082600101826040516103bd91906148e3565b9081526020016040518091039020541161040c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161040390614ade565b60405180910390fd5b6000826002018260405161042091906148e3565b90815260200160405180910390206000018054905014610475576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161046c90614b5e565b60405180910390fd5b60006104818587612b02565b9050806104c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ba90614a7e565b60405180910390fd5b6104cb613888565b836000016001856000018054905003815481106104e457fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156105965780601f1061056b57610100808354040283529160200191610596565b820191906000526020600020905b81548152906001019060200180831161057957829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff1660028111156105e257fe5b60028111156105ed57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561066557602002820191906000526020600020906000905b82829054906101000a900460ff1615158152602001906001019060208260000104928301926001038202915080841161062f5790505b505050505081525050905080846000016001866001018660405161068991906148e3565b90815260200160405180910390205403815481106106a357fe5b906000526020600020906005020160008201518160000190805190602001906106cd9291906138c4565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561071c57fe5b0217905550608082015181600401908051906020019061073d929190613944565b50905050836001018360405161075391906148e3565b90815260200160405180910390205484600101826000015160405161077891906148cc565b9081526020016040518091039020819055506000846001018460405161079e91906148e3565b908152602001604051809103902081905550836000018054809190600190036107c791906139ea565b5083600201836040516107da91906148e3565b9081526020016040518091039020600080820160006107f99190613a1c565b505050505050505050565b600080606061081284612b66565b91509150606061082182612902565b90506000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b82518110156109065760008260010184600184038151811061088b57fe5b60200260200101516040516108a091906148cc565b90815260200160405180910390205414156108c357600095505050505050610b3e565b816002018360018303815181106108d657fe5b60200260200101516040516108eb91906148cc565b9081526020016040518091039020915080600101905061086d565b50606060018351116109185783610931565b8260018451038151811061092857fe5b60200260200101515b90506000826001018260405161094791906148e3565b908152602001604051809103902054141561096a57600095505050505050610b3e565b610972613888565b826000016001846001018460405161098a91906148e3565b90815260200160405180910390205403815481106109a457fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610a565780601f10610a2b57610100808354040283529160200191610a56565b820191906000526020600020905b815481529060010190602001808311610a3957829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115610aa257fe5b6002811115610aad57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015610b2557602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411610aef5790505b5050505050815250509050806060015196505050505050505b919050565b600160009054906101000a900460ff16610b85576120006002819055506210000060038190555060018060006101000a81548160ff0219169083151502179055505b6000815111610bc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc090614ade565b60405180910390fd5b60003390506060610bd983612902565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015610cea57600082600101846001840381518110610c4357fe5b6020026020010151604051610c5891906148cc565b90815260200160405180910390205411610ca7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9e90614ade565b60405180910390fd5b81600201836001830381518110610cba57fe5b6020026020010151604051610ccf91906148cc565b90815260200160405180910390209150806001019050610c25565b50600254816000018054905010610d36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2d90614bfe565b60405180910390fd5b60606001835111610d475784610d60565b82600184510381518110610d5757fe5b60200260200101515b905060008260010182604051610d7691906148e3565b90815260200160405180910390205414610dc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbc90614c3e565b60405180910390fd5b610dce81612ee8565b610e0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0490614afe565b60405180910390fd5b6000610e198587612fc9565b905080610e5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e529061499e565b60405180910390fd5b610e63613888565b82816000018190525060008160200190151590811515815250508360000181908060018154018082558091505090600182039060005260206000209060050201600090919290919091506000820151816000019080519060200190610ec99291906138c4565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff02191690836002811115610f1857fe5b02179055506080820151816004019080519060200190610f39929190613944565b5050505083600001805490508460010184604051610f5791906148e3565b90815260200160405180910390208190555050505050505050565b610f7a61302d565b73ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161480610fdf57503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614155b61101e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101590614a5e565b60405180910390fd5b80600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411156110a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109790614b3e565b60405180910390fd5b600054600754820111156110e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e0906149be565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460076000828254039250508190555080600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550806007600082825401925050819055505050565b60008054905090565b600033905060006111aa82866130c6565b9050600160028111156111b957fe5b8160030160009054906101000a900460ff1660028111156111d657fe5b14611216576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120d90614c1e565b60405180910390fd5b6000600354858161122357fe5b061480156112345750806002015484105b611273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126a9061497e565b60405180910390fd5b600354848260020154031080156112905750838160020154038351145b8061129d57506003548351145b6112dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d390614a1e565b60405180910390fd5b600015158160040160035486816112ef57fe5b04815481106112fa57fe5b90600052602060002090602091828204019190069054906101000a900460ff1615151461135c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611353906149fe565b60405180910390fd5b600061136a838787876132c5565b9050806113ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a390614b1e565b60405180910390fd5b60018260040160035487816113bd57fe5b04815481106113c857fe5b90600052602060002090602091828204019190066101000a81548160ff021916908315150217905550505050505050565b611401613a40565b6000606061140e86612b66565b9150915061141a613888565b61142483836130c6565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156114c85780601f1061149d576101008083540402835291602001916114c8565b820191906000526020600020905b8154815290600101906020018083116114ab57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561151457fe5b600281111561151f57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561159757602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116115615790505b50505050508152505090506002808111156115ae57fe5b816060015160028111156115be57fe5b146115fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f590614c9e565b60405180910390fd5b60035485111580156116105750600085115b61164f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164690614a1e565b60405180910390fd5b80604001518587011115611698576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168f9061497e565b60405180910390fd5b60006116a684848989613376565b8096508192505050806116ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e590614b9e565b60405180910390fd5b505050509392505050565b6000339050600061170a82846130c6565b90506001600281111561171957fe5b8160030160009054906101000a900460ff16600281111561173657fe5b14611776576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176d90614c1e565b60405180910390fd5b60006001905060008260040180549050905060008090505b818110156117e157600015158460040182815481106117a957fe5b90600052602060002090602091828204019190069054906101000a900460ff16151514156117d657600092505b80600101905061178e565b5081611822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181990614b7e565b60405180910390fd5b60028360030160006101000a81548160ff0219169083600281111561184357fe5b021790555060006118548587613409565b905080611896576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188d906149de565b60405180910390fd5b505050505050565b6060600060606118ad84612b66565b9150915060606118bc82612902565b90506000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008090505b82518110156119c65760008260010184838151811061192257fe5b602002602001015160405161193791906148cc565b90815260200160405180910390205411611986576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197d90614ade565b60405180910390fd5b8160020183828151811061199657fe5b60200260200101516040516119ab91906148cc565b90815260200160405180910390209150806001019050611907565b5080600001805480602002602001604051908101604052809291908181526020016000905b82821015611b8e57838290600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611aa75780601f10611a7c57610100808354040283529160200191611aa7565b820191906000526020600020905b815481529060010190602001808311611a8a57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115611af357fe5b6002811115611afe57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015611b7657602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411611b405790505b505050505081525050815260200190600101906119eb565b50505050945050505050919050565b600160009054906101000a900460ff16611bdf576120006002819055506210000060038190555060018060006101000a81548160ff0219169083151502179055505b60003390506305f5e100821115611c2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2290614bde565b60405180910390fd5b6060611c3684612902565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015611d4757600082600101846001840381518110611ca057fe5b6020026020010151604051611cb591906148cc565b90815260200160405180910390205411611d04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cfb90614ade565b60405180910390fd5b81600201836001830381518110611d1757fe5b6020026020010151604051611d2c91906148cc565b90815260200160405180910390209150806001019050611c82565b5060606001835111611d595785611d72565b82600184510381518110611d6957fe5b60200260200101515b905060008260010182604051611d8891906148e3565b90815260200160405180910390205414611dd7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dce90614c3e565b60405180910390fd5b611de081612ee8565b611e1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1690614bbe565b60405180910390fd5b6000611e2c85888861346d565b905080611e6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6590614c7e565b60405180910390fd5b6060600354600160035489010381611e8257fe5b04604051908082528060200260200182016040528015611eb15781602001602082028038833980820191505090505b509050836000016040518060a0016040528085815260200160011515815260200189815260200160016002811115611ee557fe5b815260200183815250908060018154018082558091505090600182039060005260206000209060050201600090919290919091506000820151816000019080519060200190611f359291906138c4565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff02191690836002811115611f8457fe5b02179055506080820151816004019080519060200190611fa5929190613944565b5050505083600001805490508460010184604051611fc391906148e3565b90815260200160405180910390208190555086600560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505050505050505050565b6000339050612039613888565b61204382846130c6565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156120e75780601f106120bc576101008083540402835291602001916120e7565b820191906000526020600020905b8154815290600101906020018083116120ca57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561213357fe5b600281111561213e57fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156121b657602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116121805790505b5050505050815250509050600060028111156121ce57fe5b816060015160028111156121de57fe5b141561221f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221690614a3e565b60405180910390fd5b600061222b83856134da565b90508061226d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226490614a9e565b60405180910390fd5b606061227885612902565b90506000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b825181101561231057816002018360018303815181106122e057fe5b60200260200101516040516122f591906148cc565b908152602001604051809103902091508060010190506122c4565b506000600182600101866000015160405161232b91906148cc565b908152602001604051809103902054039050612345613888565b8260000160018460000180549050038154811061235e57fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156124105780601f106123e557610100808354040283529160200191612410565b820191906000526020600020905b8154815290600101906020018083116123f357829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561245c57fe5b600281111561246757fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156124df57602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116124a95790505b5050505050815250509050808360000183815481106124fa57fe5b906000526020600020906005020160008201518160000190805190602001906125249291906138c4565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561257357fe5b02179055506080820151816004019080519060200190612594929190613944565b50905050826000018054809190600190036125af91906139ea565b508260010186600001516040516125c691906148cc565b9081526020016040518091039020548360010182600001516040516125eb91906148cc565b908152602001604051809103902081905550600083600101876000015160405161261591906148cc565b9081526020016040518091039020819055508560400151600560008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505050505050505050565b600080606061269084612b66565b9150915061269c613888565b6126a683836130c6565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561274a5780601f1061271f5761010080835404028352916020019161274a565b820191906000526020600020905b81548152906001019060200180831161272d57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561279657fe5b60028111156127a157fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561281957602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116127e35790505b50505050508152505090506001600281111561283157fe5b8160600151600281111561284157fe5b1480612866575060028081111561285457fe5b8160600151600281111561286457fe5b145b6128a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161289c90614c1e565b60405180910390fd5b60006128b1848461353e565b8096508192505050806128f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128f090614c5e565b60405180910390fd5b50505050919050565b606061290c613a65565b612915836135a7565b905061291f613a65565b61295d6040518060400160405280600181526020017f2f000000000000000000000000000000000000000000000000000000000000008152506135a7565b90506060600161297683856135d590919063ffffffff16565b016040519080825280602002602001820160405280156129aa57816020015b60608152602001906001900390816129955790505b50905060008090505b81518110156129fb576129d76129d2848661364a90919063ffffffff16565b613664565b8282815181106129e357fe5b602002602001018190525080806001019150506129b3565b50600081600183510381518110612a0e57fe5b6020026020010151511415612a795780600182510381518110612a2d57fe5b6020026020010160608152506001815103604051908082528060200260200182016040528015612a7157816020015b6060815260200190600190039081612a5c5790505b509350612ab2565b8051604051908082528060200260200182016040528015612aae57816020015b6060815260200190600190039081612a995790505b5093505b60008090505b8451811015612af957818181518110612acd57fe5b6020026020010151858281518110612ae157fe5b60200260200101819052508080600101915050612ab8565b50505050919050565b60008060016020601f85510181612b1557fe5b040190506040518481526020810160005b83811015612b47578060200286015181602002830152806001019050612b26565b50602082602085026040018460006010600019f1935050505092915050565b6000606060006028905080845111612bb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612baa90614abe565b60405180910390fd5b6060816040519080825280601f01601f191660200182016040528015612be85781602001600182028038833980820191505090505b50905060008090505b82811015612c5857858181518110612c0557fe5b602001015160f81c60f81b828281518110612c1c57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050612bf1565b50600080905060008090505b83811015612d87576000838281518110612c7a57fe5b602001015160f81c60f81b60f81c60ff16905060308110158015612c9f575060398111155b80612cb8575060418110158015612cb75750605a8111155b5b80612cd1575060618110158015612cd0575060668111155b5b612d10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d0790614abe565b60405180910390fd5b60308110158015612d22575060398111155b15612d335760308103601084020192505b60418110158015612d455750605a8111155b15612d565760378103601084020192505b60618110158015612d68575060668111155b15612d795760578103601084020192505b508080600101915050612c64565b508094507f2f00000000000000000000000000000000000000000000000000000000000000868481518110612db857fe5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612e25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e1c90614abe565b60405180910390fd5b6000600184885103039050806040519080825280601f01601f191660200182016040528015612e635781602001600182028038833980820191505090505b50945060008090505b81811015612ede5760008860018784010181518110612e8757fe5b602001015160f81c60f81b905080878381518110612ea157fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350508080600101915050612e6c565b5050505050915091565b6000604051602001612ef99061490f565b6040516020818303038152906040528051906020012082604051602001612f2091906148e3565b604051602081830303815290604052805190602001201480612f8b5750604051602001612f4c906148fa565b6040516020818303038152906040528051906020012082604051602001612f7391906148e3565b60405160208183030381529060405280519060200120145b80612f97575060008251145b15612fa55760009050612fc4565b60008251905060ff811115612fbe576000915050612fc4565b60019150505b919050565b60008060016020601f85510181612fdc57fe5b040190506040518481526020810160005b8381101561300e578060200286015181602002830152806001019050612fed565b5060208260208502604001846000600f600019f1935050505092915050565b600073d2001000000000000000000000000000000000d273ffffffffffffffffffffffffffffffffffffffff166383e781fe6040518163ffffffff1660e01b815260040160206040518083038186803b15801561308957600080fd5b505afa15801561309d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506130c19190810190613c9a565b905090565b600060606130d383612902565b90506000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b82518110156131e45760008260010184600184038151811061313d57fe5b602002602001015160405161315291906148cc565b908152602001604051809103902054116131a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161319890614ade565b60405180910390fd5b816002018360018303815181106131b457fe5b60200260200101516040516131c991906148cc565b9081526020016040518091039020915080600101905061311f565b50606060018351116131f6578461320f565b8260018451038151811061320657fe5b60200260200101515b90506000826001018260405161322591906148e3565b90815260200160405180910390205411613274576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161326b90614ade565b60405180910390fd5b6000826000016001846001018460405161328e91906148e3565b90815260200160405180910390205403815481106132a857fe5b906000526020600020906005020190508094505050505092915050565b60008060016020601f855101816132d857fe5b04019050600060016020601f885101816132ee57fe5b040190506040518781526020810160005b838110156133205780602002890151816020028301528060010190506132ff565b50868360200282015260005b84811015613352578060200287015181856001010160200283015280600101905061332c565b50602082848601602002606001846000600c600019f1945050505050949350505050565b6000613380613a40565b600060016020601f8851018161339257fe5b0401905060006020601f8601816133a557fe5b0490506040518881526020810160005b848110156133d657806020028a0151816020028301528060010190506133b5565b5083602002810188815287816020015283602002868660030160200285600a600019fa9650505050505094509492505050565b60008060016020601f8551018161341c57fe5b040190506040518481526020810160005b8381101561344e57806020028601518160200283015280600101905061342d565b50602082602085026040018460006011600019f1935050505092915050565b60008060016020601f8651018161348057fe5b040190506040518581526020810160005b838110156134b2578060200287015181602002830152806001019050613491565b50846020840282015260208260208502604001846000600b600019f193505050509392505050565b60008060016020601f855101816134ed57fe5b040190506040518481526020810160005b8381101561351f5780602002860151816020028301528060010190506134fe565b5060208260208502604001846000600e600019f1935050505092915050565b600080600060016020601f8651018161355357fe5b040190506040518581526020810160005b83811015613585578060200287015181602002830152806001019050613564565b506020826020850260200184600d600019fa9450815193505050509250929050565b6135af613a65565b600060208301905060405180604001604052808451815260200182815250915050919050565b60008082600001516135f985600001518660200151866000015187602001516136c6565b0190505b83600001518460200151018111613643578180600101925050826000015161363b8560200151830386600001510383866000015187602001516136c6565b0190506135fd565b5092915050565b613652613a65565b61365d8383836137a1565b5092915050565b60608082600001516040519080825280601f01601f19166020018201604052801561369e5781602001600182028038833980820191505090505b50905060006020820190506136bc818560200151866000015161383f565b8192505050919050565b6000808490506000868511613791576020851161374b57600060018660200360080260020a031960001b905060008186511690506000878a8a0103905060008386511690505b82811461373d5781861061372a578a8a019650505050505050613799565b858060010196505083865116905061370c565b859650505050505050613799565b60008585209050600091505b858803821161378f57600086842090508082141561377b5783945050505050613799565b600184019350508180600101925050613757565b505b868601925050505b949350505050565b6137a9613a65565b60006137c785600001518660200151866000015187602001516136c6565b90508460200151836020018181525050846020015181038360000181815250508460000151856020015101811415613809576000856000018181525050613834565b8360000151836000015101856000018181510391508181525050836000015181018560200181815250505b829150509392505050565b5b602081106138635781518352602083019250602082019150602081039050613840565b60006001826020036101000a0390508019835116818551168181178652505050505050565b6040518060a001604052806060815260200160001515815260200160008152602001600060028111156138b757fe5b8152602001606081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061390557805160ff1916838001178555613933565b82800160010185558215613933579182015b82811115613932578251825591602001919060010190613917565b5b5090506139409190613a7f565b5090565b82805482825590600052602060002090601f016020900481019282156139d95791602002820160005b838211156139aa57835183826101000a81548160ff021916908315150217905550926020019260010160208160000104928301926001030261396d565b80156139d75782816101000a81549060ff02191690556001016020816000010492830192600103026139aa565b505b5090506139e69190613aa4565b5090565b815481835581811115613a1757600502816005028360005260206000209182019101613a169190613ad4565b5b505050565b5080546000825560050290600052602060002090810190613a3d9190613ad4565b50565b6040518062100000016040528061800090602082028038833980820191505090505090565b604051806040016040528060008152602001600081525090565b613aa191905b80821115613a9d576000816000905550600101613a85565b5090565b90565b613ad191905b80821115613acd57600081816101000a81549060ff021916905550600101613aaa565b5090565b90565b613b4091905b80821115613b3c5760008082016000613af39190613b43565b6001820160006101000a81549060ff021916905560028201600090556003820160006101000a81549060ff0219169055600482016000613b339190613b8b565b50600501613ada565b5090565b90565b50805460018160011615610100020316600290046000825580601f10613b695750613b88565b601f016020900490600052602060002090810190613b879190613a7f565b5b50565b50805460008255601f016020900490600052602060002090810190613bb09190613a7f565b50565b600081359050613bc281614f18565b92915050565b600081519050613bd781614f18565b92915050565b600082601f830112613bee57600080fd5b8135613c01613bfc82614d06565b614cd9565b91508082526020830160208301858383011115613c1d57600080fd5b613c28838284614eb8565b50505092915050565b600082601f830112613c4257600080fd5b8135613c55613c5082614d32565b614cd9565b91508082526020830160208301858383011115613c7157600080fd5b613c7c838284614eb8565b50505092915050565b600081359050613c9481614f2f565b92915050565b600060208284031215613cac57600080fd5b6000613cba84828501613bc8565b91505092915050565b60008060408385031215613cd657600080fd5b6000613ce485828601613bb3565b9250506020613cf585828601613c85565b9150509250929050565b600060208284031215613d1157600080fd5b600082013567ffffffffffffffff811115613d2b57600080fd5b613d3784828501613c31565b91505092915050565b60008060408385031215613d5357600080fd5b600083013567ffffffffffffffff811115613d6d57600080fd5b613d7985828601613c31565b9250506020613d8a85828601613c85565b9150509250929050565b600080600060608486031215613da957600080fd5b600084013567ffffffffffffffff811115613dc357600080fd5b613dcf86828701613c31565b9350506020613de086828701613c85565b925050604084013567ffffffffffffffff811115613dfd57600080fd5b613e0986828701613bdd565b9150509250925092565b600080600060608486031215613e2857600080fd5b600084013567ffffffffffffffff811115613e4257600080fd5b613e4e86828701613c31565b9350506020613e5f86828701613c85565b9250506040613e7086828701613c85565b9150509250925092565b6000613e868383613fe8565b60208301905092915050565b6000613e9e8383613ff7565b60208301905092915050565b6000613eb68383614831565b905092915050565b6000613ec982614d88565b613ed38185614de7565b9350613ede83614d5e565b8060005b83811015613f0f578151613ef68882613e7a565b9750613f0183614dc0565b925050600181019050613ee2565b5085935050505092915050565b613f2581614d93565b613f2f8184614df8565b9250613f3a82614d6e565b8060005b83811015613f6b578151613f528782613e92565b9650613f5d83614dcd565b925050600181019050613f3e565b505050505050565b6000613f7e82614d9f565b613f888185614e03565b935083602082028501613f9a85614d78565b8060005b85811015613fd65784840389528151613fb78582613eaa565b9450613fc283614dda565b925060208a01995050600181019050613f9e565b50829750879550505050505092915050565b613ff181614e53565b82525050565b61400081614e5f565b82525050565b61400f81614ea6565b82525050565b61401e81614ea6565b82525050565b600061402f82614db5565b6140398185614e36565b9350614049818560208601614ec7565b80840191505092915050565b600061406082614daa565b61406a8185614e14565b935061407a818560208601614ec7565b61408381614efa565b840191505092915050565b600061409982614daa565b6140a38185614e36565b93506140b3818560208601614ec7565b80840191505092915050565b60006140cc601883614e25565b91507f496e636f7272656374206368756e6b20706f736974696f6e00000000000000006000830152602082019050919050565b600061410c601583614e25565b91507f4469726563746f7279206e6f74206372656174656400000000000000000000006000830152602082019050919050565b600061414c602483614e25565b91507f4e6f7420656e6f756768206d656d6f727920696e207468652046696c6573746f60008301527f72616765000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006141b2601b83614e25565b91507f48617368206861736e2774206265656e2063616c63756c6174656400000000006000830152602082019050919050565b60006141f2601983614e25565b91507f4368756e6b20697320616c72656164792075706c6f61646564000000000000006000830152602082019050919050565b6000614232601683614e25565b91507f496e636f7272656374206368756e6b206c656e677468000000000000000000006000830152602082019050919050565b6000614272600f83614e25565b91507f46696c65206e6f742065786973747300000000000000000000000000000000006000830152602082019050919050565b60006142b2600e83614e25565b91507f496e76616c69642073656e6465720000000000000000000000000000000000006000830152602082019050919050565b60006142f2601883614e25565b91507f4469726563746f7279206973206e6f742064656c6574656400000000000000006000830152602082019050919050565b6000614332601083614e25565b91507f46696c65206e6f742064656c65746564000000000000000000000000000000006000830152602082019050919050565b6000614372601383614e25565b91507f496e76616c69642073746f7261676550617468000000000000000000000000006000830152602082019050919050565b60006143b2600c83614e25565b91507f496e76616c6964207061746800000000000000000000000000000000000000006000830152602082019050919050565b60006143f2600183614e36565b91507f2e000000000000000000000000000000000000000000000000000000000000006000830152600182019050919050565b6000614432601683614e25565b91507f496e76616c6964206469726563746f7279206e616d65000000000000000000006000830152602082019050919050565b6000614472601583614e25565b91507f4368756e6b207761736e27742075706c6f6164656400000000000000000000006000830152602082019050919050565b60006144b2602683614e25565b91507f436f756c64206e6f742072657365727665206c657373207468616e207573656460008301527f20737061636500000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614518601683614e25565b91507f4469726563746f7279206973206e6f7420656d707479000000000000000000006000830152602082019050919050565b6000614558602383614e25565b91507f46696c65206861736e2774206265656e2075706c6f6164656420636f7272656360008301527f746c7900000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006145be601183614e25565b91507f4368756e6b207761736e277420726561640000000000000000000000000000006000830152602082019050919050565b60006145fe601883614e25565b91507f46696c656e616d652073686f756c64206265203c2032353600000000000000006000830152602082019050919050565b600061463e601f83614e25565b91507f46696c652073686f756c64206265206c657373207468616e20313030204d42006000830152602082019050919050565b600061467e600283614e36565b91507f2e2e0000000000000000000000000000000000000000000000000000000000006000830152600282019050919050565b60006146be601183614e25565b91507f4469726563746f72792069732066756c6c0000000000000000000000000000006000830152602082019050919050565b60006146fe600e83614e25565b91507f46696c65206e6f7420666f756e640000000000000000000000000000000000006000830152602082019050919050565b600061473e601883614e25565b91507f46696c65206f72206469726563746f72792065786973747300000000000000006000830152602082019050919050565b600061477e601883614e25565b91507f45564d206572726f7220696e2067657446696c6553697a6500000000000000006000830152602082019050919050565b60006147be601083614e25565b91507f46696c65206e6f742063726561746564000000000000000000000000000000006000830152602082019050919050565b60006147fe601983614e25565b91507f46696c65206861736e2774206265656e2075706c6f61646564000000000000006000830152602082019050919050565b600060a083016000830151848203600086015261484e8282614055565b91505060208301516148636020860182613fe8565b50604083015161487660408601826148ae565b5060608301516148896060860182614006565b50608083015184820360808601526148a18282613ebe565b9150508091505092915050565b6148b781614e9c565b82525050565b6148c681614e9c565b82525050565b60006148d8828461408e565b915081905092915050565b60006148ef8284614024565b915081905092915050565b6000614905826143e5565b9150819050919050565b600061491a82614671565b9150819050919050565b6000621000008201905061493b6000830184613f1c565b92915050565b6000602082019050818103600083015261495b8184613f73565b905092915050565b60006020820190506149786000830184614015565b92915050565b60006020820190508181036000830152614997816140bf565b9050919050565b600060208201905081810360008301526149b7816140ff565b9050919050565b600060208201905081810360008301526149d78161413f565b9050919050565b600060208201905081810360008301526149f7816141a5565b9050919050565b60006020820190508181036000830152614a17816141e5565b9050919050565b60006020820190508181036000830152614a3781614225565b9050919050565b60006020820190508181036000830152614a5781614265565b9050919050565b60006020820190508181036000830152614a77816142a5565b9050919050565b60006020820190508181036000830152614a97816142e5565b9050919050565b60006020820190508181036000830152614ab781614325565b9050919050565b60006020820190508181036000830152614ad781614365565b9050919050565b60006020820190508181036000830152614af7816143a5565b9050919050565b60006020820190508181036000830152614b1781614425565b9050919050565b60006020820190508181036000830152614b3781614465565b9050919050565b60006020820190508181036000830152614b57816144a5565b9050919050565b60006020820190508181036000830152614b778161450b565b9050919050565b60006020820190508181036000830152614b978161454b565b9050919050565b60006020820190508181036000830152614bb7816145b1565b9050919050565b60006020820190508181036000830152614bd7816145f1565b9050919050565b60006020820190508181036000830152614bf781614631565b9050919050565b60006020820190508181036000830152614c17816146b1565b9050919050565b60006020820190508181036000830152614c37816146f1565b9050919050565b60006020820190508181036000830152614c5781614731565b9050919050565b60006020820190508181036000830152614c7781614771565b9050919050565b60006020820190508181036000830152614c97816147b1565b9050919050565b60006020820190508181036000830152614cb7816147f1565b9050919050565b6000602082019050614cd360008301846148bd565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614cfc57600080fd5b8060405250919050565b600067ffffffffffffffff821115614d1d57600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614d4957600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050919050565b6000819050602082019050919050565b600081519050919050565b60006180009050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614e4c82614e7c565b9050919050565b60008115159050919050565b6000819050919050565b6000819050614e7782614f0b565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000614eb182614e69565b9050919050565b82818337600083830152505050565b60005b83811015614ee5578082015181840152602081019050614eca565b83811115614ef4576000848401525b50505050565b6000601f19601f8301169050919050565b60038110614f1557fe5b50565b614f2181614e41565b8114614f2c57600080fd5b50565b614f3881614e9c565b8114614f4357600080fd5b5056fea365627a7a723158202ae226b25ad72f9cff2d74c6dc7bcfb78530ab1d2438f48a8dab67499b37a8e56c6578706572696d656e74616cf564736f6c634300050d0040", + "nonce": "0", + "storage": { + "0x0": "2868903936" + } + }, + "0x69362535ec535F0643cBf62D16aDeDCAf32Ee6F8": { + "balance": "0", + "code": "0x608060405234801561001057600080fd5b50600436106100b45760003560e01c806379210e8e1161007157806379210e8e1461017757806381a8235a146101a757806385aeeb17146101c35780639a9a5593146101f3578063a99100541461020f578063b57321221461022b576100b4565b806307c6e7d3146100b9578063122f4fba146100d55780631c6ec7a9146101055780631cfe4e3b14610121578063373dedb41461013d57806361e46db51461015b575b600080fd5b6100d360048036036100ce9190810190613e0d565b61025b565b005b6100ef60048036036100ea9190810190613e0d565b610804565b6040516100fc9190614ab1565b60405180910390f35b61011f600480360361011a9190810190613e0d565b610b43565b005b61013b60048036036101369190810190613dd1565b610f72565b005b610145611190565b6040516101529190614e2c565b60405180910390f35b61017560048036036101709190810190613ea2565b611199565b005b610191600480360361018c9190810190613f21565b6113f9565b60405161019e9190614a72565b60405180910390f35b6101c160048036036101bc9190810190613e0d565b6116f9565b005b6101dd60048036036101d89190810190613e0d565b61189e565b6040516101ea9190614a8f565b60405180910390f35b61020d60048036036102089190810190613e4e565b611b9d565b005b61022960048036036102249190810190613e0d565b61213a565b005b61024560048036036102409190810190613e0d565b612790565b6040516102529190614e2c565b60405180910390f35b6000339050606061026b83612a10565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b825181101561037c576000826001018460018403815181106102d557fe5b60200260200101516040516102ea9190614a1a565b90815260200160405180910390205411610339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161033090614c2c565b60405180910390fd5b8160020183600183038151811061034c57fe5b60200260200101516040516103619190614a1a565b908152602001604051809103902091508060010190506102b7565b506060600183511161038e57846103a7565b8260018451038151811061039e57fe5b60200260200101515b9050600082600101826040516103bd9190614a31565b9081526020016040518091039020541161040c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161040390614c2c565b60405180910390fd5b600082600201826040516104209190614a31565b90815260200160405180910390206000018054905014610475576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161046c90614cac565b60405180910390fd5b60006104818587612c10565b9050806104c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ba90614bcc565b60405180910390fd5b6104cb613996565b836000016001856000018054905003815481106104e457fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156105965780601f1061056b57610100808354040283529160200191610596565b820191906000526020600020905b81548152906001019060200180831161057957829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff1660028111156105e257fe5b60028111156105ed57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561066557602002820191906000526020600020906000905b82829054906101000a900460ff1615158152602001906001019060208260000104928301926001038202915080841161062f5790505b50505050508152505090508084600001600186600101866040516106899190614a31565b90815260200160405180910390205403815481106106a357fe5b906000526020600020906005020160008201518160000190805190602001906106cd9291906139d2565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561071c57fe5b0217905550608082015181600401908051906020019061073d929190613a52565b5090505083600101836040516107539190614a31565b9081526020016040518091039020548460010182600001516040516107789190614a1a565b9081526020016040518091039020819055506000846001018460405161079e9190614a31565b908152602001604051809103902081905550836000018054809190600190036107c79190613af8565b5083600201836040516107da9190614a31565b9081526020016040518091039020600080820160006107f99190613b2a565b505050505050505050565b600080606061081284612c74565b91509150606061082182612a10565b90506000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b82518110156109065760008260010184600184038151811061088b57fe5b60200260200101516040516108a09190614a1a565b90815260200160405180910390205414156108c357600095505050505050610b3e565b816002018360018303815181106108d657fe5b60200260200101516040516108eb9190614a1a565b9081526020016040518091039020915080600101905061086d565b50606060018351116109185783610931565b8260018451038151811061092857fe5b60200260200101515b9050600082600101826040516109479190614a31565b908152602001604051809103902054141561096a57600095505050505050610b3e565b610972613996565b826000016001846001018460405161098a9190614a31565b90815260200160405180910390205403815481106109a457fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610a565780601f10610a2b57610100808354040283529160200191610a56565b820191906000526020600020905b815481529060010190602001808311610a3957829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115610aa257fe5b6002811115610aad57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015610b2557602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411610aef5790505b5050505050815250509050806060015196505050505050505b919050565b600160009054906101000a900460ff16610b85576120006002819055506210000060038190555060018060006101000a81548160ff0219169083151502179055505b6000815111610bc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc090614c2c565b60405180910390fd5b60003390506060610bd983612a10565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015610cea57600082600101846001840381518110610c4357fe5b6020026020010151604051610c589190614a1a565b90815260200160405180910390205411610ca7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9e90614c2c565b60405180910390fd5b81600201836001830381518110610cba57fe5b6020026020010151604051610ccf9190614a1a565b90815260200160405180910390209150806001019050610c25565b50600254816000018054905010610d36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2d90614d4c565b60405180910390fd5b60606001835111610d475784610d60565b82600184510381518110610d5757fe5b60200260200101515b905060008260010182604051610d769190614a31565b90815260200160405180910390205414610dc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbc90614d8c565b60405180910390fd5b610dce81612ff6565b610e0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0490614c4c565b60405180910390fd5b6000610e1985876130d7565b905080610e5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5290614aec565b60405180910390fd5b610e63613996565b82816000018190525060008160200190151590811515815250508360000181908060018154018082558091505090600182039060005260206000209060050201600090919290919091506000820151816000019080519060200190610ec99291906139d2565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff02191690836002811115610f1857fe5b02179055506080820151816004019080519060200190610f39929190613a52565b5050505083600001805490508460010184604051610f579190614a31565b90815260200160405180910390208190555050505050505050565b610f7a61313b565b73ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161480610fdf57503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614155b61101e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101590614bac565b60405180910390fd5b80600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411156110a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109790614c8c565b60405180910390fd5b600054600754820111156110e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e090614b0c565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460076000828254039250508190555080600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550806007600082825401925050819055505050565b60008054905090565b600033905060006111aa82866131d4565b9050600160028111156111b957fe5b8160030160009054906101000a900460ff1660028111156111d657fe5b14611216576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120d90614d6c565b60405180910390fd5b6000600354858161122357fe5b061480156112345750806002015484105b611273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126a90614acc565b60405180910390fd5b600354848260020154031080156112905750838160020154038351145b8061129d57506003548351145b6112dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d390614b6c565b60405180910390fd5b600015158160040160035486816112ef57fe5b04815481106112fa57fe5b90600052602060002090602091828204019190069054906101000a900460ff1615151461135c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135390614b4c565b60405180910390fd5b600061136a838787876133d3565b9050806113ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a390614c6c565b60405180910390fd5b60018260040160035487816113bd57fe5b04815481106113c857fe5b90600052602060002090602091828204019190066101000a81548160ff021916908315150217905550505050505050565b611401613b4e565b6000606061140e86612c74565b9150915061141a613996565b61142483836131d4565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156114c85780601f1061149d576101008083540402835291602001916114c8565b820191906000526020600020905b8154815290600101906020018083116114ab57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561151457fe5b600281111561151f57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561159757602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116115615790505b50505050508152505090506002808111156115ae57fe5b816060015160028111156115be57fe5b146115fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f590614e0c565b60405180910390fd5b60035485111580156116105750600085115b61164f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164690614b6c565b60405180910390fd5b80604001518587011115611698576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168f90614acc565b60405180910390fd5b60006116a684848989613484565b8096508192505050806116ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e590614cec565b60405180910390fd5b505050509392505050565b6000339050600061170a82846131d4565b90506001600281111561171957fe5b8160030160009054906101000a900460ff16600281111561173657fe5b14611776576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176d90614d6c565b60405180910390fd5b60006001905060008260040180549050905060008090505b818110156117e157600015158460040182815481106117a957fe5b90600052602060002090602091828204019190069054906101000a900460ff16151514156117d657600092505b80600101905061178e565b5081611822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181990614ccc565b60405180910390fd5b60028360030160006101000a81548160ff0219169083600281111561184357fe5b021790555060006118548587613517565b905080611896576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188d90614b2c565b60405180910390fd5b505050505050565b6060600060606118ad84612c74565b9150915060606118bc82612a10565b90506000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008090505b82518110156119c65760008260010184838151811061192257fe5b60200260200101516040516119379190614a1a565b90815260200160405180910390205411611986576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197d90614c2c565b60405180910390fd5b8160020183828151811061199657fe5b60200260200101516040516119ab9190614a1a565b90815260200160405180910390209150806001019050611907565b5080600001805480602002602001604051908101604052809291908181526020016000905b82821015611b8e57838290600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611aa75780601f10611a7c57610100808354040283529160200191611aa7565b820191906000526020600020905b815481529060010190602001808311611a8a57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115611af357fe5b6002811115611afe57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015611b7657602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411611b405790505b505050505081525050815260200190600101906119eb565b50505050945050505050919050565b600160009054906101000a900460ff16611bdf576120006002819055506210000060038190555060018060006101000a81548160ff0219169083151502179055505b60003390506305f5e100821115611c2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2290614d2c565b60405180910390fd5b600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205483011115611cee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce590614dac565b60405180910390fd5b6060611cf984612a10565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015611e0a57600082600101846001840381518110611d6357fe5b6020026020010151604051611d789190614a1a565b90815260200160405180910390205411611dc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dbe90614c2c565b60405180910390fd5b81600201836001830381518110611dda57fe5b6020026020010151604051611def9190614a1a565b90815260200160405180910390209150806001019050611d45565b50600254816000018054905010611e56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4d90614d4c565b60405180910390fd5b60606001835111611e675785611e80565b82600184510381518110611e7757fe5b60200260200101515b905060008260010182604051611e969190614a31565b90815260200160405180910390205414611ee5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611edc90614d8c565b60405180910390fd5b611eee81612ff6565b611f2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2490614d0c565b60405180910390fd5b6000611f3a85888861357b565b905080611f7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7390614dec565b60405180910390fd5b6060600354600160035489010381611f9057fe5b04604051908082528060200260200182016040528015611fbf5781602001602082028038833980820191505090505b509050836000016040518060a0016040528085815260200160011515815260200189815260200160016002811115611ff357fe5b8152602001838152509080600181540180825580915050906001820390600052602060002090600502016000909192909190915060008201518160000190805190602001906120439291906139d2565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561209257fe5b021790555060808201518160040190805190602001906120b3929190613a52565b50505050836000018054905084600101846040516120d19190614a31565b90815260200160405180910390208190555086600560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505050505050505050565b6000339050612147613996565b61215182846131d4565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156121f55780601f106121ca576101008083540402835291602001916121f5565b820191906000526020600020905b8154815290600101906020018083116121d857829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561224157fe5b600281111561224c57fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156122c457602002820191906000526020600020906000905b82829054906101000a900460ff1615158152602001906001019060208260000104928301926001038202915080841161228e5790505b5050505050815250509050600060028111156122dc57fe5b816060015160028111156122ec57fe5b141561232d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232490614b8c565b60405180910390fd5b600061233983856135e8565b90508061237b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161237290614bec565b60405180910390fd5b606061238685612a10565b90506000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b825181101561241e57816002018360018303815181106123ee57fe5b60200260200101516040516124039190614a1a565b908152602001604051809103902091508060010190506123d2565b50600060018260010186600001516040516124399190614a1a565b908152602001604051809103902054039050612453613996565b8260000160018460000180549050038154811061246c57fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561251e5780601f106124f35761010080835404028352916020019161251e565b820191906000526020600020905b81548152906001019060200180831161250157829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561256a57fe5b600281111561257557fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156125ed57602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116125b75790505b50505050508152505090508083600001838154811061260857fe5b906000526020600020906005020160008201518160000190805190602001906126329291906139d2565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561268157fe5b021790555060808201518160040190805190602001906126a2929190613a52565b50905050826000018054809190600190036126bd9190613af8565b508260010186600001516040516126d49190614a1a565b9081526020016040518091039020548360010182600001516040516126f99190614a1a565b90815260200160405180910390208190555060008360010187600001516040516127239190614a1a565b9081526020016040518091039020819055508560400151600560008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505050505050505050565b600080606061279e84612c74565b915091506127aa613996565b6127b483836131d4565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156128585780601f1061282d57610100808354040283529160200191612858565b820191906000526020600020905b81548152906001019060200180831161283b57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff1660028111156128a457fe5b60028111156128af57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561292757602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116128f15790505b50505050508152505090506001600281111561293f57fe5b8160600151600281111561294f57fe5b1480612974575060028081111561296257fe5b8160600151600281111561297257fe5b145b6129b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129aa90614d6c565b60405180910390fd5b60006129bf848461364c565b809650819250505080612a07576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129fe90614dcc565b60405180910390fd5b50505050919050565b6060612a1a613b73565b612a23836136b5565b9050612a2d613b73565b612a6b6040518060400160405280600181526020017f2f000000000000000000000000000000000000000000000000000000000000008152506136b5565b905060606001612a8483856136e390919063ffffffff16565b01604051908082528060200260200182016040528015612ab857816020015b6060815260200190600190039081612aa35790505b50905060008090505b8151811015612b0957612ae5612ae0848661375890919063ffffffff16565b613772565b828281518110612af157fe5b60200260200101819052508080600101915050612ac1565b50600081600183510381518110612b1c57fe5b6020026020010151511415612b875780600182510381518110612b3b57fe5b6020026020010160608152506001815103604051908082528060200260200182016040528015612b7f57816020015b6060815260200190600190039081612b6a5790505b509350612bc0565b8051604051908082528060200260200182016040528015612bbc57816020015b6060815260200190600190039081612ba75790505b5093505b60008090505b8451811015612c0757818181518110612bdb57fe5b6020026020010151858281518110612bef57fe5b60200260200101819052508080600101915050612bc6565b50505050919050565b60008060016020601f85510181612c2357fe5b040190506040518481526020810160005b83811015612c55578060200286015181602002830152806001019050612c34565b50602082602085026040018460006010600019f1935050505092915050565b6000606060006028905080845111612cc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cb890614c0c565b60405180910390fd5b6060816040519080825280601f01601f191660200182016040528015612cf65781602001600182028038833980820191505090505b50905060008090505b82811015612d6657858181518110612d1357fe5b602001015160f81c60f81b828281518110612d2a57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050612cff565b50600080905060008090505b83811015612e95576000838281518110612d8857fe5b602001015160f81c60f81b60f81c60ff16905060308110158015612dad575060398111155b80612dc6575060418110158015612dc55750605a8111155b5b80612ddf575060618110158015612dde575060668111155b5b612e1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e1590614c0c565b60405180910390fd5b60308110158015612e30575060398111155b15612e415760308103601084020192505b60418110158015612e535750605a8111155b15612e645760378103601084020192505b60618110158015612e76575060668111155b15612e875760578103601084020192505b508080600101915050612d72565b508094507f2f00000000000000000000000000000000000000000000000000000000000000868481518110612ec657fe5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612f33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f2a90614c0c565b60405180910390fd5b6000600184885103039050806040519080825280601f01601f191660200182016040528015612f715781602001600182028038833980820191505090505b50945060008090505b81811015612fec5760008860018784010181518110612f9557fe5b602001015160f81c60f81b905080878381518110612faf57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350508080600101915050612f7a565b5050505050915091565b600060405160200161300790614a5d565b604051602081830303815290604052805190602001208260405160200161302e9190614a31565b604051602081830303815290604052805190602001201480613099575060405160200161305a90614a48565b60405160208183030381529060405280519060200120826040516020016130819190614a31565b60405160208183030381529060405280519060200120145b806130a5575060008251145b156130b357600090506130d2565b60008251905060ff8111156130cc5760009150506130d2565b60019150505b919050565b60008060016020601f855101816130ea57fe5b040190506040518481526020810160005b8381101561311c5780602002860151816020028301528060010190506130fb565b5060208260208502604001846000600f600019f1935050505092915050565b600073d2001000000000000000000000000000000000d273ffffffffffffffffffffffffffffffffffffffff166383e781fe6040518163ffffffff1660e01b815260040160206040518083038186803b15801561319757600080fd5b505afa1580156131ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506131cf9190810190613da8565b905090565b600060606131e183612a10565b90506000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b82518110156132f25760008260010184600184038151811061324b57fe5b60200260200101516040516132609190614a1a565b908152602001604051809103902054116132af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132a690614c2c565b60405180910390fd5b816002018360018303815181106132c257fe5b60200260200101516040516132d79190614a1a565b9081526020016040518091039020915080600101905061322d565b5060606001835111613304578461331d565b8260018451038151811061331457fe5b60200260200101515b9050600082600101826040516133339190614a31565b90815260200160405180910390205411613382576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161337990614c2c565b60405180910390fd5b6000826000016001846001018460405161339c9190614a31565b90815260200160405180910390205403815481106133b657fe5b906000526020600020906005020190508094505050505092915050565b60008060016020601f855101816133e657fe5b04019050600060016020601f885101816133fc57fe5b040190506040518781526020810160005b8381101561342e57806020028901518160200283015280600101905061340d565b50868360200282015260005b84811015613460578060200287015181856001010160200283015280600101905061343a565b50602082848601602002606001846000600c600019f1945050505050949350505050565b600061348e613b4e565b600060016020601f885101816134a057fe5b0401905060006020601f8601816134b357fe5b0490506040518881526020810160005b848110156134e457806020028a0151816020028301528060010190506134c3565b5083602002810188815287816020015283602002868660030160200285600a600019fa9650505050505094509492505050565b60008060016020601f8551018161352a57fe5b040190506040518481526020810160005b8381101561355c57806020028601518160200283015280600101905061353b565b50602082602085026040018460006011600019f1935050505092915050565b60008060016020601f8651018161358e57fe5b040190506040518581526020810160005b838110156135c057806020028701518160200283015280600101905061359f565b50846020840282015260208260208502604001846000600b600019f193505050509392505050565b60008060016020601f855101816135fb57fe5b040190506040518481526020810160005b8381101561362d57806020028601518160200283015280600101905061360c565b5060208260208502604001846000600e600019f1935050505092915050565b600080600060016020601f8651018161366157fe5b040190506040518581526020810160005b83811015613693578060200287015181602002830152806001019050613672565b506020826020850260200184600d600019fa9450815193505050509250929050565b6136bd613b73565b600060208301905060405180604001604052808451815260200182815250915050919050565b600080826000015161370785600001518660200151866000015187602001516137d4565b0190505b8360000151846020015101811161375157818060010192505082600001516137498560200151830386600001510383866000015187602001516137d4565b01905061370b565b5092915050565b613760613b73565b61376b8383836138af565b5092915050565b60608082600001516040519080825280601f01601f1916602001820160405280156137ac5781602001600182028038833980820191505090505b50905060006020820190506137ca818560200151866000015161394d565b8192505050919050565b600080849050600086851161389f576020851161385957600060018660200360080260020a031960001b905060008186511690506000878a8a0103905060008386511690505b82811461384b57818610613838578a8a0196505050505050506138a7565b858060010196505083865116905061381a565b8596505050505050506138a7565b60008585209050600091505b858803821161389d57600086842090508082141561388957839450505050506138a7565b600184019350508180600101925050613865565b505b868601925050505b949350505050565b6138b7613b73565b60006138d585600001518660200151866000015187602001516137d4565b90508460200151836020018181525050846020015181038360000181815250508460000151856020015101811415613917576000856000018181525050613942565b8360000151836000015101856000018181510391508181525050836000015181018560200181815250505b829150509392505050565b5b60208110613971578151835260208301925060208201915060208103905061394e565b60006001826020036101000a0390508019835116818551168181178652505050505050565b6040518060a001604052806060815260200160001515815260200160008152602001600060028111156139c557fe5b8152602001606081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613a1357805160ff1916838001178555613a41565b82800160010185558215613a41579182015b82811115613a40578251825591602001919060010190613a25565b5b509050613a4e9190613b8d565b5090565b82805482825590600052602060002090601f01602090048101928215613ae75791602002820160005b83821115613ab857835183826101000a81548160ff0219169083151502179055509260200192600101602081600001049283019260010302613a7b565b8015613ae55782816101000a81549060ff0219169055600101602081600001049283019260010302613ab8565b505b509050613af49190613bb2565b5090565b815481835581811115613b2557600502816005028360005260206000209182019101613b249190613be2565b5b505050565b5080546000825560050290600052602060002090810190613b4b9190613be2565b50565b6040518062100000016040528061800090602082028038833980820191505090505090565b604051806040016040528060008152602001600081525090565b613baf91905b80821115613bab576000816000905550600101613b93565b5090565b90565b613bdf91905b80821115613bdb57600081816101000a81549060ff021916905550600101613bb8565b5090565b90565b613c4e91905b80821115613c4a5760008082016000613c019190613c51565b6001820160006101000a81549060ff021916905560028201600090556003820160006101000a81549060ff0219169055600482016000613c419190613c99565b50600501613be8565b5090565b90565b50805460018160011615610100020316600290046000825580601f10613c775750613c96565b601f016020900490600052602060002090810190613c959190613b8d565b5b50565b50805460008255601f016020900490600052602060002090810190613cbe9190613b8d565b50565b600081359050613cd081615086565b92915050565b600081519050613ce581615086565b92915050565b600082601f830112613cfc57600080fd5b8135613d0f613d0a82614e74565b614e47565b91508082526020830160208301858383011115613d2b57600080fd5b613d36838284615026565b50505092915050565b600082601f830112613d5057600080fd5b8135613d63613d5e82614ea0565b614e47565b91508082526020830160208301858383011115613d7f57600080fd5b613d8a838284615026565b50505092915050565b600081359050613da28161509d565b92915050565b600060208284031215613dba57600080fd5b6000613dc884828501613cd6565b91505092915050565b60008060408385031215613de457600080fd5b6000613df285828601613cc1565b9250506020613e0385828601613d93565b9150509250929050565b600060208284031215613e1f57600080fd5b600082013567ffffffffffffffff811115613e3957600080fd5b613e4584828501613d3f565b91505092915050565b60008060408385031215613e6157600080fd5b600083013567ffffffffffffffff811115613e7b57600080fd5b613e8785828601613d3f565b9250506020613e9885828601613d93565b9150509250929050565b600080600060608486031215613eb757600080fd5b600084013567ffffffffffffffff811115613ed157600080fd5b613edd86828701613d3f565b9350506020613eee86828701613d93565b925050604084013567ffffffffffffffff811115613f0b57600080fd5b613f1786828701613ceb565b9150509250925092565b600080600060608486031215613f3657600080fd5b600084013567ffffffffffffffff811115613f5057600080fd5b613f5c86828701613d3f565b9350506020613f6d86828701613d93565b9250506040613f7e86828701613d93565b9150509250925092565b6000613f9483836140f6565b60208301905092915050565b6000613fac8383614105565b60208301905092915050565b6000613fc4838361497f565b905092915050565b6000613fd782614ef6565b613fe18185614f55565b9350613fec83614ecc565b8060005b8381101561401d5781516140048882613f88565b975061400f83614f2e565b925050600181019050613ff0565b5085935050505092915050565b61403381614f01565b61403d8184614f66565b925061404882614edc565b8060005b838110156140795781516140608782613fa0565b965061406b83614f3b565b92505060018101905061404c565b505050505050565b600061408c82614f0d565b6140968185614f71565b9350836020820285016140a885614ee6565b8060005b858110156140e457848403895281516140c58582613fb8565b94506140d083614f48565b925060208a019950506001810190506140ac565b50829750879550505050505092915050565b6140ff81614fc1565b82525050565b61410e81614fcd565b82525050565b61411d81615014565b82525050565b61412c81615014565b82525050565b600061413d82614f23565b6141478185614fa4565b9350614157818560208601615035565b80840191505092915050565b600061416e82614f18565b6141788185614f82565b9350614188818560208601615035565b61419181615068565b840191505092915050565b60006141a782614f18565b6141b18185614fa4565b93506141c1818560208601615035565b80840191505092915050565b60006141da601883614f93565b91507f496e636f7272656374206368756e6b20706f736974696f6e00000000000000006000830152602082019050919050565b600061421a601583614f93565b91507f4469726563746f7279206e6f74206372656174656400000000000000000000006000830152602082019050919050565b600061425a602483614f93565b91507f4e6f7420656e6f756768206d656d6f727920696e207468652046696c6573746f60008301527f72616765000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006142c0601b83614f93565b91507f48617368206861736e2774206265656e2063616c63756c6174656400000000006000830152602082019050919050565b6000614300601983614f93565b91507f4368756e6b20697320616c72656164792075706c6f61646564000000000000006000830152602082019050919050565b6000614340601683614f93565b91507f496e636f7272656374206368756e6b206c656e677468000000000000000000006000830152602082019050919050565b6000614380600f83614f93565b91507f46696c65206e6f742065786973747300000000000000000000000000000000006000830152602082019050919050565b60006143c0600e83614f93565b91507f496e76616c69642073656e6465720000000000000000000000000000000000006000830152602082019050919050565b6000614400601883614f93565b91507f4469726563746f7279206973206e6f742064656c6574656400000000000000006000830152602082019050919050565b6000614440601083614f93565b91507f46696c65206e6f742064656c65746564000000000000000000000000000000006000830152602082019050919050565b6000614480601383614f93565b91507f496e76616c69642073746f7261676550617468000000000000000000000000006000830152602082019050919050565b60006144c0600c83614f93565b91507f496e76616c6964207061746800000000000000000000000000000000000000006000830152602082019050919050565b6000614500600183614fa4565b91507f2e000000000000000000000000000000000000000000000000000000000000006000830152600182019050919050565b6000614540601683614f93565b91507f496e76616c6964206469726563746f7279206e616d65000000000000000000006000830152602082019050919050565b6000614580601583614f93565b91507f4368756e6b207761736e27742075706c6f6164656400000000000000000000006000830152602082019050919050565b60006145c0602683614f93565b91507f436f756c64206e6f742072657365727665206c657373207468616e207573656460008301527f20737061636500000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614626601683614f93565b91507f4469726563746f7279206973206e6f7420656d707479000000000000000000006000830152602082019050919050565b6000614666602383614f93565b91507f46696c65206861736e2774206265656e2075706c6f6164656420636f7272656360008301527f746c7900000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006146cc601183614f93565b91507f4368756e6b207761736e277420726561640000000000000000000000000000006000830152602082019050919050565b600061470c601883614f93565b91507f46696c656e616d652073686f756c64206265203c2032353600000000000000006000830152602082019050919050565b600061474c601f83614f93565b91507f46696c652073686f756c64206265206c657373207468616e20313030204d42006000830152602082019050919050565b600061478c600283614fa4565b91507f2e2e0000000000000000000000000000000000000000000000000000000000006000830152600282019050919050565b60006147cc601183614f93565b91507f4469726563746f72792069732066756c6c0000000000000000000000000000006000830152602082019050919050565b600061480c600e83614f93565b91507f46696c65206e6f7420666f756e640000000000000000000000000000000000006000830152602082019050919050565b600061484c601883614f93565b91507f46696c65206f72206469726563746f72792065786973747300000000000000006000830152602082019050919050565b600061488c601983614f93565b91507f4e6f7420656e6f756768207265736572766564207370616365000000000000006000830152602082019050919050565b60006148cc601883614f93565b91507f45564d206572726f7220696e2067657446696c6553697a6500000000000000006000830152602082019050919050565b600061490c601083614f93565b91507f46696c65206e6f742063726561746564000000000000000000000000000000006000830152602082019050919050565b600061494c601983614f93565b91507f46696c65206861736e2774206265656e2075706c6f61646564000000000000006000830152602082019050919050565b600060a083016000830151848203600086015261499c8282614163565b91505060208301516149b160208601826140f6565b5060408301516149c460408601826149fc565b5060608301516149d76060860182614114565b50608083015184820360808601526149ef8282613fcc565b9150508091505092915050565b614a058161500a565b82525050565b614a148161500a565b82525050565b6000614a26828461419c565b915081905092915050565b6000614a3d8284614132565b915081905092915050565b6000614a53826144f3565b9150819050919050565b6000614a688261477f565b9150819050919050565b60006210000082019050614a89600083018461402a565b92915050565b60006020820190508181036000830152614aa98184614081565b905092915050565b6000602082019050614ac66000830184614123565b92915050565b60006020820190508181036000830152614ae5816141cd565b9050919050565b60006020820190508181036000830152614b058161420d565b9050919050565b60006020820190508181036000830152614b258161424d565b9050919050565b60006020820190508181036000830152614b45816142b3565b9050919050565b60006020820190508181036000830152614b65816142f3565b9050919050565b60006020820190508181036000830152614b8581614333565b9050919050565b60006020820190508181036000830152614ba581614373565b9050919050565b60006020820190508181036000830152614bc5816143b3565b9050919050565b60006020820190508181036000830152614be5816143f3565b9050919050565b60006020820190508181036000830152614c0581614433565b9050919050565b60006020820190508181036000830152614c2581614473565b9050919050565b60006020820190508181036000830152614c45816144b3565b9050919050565b60006020820190508181036000830152614c6581614533565b9050919050565b60006020820190508181036000830152614c8581614573565b9050919050565b60006020820190508181036000830152614ca5816145b3565b9050919050565b60006020820190508181036000830152614cc581614619565b9050919050565b60006020820190508181036000830152614ce581614659565b9050919050565b60006020820190508181036000830152614d05816146bf565b9050919050565b60006020820190508181036000830152614d25816146ff565b9050919050565b60006020820190508181036000830152614d458161473f565b9050919050565b60006020820190508181036000830152614d65816147bf565b9050919050565b60006020820190508181036000830152614d85816147ff565b9050919050565b60006020820190508181036000830152614da58161483f565b9050919050565b60006020820190508181036000830152614dc58161487f565b9050919050565b60006020820190508181036000830152614de5816148bf565b9050919050565b60006020820190508181036000830152614e05816148ff565b9050919050565b60006020820190508181036000830152614e258161493f565b9050919050565b6000602082019050614e416000830184614a0b565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614e6a57600080fd5b8060405250919050565b600067ffffffffffffffff821115614e8b57600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614eb757600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050919050565b6000819050602082019050919050565b600081519050919050565b60006180009050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614fba82614fea565b9050919050565b60008115159050919050565b6000819050919050565b6000819050614fe582615079565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061501f82614fd7565b9050919050565b82818337600083830152505050565b60005b83811015615053578082015181840152602081019050615038565b83811115615062576000848401525b50505050565b6000601f19601f8301169050919050565b6003811061508357fe5b50565b61508f81614faf565b811461509a57600080fd5b50565b6150a68161500a565b81146150b157600080fd5b5056fea365627a7a72315820314a90e541327f2678eaf7815f54348c3702e4fa45cdf1d5595b378d08af86896c6578706572696d656e74616cf564736f6c634300050d0040", + "nonce": "0", + "storage": { + "0x0": "2868903936" + } + }, + "0x69bfcdcb98c9562e0a2faee3ecdfd65e8a0adb19": { + "balance": "1000000000000000000000000000000" + }, + "0x6a37ad7dceec4595eea9f03b82d2710e738343ac": { + "balance": "1000000000000000000000000000000" + }, + "0x6b806862a977a0e22ed1752f858e5332647121c8": { + "balance": "1000000000000000000000000000000" + }, + "0x6c0ef9084a57df13c175afea32ea47a510c5506e": { + "balance": "1000000000000000000000000000000" + }, + "0x6cd5e637266e18d3e888ee99451eb828c6b491f4": { + "balance": "1000000000000000000000000000000" + }, + "0x6d0d7f0ff51917bd84a5f7270d31a894282aaf4b": { + "balance": "1000000000000000000000000000000" + }, + "0x6d8092cb926daf29236f866cd31c327ff73323d1": { + "balance": "1000000000000000000000000000000" + }, + "0x6d80aAC61F6d92c7F4A3c412850474ba963B698E": { + "balance": "1000000000000000000000" + }, + "0x6fec280c0ab320715b17d70e8b02c2d4141c1372": { + "balance": "1000000000000000000000000000000" + }, + "0x733ad609ef2e742334d96266fbc13733f1cf5e4a": { + "balance": "1000000000000000000000000000000" + }, + "0x7525198d8cd1121d57358a0b0ed037e924581a76": { + "balance": "1000000000000000000000000000000" + }, + "0x765708943c3b791563d1e3f0533b6d7e7d769e4d": { + "balance": "1000000000000000000000000000000" + }, + "0x7685d04f0b7657017b77efa004a14ff9f022acab": { + "balance": "1000000000000000000000000000000" + }, + "0x76b545cb6a2fc671f741950eeb27627e69a1e69b": { + "balance": "1000000000000000000000000000000" + }, + "0x77a0bc73442d3d9cb993e8d9752f95babf0ccaa6": { + "balance": "1000000000000000000000000000000" + }, + "0x7a89A6c323FaCfF0ADeF7EEF3e491aD4044d0592": { + "balance": "100000000000000000000000" + }, + "0x7e7E68F04D1799Fa25C8cff57314c8a5d3942e69": { + "balance": "1000000000000000000000000" + }, + "0x811d701d14539d190a8593fe901eafe8eff511f5": { + "balance": "1000000000000000000000000000000" + }, + "0x81dcbd71da28fafb9ca99ff5a22bfcebba84fecc": { + "balance": "100000000000000000000000" + }, + "0x83c1479d2a32d9ed9fa699289b6c2db56b7cd045": { + "balance": "1000000000000000000000000000000" + }, + "0x85b33f0853ab8eaa4e602bdfd724d44bc2731e90": { + "balance": "1000000000000000000000000000000" + }, + "0x863f816036e3cbba90855196c9d1e339fcff1650": { + "balance": "1000000000000000000000000000000" + }, + "0x87ea381878572d63b3453033d7540abddd191186": { + "balance": "1000000000000000000000000000000" + }, + "0x88fd5e01078629cc194c933d9631b9448fe10b1d": { + "balance": "1000000000000000000000000000000" + }, + "0x8945e48bd056f45c8b57f9025d2674bb03a24035": { + "balance": "1000000000000000000000000000000" + }, + "0x8a920edc1021ce76c22774e0e83723a6e51c2439": { + "balance": "1000000000000000000000000000000" + }, + "0x8e6081e272c8f4d49f5b29157b52f68cbd6307ad": { + "balance": "1000000000000000000000000000000" + }, + "0x8fe24dbbf9884bd458d8cfac528b4ad70e82497d": { + "balance": "1000000000000000000000000000000" + }, + "0x90431f3f75b26657f74abbb5c759b12e78f916cc": { + "balance": "1000000000000000000000000000000" + }, + "0x907cd0881E50d359bb9Fd120B1A5A143b1C97De6": { + "balance": "1000000000000000000000000000000000000000000000000000000000" + }, + "0x94c6e5746971d6aebeaa42cbbe2feca0f6b5b24f": { + "balance": "1000000000000000000000000000000" + }, + "0x96672f9e982936e1904b15c948cc81bf18027db6": { + "balance": "1000000000000000000000000000000" + }, + "0x97b921ba45e0aa8830701aa62050a83ee00a1bb8": { + "balance": "1000000000000000000000000000000" + }, + "0x98e50c97baf98dc6a81bdb95067339a269a36fc1": { + "balance": "1000000000000000000000000000000" + }, + "0x9b77f28285a49601169a33332f08aa309d97edd0": { + "balance": "1000000000000000000000000000000" + }, + "0x9f62f4215cd277ca40dede101b4ccb29290de6bb": { + "balance": "1000000000000000000000000000000" + }, + "0xD1001000000000000000000000000000000000D1": { + "balance": "0", + "code": "0x608060405260043610603f576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680636d4ce63c146044575b600080fd5b348015604f57600080fd5b506056606c565b6040518082815260200191505060405180910390f35b60006001600060048152602001908152602001600020600060098152602001908152602001600020600101549050905600a165627a7a723058208fe64219becc0bcab1c8f854f05804ebb6bb555da5dbc49e8f7021c31d77636a0029", + "nonce": "0", + "storage": { + "0x3b4da637a1b0e6dbfc6795f2b7f0cb29eebb91b3af4dcc335e1633f6b4af810b": "1111" + } + }, + "0xD3001000000000000000000000000000000000D3": { + "balance": "0", + "code": "0x60806040526004361061007b5760003560e01c80639623609d1161004e5780639623609d1461013657806399a88ec4146101f5578063f2fde38b14610230578063f3b7dead146102635761007b565b8063204e1c7a14610080578063715018a6146100cf5780637eff275e146100e65780638da5cb5b14610121575b600080fd5b34801561008c57600080fd5b506100b3600480360360208110156100a357600080fd5b50356001600160a01b0316610296565b604080516001600160a01b039092168252519081900360200190f35b3480156100db57600080fd5b506100e4610328565b005b3480156100f257600080fd5b506100e46004803603604081101561010957600080fd5b506001600160a01b03813581169160200135166103ca565b34801561012d57600080fd5b506100b3610496565b6100e46004803603606081101561014c57600080fd5b6001600160a01b03823581169260208101359091169181019060608101604082013564010000000081111561018057600080fd5b82018360208201111561019257600080fd5b803590602001918460018302840111640100000000831117156101b457600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506104a5945050505050565b34801561020157600080fd5b506100e46004803603604081101561021857600080fd5b506001600160a01b03813581169160200135166105dd565b34801561023c57600080fd5b506100e46004803603602081101561025357600080fd5b50356001600160a01b031661068d565b34801561026f57600080fd5b506100b36004803603602081101561028657600080fd5b50356001600160a01b0316610785565b6000806060836001600160a01b03166040518080635c60da1b60e01b8152506004019050600060405180830381855afa9150503d80600081146102f5576040519150601f19603f3d011682016040523d82523d6000602084013e6102fa565b606091505b50915091508161030957600080fd5b80806020019051602081101561031e57600080fd5b5051949350505050565b6103306107e4565b6000546001600160a01b03908116911614610380576040805162461bcd60e51b8152602060048201819052602482015260008051602061080f833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6103d26107e4565b6000546001600160a01b03908116911614610422576040805162461bcd60e51b8152602060048201819052602482015260008051602061080f833981519152604482015290519081900360640190fd5b816001600160a01b0316638f283970826040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050600060405180830381600087803b15801561047a57600080fd5b505af115801561048e573d6000803e3d6000fd5b505050505050565b6000546001600160a01b031690565b6104ad6107e4565b6000546001600160a01b039081169116146104fd576040805162461bcd60e51b8152602060048201819052602482015260008051602061080f833981519152604482015290519081900360640190fd5b826001600160a01b0316634f1ef2863484846040518463ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561057357818101518382015260200161055b565b50505050905090810190601f1680156105a05780820380516001836020036101000a031916815260200191505b5093505050506000604051808303818588803b1580156105bf57600080fd5b505af11580156105d3573d6000803e3d6000fd5b5050505050505050565b6105e56107e4565b6000546001600160a01b03908116911614610635576040805162461bcd60e51b8152602060048201819052602482015260008051602061080f833981519152604482015290519081900360640190fd5b816001600160a01b0316633659cfe6826040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050600060405180830381600087803b15801561047a57600080fd5b6106956107e4565b6000546001600160a01b039081169116146106e5576040805162461bcd60e51b8152602060048201819052602482015260008051602061080f833981519152604482015290519081900360640190fd5b6001600160a01b03811661072a5760405162461bcd60e51b81526004018080602001828103825260268152602001806107e96026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000806060836001600160a01b031660405180806303e1469160e61b8152506004019050600060405180830381855afa9150503d80600081146102f5576040519150601f19603f3d011682016040523d82523d6000602084013e6102fa565b339056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a26469706673582212201d968ac32bef5562c6b4f1bd5d2f2a74c14d07ce008ca6fdc5a3bd0f5fc265f564736f6c63430006080033", + "nonce": "0", + "storage": { + "0x0": "0x907cd0881E50d359bb9Fd120B1A5A143b1C97De6" + } + }, + "0xD3002000000000000000000000000000000000D3": { + "balance": "0", + "code": "0x60806040526004361061004e5760003560e01c80633659cfe6146100655780634f1ef286146100985780635c60da1b146101185780638f28397014610149578063f851a4401461017c5761005d565b3661005d5761005b610191565b005b61005b610191565b34801561007157600080fd5b5061005b6004803603602081101561008857600080fd5b50356001600160a01b03166101ab565b61005b600480360360408110156100ae57600080fd5b6001600160a01b0382351691908101906040810160208201356401000000008111156100d957600080fd5b8201836020820111156100eb57600080fd5b8035906020019184600183028401116401000000008311171561010d57600080fd5b5090925090506101e5565b34801561012457600080fd5b5061012d610292565b604080516001600160a01b039092168252519081900360200190f35b34801561015557600080fd5b5061005b6004803603602081101561016c57600080fd5b50356001600160a01b03166102cf565b34801561018857600080fd5b5061012d610389565b6101996103ba565b6101a96101a461041a565b61043f565b565b6101b3610463565b6001600160a01b0316336001600160a01b031614156101da576101d581610488565b6101e2565b6101e2610191565b50565b6101ed610463565b6001600160a01b0316336001600160a01b031614156102855761020f83610488565b6000836001600160a01b031683836040518083838082843760405192019450600093509091505080830381855af49150503d806000811461026c576040519150601f19603f3d011682016040523d82523d6000602084013e610271565b606091505b505090508061027f57600080fd5b5061028d565b61028d610191565b505050565b600061029c610463565b6001600160a01b0316336001600160a01b031614156102c4576102bd61041a565b90506102cc565b6102cc610191565b90565b6102d7610463565b6001600160a01b0316336001600160a01b031614156101da576001600160a01b0381166103355760405162461bcd60e51b81526004018080602001828103825260368152602001806105876036913960400191505060405180910390fd5b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f61035e610463565b604080516001600160a01b03928316815291841660208301528051918290030190a16101d5816104c8565b6000610393610463565b6001600160a01b0316336001600160a01b031614156102c4576102bd610463565b3b151590565b6103c2610463565b6001600160a01b0316336001600160a01b031614156104125760405162461bcd60e51b81526004018080602001828103825260328152602001806105556032913960400191505060405180910390fd5b6101a96101a9565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b3660008037600080366000845af43d6000803e80801561045e573d6000f35b3d6000fd5b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b610491816104ec565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610355565b6104f5816103b4565b6105305760405162461bcd60e51b815260040180806020018281038252603b8152602001806105bd603b913960400191505060405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5556fe43616e6e6f742063616c6c2066616c6c6261636b2066756e6374696f6e2066726f6d207468652070726f78792061646d696e43616e6e6f74206368616e6765207468652061646d696e206f6620612070726f787920746f20746865207a65726f206164647265737343616e6e6f742073657420612070726f787920696d706c656d656e746174696f6e20746f2061206e6f6e2d636f6e74726163742061646472657373a26469706673582212206e221e2a3547bd97244b05ed46430b1b078ba097cb2a4e25ec3d79cf9ac9f02c64736f6c63430006080033", + "nonce": "0", + "storage": { + "0x0": "1000000", + "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0xD3003000000000000000000000000000000000D3", + "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "0xD3001000000000000000000000000000000000D3" + } + }, + "0xD3003000000000000000000000000000000000D3": { + "balance": "0", + "code": "0x608060405234801561001057600080fd5b50600436106100b45760003560e01c806379210e8e1161007157806379210e8e1461017757806381a8235a146101a757806385aeeb17146101c35780639a9a5593146101f3578063a99100541461020f578063b57321221461022b576100b4565b806307c6e7d3146100b9578063122f4fba146100d55780631c6ec7a9146101055780631cfe4e3b14610121578063373dedb41461013d57806361e46db51461015b575b600080fd5b6100d360048036036100ce9190810190613e94565b61025b565b005b6100ef60048036036100ea9190810190613e94565b610862565b6040516100fc9190614b38565b60405180910390f35b61011f600480360361011a9190810190613e94565b610ba1565b005b61013b60048036036101369190810190613e58565b610fce565b005b6101456111ec565b6040516101529190614eb3565b60405180910390f35b61017560048036036101709190810190613f29565b6111f6565b005b610191600480360361018c9190810190613fa8565b611456565b60405161019e9190614af9565b60405180910390f35b6101c160048036036101bc9190810190613e94565b611756565b005b6101dd60048036036101d89190810190613e94565b6118fb565b6040516101ea9190614b16565b60405180910390f35b61020d60048036036102089190810190613ed5565b611bfa565b005b61022960048036036102249190810190613e94565b612195565b005b61024560048036036102409190810190613e94565b612849565b6040516102529190614eb3565b60405180910390f35b6000339050606061026b83612ac9565b90506000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b825181101561037c576000826001018460018403815181106102d557fe5b60200260200101516040516102ea9190614aa1565b90815260200160405180910390205411610339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161033090614cb3565b60405180910390fd5b8160020183600183038151811061034c57fe5b60200260200101516040516103619190614aa1565b908152602001604051809103902091508060010190506102b7565b506060600183511161038e57846103a7565b8260018451038151811061039e57fe5b60200260200101515b9050600082600101826040516103bd9190614ab8565b9081526020016040518091039020541161040c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161040390614cb3565b60405180910390fd5b600082600201826040516104209190614ab8565b90815260200160405180910390206000018054905014610475576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161046c90614d33565b60405180910390fd5b60006104818587612cc9565b9050806104c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ba90614c53565b60405180910390fd5b6104cb613a4f565b836000016001856000018054905003815481106104e457fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156105965780601f1061056b57610100808354040283529160200191610596565b820191906000526020600020905b81548152906001019060200180831161057957829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff1660028111156105e257fe5b60028111156105ed57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561066557602002820191906000526020600020906000905b82829054906101000a900460ff1615158152602001906001019060208260000104928301926001038202915080841161062f5790505b50505050508152505090508084600001600186600101866040516106899190614ab8565b90815260200160405180910390205403815481106106a357fe5b906000526020600020906005020160008201518160000190805190602001906106cd929190613a8b565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561071c57fe5b0217905550608082015181600401908051906020019061073d929190613b0b565b5090505083600101836040516107539190614ab8565b9081526020016040518091039020548460010182600001516040516107789190614aa1565b9081526020016040518091039020819055506000846001018460405161079e9190614ab8565b908152602001604051809103902081905550836000018054806107bd57fe5b6001900381819060005260206000209060050201600080820160006107e29190613bb1565b6001820160006101000a81549060ff021916905560028201600090556003820160006101000a81549060ff02191690556004820160006108229190613bf9565b5050905583600201836040516108389190614ab8565b9081526020016040518091039020600080820160006108579190613c21565b505050505050505050565b600080606061087084612d2d565b91509150606061087f82612ac9565b90506000600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015610964576000826001018460018403815181106108e957fe5b60200260200101516040516108fe9190614aa1565b908152602001604051809103902054141561092157600095505050505050610b9c565b8160020183600183038151811061093457fe5b60200260200101516040516109499190614aa1565b908152602001604051809103902091508060010190506108cb565b5060606001835111610976578361098f565b8260018451038151811061098657fe5b60200260200101515b9050600082600101826040516109a59190614ab8565b90815260200160405180910390205414156109c857600095505050505050610b9c565b6109d0613a4f565b82600001600184600101846040516109e89190614ab8565b9081526020016040518091039020540381548110610a0257fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610ab45780601f10610a8957610100808354040283529160200191610ab4565b820191906000526020600020905b815481529060010190602001808311610a9757829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115610b0057fe5b6002811115610b0b57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015610b8357602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411610b4d5790505b5050505050815250509050806060015196505050505050505b919050565b600360009054906101000a900460ff16610be457612000600481905550621000006005819055506001600360006101000a81548160ff0219169083151502179055505b6000815111610c28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1f90614cb3565b60405180910390fd5b60003390506060610c3883612ac9565b90506000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015610d4957600082600101846001840381518110610ca257fe5b6020026020010151604051610cb79190614aa1565b90815260200160405180910390205411610d06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cfd90614cb3565b60405180910390fd5b81600201836001830381518110610d1957fe5b6020026020010151604051610d2e9190614aa1565b90815260200160405180910390209150806001019050610c84565b50600454816000018054905010610d95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8c90614dd3565b60405180910390fd5b60606001835111610da65784610dbf565b82600184510381518110610db657fe5b60200260200101515b905060008260010182604051610dd59190614ab8565b90815260200160405180910390205414610e24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1b90614e13565b60405180910390fd5b610e2d816130af565b610e6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6390614cd3565b60405180910390fd5b6000610e788587613190565b905080610eba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb190614b73565b60405180910390fd5b610ec2613a4f565b8281600001819052506000816020019015159081151581525050836000018190806001815401808255809150506001900390600052602060002090600502016000909190919091506000820151816000019080519060200190610f26929190613a8b565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff02191690836002811115610f7557fe5b02179055506080820151816004019080519060200190610f96929190613b0b565b50505083600001805490508460010184604051610fb39190614ab8565b90815260200160405180910390208190555050505050505050565b610fd66131f4565b73ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16148061103b57503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614155b61107a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107190614c33565b60405180910390fd5b80600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411156110fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f390614d13565b60405180910390fd5b60025460095482011115611145576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113c90614b93565b60405180910390fd5b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460096000828254039250508190555080600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550806009600082825401925050819055505050565b6000600254905090565b60003390506000611207828661328d565b90506001600281111561121657fe5b8160030160009054906101000a900460ff16600281111561123357fe5b14611273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126a90614df3565b60405180910390fd5b6000600554858161128057fe5b061480156112915750806002015484105b6112d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c790614b53565b60405180910390fd5b600554848260020154031080156112ed5750838160020154038351145b806112fa57506005548351145b611339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133090614bf3565b60405180910390fd5b6000151581600401600554868161134c57fe5b048154811061135757fe5b90600052602060002090602091828204019190069054906101000a900460ff161515146113b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b090614bd3565b60405180910390fd5b60006113c78387878761348c565b905080611409576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140090614cf3565b60405180910390fd5b600182600401600554878161141a57fe5b048154811061142557fe5b90600052602060002090602091828204019190066101000a81548160ff021916908315150217905550505050505050565b61145e613c45565b6000606061146b86612d2d565b91509150611477613a4f565b611481838361328d565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156115255780601f106114fa57610100808354040283529160200191611525565b820191906000526020600020905b81548152906001019060200180831161150857829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561157157fe5b600281111561157c57fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156115f457602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116115be5790505b505050505081525050905060028081111561160b57fe5b8160600151600281111561161b57fe5b1461165b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165290614e93565b60405180910390fd5b600554851115801561166d5750600085115b6116ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a390614bf3565b60405180910390fd5b806040015185870111156116f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ec90614b53565b60405180910390fd5b60006117038484898961353d565b80965081925050508061174b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174290614d73565b60405180910390fd5b505050509392505050565b60003390506000611767828461328d565b90506001600281111561177657fe5b8160030160009054906101000a900460ff16600281111561179357fe5b146117d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ca90614df3565b60405180910390fd5b60006001905060008260040180549050905060008090505b8181101561183e576000151584600401828154811061180657fe5b90600052602060002090602091828204019190069054906101000a900460ff161515141561183357600092505b8060010190506117eb565b508161187f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187690614d53565b60405180910390fd5b60028360030160006101000a81548160ff021916908360028111156118a057fe5b021790555060006118b185876135d0565b9050806118f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ea90614bb3565b60405180910390fd5b505050505050565b60606000606061190a84612d2d565b91509150606061191982612ac9565b90506000600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008090505b8251811015611a235760008260010184838151811061197f57fe5b60200260200101516040516119949190614aa1565b908152602001604051809103902054116119e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119da90614cb3565b60405180910390fd5b816002018382815181106119f357fe5b6020026020010151604051611a089190614aa1565b90815260200160405180910390209150806001019050611964565b5080600001805480602002602001604051908101604052809291908181526020016000905b82821015611beb57838290600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611b045780601f10611ad957610100808354040283529160200191611b04565b820191906000526020600020905b815481529060010190602001808311611ae757829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115611b5057fe5b6002811115611b5b57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015611bd357602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411611b9d5790505b50505050508152505081526020019060010190611a48565b50505050945050505050919050565b600360009054906101000a900460ff16611c3d57612000600481905550621000006005819055506001600360006101000a81548160ff0219169083151502179055505b60003390506305f5e100821115611c89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8090614db3565b60405180910390fd5b600660008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205483011115611d4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4390614e33565b60405180910390fd5b6060611d5784612ac9565b90506000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015611e6857600082600101846001840381518110611dc157fe5b6020026020010151604051611dd69190614aa1565b90815260200160405180910390205411611e25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1c90614cb3565b60405180910390fd5b81600201836001830381518110611e3857fe5b6020026020010151604051611e4d9190614aa1565b90815260200160405180910390209150806001019050611da3565b50600454816000018054905010611eb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eab90614dd3565b60405180910390fd5b60606001835111611ec55785611ede565b82600184510381518110611ed557fe5b60200260200101515b905060008260010182604051611ef49190614ab8565b90815260200160405180910390205414611f43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3a90614e13565b60405180910390fd5b611f4c816130af565b611f8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8290614d93565b60405180910390fd5b6000611f98858888613634565b905080611fda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd190614e73565b60405180910390fd5b6060600554600160055489010381611fee57fe5b0460405190808252806020026020018201604052801561201d5781602001602082028038833980820191505090505b509050836000016040518060a001604052808581526020016001151581526020018981526020016001600281111561205157fe5b8152602001838152509080600181540180825580915050600190039060005260206000209060050201600090919091909150600082015181600001908051906020019061209f929190613a8b565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff021916908360028111156120ee57fe5b0217905550608082015181600401908051906020019061210f929190613b0b565b5050508360000180549050846001018460405161212c9190614ab8565b90815260200160405180910390208190555086600760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505050505050505050565b60003390506121a2613a4f565b6121ac828461328d565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156122505780601f1061222557610100808354040283529160200191612250565b820191906000526020600020905b81548152906001019060200180831161223357829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561229c57fe5b60028111156122a757fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561231f57602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116122e95790505b50505050508152505090506000600281111561233757fe5b8160600151600281111561234757fe5b1415612388576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161237f90614c13565b60405180910390fd5b600061239483856136a1565b9050806123d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123cd90614c73565b60405180910390fd5b60606123e185612ac9565b90506000600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015612479578160020183600183038151811061244957fe5b602002602001015160405161245e9190614aa1565b9081526020016040518091039020915080600101905061242d565b50600060018260010186600001516040516124949190614aa1565b9081526020016040518091039020540390506124ae613a4f565b826000016001846000018054905003815481106124c757fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156125795780601f1061254e57610100808354040283529160200191612579565b820191906000526020600020905b81548152906001019060200180831161255c57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff1660028111156125c557fe5b60028111156125d057fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561264857602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116126125790505b50505050508152505090508083600001838154811061266357fe5b9060005260206000209060050201600082015181600001908051906020019061268d929190613a8b565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff021916908360028111156126dc57fe5b021790555060808201518160040190805190602001906126fd929190613b0b565b509050508260000180548061270e57fe5b6001900381819060005260206000209060050201600080820160006127339190613bb1565b6001820160006101000a81549060ff021916905560028201600090556003820160006101000a81549060ff02191690556004820160006127739190613bf9565b5050905582600101866000015160405161278d9190614aa1565b9081526020016040518091039020548360010182600001516040516127b29190614aa1565b90815260200160405180910390208190555060008360010187600001516040516127dc9190614aa1565b9081526020016040518091039020819055508560400151600760008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505050505050505050565b600080606061285784612d2d565b91509150612863613a4f565b61286d838361328d565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156129115780601f106128e657610100808354040283529160200191612911565b820191906000526020600020905b8154815290600101906020018083116128f457829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561295d57fe5b600281111561296857fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156129e057602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116129aa5790505b5050505050815250509050600160028111156129f857fe5b81606001516002811115612a0857fe5b1480612a2d5750600280811115612a1b57fe5b81606001516002811115612a2b57fe5b145b612a6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a6390614df3565b60405180910390fd5b6000612a788484613705565b809650819250505080612ac0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ab790614e53565b60405180910390fd5b50505050919050565b6060612ad3613c6a565b612adc8361376e565b9050612ae6613c6a565b612b246040518060400160405280600181526020017f2f0000000000000000000000000000000000000000000000000000000000000081525061376e565b905060606001612b3d838561379c90919063ffffffff16565b01604051908082528060200260200182016040528015612b7157816020015b6060815260200190600190039081612b5c5790505b50905060008090505b8151811015612bc257612b9e612b99848661381190919063ffffffff16565b61382b565b828281518110612baa57fe5b60200260200101819052508080600101915050612b7a565b50600081600183510381518110612bd557fe5b6020026020010151511415612c405780600182510381518110612bf457fe5b6020026020010160608152506001815103604051908082528060200260200182016040528015612c3857816020015b6060815260200190600190039081612c235790505b509350612c79565b8051604051908082528060200260200182016040528015612c7557816020015b6060815260200190600190039081612c605790505b5093505b60008090505b8451811015612cc057818181518110612c9457fe5b6020026020010151858281518110612ca857fe5b60200260200101819052508080600101915050612c7f565b50505050919050565b60008060016020601f85510181612cdc57fe5b040190506040518481526020810160005b83811015612d0e578060200286015181602002830152806001019050612ced565b50602082602085026040018460006010600019f1935050505092915050565b6000606060006028905080845111612d7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d7190614c93565b60405180910390fd5b6060816040519080825280601f01601f191660200182016040528015612daf5781602001600182028038833980820191505090505b50905060008090505b82811015612e1f57858181518110612dcc57fe5b602001015160f81c60f81b828281518110612de357fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050612db8565b50600080905060008090505b83811015612f4e576000838281518110612e4157fe5b602001015160f81c60f81b60f81c60ff16905060308110158015612e66575060398111155b80612e7f575060418110158015612e7e5750605a8111155b5b80612e98575060618110158015612e97575060668111155b5b612ed7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ece90614c93565b60405180910390fd5b60308110158015612ee9575060398111155b15612efa5760308103601084020192505b60418110158015612f0c5750605a8111155b15612f1d5760378103601084020192505b60618110158015612f2f575060668111155b15612f405760578103601084020192505b508080600101915050612e2b565b508094507f2f00000000000000000000000000000000000000000000000000000000000000868481518110612f7f57fe5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612fec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fe390614c93565b60405180910390fd5b6000600184885103039050806040519080825280601f01601f19166020018201604052801561302a5781602001600182028038833980820191505090505b50945060008090505b818110156130a5576000886001878401018151811061304e57fe5b602001015160f81c60f81b90508087838151811061306857fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350508080600101915050613033565b5050505050915091565b60006040516020016130c090614ae4565b60405160208183030381529060405280519060200120826040516020016130e79190614ab8565b604051602081830303815290604052805190602001201480613152575060405160200161311390614acf565b604051602081830303815290604052805190602001208260405160200161313a9190614ab8565b60405160208183030381529060405280519060200120145b8061315e575060008251145b1561316c576000905061318b565b60008251905060ff81111561318557600091505061318b565b60019150505b919050565b60008060016020601f855101816131a357fe5b040190506040518481526020810160005b838110156131d55780602002860151816020028301528060010190506131b4565b5060208260208502604001846000600f600019f1935050505092915050565b600073d2001000000000000000000000000000000000d273ffffffffffffffffffffffffffffffffffffffff166383e781fe6040518163ffffffff1660e01b815260040160206040518083038186803b15801561325057600080fd5b505afa158015613264573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506132889190810190613e2f565b905090565b6000606061329a83612ac9565b90506000600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b82518110156133ab5760008260010184600184038151811061330457fe5b60200260200101516040516133199190614aa1565b90815260200160405180910390205411613368576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161335f90614cb3565b60405180910390fd5b8160020183600183038151811061337b57fe5b60200260200101516040516133909190614aa1565b908152602001604051809103902091508060010190506132e6565b50606060018351116133bd57846133d6565b826001845103815181106133cd57fe5b60200260200101515b9050600082600101826040516133ec9190614ab8565b9081526020016040518091039020541161343b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161343290614cb3565b60405180910390fd5b600082600001600184600101846040516134559190614ab8565b908152602001604051809103902054038154811061346f57fe5b906000526020600020906005020190508094505050505092915050565b60008060016020601f8551018161349f57fe5b04019050600060016020601f885101816134b557fe5b040190506040518781526020810160005b838110156134e75780602002890151816020028301528060010190506134c6565b50868360200282015260005b8481101561351957806020028701518185600101016020028301528060010190506134f3565b50602082848601602002606001846000600c600019f1945050505050949350505050565b6000613547613c45565b600060016020601f8851018161355957fe5b0401905060006020601f86018161356c57fe5b0490506040518881526020810160005b8481101561359d57806020028a01518160200283015280600101905061357c565b5083602002810188815287816020015283602002868660030160200285600a600019fa9650505050505094509492505050565b60008060016020601f855101816135e357fe5b040190506040518481526020810160005b838110156136155780602002860151816020028301528060010190506135f4565b50602082602085026040018460006011600019f1935050505092915050565b60008060016020601f8651018161364757fe5b040190506040518581526020810160005b83811015613679578060200287015181602002830152806001019050613658565b50846020840282015260208260208502604001846000600b600019f193505050509392505050565b60008060016020601f855101816136b457fe5b040190506040518481526020810160005b838110156136e65780602002860151816020028301528060010190506136c5565b5060208260208502604001846000600e600019f1935050505092915050565b600080600060016020601f8651018161371a57fe5b040190506040518581526020810160005b8381101561374c57806020028701518160200283015280600101905061372b565b506020826020850260200184600d600019fa9450815193505050509250929050565b613776613c6a565b600060208301905060405180604001604052808451815260200182815250915050919050565b60008082600001516137c0856000015186602001518660000151876020015161388d565b0190505b8360000151846020015101811161380a578180600101925050826000015161380285602001518303866000015103838660000151876020015161388d565b0190506137c4565b5092915050565b613819613c6a565b613824838383613968565b5092915050565b60608082600001516040519080825280601f01601f1916602001820160405280156138655781602001600182028038833980820191505090505b50905060006020820190506138838185602001518660000151613a06565b8192505050919050565b6000808490506000868511613958576020851161391257600060018660200360080260020a031960001b905060008186511690506000878a8a0103905060008386511690505b828114613904578186106138f1578a8a019650505050505050613960565b85806001019650508386511690506138d3565b859650505050505050613960565b60008585209050600091505b85880382116139565760008684209050808214156139425783945050505050613960565b60018401935050818060010192505061391e565b505b868601925050505b949350505050565b613970613c6a565b600061398e856000015186602001518660000151876020015161388d565b905084602001518360200181815250508460200151810383600001818152505084600001518560200151018114156139d05760008560000181815250506139fb565b8360000151836000015101856000018181510391508181525050836000015181018560200181815250505b829150509392505050565b5b60208110613a2a5781518352602083019250602082019150602081039050613a07565b60006001826020036101000a0390508019835116818551168181178652505050505050565b6040518060a00160405280606081526020016000151581526020016000815260200160006002811115613a7e57fe5b8152602001606081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613acc57805160ff1916838001178555613afa565b82800160010185558215613afa579182015b82811115613af9578251825591602001919060010190613ade565b5b509050613b079190613c84565b5090565b82805482825590600052602060002090601f01602090048101928215613ba05791602002820160005b83821115613b7157835183826101000a81548160ff0219169083151502179055509260200192600101602081600001049283019260010302613b34565b8015613b9e5782816101000a81549060ff0219169055600101602081600001049283019260010302613b71565b505b509050613bad9190613ca9565b5090565b50805460018160011615610100020316600290046000825580601f10613bd75750613bf6565b601f016020900490600052602060002090810190613bf59190613c84565b5b50565b50805460008255601f016020900490600052602060002090810190613c1e9190613c84565b50565b5080546000825560050290600052602060002090810190613c429190613cd9565b50565b6040518062100000016040528061800090602082028038833980820191505090505090565b604051806040016040528060008152602001600081525090565b613ca691905b80821115613ca2576000816000905550600101613c8a565b5090565b90565b613cd691905b80821115613cd257600081816101000a81549060ff021916905550600101613caf565b5090565b90565b613d4591905b80821115613d415760008082016000613cf89190613bb1565b6001820160006101000a81549060ff021916905560028201600090556003820160006101000a81549060ff0219169055600482016000613d389190613bf9565b50600501613cdf565b5090565b90565b600081359050613d578161510d565b92915050565b600081519050613d6c8161510d565b92915050565b600082601f830112613d8357600080fd5b8135613d96613d9182614efb565b614ece565b91508082526020830160208301858383011115613db257600080fd5b613dbd8382846150ad565b50505092915050565b600082601f830112613dd757600080fd5b8135613dea613de582614f27565b614ece565b91508082526020830160208301858383011115613e0657600080fd5b613e118382846150ad565b50505092915050565b600081359050613e2981615124565b92915050565b600060208284031215613e4157600080fd5b6000613e4f84828501613d5d565b91505092915050565b60008060408385031215613e6b57600080fd5b6000613e7985828601613d48565b9250506020613e8a85828601613e1a565b9150509250929050565b600060208284031215613ea657600080fd5b600082013567ffffffffffffffff811115613ec057600080fd5b613ecc84828501613dc6565b91505092915050565b60008060408385031215613ee857600080fd5b600083013567ffffffffffffffff811115613f0257600080fd5b613f0e85828601613dc6565b9250506020613f1f85828601613e1a565b9150509250929050565b600080600060608486031215613f3e57600080fd5b600084013567ffffffffffffffff811115613f5857600080fd5b613f6486828701613dc6565b9350506020613f7586828701613e1a565b925050604084013567ffffffffffffffff811115613f9257600080fd5b613f9e86828701613d72565b9150509250925092565b600080600060608486031215613fbd57600080fd5b600084013567ffffffffffffffff811115613fd757600080fd5b613fe386828701613dc6565b9350506020613ff486828701613e1a565b925050604061400586828701613e1a565b9150509250925092565b600061401b838361417d565b60208301905092915050565b6000614033838361418c565b60208301905092915050565b600061404b8383614a06565b905092915050565b600061405e82614f7d565b6140688185614fdc565b935061407383614f53565b8060005b838110156140a457815161408b888261400f565b975061409683614fb5565b925050600181019050614077565b5085935050505092915050565b6140ba81614f88565b6140c48184614fed565b92506140cf82614f63565b8060005b838110156141005781516140e78782614027565b96506140f283614fc2565b9250506001810190506140d3565b505050505050565b600061411382614f94565b61411d8185614ff8565b93508360208202850161412f85614f6d565b8060005b8581101561416b578484038952815161414c858261403f565b945061415783614fcf565b925060208a01995050600181019050614133565b50829750879550505050505092915050565b61418681615048565b82525050565b61419581615054565b82525050565b6141a48161509b565b82525050565b6141b38161509b565b82525050565b60006141c482614faa565b6141ce818561502b565b93506141de8185602086016150bc565b80840191505092915050565b60006141f582614f9f565b6141ff8185615009565b935061420f8185602086016150bc565b614218816150ef565b840191505092915050565b600061422e82614f9f565b614238818561502b565b93506142488185602086016150bc565b80840191505092915050565b600061426160188361501a565b91507f496e636f7272656374206368756e6b20706f736974696f6e00000000000000006000830152602082019050919050565b60006142a160158361501a565b91507f4469726563746f7279206e6f74206372656174656400000000000000000000006000830152602082019050919050565b60006142e160248361501a565b91507f4e6f7420656e6f756768206d656d6f727920696e207468652046696c6573746f60008301527f72616765000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614347601b8361501a565b91507f48617368206861736e2774206265656e2063616c63756c6174656400000000006000830152602082019050919050565b600061438760198361501a565b91507f4368756e6b20697320616c72656164792075706c6f61646564000000000000006000830152602082019050919050565b60006143c760168361501a565b91507f496e636f7272656374206368756e6b206c656e677468000000000000000000006000830152602082019050919050565b6000614407600f8361501a565b91507f46696c65206e6f742065786973747300000000000000000000000000000000006000830152602082019050919050565b6000614447600e8361501a565b91507f496e76616c69642073656e6465720000000000000000000000000000000000006000830152602082019050919050565b600061448760188361501a565b91507f4469726563746f7279206973206e6f742064656c6574656400000000000000006000830152602082019050919050565b60006144c760108361501a565b91507f46696c65206e6f742064656c65746564000000000000000000000000000000006000830152602082019050919050565b600061450760138361501a565b91507f496e76616c69642073746f7261676550617468000000000000000000000000006000830152602082019050919050565b6000614547600c8361501a565b91507f496e76616c6964207061746800000000000000000000000000000000000000006000830152602082019050919050565b600061458760018361502b565b91507f2e000000000000000000000000000000000000000000000000000000000000006000830152600182019050919050565b60006145c760168361501a565b91507f496e76616c6964206469726563746f7279206e616d65000000000000000000006000830152602082019050919050565b600061460760158361501a565b91507f4368756e6b207761736e27742075706c6f6164656400000000000000000000006000830152602082019050919050565b600061464760268361501a565b91507f436f756c64206e6f742072657365727665206c657373207468616e207573656460008301527f20737061636500000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006146ad60168361501a565b91507f4469726563746f7279206973206e6f7420656d707479000000000000000000006000830152602082019050919050565b60006146ed60238361501a565b91507f46696c65206861736e2774206265656e2075706c6f6164656420636f7272656360008301527f746c7900000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061475360118361501a565b91507f4368756e6b207761736e277420726561640000000000000000000000000000006000830152602082019050919050565b600061479360188361501a565b91507f46696c656e616d652073686f756c64206265203c2032353600000000000000006000830152602082019050919050565b60006147d3601f8361501a565b91507f46696c652073686f756c64206265206c657373207468616e20313030204d42006000830152602082019050919050565b600061481360028361502b565b91507f2e2e0000000000000000000000000000000000000000000000000000000000006000830152600282019050919050565b600061485360118361501a565b91507f4469726563746f72792069732066756c6c0000000000000000000000000000006000830152602082019050919050565b6000614893600e8361501a565b91507f46696c65206e6f7420666f756e640000000000000000000000000000000000006000830152602082019050919050565b60006148d360188361501a565b91507f46696c65206f72206469726563746f72792065786973747300000000000000006000830152602082019050919050565b600061491360198361501a565b91507f4e6f7420656e6f756768207265736572766564207370616365000000000000006000830152602082019050919050565b600061495360188361501a565b91507f45564d206572726f7220696e2067657446696c6553697a6500000000000000006000830152602082019050919050565b600061499360108361501a565b91507f46696c65206e6f742063726561746564000000000000000000000000000000006000830152602082019050919050565b60006149d360198361501a565b91507f46696c65206861736e2774206265656e2075706c6f61646564000000000000006000830152602082019050919050565b600060a0830160008301518482036000860152614a2382826141ea565b9150506020830151614a38602086018261417d565b506040830151614a4b6040860182614a83565b506060830151614a5e606086018261419b565b5060808301518482036080860152614a768282614053565b9150508091505092915050565b614a8c81615091565b82525050565b614a9b81615091565b82525050565b6000614aad8284614223565b915081905092915050565b6000614ac482846141b9565b915081905092915050565b6000614ada8261457a565b9150819050919050565b6000614aef82614806565b9150819050919050565b60006210000082019050614b1060008301846140b1565b92915050565b60006020820190508181036000830152614b308184614108565b905092915050565b6000602082019050614b4d60008301846141aa565b92915050565b60006020820190508181036000830152614b6c81614254565b9050919050565b60006020820190508181036000830152614b8c81614294565b9050919050565b60006020820190508181036000830152614bac816142d4565b9050919050565b60006020820190508181036000830152614bcc8161433a565b9050919050565b60006020820190508181036000830152614bec8161437a565b9050919050565b60006020820190508181036000830152614c0c816143ba565b9050919050565b60006020820190508181036000830152614c2c816143fa565b9050919050565b60006020820190508181036000830152614c4c8161443a565b9050919050565b60006020820190508181036000830152614c6c8161447a565b9050919050565b60006020820190508181036000830152614c8c816144ba565b9050919050565b60006020820190508181036000830152614cac816144fa565b9050919050565b60006020820190508181036000830152614ccc8161453a565b9050919050565b60006020820190508181036000830152614cec816145ba565b9050919050565b60006020820190508181036000830152614d0c816145fa565b9050919050565b60006020820190508181036000830152614d2c8161463a565b9050919050565b60006020820190508181036000830152614d4c816146a0565b9050919050565b60006020820190508181036000830152614d6c816146e0565b9050919050565b60006020820190508181036000830152614d8c81614746565b9050919050565b60006020820190508181036000830152614dac81614786565b9050919050565b60006020820190508181036000830152614dcc816147c6565b9050919050565b60006020820190508181036000830152614dec81614846565b9050919050565b60006020820190508181036000830152614e0c81614886565b9050919050565b60006020820190508181036000830152614e2c816148c6565b9050919050565b60006020820190508181036000830152614e4c81614906565b9050919050565b60006020820190508181036000830152614e6c81614946565b9050919050565b60006020820190508181036000830152614e8c81614986565b9050919050565b60006020820190508181036000830152614eac816149c6565b9050919050565b6000602082019050614ec86000830184614a92565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614ef157600080fd5b8060405250919050565b600067ffffffffffffffff821115614f1257600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614f3e57600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050919050565b6000819050602082019050919050565b600081519050919050565b60006180009050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061504182615071565b9050919050565b60008115159050919050565b6000819050919050565b600081905061506c82615100565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006150a68261505e565b9050919050565b82818337600083830152505050565b60005b838110156150da5780820151818401526020810190506150bf565b838111156150e9576000848401525b50505050565b6000601f19601f8301169050919050565b6003811061510a57fe5b50565b61511681615036565b811461512157600080fd5b50565b61512d81615091565b811461513857600080fd5b5056fea2646970667358221220a549ad9e778ae8bb3048c0a1805e77745871cc1560637ae1c3ebccb76638d9c464736f6c63430006020033", + "nonce": "0", + "storage": {} + }, + "0xa096b05a489831db893fc53aacc7ed20efb36382": { + "balance": "1000000000000000000000000000000" + }, + "0xa1cd651d99283be60e2a9d2e3bc8a90aedb8244f": { + "balance": "1000000000000000000000000000000" + }, + "0xa2969e82619021ea407338f8bdf7c6f2bd679673": { + "balance": "1000000000000000000000000000000" + }, + "0xa3597b1162b6559cb5e966904b63e762ece756a4": { + "balance": "1000000000000000000000000000000" + }, + "0xa68f946090c600eda6f139783077ee802afeb990": { + "balance": "1000000000000000000000000000000" + }, + "0xa6d50055592cecb795bc1ed3b9ea57ed426b0b7c": { + "balance": "1000000000000000000000000000000" + }, + "0xa7c0789bdeee38c6b59111a789dfb6b815489847": { + "balance": "1000000000000000000000000000000" + }, + "0xa8c813ee806b4c8537ff5f16084d44db18ea9ab1": { + "balance": "1000000000000000000000000000000" + }, + "0xaa6a87bbb74bc1f3cb40c1efb7fc171ee6407560": { + "balance": "1000000000000000000000000000000" + }, + "0xabf920b89f5a2487fdb70be17fd01a99a0602e62": { + "balance": "1000000000000000000000000000000" + }, + "0xac5df92da5171ba24a9618018b4f79494040334b": { + "balance": "1000000000000000000000000000000" + }, + "0xaf97a8318a1a51d5daeeb9650024b63ee44f45bd": { + "balance": "1000000000000000000000000000000" + }, + "0xb28c45b98ae43a5e9ee5509c97ea037b5de5d6d9": { + "balance": "1000000000000000000000000000000" + }, + "0xb64989ab32b089da3da103b93e6781d6d5dd10b4": { + "balance": "1000000000000000000000000000000" + }, + "0xb67e6f4a21f93c250fa6ff0cb142bd14dd4ca8eb": { + "balance": "1000000000000000000000000000000" + }, + "0xb70603c505f85130b5b2e73cd82d196dfd7d8b5e": { + "balance": "1000000000000000000000000000000" + }, + "0xb942414cae2a1ab1056657b905845c0ab6b6280a": { + "balance": "1000000000000000000000000000000" + }, + "0xbee0e5c1961d51be9bd670876caa9c90ba7d9016": { + "balance": "1000000000000000000000000000000" + }, + "0xbf2d8cebdeeb8ad8fed7b2a75f35922106f8d75c": { + "balance": "1000000000000000000000000000000" + }, + "0xbf5aa678b969c0871e2fbcf09c3dbb5d5865ac1e": { + "balance": "1000000000000000000000000000000" + }, + "0xc12bcedd9bcad9120150122cd50f39576ecccc08": { + "balance": "1000000000000000000000000000000" + }, + "0xc2d3852f3292acb81bd164dbae5f1e2a87535150": { + "balance": "1000000000000000000000000000000" + }, + "0xc3820490201e94d76b44655d2df713fec29d9795": { + "balance": "1000000000000000000000000000000" + }, + "0xc58744e2eceefd45cc5469f0e0a708ad24ddbbdb": { + "balance": "1000000000000000000000000000000" + }, + "0xc7865200e8e51ba1c8d695f327deed432930f2cc": { + "balance": "1000000000000000000000000000000" + }, + "0xc8e4d709eb3eb335dc69c9fbf2d24d447cb86105": { + "balance": "1000000000000000000000000000000" + }, + "0xc98af661e44c5bf31d2f8bdff4bbf2808ed4e991": { + "balance": "1000000000000000000000000000000" + }, + "0xca4409573a5129a72edf85d6c51e26760fc9c903": { + "balance": "100000000000000000000000" + }, + "0xcc33e23b04b74f7ba8fbe315083182224af973fa": { + "balance": "1000000000000000000000000000000" + }, + "0xce1c62d0a77600fb2f959b4da76fcb9b3b9430a3": { + "balance": "1000000000000000000000000000000" + }, + "0xd1b6c947fb14060b38945584714491592e84875d": { + "balance": "1000000000000000000000000000000" + }, + "0xd23cd6a9ddcc3470300003621bbac1e06a7919d5": { + "balance": "1000000000000000000000000000000" + }, + "0xd2c5b39B4e735C17612Bb5a08FD024ccc5dBCb23": { + "balance": "100000000000000000000000" + }, + "0xd2cd302eb060e375a65d65946692a3ac2d838d35": { + "balance": "1000000000000000000000000000000" + }, + "0xd2e75c41ced8699e3176f6e335355701a2568b7b": { + "balance": "1000000000000000000000000000000" + }, + "0xd3d38f4cb0aeb4c7c2527ddaeec2ab3b910c8528": { + "balance": "1000000000000000000000000000000" + }, + "0xd5b561a27cca5049650a14ab93dbf1a20c0cefc1": { + "balance": "1000000000000000000000000000000" + }, + "0xd90045420b8abc37b3f9304ed2b385fc1b7fa8c5": { + "balance": "1000000000000000000000000000000" + }, + "0xd951bf4cff429062702a7d8699a5f0bf14845d9b": { + "balance": "1000000000000000000000000000000" + }, + "0xdc6a269c58e58a93a22b5df8cdf1af630c47481f": { + "balance": "1000000000000000000000000000000" + }, + "0xdc6d02ef4003a4f2d0ccff65ae1a2d8157fbb23e": { + "balance": "1000000000000000000000000000000" + }, + "0xde14aca36acc62c305a7ee571da37840a408e600": { + "balance": "1000000000000000000000000000000" + }, + "0xdee32ae508cf783f53ab8bc39d878fe323cdfae3": { + "balance": "1000000000000000000000000000000" + }, + "0xe083a100d51fc4f38aae4a3a68404c36ad96c612": { + "balance": "1000000000000000000000000000000" + }, + "0xe1607990ce800407e3c206e58de4917977181d4d": { + "balance": "1000000000000000000000000000000" + }, + "0xe25e5b63dfd4cf59b81eddf64f1195858634b8a6": { + "balance": "1000000000000000000000000000000" + }, + "0xe372377decb3bdc0c7f5272d38ce0ba2a54934fe": { + "balance": "1000000000000000000000000000000" + }, + "0xe3cc6ec63b5652d1594bc63bb293f4e80f76dbdd": { + "balance": "1000000000000000000000000000000" + }, + "0xe3da7c014286258944ab20a31e4d861b4c9262f1": { + "balance": "1000000000000000000000000000000" + }, + "0xe8b57f330d56081c856e618210fbedb414925ff0": { + "balance": "1000000000000000000000000000000" + }, + "0xe91ac72a568e752eb7c9f5235100586ce97c8cc1": { + "balance": "1000000000000000000000000000000" + }, + "0xf184c8c243a178c1748a0af45caedeca476105b4": { + "balance": "1000000000000000000000000000000" + }, + "0xf1a5912ff318aebf312cdb54c75642a9e632703c": { + "balance": "1000000000000000000000000000000" + }, + "0xf2197b153b4c9086fc5410431fbf7960d284c65e": { + "balance": "1000000000000000000000000000000" + }, + "0xf36620e71327f4a55d550d46e030ccf0c728f154": { + "balance": "1000000000000000000000000000000" + }, + "0xf9817fB82fc767aA9A4A97a1901676244b88ce0E": { + "balance": "100000000000000000000000" + }, + "0xfa723938fa8da1a8a2114ad409a11581761ee40d": { + "balance": "1000000000000000000000000000000" + }, + "0xfa7a8c69810eaf16a395d2a93b3ab51efeed2a1c": { + "balance": "1000000000000000000000000000000" + }, + "0xfaa1038074941571524934ba52d312e88b3577f5": { + "balance": "1000000000000000000000000000000" + }, + "0xfe14077c26a507496b7208384d459e21c49c4212": { + "balance": "1000000000000000000000000000000" + }, + "0xfe275c9b5ac792327da509b27eb9614196dfb07d": { + "balance": "1000000000000000000000000000000" + }, + "0xfe2c5aa110fff89361806ea7ee080bfffba0d3dd": { + "balance": "1000000000000000000000000000000" + }, + "0xfe3d4f1fc038f4f756ba44995129cd45c9e0e861": { + "balance": "1000000000000000000000000000000" + }, + "0xfee314cdc84ecfaa675e41b3559c0101e1eba6b8": { + "balance": "1000000000000000000000000000000" + } + }, + "genesis": { + "author": "0x0000000000000000000000000000000000000001", + "difficulty": "0x0", + "extraData": "0x11bbe8db4e347b4e8c937c1c8370e4b5ed33adb3db69cbdb7a38e1e50b1b82fa", + "gasLimit": "0xFFFFFFFFF", + "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000abc", + "nonce": "0x0000000000000042", + "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "timestamp": "0x00" + }, + "params": { + "EIP150ForkBlock": "0x00", + "EIP158ForkBlock": "0x00", + "accountStartNonce": "0x00", + "blockReward": "0x4563918244F40000", + "byzantiumForkBlock": "0x0", + "chainID": "0x12345", + "constantinopleForkBlock": "0x0", + "daoHardforkBlock": "0x0", + "difficultyBoundDivisor": "0x0800", + "durationLimit": "0x0d", + "externalGasDifficulty": "0x01", + "gasLimitBoundDivisor": "0x0400", + "homesteadForkBlock": "0x0", + "maxGasLimit": "0xFFFFFFFFF", + "maximumExtraDataSize": "0x20", + "minGasLimit": "0xFFFFFFFFF", + "minimumDifficulty": "0x0", + "networkID": "12313219", + "tieBreakingGas": false + }, + "sealEngine": "Ethash", + "skaleConfig": { + "nodeInfo": { + "basePort": 2031, + "bindIP": "0.0.0.0", + "collectionDuration": 10, + "collectionQueueSize": 2, + "db-path": "/tmp/test_eth_9_of_16", + "ecdsaKeyName": "", + "httpRpcPort": 2034, + "httpsRpcPort": 1239, + "logLevel": "info", + "logLevelProposal": "info", + "maxCacheSize": 2000, + "maxOpenLeveldbFiles": 25, + "minCacheSize": 1000, + "nodeID": 1609, + "nodeName": "Node1", + "rotateAfterBlock": 0, + "testSignatures": true, + "transactionQueueSize": 10000, + "wsRpcPort": 2033, + "wssRpcPort": 2038 + }, + "sChain": { + "EIP1559TransactionsPatchTimestamp": 1, + "contractStorageLimit": 10000000000, + "contractStoragePatchTimestamp": 1, + "contractStorageZeroValuePatchTimestamp": 1, + "correctForkInPowPatchTimestamp": 1, + "emptyBlockIntervalMs": 10000, + "fastConsensusPatchTimestamp": 1, + "flexibleDeploymentPatchTimestamp": 1, + "levelDBReopenIntervalMs": 1, + "multiTransactionMode": false, + "nodes": [ + { + "basePort": 1231, + "ip": "127.0.0.1", + "nodeID": 1601, + "publicKey": "", + "schainIndex": 1 + }, + { + "basePort": 1331, + "ip": "127.0.0.1", + "nodeID": 1602, + "publicKey": "", + "schainIndex": 2 + }, + { + "basePort": 1431, + "ip": "127.0.0.1", + "nodeID": 1603, + "publicKey": "", + "schainIndex": 3 + }, + { + "basePort": 1531, + "ip": "127.0.0.1", + "nodeID": 1604, + "publicKey": "", + "schainIndex": 4 + }, + { + "basePort": 1631, + "ip": "127.0.0.1", + "nodeID": 1605, + "publicKey": "", + "schainIndex": 5 + }, + { + "basePort": 1731, + "ip": "127.0.0.1", + "nodeID": 1606, + "publicKey": "", + "schainIndex": 6 + }, + { + "basePort": 1831, + "ip": "127.0.0.1", + "nodeID": 1607, + "publicKey": "", + "schainIndex": 7 + }, + { + "basePort": 1931, + "ip": "127.0.0.1", + "nodeID": 1608, + "publicKey": "", + "schainIndex": 8 + }, + { + "basePort": 2031, + "ip": "127.0.0.1", + "nodeID": 1609, + "publicKey": "", + "schainIndex": 9 + }, + { + "basePort": 2131, + "ip": "127.0.0.1", + "nodeID": 1610, + "publicKey": "", + "schainIndex": 10 + }, + { + "basePort": 2231, + "ip": "127.0.0.1", + "nodeID": 1611, + "publicKey": "", + "schainIndex": 11 + }, + { + "basePort": 2331, + "ip": "127.0.0.1", + "nodeID": 1612, + "publicKey": "", + "schainIndex": 12 + }, + { + "basePort": 2431, + "ip": "127.0.0.1", + "nodeID": 1613, + "publicKey": "", + "schainIndex": 13 + }, + { + "basePort": 2531, + "ip": "127.0.0.1", + "nodeID": 1614, + "publicKey": "", + "schainIndex": 14 + }, + { + "basePort": 2631, + "ip": "127.0.0.1", + "nodeID": 1615, + "publicKey": "", + "schainIndex": 15 + }, + { + "basePort": 2731, + "ip": "127.0.0.1", + "nodeID": 1616, + "publicKey": "", + "schainIndex": 16 + } + ], + "powCheckPatchTimestamp": 1, + "precompiledConfigPatchTimestamp": 1, + "pushZeroPatchTimestamp": 1, + "revertableFSPatchTimestamp": 1, + "schainID": 5, + "schainName": "TestChain", + "schainOwner": "0x907cd0881E50d359bb9Fd120B1A5A143b1C97De6", + "skipInvalidTransactionsPatchTimestamp": 1, + "storageDestructionPatchTimestamp": 1, + "verifyBlsSyncPatchTimestamp": 1, + "verifyDaSigsPatchTimestamp": 1 + } + }, + "unddos": { + "origins": [ + { + "ban_lengthy": 0, + "ban_peak": 0, + "max_calls_per_minute": 1000000000, + "max_calls_per_second": 1000000000, + "max_ws_conn": 65535, + "origin": [ + "*" + ] + } + ] + } +} \ No newline at end of file diff --git a/test/historicstate/configs/testeth_config.json b/test/historicstate/configs/testeth_config.json new file mode 100644 index 000000000..b6abe0a96 --- /dev/null +++ b/test/historicstate/configs/testeth_config.json @@ -0,0 +1,354 @@ +{ + "unddos": { + "origins": [ + { + "origin": [ "*" ], + "ban_lengthy": 0, + "ban_peak": 0, + "max_calls_per_minute": 1000000000, + "max_calls_per_second": 1000000000, + "max_ws_conn": 65535 + } + ] + }, + "sealEngine": "Ethash", + "params": { + "accountStartNonce": "0x00", + "homesteadForkBlock": "0x0", + "daoHardforkBlock": "0x0", + "EIP150ForkBlock": "0x00", + "EIP158ForkBlock": "0x00", + "byzantiumForkBlock": "0x0", + "constantinopleForkBlock": "0x0", + "networkID": "12313219", + "chainID": "0x12345", + "maximumExtraDataSize": "0x20", + "tieBreakingGas": false, + "minGasLimit": "0xFFFFFFFFF", + "maxGasLimit": "0xFFFFFFFFF", + "gasLimitBoundDivisor": "0x0400", + "minimumDifficulty": "0x0", + "difficultyBoundDivisor": "0x0800", + "durationLimit": "0x0d", + "blockReward": "0x4563918244F40000", + "externalGasDifficulty": "0x01" + }, + "genesis": { + "nonce": "0x0000000000000042", + "difficulty": "0x0", + "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000abc", + "author": "0x0000000000000000000000000000000000000001", + "timestamp": "0x00", + "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "extraData": "0x11bbe8db4e347b4e8c937c1c8370e4b5ed33adb3db69cbdb7a38e1e50b1b82fa", + "gasLimit": "0xFFFFFFFFF" + }, + "accounts": { + "0x66c5a87f4a49DD75e970055A265E8dd5C3F8f852":{ + "balance": "1000000000000000000000" + }, + "0x6d80aAC61F6d92c7F4A3c412850474ba963B698E":{ + "balance": "1000000000000000000000" + }, + "0x7e7E68F04D1799Fa25C8cff57314c8a5d3942e69":{ + "balance": "1000000000000000000000000" + }, + "0x5EF25557E2ed6AFfF321B266C93e95A0B4B05AbC":{ + "balance": "1000000000000000000000000" + }, + "0x6196d135CdDb9d73A0756C1E44b5b02B11acf594":{ + "balance": "2000000000000000000000", + "nonce": "5076", + "code": "", + "storage":{} + }, + "0xa68f946090c600eda6f139783077ee802afeb990": { "balance": "1000000000000000000000000000000" } , + "0x88fd5e01078629cc194c933d9631b9448fe10b1d": { "balance": "1000000000000000000000000000000" } , + "0x77a0bc73442d3d9cb993e8d9752f95babf0ccaa6": { "balance": "1000000000000000000000000000000" } , + "0x0aa6a44690ef52354e976990292cf9c5cd36ad59": { "balance": "1000000000000000000000000000000" } , + "0x863f816036e3cbba90855196c9d1e339fcff1650": { "balance": "1000000000000000000000000000000" } , + "0xe3cc6ec63b5652d1594bc63bb293f4e80f76dbdd": { "balance": "1000000000000000000000000000000" } , + "0x94c6e5746971d6aebeaa42cbbe2feca0f6b5b24f": { "balance": "1000000000000000000000000000000" } , + "0x3f5bdf5d4c274c82b8d17aa2810b00d2cf050f24": { "balance": "1000000000000000000000000000000" } , + "0xbf5aa678b969c0871e2fbcf09c3dbb5d5865ac1e": { "balance": "1000000000000000000000000000000" } , + "0xa6d50055592cecb795bc1ed3b9ea57ed426b0b7c": { "balance": "1000000000000000000000000000000" } , + "0xb70603c505f85130b5b2e73cd82d196dfd7d8b5e": { "balance": "1000000000000000000000000000000" } , + "0x079cf317ef40b16141784b6fabff812d64f7c0fd": { "balance": "1000000000000000000000000000000" } , + "0x482d7f53cba6ae73a354533673c48e2dfd560949": { "balance": "1000000000000000000000000000000" } , + "0xa2969e82619021ea407338f8bdf7c6f2bd679673": { "balance": "1000000000000000000000000000000" } , + "0x28353685b0b986a724b92113debb3d8cd9a6b263": { "balance": "1000000000000000000000000000000" } , + "0x9b77f28285a49601169a33332f08aa309d97edd0": { "balance": "1000000000000000000000000000000" } , + "0xd2cd302eb060e375a65d65946692a3ac2d838d35": { "balance": "1000000000000000000000000000000" } , + "0x811d701d14539d190a8593fe901eafe8eff511f5": { "balance": "1000000000000000000000000000000" } , + "0x194cb9991d3d94c43e400becf21dfea45e7b3b4c": { "balance": "1000000000000000000000000000000" } , + "0xf36620e71327f4a55d550d46e030ccf0c728f154": { "balance": "1000000000000000000000000000000" } , + "0x661bda4daeba3ce9ac2aa30b80d463580f90d31a": { "balance": "1000000000000000000000000000000" } , + "0xdc6a269c58e58a93a22b5df8cdf1af630c47481f": { "balance": "1000000000000000000000000000000" } , + "0x6923877b65e24966efa9efd1207822fa2eaf601a": { "balance": "1000000000000000000000000000000" } , + "0x38855e430611bc179cd777a8704679ffc43921de": { "balance": "1000000000000000000000000000000" } , + "0xc12bcedd9bcad9120150122cd50f39576ecccc08": { "balance": "1000000000000000000000000000000" } , + "0x6b806862a977a0e22ed1752f858e5332647121c8": { "balance": "1000000000000000000000000000000" } , + "0x8e6081e272c8f4d49f5b29157b52f68cbd6307ad": { "balance": "1000000000000000000000000000000" } , + "0x7685d04f0b7657017b77efa004a14ff9f022acab": { "balance": "1000000000000000000000000000000" } , + "0xabf920b89f5a2487fdb70be17fd01a99a0602e62": { "balance": "1000000000000000000000000000000" } , + "0xd3d38f4cb0aeb4c7c2527ddaeec2ab3b910c8528": { "balance": "1000000000000000000000000000000" } , + "0xaa6a87bbb74bc1f3cb40c1efb7fc171ee6407560": { "balance": "1000000000000000000000000000000" } , + "0x138ea4bdf0382c2deffd5b0bff0afe59f471467f": { "balance": "1000000000000000000000000000000" } , + "0xe083a100d51fc4f38aae4a3a68404c36ad96c612": { "balance": "1000000000000000000000000000000" } , + "0xe91ac72a568e752eb7c9f5235100586ce97c8cc1": { "balance": "1000000000000000000000000000000" } , + "0xd951bf4cff429062702a7d8699a5f0bf14845d9b": { "balance": "1000000000000000000000000000000" } , + "0x16e8c390f8e576161cfe966f2c3e5dd303eb9039": { "balance": "1000000000000000000000000000000" } , + "0xe25e5b63dfd4cf59b81eddf64f1195858634b8a6": { "balance": "1000000000000000000000000000000" } , + "0xd23cd6a9ddcc3470300003621bbac1e06a7919d5": { "balance": "1000000000000000000000000000000" } , + "0x32ea0400dc2d20664cc4744b2fab04ecb709445c": { "balance": "1000000000000000000000000000000" } , + "0xb64989ab32b089da3da103b93e6781d6d5dd10b4": { "balance": "1000000000000000000000000000000" } , + "0x6cd5e637266e18d3e888ee99451eb828c6b491f4": { "balance": "1000000000000000000000000000000" } , + "0x13867af77a63048e17380e39248ada90521e97e4": { "balance": "1000000000000000000000000000000" } , + "0x5d012c13b2854bda8b7b6580e97e52751884f827": { "balance": "1000000000000000000000000000000" } , + "0x006d8e49ce0b9eb5646e34a4d91934801b9044fd": { "balance": "1000000000000000000000000000000" } , + "0x3bcca8a8471d55a1a668bc163c0336e4a57e5c99": { "balance": "1000000000000000000000000000000" } , + "0x87ea381878572d63b3453033d7540abddd191186": { "balance": "1000000000000000000000000000000" } , + "0x3d46ee560227c1d73cd6042b47fc8fddd8a06ecb": { "balance": "1000000000000000000000000000000" } , + "0x06104a85a380895b6dd4030113806df2b044905e": { "balance": "1000000000000000000000000000000" } , + "0x12d5d7340a93be7be28ea7a3ae198242f8e1282c": { "balance": "1000000000000000000000000000000" } , + "0x605ba4a05d779f9869bd9a10234c22f516766cfe": { "balance": "1000000000000000000000000000000" } , + "0xdee32ae508cf783f53ab8bc39d878fe323cdfae3": { "balance": "1000000000000000000000000000000" } , + "0x5a3adad4382b3eb1e0c65f2de2845901081039b5": { "balance": "1000000000000000000000000000000" } , + "0x48acbd6a2724eadcc2a11144ab84b6a617d1a241": { "balance": "1000000000000000000000000000000" } , + "0xdc6d02ef4003a4f2d0ccff65ae1a2d8157fbb23e": { "balance": "1000000000000000000000000000000" } , + "0x03309956988ae70152ae4469daf99b0cac2306c5": { "balance": "1000000000000000000000000000000" } , + "0x57829f2ecca390cd9d1c41f92328bad4d1073bbb": { "balance": "1000000000000000000000000000000" } , + "0xb67e6f4a21f93c250fa6ff0cb142bd14dd4ca8eb": { "balance": "1000000000000000000000000000000" } , + "0x7525198d8cd1121d57358a0b0ed037e924581a76": { "balance": "1000000000000000000000000000000" } , + "0x13d19c55ee0a212249d26b9d741ff6d7f416db01": { "balance": "1000000000000000000000000000000" } , + "0x2d93455b07bccf38e8d019f7f43a2c2d70b46b4e": { "balance": "1000000000000000000000000000000" } , + "0x54e228d8fea148cfe2b109b3b152ff21321d09a2": { "balance": "1000000000000000000000000000000" } , + "0xbf2d8cebdeeb8ad8fed7b2a75f35922106f8d75c": { "balance": "1000000000000000000000000000000" } , + "0xa096b05a489831db893fc53aacc7ed20efb36382": { "balance": "1000000000000000000000000000000" } , + "0xd90045420b8abc37b3f9304ed2b385fc1b7fa8c5": { "balance": "1000000000000000000000000000000" } , + "0x3ffe1c9183e0f97f52a816405a7d2350624ec88b": { "balance": "1000000000000000000000000000000" } , + "0xe372377decb3bdc0c7f5272d38ce0ba2a54934fe": { "balance": "1000000000000000000000000000000" } , + "0xe1607990ce800407e3c206e58de4917977181d4d": { "balance": "1000000000000000000000000000000" } , + "0xc7865200e8e51ba1c8d695f327deed432930f2cc": { "balance": "1000000000000000000000000000000" } , + "0x85b33f0853ab8eaa4e602bdfd724d44bc2731e90": { "balance": "1000000000000000000000000000000" } , + "0xd2e75c41ced8699e3176f6e335355701a2568b7b": { "balance": "1000000000000000000000000000000" } , + "0x62971de462ea1ec0d3b43a6a85b6fb975e6c6f64": { "balance": "1000000000000000000000000000000" } , + "0xcc33e23b04b74f7ba8fbe315083182224af973fa": { "balance": "1000000000000000000000000000000" } , + "0x49ef89840e400026eb5c8d79bd1b0adc152fe86d": { "balance": "1000000000000000000000000000000" } , + "0x62cf32dfb9eb6358dc5deb006aef1d75fb153e5f": { "balance": "1000000000000000000000000000000" } , + "0x733ad609ef2e742334d96266fbc13733f1cf5e4a": { "balance": "1000000000000000000000000000000" } , + "0x76b545cb6a2fc671f741950eeb27627e69a1e69b": { "balance": "1000000000000000000000000000000" } , + "0xce1c62d0a77600fb2f959b4da76fcb9b3b9430a3": { "balance": "1000000000000000000000000000000" } , + "0xe8b57f330d56081c856e618210fbedb414925ff0": { "balance": "1000000000000000000000000000000" } , + "0x30aaab366dfac8331f3e827495c789cde9b437c0": { "balance": "1000000000000000000000000000000" } , + "0x54db355342c35085a1a53184162b2fddd0a43b0f": { "balance": "1000000000000000000000000000000" } , + "0x5cdb7392efdce502ccc6fba5c3c1dd1653967b4d": { "balance": "1000000000000000000000000000000" } , + "0x3760dc9594ccac0f33ade5cc5371402131696341": { "balance": "1000000000000000000000000000000" } , + "0xa8c813ee806b4c8537ff5f16084d44db18ea9ab1": { "balance": "1000000000000000000000000000000" } , + "0x98e50c97baf98dc6a81bdb95067339a269a36fc1": { "balance": "1000000000000000000000000000000" } , + "0xfa723938fa8da1a8a2114ad409a11581761ee40d": { "balance": "1000000000000000000000000000000" } , + "0xfaa1038074941571524934ba52d312e88b3577f5": { "balance": "1000000000000000000000000000000" } , + "0x6c0ef9084a57df13c175afea32ea47a510c5506e": { "balance": "1000000000000000000000000000000" } , + "0x8a920edc1021ce76c22774e0e83723a6e51c2439": { "balance": "1000000000000000000000000000000" } , + "0xa7c0789bdeee38c6b59111a789dfb6b815489847": { "balance": "1000000000000000000000000000000" } , + "0xfee314cdc84ecfaa675e41b3559c0101e1eba6b8": { "balance": "1000000000000000000000000000000" } , + "0x69bfcdcb98c9562e0a2faee3ecdfd65e8a0adb19": { "balance": "1000000000000000000000000000000" } , + "0x4e9b85904bca60aeb5b916ca86ac622096908427": { "balance": "1000000000000000000000000000000" } , + "0x2bee474be207bdbeac83d6672da5ed2fd417eac9": { "balance": "1000000000000000000000000000000" } , + "0x0966454f51166c68b73b2865473c8fb2fcdefdd5": { "balance": "1000000000000000000000000000000" } , + "0x4bf989fa6572af36b190032505506f1db888357f": { "balance": "1000000000000000000000000000000" } , + "0xb28c45b98ae43a5e9ee5509c97ea037b5de5d6d9": { "balance": "1000000000000000000000000000000" } , + "0xbee0e5c1961d51be9bd670876caa9c90ba7d9016": { "balance": "1000000000000000000000000000000" } , + "0xaf97a8318a1a51d5daeeb9650024b63ee44f45bd": { "balance": "1000000000000000000000000000000" } , + "0xe3da7c014286258944ab20a31e4d861b4c9262f1": { "balance": "1000000000000000000000000000000" } , + "0x50120c17d7b59200e9b76e89e4e3de2f0cd00090": { "balance": "1000000000000000000000000000000" } , + "0x1a66fc89809112c20aa76a993db712fa9e003e4e": { "balance": "1000000000000000000000000000000" } , + "0xb942414cae2a1ab1056657b905845c0ab6b6280a": { "balance": "1000000000000000000000000000000" } , + "0x236bf02dfafaf03851a4e6f5d69052f4884cec32": { "balance": "1000000000000000000000000000000" } , + "0xc8e4d709eb3eb335dc69c9fbf2d24d447cb86105": { "balance": "1000000000000000000000000000000" } , + "0xf184c8c243a178c1748a0af45caedeca476105b4": { "balance": "1000000000000000000000000000000" } , + "0x97b921ba45e0aa8830701aa62050a83ee00a1bb8": { "balance": "1000000000000000000000000000000" } , + "0x29d83322219fdfb821459d5fdf796360faf3166a": { "balance": "1000000000000000000000000000000" } , + "0x3a921471a2397644c37c88ef9572c421ab37145d": { "balance": "1000000000000000000000000000000" } , + "0x426ec5f07847674aada3856609d8baaa16805d88": { "balance": "1000000000000000000000000000000" } , + "0x60268f799d8f1808e4a32c2eb898e73a8881f6f0": { "balance": "1000000000000000000000000000000" } , + "0x68bca79ae7aae796027ff843d2303444da5cf5d8": { "balance": "1000000000000000000000000000000" } , + "0xd1b6c947fb14060b38945584714491592e84875d": { "balance": "1000000000000000000000000000000" } , + "0x90431f3f75b26657f74abbb5c759b12e78f916cc": { "balance": "1000000000000000000000000000000" } , + "0xc2d3852f3292acb81bd164dbae5f1e2a87535150": { "balance": "1000000000000000000000000000000" } , + "0x9f62f4215cd277ca40dede101b4ccb29290de6bb": { "balance": "1000000000000000000000000000000" } , + "0xc98af661e44c5bf31d2f8bdff4bbf2808ed4e991": { "balance": "1000000000000000000000000000000" } , + "0x1feaf1671c1f0faf0d44c152f72dc755db932569": { "balance": "1000000000000000000000000000000" } , + "0x8945e48bd056f45c8b57f9025d2674bb03a24035": { "balance": "1000000000000000000000000000000" } , + "0x2f971bd38806c3ca45ae0a125d1267118bf5619c": { "balance": "1000000000000000000000000000000" } , + "0xac5df92da5171ba24a9618018b4f79494040334b": { "balance": "1000000000000000000000000000000" } , + "0x0150b461b06922a5030784ba888962c28bb1f188": { "balance": "1000000000000000000000000000000" } , + "0xde14aca36acc62c305a7ee571da37840a408e600": { "balance": "1000000000000000000000000000000" } , + "0x66cd465ddcd85504c0d2cfb1728acee994d55a3f": { "balance": "1000000000000000000000000000000" } , + "0x5d9326c6504833d84f8a0d65ded59b1a6e768ca2": { "balance": "1000000000000000000000000000000" } , + "0x8fe24dbbf9884bd458d8cfac528b4ad70e82497d": { "balance": "1000000000000000000000000000000" } , + "0xfe2c5aa110fff89361806ea7ee080bfffba0d3dd": { "balance": "1000000000000000000000000000000" } , + "0xd5b561a27cca5049650a14ab93dbf1a20c0cefc1": { "balance": "1000000000000000000000000000000" } , + "0x1239fe658b410dbbac5bbd572035f5041542f9e5": { "balance": "1000000000000000000000000000000" } , + "0x26d88f6a8b659be4165ee53774a057e41b5201c9": { "balance": "1000000000000000000000000000000" } , + "0xa3597b1162b6559cb5e966904b63e762ece756a4": { "balance": "1000000000000000000000000000000" } , + "0x137048b9fa4f1234d6519271b2c5ec64f480db0f": { "balance": "1000000000000000000000000000000" } , + "0xc58744e2eceefd45cc5469f0e0a708ad24ddbbdb": { "balance": "1000000000000000000000000000000" } , + "0x83c1479d2a32d9ed9fa699289b6c2db56b7cd045": { "balance": "1000000000000000000000000000000" } , + "0x0fbbe17a0e5a61ee3e8661f442d7f6b177c49820": { "balance": "1000000000000000000000000000000" } , + "0x96672f9e982936e1904b15c948cc81bf18027db6": { "balance": "1000000000000000000000000000000" } , + "0xf1a5912ff318aebf312cdb54c75642a9e632703c": { "balance": "1000000000000000000000000000000" } , + "0x62712ceccb50f62ca4c5402fff6da9c819c866cf": { "balance": "1000000000000000000000000000000" } , + "0x6093f0f2a7b5148b71603ac439adbc4c0e5aa5da": { "balance": "1000000000000000000000000000000" } , + "0xc3820490201e94d76b44655d2df713fec29d9795": { "balance": "1000000000000000000000000000000" } , + "0x6d0d7f0ff51917bd84a5f7270d31a894282aaf4b": { "balance": "1000000000000000000000000000000" } , + "0x1f1d6041e12a18cf1202019f146f2fc150915e8d": { "balance": "1000000000000000000000000000000" } , + "0x6fec280c0ab320715b17d70e8b02c2d4141c1372": { "balance": "1000000000000000000000000000000" } , + "0x4cf9b195f7cb5f86694d9b399fe21a5f34616fd3": { "balance": "1000000000000000000000000000000" } , + "0xfe275c9b5ac792327da509b27eb9614196dfb07d": { "balance": "1000000000000000000000000000000" } , + "0x6a37ad7dceec4595eea9f03b82d2710e738343ac": { "balance": "1000000000000000000000000000000" } , + "0x6d8092cb926daf29236f866cd31c327ff73323d1": { "balance": "1000000000000000000000000000000" } , + "0xa1cd651d99283be60e2a9d2e3bc8a90aedb8244f": { "balance": "1000000000000000000000000000000" } , + "0x5667601b7dcde6f24d06bccc4f291cb06976f4ee": { "balance": "1000000000000000000000000000000" } , + "0x6314956b78bb2eaed1c49b3ae71d4d0ec501cfab": { "balance": "1000000000000000000000000000000" } , + "0x157d38b52196b248e9fe6a2172e32ce2b8c078e6": { "balance": "1000000000000000000000000000000" } , + "0xfa7a8c69810eaf16a395d2a93b3ab51efeed2a1c": { "balance": "1000000000000000000000000000000" } , + "0x765708943c3b791563d1e3f0533b6d7e7d769e4d": { "balance": "1000000000000000000000000000000" } , + "0xf2197b153b4c9086fc5410431fbf7960d284c65e": { "balance": "1000000000000000000000000000000" } , + "0xfe14077c26a507496b7208384d459e21c49c4212": { "balance": "1000000000000000000000000000000" } , + "0xfe3d4f1fc038f4f756ba44995129cd45c9e0e861": { "balance": "1000000000000000000000000000000" } , + "0x099452fedc71897880f584b1bc1706efc4e76e36": { "balance": "1000000000000000000000000000000" } , + "0x907cd0881E50d359bb9Fd120B1A5A143b1C97De6": { "balance": "1000000000000000000000000000000000000000000000000000000000" } , + "0000000000000000000000000000000000000001": { "precompiled": { "name": "ecrecover", "linear": { "base": 3000, "word": 0 } } }, + "0000000000000000000000000000000000000002": { "precompiled": { "name": "sha256", "linear": { "base": 60, "word": 12 } } }, + "0000000000000000000000000000000000000003": { "precompiled": { "name": "ripemd160", "linear": { "base": 600, "word": 120 } } }, + "0000000000000000000000000000000000000004": { "precompiled": { "name": "identity", "linear": { "base": 15, "word": 3 } } }, + "0000000000000000000000000000000000000005": { "precompiled": { "name": "modexp", "startingBlock" : "0x2dc6c0" } }, + "0000000000000000000000000000000000000006": { "precompiled": { "name": "alt_bn128_G1_add", "startingBlock" : "0x2dc6c0", "linear": { "base": 500, "word": 0 } } }, + "0000000000000000000000000000000000000007": { "precompiled": { "name": "alt_bn128_G1_mul", "startingBlock" : "0x2dc6c0", "linear": { "base": 40000, "word": 0 } } }, + "0000000000000000000000000000000000000008": { "precompiled": { "name": "alt_bn128_pairing_product", "startingBlock" : "0x2dc6c0" } }, + "000000000000000000000000000000000000000A": { "precompiled": { "name": "readChunk", "linear": { "base": 15, "word": 0 },"startingBlock" : "0x0"} }, + "000000000000000000000000000000000000000B": { "precompiled": { "name": "createFile", "linear": { "base": 15, "word": 0 },"startingBlock" : "0x0", "restrictAccess": ["69362535ec535F0643cBf62D16aDeDCAf32Ee6F7"] } }, + "000000000000000000000000000000000000000C": { "precompiled": { "name": "uploadChunk", "linear": { "base": 15, "word": 0 },"startingBlock" : "0x0"} }, + "000000000000000000000000000000000000000D": { "precompiled": { "name": "getFileSize", "linear": { "base": 15, "word": 0 },"startingBlock" : "0x0"} }, + "000000000000000000000000000000000000000E": { "precompiled": { "name": "deleteFile", "linear": { "base": 15, "word": 0 },"startingBlock" : "0x0"} }, + "000000000000000000000000000000000000000F": { "precompiled": { "name": "createDirectory", "linear": { "base": 15, "word": 0 },"startingBlock" : "0x0"} }, + "0000000000000000000000000000000000000010": { "precompiled": { "name": "deleteDirectory", "linear": { "base": 15, "word": 0 },"startingBlock" : "0x0"} }, + "0x69362535ec535F0643cBf62D16aDeDCAf32Ee6F8": { + "balance": "0", + "code": "0x608060405234801561001057600080fd5b50600436106100b45760003560e01c806379210e8e1161007157806379210e8e1461017757806381a8235a146101a757806385aeeb17146101c35780639a9a5593146101f3578063a99100541461020f578063b57321221461022b576100b4565b806307c6e7d3146100b9578063122f4fba146100d55780631c6ec7a9146101055780631cfe4e3b14610121578063373dedb41461013d57806361e46db51461015b575b600080fd5b6100d360048036036100ce9190810190613e0d565b61025b565b005b6100ef60048036036100ea9190810190613e0d565b610804565b6040516100fc9190614ab1565b60405180910390f35b61011f600480360361011a9190810190613e0d565b610b43565b005b61013b60048036036101369190810190613dd1565b610f72565b005b610145611190565b6040516101529190614e2c565b60405180910390f35b61017560048036036101709190810190613ea2565b611199565b005b610191600480360361018c9190810190613f21565b6113f9565b60405161019e9190614a72565b60405180910390f35b6101c160048036036101bc9190810190613e0d565b6116f9565b005b6101dd60048036036101d89190810190613e0d565b61189e565b6040516101ea9190614a8f565b60405180910390f35b61020d60048036036102089190810190613e4e565b611b9d565b005b61022960048036036102249190810190613e0d565b61213a565b005b61024560048036036102409190810190613e0d565b612790565b6040516102529190614e2c565b60405180910390f35b6000339050606061026b83612a10565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b825181101561037c576000826001018460018403815181106102d557fe5b60200260200101516040516102ea9190614a1a565b90815260200160405180910390205411610339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161033090614c2c565b60405180910390fd5b8160020183600183038151811061034c57fe5b60200260200101516040516103619190614a1a565b908152602001604051809103902091508060010190506102b7565b506060600183511161038e57846103a7565b8260018451038151811061039e57fe5b60200260200101515b9050600082600101826040516103bd9190614a31565b9081526020016040518091039020541161040c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161040390614c2c565b60405180910390fd5b600082600201826040516104209190614a31565b90815260200160405180910390206000018054905014610475576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161046c90614cac565b60405180910390fd5b60006104818587612c10565b9050806104c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ba90614bcc565b60405180910390fd5b6104cb613996565b836000016001856000018054905003815481106104e457fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156105965780601f1061056b57610100808354040283529160200191610596565b820191906000526020600020905b81548152906001019060200180831161057957829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff1660028111156105e257fe5b60028111156105ed57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561066557602002820191906000526020600020906000905b82829054906101000a900460ff1615158152602001906001019060208260000104928301926001038202915080841161062f5790505b50505050508152505090508084600001600186600101866040516106899190614a31565b90815260200160405180910390205403815481106106a357fe5b906000526020600020906005020160008201518160000190805190602001906106cd9291906139d2565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561071c57fe5b0217905550608082015181600401908051906020019061073d929190613a52565b5090505083600101836040516107539190614a31565b9081526020016040518091039020548460010182600001516040516107789190614a1a565b9081526020016040518091039020819055506000846001018460405161079e9190614a31565b908152602001604051809103902081905550836000018054809190600190036107c79190613af8565b5083600201836040516107da9190614a31565b9081526020016040518091039020600080820160006107f99190613b2a565b505050505050505050565b600080606061081284612c74565b91509150606061082182612a10565b90506000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b82518110156109065760008260010184600184038151811061088b57fe5b60200260200101516040516108a09190614a1a565b90815260200160405180910390205414156108c357600095505050505050610b3e565b816002018360018303815181106108d657fe5b60200260200101516040516108eb9190614a1a565b9081526020016040518091039020915080600101905061086d565b50606060018351116109185783610931565b8260018451038151811061092857fe5b60200260200101515b9050600082600101826040516109479190614a31565b908152602001604051809103902054141561096a57600095505050505050610b3e565b610972613996565b826000016001846001018460405161098a9190614a31565b90815260200160405180910390205403815481106109a457fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610a565780601f10610a2b57610100808354040283529160200191610a56565b820191906000526020600020905b815481529060010190602001808311610a3957829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115610aa257fe5b6002811115610aad57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015610b2557602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411610aef5790505b5050505050815250509050806060015196505050505050505b919050565b600160009054906101000a900460ff16610b85576120006002819055506210000060038190555060018060006101000a81548160ff0219169083151502179055505b6000815111610bc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc090614c2c565b60405180910390fd5b60003390506060610bd983612a10565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015610cea57600082600101846001840381518110610c4357fe5b6020026020010151604051610c589190614a1a565b90815260200160405180910390205411610ca7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9e90614c2c565b60405180910390fd5b81600201836001830381518110610cba57fe5b6020026020010151604051610ccf9190614a1a565b90815260200160405180910390209150806001019050610c25565b50600254816000018054905010610d36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2d90614d4c565b60405180910390fd5b60606001835111610d475784610d60565b82600184510381518110610d5757fe5b60200260200101515b905060008260010182604051610d769190614a31565b90815260200160405180910390205414610dc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbc90614d8c565b60405180910390fd5b610dce81612ff6565b610e0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0490614c4c565b60405180910390fd5b6000610e1985876130d7565b905080610e5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5290614aec565b60405180910390fd5b610e63613996565b82816000018190525060008160200190151590811515815250508360000181908060018154018082558091505090600182039060005260206000209060050201600090919290919091506000820151816000019080519060200190610ec99291906139d2565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff02191690836002811115610f1857fe5b02179055506080820151816004019080519060200190610f39929190613a52565b5050505083600001805490508460010184604051610f579190614a31565b90815260200160405180910390208190555050505050505050565b610f7a61313b565b73ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161480610fdf57503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614155b61101e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101590614bac565b60405180910390fd5b80600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411156110a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109790614c8c565b60405180910390fd5b600054600754820111156110e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e090614b0c565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460076000828254039250508190555080600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550806007600082825401925050819055505050565b60008054905090565b600033905060006111aa82866131d4565b9050600160028111156111b957fe5b8160030160009054906101000a900460ff1660028111156111d657fe5b14611216576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120d90614d6c565b60405180910390fd5b6000600354858161122357fe5b061480156112345750806002015484105b611273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126a90614acc565b60405180910390fd5b600354848260020154031080156112905750838160020154038351145b8061129d57506003548351145b6112dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d390614b6c565b60405180910390fd5b600015158160040160035486816112ef57fe5b04815481106112fa57fe5b90600052602060002090602091828204019190069054906101000a900460ff1615151461135c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135390614b4c565b60405180910390fd5b600061136a838787876133d3565b9050806113ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a390614c6c565b60405180910390fd5b60018260040160035487816113bd57fe5b04815481106113c857fe5b90600052602060002090602091828204019190066101000a81548160ff021916908315150217905550505050505050565b611401613b4e565b6000606061140e86612c74565b9150915061141a613996565b61142483836131d4565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156114c85780601f1061149d576101008083540402835291602001916114c8565b820191906000526020600020905b8154815290600101906020018083116114ab57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561151457fe5b600281111561151f57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561159757602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116115615790505b50505050508152505090506002808111156115ae57fe5b816060015160028111156115be57fe5b146115fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f590614e0c565b60405180910390fd5b60035485111580156116105750600085115b61164f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164690614b6c565b60405180910390fd5b80604001518587011115611698576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168f90614acc565b60405180910390fd5b60006116a684848989613484565b8096508192505050806116ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e590614cec565b60405180910390fd5b505050509392505050565b6000339050600061170a82846131d4565b90506001600281111561171957fe5b8160030160009054906101000a900460ff16600281111561173657fe5b14611776576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176d90614d6c565b60405180910390fd5b60006001905060008260040180549050905060008090505b818110156117e157600015158460040182815481106117a957fe5b90600052602060002090602091828204019190069054906101000a900460ff16151514156117d657600092505b80600101905061178e565b5081611822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181990614ccc565b60405180910390fd5b60028360030160006101000a81548160ff0219169083600281111561184357fe5b021790555060006118548587613517565b905080611896576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188d90614b2c565b60405180910390fd5b505050505050565b6060600060606118ad84612c74565b9150915060606118bc82612a10565b90506000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008090505b82518110156119c65760008260010184838151811061192257fe5b60200260200101516040516119379190614a1a565b90815260200160405180910390205411611986576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197d90614c2c565b60405180910390fd5b8160020183828151811061199657fe5b60200260200101516040516119ab9190614a1a565b90815260200160405180910390209150806001019050611907565b5080600001805480602002602001604051908101604052809291908181526020016000905b82821015611b8e57838290600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611aa75780601f10611a7c57610100808354040283529160200191611aa7565b820191906000526020600020905b815481529060010190602001808311611a8a57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115611af357fe5b6002811115611afe57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015611b7657602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411611b405790505b505050505081525050815260200190600101906119eb565b50505050945050505050919050565b600160009054906101000a900460ff16611bdf576120006002819055506210000060038190555060018060006101000a81548160ff0219169083151502179055505b60003390506305f5e100821115611c2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2290614d2c565b60405180910390fd5b600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205483011115611cee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce590614dac565b60405180910390fd5b6060611cf984612a10565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015611e0a57600082600101846001840381518110611d6357fe5b6020026020010151604051611d789190614a1a565b90815260200160405180910390205411611dc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dbe90614c2c565b60405180910390fd5b81600201836001830381518110611dda57fe5b6020026020010151604051611def9190614a1a565b90815260200160405180910390209150806001019050611d45565b50600254816000018054905010611e56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4d90614d4c565b60405180910390fd5b60606001835111611e675785611e80565b82600184510381518110611e7757fe5b60200260200101515b905060008260010182604051611e969190614a31565b90815260200160405180910390205414611ee5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611edc90614d8c565b60405180910390fd5b611eee81612ff6565b611f2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2490614d0c565b60405180910390fd5b6000611f3a85888861357b565b905080611f7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7390614dec565b60405180910390fd5b6060600354600160035489010381611f9057fe5b04604051908082528060200260200182016040528015611fbf5781602001602082028038833980820191505090505b509050836000016040518060a0016040528085815260200160011515815260200189815260200160016002811115611ff357fe5b8152602001838152509080600181540180825580915050906001820390600052602060002090600502016000909192909190915060008201518160000190805190602001906120439291906139d2565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561209257fe5b021790555060808201518160040190805190602001906120b3929190613a52565b50505050836000018054905084600101846040516120d19190614a31565b90815260200160405180910390208190555086600560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505050505050505050565b6000339050612147613996565b61215182846131d4565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156121f55780601f106121ca576101008083540402835291602001916121f5565b820191906000526020600020905b8154815290600101906020018083116121d857829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561224157fe5b600281111561224c57fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156122c457602002820191906000526020600020906000905b82829054906101000a900460ff1615158152602001906001019060208260000104928301926001038202915080841161228e5790505b5050505050815250509050600060028111156122dc57fe5b816060015160028111156122ec57fe5b141561232d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232490614b8c565b60405180910390fd5b600061233983856135e8565b90508061237b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161237290614bec565b60405180910390fd5b606061238685612a10565b90506000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b825181101561241e57816002018360018303815181106123ee57fe5b60200260200101516040516124039190614a1a565b908152602001604051809103902091508060010190506123d2565b50600060018260010186600001516040516124399190614a1a565b908152602001604051809103902054039050612453613996565b8260000160018460000180549050038154811061246c57fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561251e5780601f106124f35761010080835404028352916020019161251e565b820191906000526020600020905b81548152906001019060200180831161250157829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561256a57fe5b600281111561257557fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156125ed57602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116125b75790505b50505050508152505090508083600001838154811061260857fe5b906000526020600020906005020160008201518160000190805190602001906126329291906139d2565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561268157fe5b021790555060808201518160040190805190602001906126a2929190613a52565b50905050826000018054809190600190036126bd9190613af8565b508260010186600001516040516126d49190614a1a565b9081526020016040518091039020548360010182600001516040516126f99190614a1a565b90815260200160405180910390208190555060008360010187600001516040516127239190614a1a565b9081526020016040518091039020819055508560400151600560008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505050505050505050565b600080606061279e84612c74565b915091506127aa613996565b6127b483836131d4565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156128585780601f1061282d57610100808354040283529160200191612858565b820191906000526020600020905b81548152906001019060200180831161283b57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff1660028111156128a457fe5b60028111156128af57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561292757602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116128f15790505b50505050508152505090506001600281111561293f57fe5b8160600151600281111561294f57fe5b1480612974575060028081111561296257fe5b8160600151600281111561297257fe5b145b6129b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129aa90614d6c565b60405180910390fd5b60006129bf848461364c565b809650819250505080612a07576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129fe90614dcc565b60405180910390fd5b50505050919050565b6060612a1a613b73565b612a23836136b5565b9050612a2d613b73565b612a6b6040518060400160405280600181526020017f2f000000000000000000000000000000000000000000000000000000000000008152506136b5565b905060606001612a8483856136e390919063ffffffff16565b01604051908082528060200260200182016040528015612ab857816020015b6060815260200190600190039081612aa35790505b50905060008090505b8151811015612b0957612ae5612ae0848661375890919063ffffffff16565b613772565b828281518110612af157fe5b60200260200101819052508080600101915050612ac1565b50600081600183510381518110612b1c57fe5b6020026020010151511415612b875780600182510381518110612b3b57fe5b6020026020010160608152506001815103604051908082528060200260200182016040528015612b7f57816020015b6060815260200190600190039081612b6a5790505b509350612bc0565b8051604051908082528060200260200182016040528015612bbc57816020015b6060815260200190600190039081612ba75790505b5093505b60008090505b8451811015612c0757818181518110612bdb57fe5b6020026020010151858281518110612bef57fe5b60200260200101819052508080600101915050612bc6565b50505050919050565b60008060016020601f85510181612c2357fe5b040190506040518481526020810160005b83811015612c55578060200286015181602002830152806001019050612c34565b50602082602085026040018460006010600019f1935050505092915050565b6000606060006028905080845111612cc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cb890614c0c565b60405180910390fd5b6060816040519080825280601f01601f191660200182016040528015612cf65781602001600182028038833980820191505090505b50905060008090505b82811015612d6657858181518110612d1357fe5b602001015160f81c60f81b828281518110612d2a57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050612cff565b50600080905060008090505b83811015612e95576000838281518110612d8857fe5b602001015160f81c60f81b60f81c60ff16905060308110158015612dad575060398111155b80612dc6575060418110158015612dc55750605a8111155b5b80612ddf575060618110158015612dde575060668111155b5b612e1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e1590614c0c565b60405180910390fd5b60308110158015612e30575060398111155b15612e415760308103601084020192505b60418110158015612e535750605a8111155b15612e645760378103601084020192505b60618110158015612e76575060668111155b15612e875760578103601084020192505b508080600101915050612d72565b508094507f2f00000000000000000000000000000000000000000000000000000000000000868481518110612ec657fe5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612f33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f2a90614c0c565b60405180910390fd5b6000600184885103039050806040519080825280601f01601f191660200182016040528015612f715781602001600182028038833980820191505090505b50945060008090505b81811015612fec5760008860018784010181518110612f9557fe5b602001015160f81c60f81b905080878381518110612faf57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350508080600101915050612f7a565b5050505050915091565b600060405160200161300790614a5d565b604051602081830303815290604052805190602001208260405160200161302e9190614a31565b604051602081830303815290604052805190602001201480613099575060405160200161305a90614a48565b60405160208183030381529060405280519060200120826040516020016130819190614a31565b60405160208183030381529060405280519060200120145b806130a5575060008251145b156130b357600090506130d2565b60008251905060ff8111156130cc5760009150506130d2565b60019150505b919050565b60008060016020601f855101816130ea57fe5b040190506040518481526020810160005b8381101561311c5780602002860151816020028301528060010190506130fb565b5060208260208502604001846000600f600019f1935050505092915050565b600073d2001000000000000000000000000000000000d273ffffffffffffffffffffffffffffffffffffffff166383e781fe6040518163ffffffff1660e01b815260040160206040518083038186803b15801561319757600080fd5b505afa1580156131ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506131cf9190810190613da8565b905090565b600060606131e183612a10565b90506000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b82518110156132f25760008260010184600184038151811061324b57fe5b60200260200101516040516132609190614a1a565b908152602001604051809103902054116132af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132a690614c2c565b60405180910390fd5b816002018360018303815181106132c257fe5b60200260200101516040516132d79190614a1a565b9081526020016040518091039020915080600101905061322d565b5060606001835111613304578461331d565b8260018451038151811061331457fe5b60200260200101515b9050600082600101826040516133339190614a31565b90815260200160405180910390205411613382576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161337990614c2c565b60405180910390fd5b6000826000016001846001018460405161339c9190614a31565b90815260200160405180910390205403815481106133b657fe5b906000526020600020906005020190508094505050505092915050565b60008060016020601f855101816133e657fe5b04019050600060016020601f885101816133fc57fe5b040190506040518781526020810160005b8381101561342e57806020028901518160200283015280600101905061340d565b50868360200282015260005b84811015613460578060200287015181856001010160200283015280600101905061343a565b50602082848601602002606001846000600c600019f1945050505050949350505050565b600061348e613b4e565b600060016020601f885101816134a057fe5b0401905060006020601f8601816134b357fe5b0490506040518881526020810160005b848110156134e457806020028a0151816020028301528060010190506134c3565b5083602002810188815287816020015283602002868660030160200285600a600019fa9650505050505094509492505050565b60008060016020601f8551018161352a57fe5b040190506040518481526020810160005b8381101561355c57806020028601518160200283015280600101905061353b565b50602082602085026040018460006011600019f1935050505092915050565b60008060016020601f8651018161358e57fe5b040190506040518581526020810160005b838110156135c057806020028701518160200283015280600101905061359f565b50846020840282015260208260208502604001846000600b600019f193505050509392505050565b60008060016020601f855101816135fb57fe5b040190506040518481526020810160005b8381101561362d57806020028601518160200283015280600101905061360c565b5060208260208502604001846000600e600019f1935050505092915050565b600080600060016020601f8651018161366157fe5b040190506040518581526020810160005b83811015613693578060200287015181602002830152806001019050613672565b506020826020850260200184600d600019fa9450815193505050509250929050565b6136bd613b73565b600060208301905060405180604001604052808451815260200182815250915050919050565b600080826000015161370785600001518660200151866000015187602001516137d4565b0190505b8360000151846020015101811161375157818060010192505082600001516137498560200151830386600001510383866000015187602001516137d4565b01905061370b565b5092915050565b613760613b73565b61376b8383836138af565b5092915050565b60608082600001516040519080825280601f01601f1916602001820160405280156137ac5781602001600182028038833980820191505090505b50905060006020820190506137ca818560200151866000015161394d565b8192505050919050565b600080849050600086851161389f576020851161385957600060018660200360080260020a031960001b905060008186511690506000878a8a0103905060008386511690505b82811461384b57818610613838578a8a0196505050505050506138a7565b858060010196505083865116905061381a565b8596505050505050506138a7565b60008585209050600091505b858803821161389d57600086842090508082141561388957839450505050506138a7565b600184019350508180600101925050613865565b505b868601925050505b949350505050565b6138b7613b73565b60006138d585600001518660200151866000015187602001516137d4565b90508460200151836020018181525050846020015181038360000181815250508460000151856020015101811415613917576000856000018181525050613942565b8360000151836000015101856000018181510391508181525050836000015181018560200181815250505b829150509392505050565b5b60208110613971578151835260208301925060208201915060208103905061394e565b60006001826020036101000a0390508019835116818551168181178652505050505050565b6040518060a001604052806060815260200160001515815260200160008152602001600060028111156139c557fe5b8152602001606081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613a1357805160ff1916838001178555613a41565b82800160010185558215613a41579182015b82811115613a40578251825591602001919060010190613a25565b5b509050613a4e9190613b8d565b5090565b82805482825590600052602060002090601f01602090048101928215613ae75791602002820160005b83821115613ab857835183826101000a81548160ff0219169083151502179055509260200192600101602081600001049283019260010302613a7b565b8015613ae55782816101000a81549060ff0219169055600101602081600001049283019260010302613ab8565b505b509050613af49190613bb2565b5090565b815481835581811115613b2557600502816005028360005260206000209182019101613b249190613be2565b5b505050565b5080546000825560050290600052602060002090810190613b4b9190613be2565b50565b6040518062100000016040528061800090602082028038833980820191505090505090565b604051806040016040528060008152602001600081525090565b613baf91905b80821115613bab576000816000905550600101613b93565b5090565b90565b613bdf91905b80821115613bdb57600081816101000a81549060ff021916905550600101613bb8565b5090565b90565b613c4e91905b80821115613c4a5760008082016000613c019190613c51565b6001820160006101000a81549060ff021916905560028201600090556003820160006101000a81549060ff0219169055600482016000613c419190613c99565b50600501613be8565b5090565b90565b50805460018160011615610100020316600290046000825580601f10613c775750613c96565b601f016020900490600052602060002090810190613c959190613b8d565b5b50565b50805460008255601f016020900490600052602060002090810190613cbe9190613b8d565b50565b600081359050613cd081615086565b92915050565b600081519050613ce581615086565b92915050565b600082601f830112613cfc57600080fd5b8135613d0f613d0a82614e74565b614e47565b91508082526020830160208301858383011115613d2b57600080fd5b613d36838284615026565b50505092915050565b600082601f830112613d5057600080fd5b8135613d63613d5e82614ea0565b614e47565b91508082526020830160208301858383011115613d7f57600080fd5b613d8a838284615026565b50505092915050565b600081359050613da28161509d565b92915050565b600060208284031215613dba57600080fd5b6000613dc884828501613cd6565b91505092915050565b60008060408385031215613de457600080fd5b6000613df285828601613cc1565b9250506020613e0385828601613d93565b9150509250929050565b600060208284031215613e1f57600080fd5b600082013567ffffffffffffffff811115613e3957600080fd5b613e4584828501613d3f565b91505092915050565b60008060408385031215613e6157600080fd5b600083013567ffffffffffffffff811115613e7b57600080fd5b613e8785828601613d3f565b9250506020613e9885828601613d93565b9150509250929050565b600080600060608486031215613eb757600080fd5b600084013567ffffffffffffffff811115613ed157600080fd5b613edd86828701613d3f565b9350506020613eee86828701613d93565b925050604084013567ffffffffffffffff811115613f0b57600080fd5b613f1786828701613ceb565b9150509250925092565b600080600060608486031215613f3657600080fd5b600084013567ffffffffffffffff811115613f5057600080fd5b613f5c86828701613d3f565b9350506020613f6d86828701613d93565b9250506040613f7e86828701613d93565b9150509250925092565b6000613f9483836140f6565b60208301905092915050565b6000613fac8383614105565b60208301905092915050565b6000613fc4838361497f565b905092915050565b6000613fd782614ef6565b613fe18185614f55565b9350613fec83614ecc565b8060005b8381101561401d5781516140048882613f88565b975061400f83614f2e565b925050600181019050613ff0565b5085935050505092915050565b61403381614f01565b61403d8184614f66565b925061404882614edc565b8060005b838110156140795781516140608782613fa0565b965061406b83614f3b565b92505060018101905061404c565b505050505050565b600061408c82614f0d565b6140968185614f71565b9350836020820285016140a885614ee6565b8060005b858110156140e457848403895281516140c58582613fb8565b94506140d083614f48565b925060208a019950506001810190506140ac565b50829750879550505050505092915050565b6140ff81614fc1565b82525050565b61410e81614fcd565b82525050565b61411d81615014565b82525050565b61412c81615014565b82525050565b600061413d82614f23565b6141478185614fa4565b9350614157818560208601615035565b80840191505092915050565b600061416e82614f18565b6141788185614f82565b9350614188818560208601615035565b61419181615068565b840191505092915050565b60006141a782614f18565b6141b18185614fa4565b93506141c1818560208601615035565b80840191505092915050565b60006141da601883614f93565b91507f496e636f7272656374206368756e6b20706f736974696f6e00000000000000006000830152602082019050919050565b600061421a601583614f93565b91507f4469726563746f7279206e6f74206372656174656400000000000000000000006000830152602082019050919050565b600061425a602483614f93565b91507f4e6f7420656e6f756768206d656d6f727920696e207468652046696c6573746f60008301527f72616765000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006142c0601b83614f93565b91507f48617368206861736e2774206265656e2063616c63756c6174656400000000006000830152602082019050919050565b6000614300601983614f93565b91507f4368756e6b20697320616c72656164792075706c6f61646564000000000000006000830152602082019050919050565b6000614340601683614f93565b91507f496e636f7272656374206368756e6b206c656e677468000000000000000000006000830152602082019050919050565b6000614380600f83614f93565b91507f46696c65206e6f742065786973747300000000000000000000000000000000006000830152602082019050919050565b60006143c0600e83614f93565b91507f496e76616c69642073656e6465720000000000000000000000000000000000006000830152602082019050919050565b6000614400601883614f93565b91507f4469726563746f7279206973206e6f742064656c6574656400000000000000006000830152602082019050919050565b6000614440601083614f93565b91507f46696c65206e6f742064656c65746564000000000000000000000000000000006000830152602082019050919050565b6000614480601383614f93565b91507f496e76616c69642073746f7261676550617468000000000000000000000000006000830152602082019050919050565b60006144c0600c83614f93565b91507f496e76616c6964207061746800000000000000000000000000000000000000006000830152602082019050919050565b6000614500600183614fa4565b91507f2e000000000000000000000000000000000000000000000000000000000000006000830152600182019050919050565b6000614540601683614f93565b91507f496e76616c6964206469726563746f7279206e616d65000000000000000000006000830152602082019050919050565b6000614580601583614f93565b91507f4368756e6b207761736e27742075706c6f6164656400000000000000000000006000830152602082019050919050565b60006145c0602683614f93565b91507f436f756c64206e6f742072657365727665206c657373207468616e207573656460008301527f20737061636500000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614626601683614f93565b91507f4469726563746f7279206973206e6f7420656d707479000000000000000000006000830152602082019050919050565b6000614666602383614f93565b91507f46696c65206861736e2774206265656e2075706c6f6164656420636f7272656360008301527f746c7900000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006146cc601183614f93565b91507f4368756e6b207761736e277420726561640000000000000000000000000000006000830152602082019050919050565b600061470c601883614f93565b91507f46696c656e616d652073686f756c64206265203c2032353600000000000000006000830152602082019050919050565b600061474c601f83614f93565b91507f46696c652073686f756c64206265206c657373207468616e20313030204d42006000830152602082019050919050565b600061478c600283614fa4565b91507f2e2e0000000000000000000000000000000000000000000000000000000000006000830152600282019050919050565b60006147cc601183614f93565b91507f4469726563746f72792069732066756c6c0000000000000000000000000000006000830152602082019050919050565b600061480c600e83614f93565b91507f46696c65206e6f7420666f756e640000000000000000000000000000000000006000830152602082019050919050565b600061484c601883614f93565b91507f46696c65206f72206469726563746f72792065786973747300000000000000006000830152602082019050919050565b600061488c601983614f93565b91507f4e6f7420656e6f756768207265736572766564207370616365000000000000006000830152602082019050919050565b60006148cc601883614f93565b91507f45564d206572726f7220696e2067657446696c6553697a6500000000000000006000830152602082019050919050565b600061490c601083614f93565b91507f46696c65206e6f742063726561746564000000000000000000000000000000006000830152602082019050919050565b600061494c601983614f93565b91507f46696c65206861736e2774206265656e2075706c6f61646564000000000000006000830152602082019050919050565b600060a083016000830151848203600086015261499c8282614163565b91505060208301516149b160208601826140f6565b5060408301516149c460408601826149fc565b5060608301516149d76060860182614114565b50608083015184820360808601526149ef8282613fcc565b9150508091505092915050565b614a058161500a565b82525050565b614a148161500a565b82525050565b6000614a26828461419c565b915081905092915050565b6000614a3d8284614132565b915081905092915050565b6000614a53826144f3565b9150819050919050565b6000614a688261477f565b9150819050919050565b60006210000082019050614a89600083018461402a565b92915050565b60006020820190508181036000830152614aa98184614081565b905092915050565b6000602082019050614ac66000830184614123565b92915050565b60006020820190508181036000830152614ae5816141cd565b9050919050565b60006020820190508181036000830152614b058161420d565b9050919050565b60006020820190508181036000830152614b258161424d565b9050919050565b60006020820190508181036000830152614b45816142b3565b9050919050565b60006020820190508181036000830152614b65816142f3565b9050919050565b60006020820190508181036000830152614b8581614333565b9050919050565b60006020820190508181036000830152614ba581614373565b9050919050565b60006020820190508181036000830152614bc5816143b3565b9050919050565b60006020820190508181036000830152614be5816143f3565b9050919050565b60006020820190508181036000830152614c0581614433565b9050919050565b60006020820190508181036000830152614c2581614473565b9050919050565b60006020820190508181036000830152614c45816144b3565b9050919050565b60006020820190508181036000830152614c6581614533565b9050919050565b60006020820190508181036000830152614c8581614573565b9050919050565b60006020820190508181036000830152614ca5816145b3565b9050919050565b60006020820190508181036000830152614cc581614619565b9050919050565b60006020820190508181036000830152614ce581614659565b9050919050565b60006020820190508181036000830152614d05816146bf565b9050919050565b60006020820190508181036000830152614d25816146ff565b9050919050565b60006020820190508181036000830152614d458161473f565b9050919050565b60006020820190508181036000830152614d65816147bf565b9050919050565b60006020820190508181036000830152614d85816147ff565b9050919050565b60006020820190508181036000830152614da58161483f565b9050919050565b60006020820190508181036000830152614dc58161487f565b9050919050565b60006020820190508181036000830152614de5816148bf565b9050919050565b60006020820190508181036000830152614e05816148ff565b9050919050565b60006020820190508181036000830152614e258161493f565b9050919050565b6000602082019050614e416000830184614a0b565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614e6a57600080fd5b8060405250919050565b600067ffffffffffffffff821115614e8b57600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614eb757600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050919050565b6000819050602082019050919050565b600081519050919050565b60006180009050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614fba82614fea565b9050919050565b60008115159050919050565b6000819050919050565b6000819050614fe582615079565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061501f82614fd7565b9050919050565b82818337600083830152505050565b60005b83811015615053578082015181840152602081019050615038565b83811115615062576000848401525b50505050565b6000601f19601f8301169050919050565b6003811061508357fe5b50565b61508f81614faf565b811461509a57600080fd5b50565b6150a68161500a565b81146150b157600080fd5b5056fea365627a7a72315820314a90e541327f2678eaf7815f54348c3702e4fa45cdf1d5595b378d08af86896c6578706572696d656e74616cf564736f6c634300050d0040", + "storage": { + "0x0": "2868903936" + }, + "nonce": "0" + }, + "0x69362535ec535F0643cBf62D16aDeDCAf32Ee6F7": { + "balance": "0", + "code": "0x608060405234801561001057600080fd5b50600436106100b45760003560e01c806379210e8e1161007157806379210e8e1461017757806381a8235a146101a757806385aeeb17146101c35780639a9a5593146101f3578063a99100541461020f578063b57321221461022b576100b4565b806307c6e7d3146100b9578063122f4fba146100d55780631c6ec7a9146101055780631cfe4e3b14610121578063373dedb41461013d57806361e46db51461015b575b600080fd5b6100d360048036036100ce9190810190613e94565b61025b565b005b6100ef60048036036100ea9190810190613e94565b610862565b6040516100fc9190614b38565b60405180910390f35b61011f600480360361011a9190810190613e94565b610ba1565b005b61013b60048036036101369190810190613e58565b610fce565b005b6101456111ec565b6040516101529190614eb3565b60405180910390f35b61017560048036036101709190810190613f29565b6111f6565b005b610191600480360361018c9190810190613fa8565b611456565b60405161019e9190614af9565b60405180910390f35b6101c160048036036101bc9190810190613e94565b611756565b005b6101dd60048036036101d89190810190613e94565b6118fb565b6040516101ea9190614b16565b60405180910390f35b61020d60048036036102089190810190613ed5565b611bfa565b005b61022960048036036102249190810190613e94565b612195565b005b61024560048036036102409190810190613e94565b612849565b6040516102529190614eb3565b60405180910390f35b6000339050606061026b83612ac9565b90506000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b825181101561037c576000826001018460018403815181106102d557fe5b60200260200101516040516102ea9190614aa1565b90815260200160405180910390205411610339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161033090614cb3565b60405180910390fd5b8160020183600183038151811061034c57fe5b60200260200101516040516103619190614aa1565b908152602001604051809103902091508060010190506102b7565b506060600183511161038e57846103a7565b8260018451038151811061039e57fe5b60200260200101515b9050600082600101826040516103bd9190614ab8565b9081526020016040518091039020541161040c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161040390614cb3565b60405180910390fd5b600082600201826040516104209190614ab8565b90815260200160405180910390206000018054905014610475576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161046c90614d33565b60405180910390fd5b60006104818587612cc9565b9050806104c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ba90614c53565b60405180910390fd5b6104cb613a4f565b836000016001856000018054905003815481106104e457fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156105965780601f1061056b57610100808354040283529160200191610596565b820191906000526020600020905b81548152906001019060200180831161057957829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff1660028111156105e257fe5b60028111156105ed57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561066557602002820191906000526020600020906000905b82829054906101000a900460ff1615158152602001906001019060208260000104928301926001038202915080841161062f5790505b50505050508152505090508084600001600186600101866040516106899190614ab8565b90815260200160405180910390205403815481106106a357fe5b906000526020600020906005020160008201518160000190805190602001906106cd929190613a8b565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561071c57fe5b0217905550608082015181600401908051906020019061073d929190613b0b565b5090505083600101836040516107539190614ab8565b9081526020016040518091039020548460010182600001516040516107789190614aa1565b9081526020016040518091039020819055506000846001018460405161079e9190614ab8565b908152602001604051809103902081905550836000018054806107bd57fe5b6001900381819060005260206000209060050201600080820160006107e29190613bb1565b6001820160006101000a81549060ff021916905560028201600090556003820160006101000a81549060ff02191690556004820160006108229190613bf9565b5050905583600201836040516108389190614ab8565b9081526020016040518091039020600080820160006108579190613c21565b505050505050505050565b600080606061087084612d2d565b91509150606061087f82612ac9565b90506000600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015610964576000826001018460018403815181106108e957fe5b60200260200101516040516108fe9190614aa1565b908152602001604051809103902054141561092157600095505050505050610b9c565b8160020183600183038151811061093457fe5b60200260200101516040516109499190614aa1565b908152602001604051809103902091508060010190506108cb565b5060606001835111610976578361098f565b8260018451038151811061098657fe5b60200260200101515b9050600082600101826040516109a59190614ab8565b90815260200160405180910390205414156109c857600095505050505050610b9c565b6109d0613a4f565b82600001600184600101846040516109e89190614ab8565b9081526020016040518091039020540381548110610a0257fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610ab45780601f10610a8957610100808354040283529160200191610ab4565b820191906000526020600020905b815481529060010190602001808311610a9757829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115610b0057fe5b6002811115610b0b57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015610b8357602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411610b4d5790505b5050505050815250509050806060015196505050505050505b919050565b600360009054906101000a900460ff16610be457612000600481905550621000006005819055506001600360006101000a81548160ff0219169083151502179055505b6000815111610c28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1f90614cb3565b60405180910390fd5b60003390506060610c3883612ac9565b90506000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015610d4957600082600101846001840381518110610ca257fe5b6020026020010151604051610cb79190614aa1565b90815260200160405180910390205411610d06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cfd90614cb3565b60405180910390fd5b81600201836001830381518110610d1957fe5b6020026020010151604051610d2e9190614aa1565b90815260200160405180910390209150806001019050610c84565b50600454816000018054905010610d95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8c90614dd3565b60405180910390fd5b60606001835111610da65784610dbf565b82600184510381518110610db657fe5b60200260200101515b905060008260010182604051610dd59190614ab8565b90815260200160405180910390205414610e24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1b90614e13565b60405180910390fd5b610e2d816130af565b610e6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6390614cd3565b60405180910390fd5b6000610e788587613190565b905080610eba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb190614b73565b60405180910390fd5b610ec2613a4f565b8281600001819052506000816020019015159081151581525050836000018190806001815401808255809150506001900390600052602060002090600502016000909190919091506000820151816000019080519060200190610f26929190613a8b565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff02191690836002811115610f7557fe5b02179055506080820151816004019080519060200190610f96929190613b0b565b50505083600001805490508460010184604051610fb39190614ab8565b90815260200160405180910390208190555050505050505050565b610fd66131f4565b73ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16148061103b57503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614155b61107a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107190614c33565b60405180910390fd5b80600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411156110fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f390614d13565b60405180910390fd5b60025460095482011115611145576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113c90614b93565b60405180910390fd5b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460096000828254039250508190555080600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550806009600082825401925050819055505050565b6000600254905090565b60003390506000611207828661328d565b90506001600281111561121657fe5b8160030160009054906101000a900460ff16600281111561123357fe5b14611273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126a90614df3565b60405180910390fd5b6000600554858161128057fe5b061480156112915750806002015484105b6112d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c790614b53565b60405180910390fd5b600554848260020154031080156112ed5750838160020154038351145b806112fa57506005548351145b611339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133090614bf3565b60405180910390fd5b6000151581600401600554868161134c57fe5b048154811061135757fe5b90600052602060002090602091828204019190069054906101000a900460ff161515146113b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b090614bd3565b60405180910390fd5b60006113c78387878761348c565b905080611409576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140090614cf3565b60405180910390fd5b600182600401600554878161141a57fe5b048154811061142557fe5b90600052602060002090602091828204019190066101000a81548160ff021916908315150217905550505050505050565b61145e613c45565b6000606061146b86612d2d565b91509150611477613a4f565b611481838361328d565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156115255780601f106114fa57610100808354040283529160200191611525565b820191906000526020600020905b81548152906001019060200180831161150857829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561157157fe5b600281111561157c57fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156115f457602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116115be5790505b505050505081525050905060028081111561160b57fe5b8160600151600281111561161b57fe5b1461165b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165290614e93565b60405180910390fd5b600554851115801561166d5750600085115b6116ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a390614bf3565b60405180910390fd5b806040015185870111156116f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ec90614b53565b60405180910390fd5b60006117038484898961353d565b80965081925050508061174b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174290614d73565b60405180910390fd5b505050509392505050565b60003390506000611767828461328d565b90506001600281111561177657fe5b8160030160009054906101000a900460ff16600281111561179357fe5b146117d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ca90614df3565b60405180910390fd5b60006001905060008260040180549050905060008090505b8181101561183e576000151584600401828154811061180657fe5b90600052602060002090602091828204019190069054906101000a900460ff161515141561183357600092505b8060010190506117eb565b508161187f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187690614d53565b60405180910390fd5b60028360030160006101000a81548160ff021916908360028111156118a057fe5b021790555060006118b185876135d0565b9050806118f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ea90614bb3565b60405180910390fd5b505050505050565b60606000606061190a84612d2d565b91509150606061191982612ac9565b90506000600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008090505b8251811015611a235760008260010184838151811061197f57fe5b60200260200101516040516119949190614aa1565b908152602001604051809103902054116119e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119da90614cb3565b60405180910390fd5b816002018382815181106119f357fe5b6020026020010151604051611a089190614aa1565b90815260200160405180910390209150806001019050611964565b5080600001805480602002602001604051908101604052809291908181526020016000905b82821015611beb57838290600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611b045780601f10611ad957610100808354040283529160200191611b04565b820191906000526020600020905b815481529060010190602001808311611ae757829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115611b5057fe5b6002811115611b5b57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015611bd357602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411611b9d5790505b50505050508152505081526020019060010190611a48565b50505050945050505050919050565b600360009054906101000a900460ff16611c3d57612000600481905550621000006005819055506001600360006101000a81548160ff0219169083151502179055505b60003390506305f5e100821115611c89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8090614db3565b60405180910390fd5b600660008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205483011115611d4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4390614e33565b60405180910390fd5b6060611d5784612ac9565b90506000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015611e6857600082600101846001840381518110611dc157fe5b6020026020010151604051611dd69190614aa1565b90815260200160405180910390205411611e25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1c90614cb3565b60405180910390fd5b81600201836001830381518110611e3857fe5b6020026020010151604051611e4d9190614aa1565b90815260200160405180910390209150806001019050611da3565b50600454816000018054905010611eb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eab90614dd3565b60405180910390fd5b60606001835111611ec55785611ede565b82600184510381518110611ed557fe5b60200260200101515b905060008260010182604051611ef49190614ab8565b90815260200160405180910390205414611f43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3a90614e13565b60405180910390fd5b611f4c816130af565b611f8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8290614d93565b60405180910390fd5b6000611f98858888613634565b905080611fda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd190614e73565b60405180910390fd5b6060600554600160055489010381611fee57fe5b0460405190808252806020026020018201604052801561201d5781602001602082028038833980820191505090505b509050836000016040518060a001604052808581526020016001151581526020018981526020016001600281111561205157fe5b8152602001838152509080600181540180825580915050600190039060005260206000209060050201600090919091909150600082015181600001908051906020019061209f929190613a8b565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff021916908360028111156120ee57fe5b0217905550608082015181600401908051906020019061210f929190613b0b565b5050508360000180549050846001018460405161212c9190614ab8565b90815260200160405180910390208190555086600760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505050505050505050565b60003390506121a2613a4f565b6121ac828461328d565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156122505780601f1061222557610100808354040283529160200191612250565b820191906000526020600020905b81548152906001019060200180831161223357829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561229c57fe5b60028111156122a757fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561231f57602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116122e95790505b50505050508152505090506000600281111561233757fe5b8160600151600281111561234757fe5b1415612388576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161237f90614c13565b60405180910390fd5b600061239483856136a1565b9050806123d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123cd90614c73565b60405180910390fd5b60606123e185612ac9565b90506000600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015612479578160020183600183038151811061244957fe5b602002602001015160405161245e9190614aa1565b9081526020016040518091039020915080600101905061242d565b50600060018260010186600001516040516124949190614aa1565b9081526020016040518091039020540390506124ae613a4f565b826000016001846000018054905003815481106124c757fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156125795780601f1061254e57610100808354040283529160200191612579565b820191906000526020600020905b81548152906001019060200180831161255c57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff1660028111156125c557fe5b60028111156125d057fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561264857602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116126125790505b50505050508152505090508083600001838154811061266357fe5b9060005260206000209060050201600082015181600001908051906020019061268d929190613a8b565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff021916908360028111156126dc57fe5b021790555060808201518160040190805190602001906126fd929190613b0b565b509050508260000180548061270e57fe5b6001900381819060005260206000209060050201600080820160006127339190613bb1565b6001820160006101000a81549060ff021916905560028201600090556003820160006101000a81549060ff02191690556004820160006127739190613bf9565b5050905582600101866000015160405161278d9190614aa1565b9081526020016040518091039020548360010182600001516040516127b29190614aa1565b90815260200160405180910390208190555060008360010187600001516040516127dc9190614aa1565b9081526020016040518091039020819055508560400151600760008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505050505050505050565b600080606061285784612d2d565b91509150612863613a4f565b61286d838361328d565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156129115780601f106128e657610100808354040283529160200191612911565b820191906000526020600020905b8154815290600101906020018083116128f457829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561295d57fe5b600281111561296857fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156129e057602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116129aa5790505b5050505050815250509050600160028111156129f857fe5b81606001516002811115612a0857fe5b1480612a2d5750600280811115612a1b57fe5b81606001516002811115612a2b57fe5b145b612a6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a6390614df3565b60405180910390fd5b6000612a788484613705565b809650819250505080612ac0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ab790614e53565b60405180910390fd5b50505050919050565b6060612ad3613c6a565b612adc8361376e565b9050612ae6613c6a565b612b246040518060400160405280600181526020017f2f0000000000000000000000000000000000000000000000000000000000000081525061376e565b905060606001612b3d838561379c90919063ffffffff16565b01604051908082528060200260200182016040528015612b7157816020015b6060815260200190600190039081612b5c5790505b50905060008090505b8151811015612bc257612b9e612b99848661381190919063ffffffff16565b61382b565b828281518110612baa57fe5b60200260200101819052508080600101915050612b7a565b50600081600183510381518110612bd557fe5b6020026020010151511415612c405780600182510381518110612bf457fe5b6020026020010160608152506001815103604051908082528060200260200182016040528015612c3857816020015b6060815260200190600190039081612c235790505b509350612c79565b8051604051908082528060200260200182016040528015612c7557816020015b6060815260200190600190039081612c605790505b5093505b60008090505b8451811015612cc057818181518110612c9457fe5b6020026020010151858281518110612ca857fe5b60200260200101819052508080600101915050612c7f565b50505050919050565b60008060016020601f85510181612cdc57fe5b040190506040518481526020810160005b83811015612d0e578060200286015181602002830152806001019050612ced565b50602082602085026040018460006010600019f1935050505092915050565b6000606060006028905080845111612d7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d7190614c93565b60405180910390fd5b6060816040519080825280601f01601f191660200182016040528015612daf5781602001600182028038833980820191505090505b50905060008090505b82811015612e1f57858181518110612dcc57fe5b602001015160f81c60f81b828281518110612de357fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050612db8565b50600080905060008090505b83811015612f4e576000838281518110612e4157fe5b602001015160f81c60f81b60f81c60ff16905060308110158015612e66575060398111155b80612e7f575060418110158015612e7e5750605a8111155b5b80612e98575060618110158015612e97575060668111155b5b612ed7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ece90614c93565b60405180910390fd5b60308110158015612ee9575060398111155b15612efa5760308103601084020192505b60418110158015612f0c5750605a8111155b15612f1d5760378103601084020192505b60618110158015612f2f575060668111155b15612f405760578103601084020192505b508080600101915050612e2b565b508094507f2f00000000000000000000000000000000000000000000000000000000000000868481518110612f7f57fe5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612fec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fe390614c93565b60405180910390fd5b6000600184885103039050806040519080825280601f01601f19166020018201604052801561302a5781602001600182028038833980820191505090505b50945060008090505b818110156130a5576000886001878401018151811061304e57fe5b602001015160f81c60f81b90508087838151811061306857fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350508080600101915050613033565b5050505050915091565b60006040516020016130c090614ae4565b60405160208183030381529060405280519060200120826040516020016130e79190614ab8565b604051602081830303815290604052805190602001201480613152575060405160200161311390614acf565b604051602081830303815290604052805190602001208260405160200161313a9190614ab8565b60405160208183030381529060405280519060200120145b8061315e575060008251145b1561316c576000905061318b565b60008251905060ff81111561318557600091505061318b565b60019150505b919050565b60008060016020601f855101816131a357fe5b040190506040518481526020810160005b838110156131d55780602002860151816020028301528060010190506131b4565b5060208260208502604001846000600f600019f1935050505092915050565b600073d2001000000000000000000000000000000000d273ffffffffffffffffffffffffffffffffffffffff166383e781fe6040518163ffffffff1660e01b815260040160206040518083038186803b15801561325057600080fd5b505afa158015613264573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506132889190810190613e2f565b905090565b6000606061329a83612ac9565b90506000600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b82518110156133ab5760008260010184600184038151811061330457fe5b60200260200101516040516133199190614aa1565b90815260200160405180910390205411613368576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161335f90614cb3565b60405180910390fd5b8160020183600183038151811061337b57fe5b60200260200101516040516133909190614aa1565b908152602001604051809103902091508060010190506132e6565b50606060018351116133bd57846133d6565b826001845103815181106133cd57fe5b60200260200101515b9050600082600101826040516133ec9190614ab8565b9081526020016040518091039020541161343b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161343290614cb3565b60405180910390fd5b600082600001600184600101846040516134559190614ab8565b908152602001604051809103902054038154811061346f57fe5b906000526020600020906005020190508094505050505092915050565b60008060016020601f8551018161349f57fe5b04019050600060016020601f885101816134b557fe5b040190506040518781526020810160005b838110156134e75780602002890151816020028301528060010190506134c6565b50868360200282015260005b8481101561351957806020028701518185600101016020028301528060010190506134f3565b50602082848601602002606001846000600c600019f1945050505050949350505050565b6000613547613c45565b600060016020601f8851018161355957fe5b0401905060006020601f86018161356c57fe5b0490506040518881526020810160005b8481101561359d57806020028a01518160200283015280600101905061357c565b5083602002810188815287816020015283602002868660030160200285600a600019fa9650505050505094509492505050565b60008060016020601f855101816135e357fe5b040190506040518481526020810160005b838110156136155780602002860151816020028301528060010190506135f4565b50602082602085026040018460006011600019f1935050505092915050565b60008060016020601f8651018161364757fe5b040190506040518581526020810160005b83811015613679578060200287015181602002830152806001019050613658565b50846020840282015260208260208502604001846000600b600019f193505050509392505050565b60008060016020601f855101816136b457fe5b040190506040518481526020810160005b838110156136e65780602002860151816020028301528060010190506136c5565b5060208260208502604001846000600e600019f1935050505092915050565b600080600060016020601f8651018161371a57fe5b040190506040518581526020810160005b8381101561374c57806020028701518160200283015280600101905061372b565b506020826020850260200184600d600019fa9450815193505050509250929050565b613776613c6a565b600060208301905060405180604001604052808451815260200182815250915050919050565b60008082600001516137c0856000015186602001518660000151876020015161388d565b0190505b8360000151846020015101811161380a578180600101925050826000015161380285602001518303866000015103838660000151876020015161388d565b0190506137c4565b5092915050565b613819613c6a565b613824838383613968565b5092915050565b60608082600001516040519080825280601f01601f1916602001820160405280156138655781602001600182028038833980820191505090505b50905060006020820190506138838185602001518660000151613a06565b8192505050919050565b6000808490506000868511613958576020851161391257600060018660200360080260020a031960001b905060008186511690506000878a8a0103905060008386511690505b828114613904578186106138f1578a8a019650505050505050613960565b85806001019650508386511690506138d3565b859650505050505050613960565b60008585209050600091505b85880382116139565760008684209050808214156139425783945050505050613960565b60018401935050818060010192505061391e565b505b868601925050505b949350505050565b613970613c6a565b600061398e856000015186602001518660000151876020015161388d565b905084602001518360200181815250508460200151810383600001818152505084600001518560200151018114156139d05760008560000181815250506139fb565b8360000151836000015101856000018181510391508181525050836000015181018560200181815250505b829150509392505050565b5b60208110613a2a5781518352602083019250602082019150602081039050613a07565b60006001826020036101000a0390508019835116818551168181178652505050505050565b6040518060a00160405280606081526020016000151581526020016000815260200160006002811115613a7e57fe5b8152602001606081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613acc57805160ff1916838001178555613afa565b82800160010185558215613afa579182015b82811115613af9578251825591602001919060010190613ade565b5b509050613b079190613c84565b5090565b82805482825590600052602060002090601f01602090048101928215613ba05791602002820160005b83821115613b7157835183826101000a81548160ff0219169083151502179055509260200192600101602081600001049283019260010302613b34565b8015613b9e5782816101000a81549060ff0219169055600101602081600001049283019260010302613b71565b505b509050613bad9190613ca9565b5090565b50805460018160011615610100020316600290046000825580601f10613bd75750613bf6565b601f016020900490600052602060002090810190613bf59190613c84565b5b50565b50805460008255601f016020900490600052602060002090810190613c1e9190613c84565b50565b5080546000825560050290600052602060002090810190613c429190613cd9565b50565b6040518062100000016040528061800090602082028038833980820191505090505090565b604051806040016040528060008152602001600081525090565b613ca691905b80821115613ca2576000816000905550600101613c8a565b5090565b90565b613cd691905b80821115613cd257600081816101000a81549060ff021916905550600101613caf565b5090565b90565b613d4591905b80821115613d415760008082016000613cf89190613bb1565b6001820160006101000a81549060ff021916905560028201600090556003820160006101000a81549060ff0219169055600482016000613d389190613bf9565b50600501613cdf565b5090565b90565b600081359050613d578161510d565b92915050565b600081519050613d6c8161510d565b92915050565b600082601f830112613d8357600080fd5b8135613d96613d9182614efb565b614ece565b91508082526020830160208301858383011115613db257600080fd5b613dbd8382846150ad565b50505092915050565b600082601f830112613dd757600080fd5b8135613dea613de582614f27565b614ece565b91508082526020830160208301858383011115613e0657600080fd5b613e118382846150ad565b50505092915050565b600081359050613e2981615124565b92915050565b600060208284031215613e4157600080fd5b6000613e4f84828501613d5d565b91505092915050565b60008060408385031215613e6b57600080fd5b6000613e7985828601613d48565b9250506020613e8a85828601613e1a565b9150509250929050565b600060208284031215613ea657600080fd5b600082013567ffffffffffffffff811115613ec057600080fd5b613ecc84828501613dc6565b91505092915050565b60008060408385031215613ee857600080fd5b600083013567ffffffffffffffff811115613f0257600080fd5b613f0e85828601613dc6565b9250506020613f1f85828601613e1a565b9150509250929050565b600080600060608486031215613f3e57600080fd5b600084013567ffffffffffffffff811115613f5857600080fd5b613f6486828701613dc6565b9350506020613f7586828701613e1a565b925050604084013567ffffffffffffffff811115613f9257600080fd5b613f9e86828701613d72565b9150509250925092565b600080600060608486031215613fbd57600080fd5b600084013567ffffffffffffffff811115613fd757600080fd5b613fe386828701613dc6565b9350506020613ff486828701613e1a565b925050604061400586828701613e1a565b9150509250925092565b600061401b838361417d565b60208301905092915050565b6000614033838361418c565b60208301905092915050565b600061404b8383614a06565b905092915050565b600061405e82614f7d565b6140688185614fdc565b935061407383614f53565b8060005b838110156140a457815161408b888261400f565b975061409683614fb5565b925050600181019050614077565b5085935050505092915050565b6140ba81614f88565b6140c48184614fed565b92506140cf82614f63565b8060005b838110156141005781516140e78782614027565b96506140f283614fc2565b9250506001810190506140d3565b505050505050565b600061411382614f94565b61411d8185614ff8565b93508360208202850161412f85614f6d565b8060005b8581101561416b578484038952815161414c858261403f565b945061415783614fcf565b925060208a01995050600181019050614133565b50829750879550505050505092915050565b61418681615048565b82525050565b61419581615054565b82525050565b6141a48161509b565b82525050565b6141b38161509b565b82525050565b60006141c482614faa565b6141ce818561502b565b93506141de8185602086016150bc565b80840191505092915050565b60006141f582614f9f565b6141ff8185615009565b935061420f8185602086016150bc565b614218816150ef565b840191505092915050565b600061422e82614f9f565b614238818561502b565b93506142488185602086016150bc565b80840191505092915050565b600061426160188361501a565b91507f496e636f7272656374206368756e6b20706f736974696f6e00000000000000006000830152602082019050919050565b60006142a160158361501a565b91507f4469726563746f7279206e6f74206372656174656400000000000000000000006000830152602082019050919050565b60006142e160248361501a565b91507f4e6f7420656e6f756768206d656d6f727920696e207468652046696c6573746f60008301527f72616765000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614347601b8361501a565b91507f48617368206861736e2774206265656e2063616c63756c6174656400000000006000830152602082019050919050565b600061438760198361501a565b91507f4368756e6b20697320616c72656164792075706c6f61646564000000000000006000830152602082019050919050565b60006143c760168361501a565b91507f496e636f7272656374206368756e6b206c656e677468000000000000000000006000830152602082019050919050565b6000614407600f8361501a565b91507f46696c65206e6f742065786973747300000000000000000000000000000000006000830152602082019050919050565b6000614447600e8361501a565b91507f496e76616c69642073656e6465720000000000000000000000000000000000006000830152602082019050919050565b600061448760188361501a565b91507f4469726563746f7279206973206e6f742064656c6574656400000000000000006000830152602082019050919050565b60006144c760108361501a565b91507f46696c65206e6f742064656c65746564000000000000000000000000000000006000830152602082019050919050565b600061450760138361501a565b91507f496e76616c69642073746f7261676550617468000000000000000000000000006000830152602082019050919050565b6000614547600c8361501a565b91507f496e76616c6964207061746800000000000000000000000000000000000000006000830152602082019050919050565b600061458760018361502b565b91507f2e000000000000000000000000000000000000000000000000000000000000006000830152600182019050919050565b60006145c760168361501a565b91507f496e76616c6964206469726563746f7279206e616d65000000000000000000006000830152602082019050919050565b600061460760158361501a565b91507f4368756e6b207761736e27742075706c6f6164656400000000000000000000006000830152602082019050919050565b600061464760268361501a565b91507f436f756c64206e6f742072657365727665206c657373207468616e207573656460008301527f20737061636500000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006146ad60168361501a565b91507f4469726563746f7279206973206e6f7420656d707479000000000000000000006000830152602082019050919050565b60006146ed60238361501a565b91507f46696c65206861736e2774206265656e2075706c6f6164656420636f7272656360008301527f746c7900000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061475360118361501a565b91507f4368756e6b207761736e277420726561640000000000000000000000000000006000830152602082019050919050565b600061479360188361501a565b91507f46696c656e616d652073686f756c64206265203c2032353600000000000000006000830152602082019050919050565b60006147d3601f8361501a565b91507f46696c652073686f756c64206265206c657373207468616e20313030204d42006000830152602082019050919050565b600061481360028361502b565b91507f2e2e0000000000000000000000000000000000000000000000000000000000006000830152600282019050919050565b600061485360118361501a565b91507f4469726563746f72792069732066756c6c0000000000000000000000000000006000830152602082019050919050565b6000614893600e8361501a565b91507f46696c65206e6f7420666f756e640000000000000000000000000000000000006000830152602082019050919050565b60006148d360188361501a565b91507f46696c65206f72206469726563746f72792065786973747300000000000000006000830152602082019050919050565b600061491360198361501a565b91507f4e6f7420656e6f756768207265736572766564207370616365000000000000006000830152602082019050919050565b600061495360188361501a565b91507f45564d206572726f7220696e2067657446696c6553697a6500000000000000006000830152602082019050919050565b600061499360108361501a565b91507f46696c65206e6f742063726561746564000000000000000000000000000000006000830152602082019050919050565b60006149d360198361501a565b91507f46696c65206861736e2774206265656e2075706c6f61646564000000000000006000830152602082019050919050565b600060a0830160008301518482036000860152614a2382826141ea565b9150506020830151614a38602086018261417d565b506040830151614a4b6040860182614a83565b506060830151614a5e606086018261419b565b5060808301518482036080860152614a768282614053565b9150508091505092915050565b614a8c81615091565b82525050565b614a9b81615091565b82525050565b6000614aad8284614223565b915081905092915050565b6000614ac482846141b9565b915081905092915050565b6000614ada8261457a565b9150819050919050565b6000614aef82614806565b9150819050919050565b60006210000082019050614b1060008301846140b1565b92915050565b60006020820190508181036000830152614b308184614108565b905092915050565b6000602082019050614b4d60008301846141aa565b92915050565b60006020820190508181036000830152614b6c81614254565b9050919050565b60006020820190508181036000830152614b8c81614294565b9050919050565b60006020820190508181036000830152614bac816142d4565b9050919050565b60006020820190508181036000830152614bcc8161433a565b9050919050565b60006020820190508181036000830152614bec8161437a565b9050919050565b60006020820190508181036000830152614c0c816143ba565b9050919050565b60006020820190508181036000830152614c2c816143fa565b9050919050565b60006020820190508181036000830152614c4c8161443a565b9050919050565b60006020820190508181036000830152614c6c8161447a565b9050919050565b60006020820190508181036000830152614c8c816144ba565b9050919050565b60006020820190508181036000830152614cac816144fa565b9050919050565b60006020820190508181036000830152614ccc8161453a565b9050919050565b60006020820190508181036000830152614cec816145ba565b9050919050565b60006020820190508181036000830152614d0c816145fa565b9050919050565b60006020820190508181036000830152614d2c8161463a565b9050919050565b60006020820190508181036000830152614d4c816146a0565b9050919050565b60006020820190508181036000830152614d6c816146e0565b9050919050565b60006020820190508181036000830152614d8c81614746565b9050919050565b60006020820190508181036000830152614dac81614786565b9050919050565b60006020820190508181036000830152614dcc816147c6565b9050919050565b60006020820190508181036000830152614dec81614846565b9050919050565b60006020820190508181036000830152614e0c81614886565b9050919050565b60006020820190508181036000830152614e2c816148c6565b9050919050565b60006020820190508181036000830152614e4c81614906565b9050919050565b60006020820190508181036000830152614e6c81614946565b9050919050565b60006020820190508181036000830152614e8c81614986565b9050919050565b60006020820190508181036000830152614eac816149c6565b9050919050565b6000602082019050614ec86000830184614a92565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614ef157600080fd5b8060405250919050565b600067ffffffffffffffff821115614f1257600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614f3e57600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050919050565b6000819050602082019050919050565b600081519050919050565b60006180009050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061504182615071565b9050919050565b60008115159050919050565b6000819050919050565b600081905061506c82615100565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006150a68261505e565b9050919050565b82818337600083830152505050565b60005b838110156150da5780820151818401526020810190506150bf565b838111156150e9576000848401525b50505050565b6000601f19601f8301169050919050565b6003811061510a57fe5b50565b61511681615036565b811461512157600080fd5b50565b61512d81615091565b811461513857600080fd5b5056fea2646970667358221220a549ad9e778ae8bb3048c0a1805e77745871cc1560637ae1c3ebccb76638d9c464736f6c63430006020033", + "storage": { + "0x0": "2868903936" + }, + "nonce": "0" + }, + "0x69362535ec535F0643cBf62D16aDeDCAf32Ee6F7": { + "balance": "0", + "code": "0x608060405234801561001057600080fd5b50600436106100b45760003560e01c806379210e8e1161007157806379210e8e1461017757806381a8235a146101a757806385aeeb17146101c35780639a9a5593146101f3578063a99100541461020f578063b57321221461022b576100b4565b806307c6e7d3146100b9578063122f4fba146100d55780631c6ec7a9146101055780631cfe4e3b14610121578063373dedb41461013d57806361e46db51461015b575b600080fd5b6100d360048036036100ce9190810190613cff565b61025b565b005b6100ef60048036036100ea9190810190613cff565b610804565b6040516100fc9190614963565b60405180910390f35b61011f600480360361011a9190810190613cff565b610b43565b005b61013b60048036036101369190810190613cc3565b610f72565b005b610145611190565b6040516101529190614cbe565b60405180910390f35b61017560048036036101709190810190613d94565b611199565b005b610191600480360361018c9190810190613e13565b6113f9565b60405161019e9190614924565b60405180910390f35b6101c160048036036101bc9190810190613cff565b6116f9565b005b6101dd60048036036101d89190810190613cff565b61189e565b6040516101ea9190614941565b60405180910390f35b61020d60048036036102089190810190613d40565b611b9d565b005b61022960048036036102249190810190613cff565b61202c565b005b61024560048036036102409190810190613cff565b612682565b6040516102529190614cbe565b60405180910390f35b6000339050606061026b83612902565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b825181101561037c576000826001018460018403815181106102d557fe5b60200260200101516040516102ea91906148cc565b90815260200160405180910390205411610339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161033090614ade565b60405180910390fd5b8160020183600183038151811061034c57fe5b602002602001015160405161036191906148cc565b908152602001604051809103902091508060010190506102b7565b506060600183511161038e57846103a7565b8260018451038151811061039e57fe5b60200260200101515b9050600082600101826040516103bd91906148e3565b9081526020016040518091039020541161040c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161040390614ade565b60405180910390fd5b6000826002018260405161042091906148e3565b90815260200160405180910390206000018054905014610475576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161046c90614b5e565b60405180910390fd5b60006104818587612b02565b9050806104c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ba90614a7e565b60405180910390fd5b6104cb613888565b836000016001856000018054905003815481106104e457fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156105965780601f1061056b57610100808354040283529160200191610596565b820191906000526020600020905b81548152906001019060200180831161057957829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff1660028111156105e257fe5b60028111156105ed57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561066557602002820191906000526020600020906000905b82829054906101000a900460ff1615158152602001906001019060208260000104928301926001038202915080841161062f5790505b505050505081525050905080846000016001866001018660405161068991906148e3565b90815260200160405180910390205403815481106106a357fe5b906000526020600020906005020160008201518160000190805190602001906106cd9291906138c4565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561071c57fe5b0217905550608082015181600401908051906020019061073d929190613944565b50905050836001018360405161075391906148e3565b90815260200160405180910390205484600101826000015160405161077891906148cc565b9081526020016040518091039020819055506000846001018460405161079e91906148e3565b908152602001604051809103902081905550836000018054809190600190036107c791906139ea565b5083600201836040516107da91906148e3565b9081526020016040518091039020600080820160006107f99190613a1c565b505050505050505050565b600080606061081284612b66565b91509150606061082182612902565b90506000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b82518110156109065760008260010184600184038151811061088b57fe5b60200260200101516040516108a091906148cc565b90815260200160405180910390205414156108c357600095505050505050610b3e565b816002018360018303815181106108d657fe5b60200260200101516040516108eb91906148cc565b9081526020016040518091039020915080600101905061086d565b50606060018351116109185783610931565b8260018451038151811061092857fe5b60200260200101515b90506000826001018260405161094791906148e3565b908152602001604051809103902054141561096a57600095505050505050610b3e565b610972613888565b826000016001846001018460405161098a91906148e3565b90815260200160405180910390205403815481106109a457fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610a565780601f10610a2b57610100808354040283529160200191610a56565b820191906000526020600020905b815481529060010190602001808311610a3957829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115610aa257fe5b6002811115610aad57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015610b2557602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411610aef5790505b5050505050815250509050806060015196505050505050505b919050565b600160009054906101000a900460ff16610b85576120006002819055506210000060038190555060018060006101000a81548160ff0219169083151502179055505b6000815111610bc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc090614ade565b60405180910390fd5b60003390506060610bd983612902565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015610cea57600082600101846001840381518110610c4357fe5b6020026020010151604051610c5891906148cc565b90815260200160405180910390205411610ca7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9e90614ade565b60405180910390fd5b81600201836001830381518110610cba57fe5b6020026020010151604051610ccf91906148cc565b90815260200160405180910390209150806001019050610c25565b50600254816000018054905010610d36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2d90614bfe565b60405180910390fd5b60606001835111610d475784610d60565b82600184510381518110610d5757fe5b60200260200101515b905060008260010182604051610d7691906148e3565b90815260200160405180910390205414610dc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbc90614c3e565b60405180910390fd5b610dce81612ee8565b610e0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0490614afe565b60405180910390fd5b6000610e198587612fc9565b905080610e5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e529061499e565b60405180910390fd5b610e63613888565b82816000018190525060008160200190151590811515815250508360000181908060018154018082558091505090600182039060005260206000209060050201600090919290919091506000820151816000019080519060200190610ec99291906138c4565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff02191690836002811115610f1857fe5b02179055506080820151816004019080519060200190610f39929190613944565b5050505083600001805490508460010184604051610f5791906148e3565b90815260200160405180910390208190555050505050505050565b610f7a61302d565b73ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161480610fdf57503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614155b61101e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101590614a5e565b60405180910390fd5b80600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411156110a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109790614b3e565b60405180910390fd5b600054600754820111156110e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e0906149be565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460076000828254039250508190555080600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550806007600082825401925050819055505050565b60008054905090565b600033905060006111aa82866130c6565b9050600160028111156111b957fe5b8160030160009054906101000a900460ff1660028111156111d657fe5b14611216576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120d90614c1e565b60405180910390fd5b6000600354858161122357fe5b061480156112345750806002015484105b611273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126a9061497e565b60405180910390fd5b600354848260020154031080156112905750838160020154038351145b8061129d57506003548351145b6112dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d390614a1e565b60405180910390fd5b600015158160040160035486816112ef57fe5b04815481106112fa57fe5b90600052602060002090602091828204019190069054906101000a900460ff1615151461135c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611353906149fe565b60405180910390fd5b600061136a838787876132c5565b9050806113ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a390614b1e565b60405180910390fd5b60018260040160035487816113bd57fe5b04815481106113c857fe5b90600052602060002090602091828204019190066101000a81548160ff021916908315150217905550505050505050565b611401613a40565b6000606061140e86612b66565b9150915061141a613888565b61142483836130c6565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156114c85780601f1061149d576101008083540402835291602001916114c8565b820191906000526020600020905b8154815290600101906020018083116114ab57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561151457fe5b600281111561151f57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561159757602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116115615790505b50505050508152505090506002808111156115ae57fe5b816060015160028111156115be57fe5b146115fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f590614c9e565b60405180910390fd5b60035485111580156116105750600085115b61164f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164690614a1e565b60405180910390fd5b80604001518587011115611698576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168f9061497e565b60405180910390fd5b60006116a684848989613376565b8096508192505050806116ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e590614b9e565b60405180910390fd5b505050509392505050565b6000339050600061170a82846130c6565b90506001600281111561171957fe5b8160030160009054906101000a900460ff16600281111561173657fe5b14611776576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176d90614c1e565b60405180910390fd5b60006001905060008260040180549050905060008090505b818110156117e157600015158460040182815481106117a957fe5b90600052602060002090602091828204019190069054906101000a900460ff16151514156117d657600092505b80600101905061178e565b5081611822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181990614b7e565b60405180910390fd5b60028360030160006101000a81548160ff0219169083600281111561184357fe5b021790555060006118548587613409565b905080611896576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188d906149de565b60405180910390fd5b505050505050565b6060600060606118ad84612b66565b9150915060606118bc82612902565b90506000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008090505b82518110156119c65760008260010184838151811061192257fe5b602002602001015160405161193791906148cc565b90815260200160405180910390205411611986576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197d90614ade565b60405180910390fd5b8160020183828151811061199657fe5b60200260200101516040516119ab91906148cc565b90815260200160405180910390209150806001019050611907565b5080600001805480602002602001604051908101604052809291908181526020016000905b82821015611b8e57838290600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611aa75780601f10611a7c57610100808354040283529160200191611aa7565b820191906000526020600020905b815481529060010190602001808311611a8a57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115611af357fe5b6002811115611afe57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015611b7657602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411611b405790505b505050505081525050815260200190600101906119eb565b50505050945050505050919050565b600160009054906101000a900460ff16611bdf576120006002819055506210000060038190555060018060006101000a81548160ff0219169083151502179055505b60003390506305f5e100821115611c2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2290614bde565b60405180910390fd5b6060611c3684612902565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015611d4757600082600101846001840381518110611ca057fe5b6020026020010151604051611cb591906148cc565b90815260200160405180910390205411611d04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cfb90614ade565b60405180910390fd5b81600201836001830381518110611d1757fe5b6020026020010151604051611d2c91906148cc565b90815260200160405180910390209150806001019050611c82565b5060606001835111611d595785611d72565b82600184510381518110611d6957fe5b60200260200101515b905060008260010182604051611d8891906148e3565b90815260200160405180910390205414611dd7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dce90614c3e565b60405180910390fd5b611de081612ee8565b611e1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1690614bbe565b60405180910390fd5b6000611e2c85888861346d565b905080611e6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6590614c7e565b60405180910390fd5b6060600354600160035489010381611e8257fe5b04604051908082528060200260200182016040528015611eb15781602001602082028038833980820191505090505b509050836000016040518060a0016040528085815260200160011515815260200189815260200160016002811115611ee557fe5b815260200183815250908060018154018082558091505090600182039060005260206000209060050201600090919290919091506000820151816000019080519060200190611f359291906138c4565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff02191690836002811115611f8457fe5b02179055506080820151816004019080519060200190611fa5929190613944565b5050505083600001805490508460010184604051611fc391906148e3565b90815260200160405180910390208190555086600560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505050505050505050565b6000339050612039613888565b61204382846130c6565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156120e75780601f106120bc576101008083540402835291602001916120e7565b820191906000526020600020905b8154815290600101906020018083116120ca57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561213357fe5b600281111561213e57fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156121b657602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116121805790505b5050505050815250509050600060028111156121ce57fe5b816060015160028111156121de57fe5b141561221f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221690614a3e565b60405180910390fd5b600061222b83856134da565b90508061226d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226490614a9e565b60405180910390fd5b606061227885612902565b90506000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b825181101561231057816002018360018303815181106122e057fe5b60200260200101516040516122f591906148cc565b908152602001604051809103902091508060010190506122c4565b506000600182600101866000015160405161232b91906148cc565b908152602001604051809103902054039050612345613888565b8260000160018460000180549050038154811061235e57fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156124105780601f106123e557610100808354040283529160200191612410565b820191906000526020600020905b8154815290600101906020018083116123f357829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561245c57fe5b600281111561246757fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156124df57602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116124a95790505b5050505050815250509050808360000183815481106124fa57fe5b906000526020600020906005020160008201518160000190805190602001906125249291906138c4565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561257357fe5b02179055506080820151816004019080519060200190612594929190613944565b50905050826000018054809190600190036125af91906139ea565b508260010186600001516040516125c691906148cc565b9081526020016040518091039020548360010182600001516040516125eb91906148cc565b908152602001604051809103902081905550600083600101876000015160405161261591906148cc565b9081526020016040518091039020819055508560400151600560008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505050505050505050565b600080606061269084612b66565b9150915061269c613888565b6126a683836130c6565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561274a5780601f1061271f5761010080835404028352916020019161274a565b820191906000526020600020905b81548152906001019060200180831161272d57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561279657fe5b60028111156127a157fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561281957602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116127e35790505b50505050508152505090506001600281111561283157fe5b8160600151600281111561284157fe5b1480612866575060028081111561285457fe5b8160600151600281111561286457fe5b145b6128a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161289c90614c1e565b60405180910390fd5b60006128b1848461353e565b8096508192505050806128f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128f090614c5e565b60405180910390fd5b50505050919050565b606061290c613a65565b612915836135a7565b905061291f613a65565b61295d6040518060400160405280600181526020017f2f000000000000000000000000000000000000000000000000000000000000008152506135a7565b90506060600161297683856135d590919063ffffffff16565b016040519080825280602002602001820160405280156129aa57816020015b60608152602001906001900390816129955790505b50905060008090505b81518110156129fb576129d76129d2848661364a90919063ffffffff16565b613664565b8282815181106129e357fe5b602002602001018190525080806001019150506129b3565b50600081600183510381518110612a0e57fe5b6020026020010151511415612a795780600182510381518110612a2d57fe5b6020026020010160608152506001815103604051908082528060200260200182016040528015612a7157816020015b6060815260200190600190039081612a5c5790505b509350612ab2565b8051604051908082528060200260200182016040528015612aae57816020015b6060815260200190600190039081612a995790505b5093505b60008090505b8451811015612af957818181518110612acd57fe5b6020026020010151858281518110612ae157fe5b60200260200101819052508080600101915050612ab8565b50505050919050565b60008060016020601f85510181612b1557fe5b040190506040518481526020810160005b83811015612b47578060200286015181602002830152806001019050612b26565b50602082602085026040018460006010600019f1935050505092915050565b6000606060006028905080845111612bb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612baa90614abe565b60405180910390fd5b6060816040519080825280601f01601f191660200182016040528015612be85781602001600182028038833980820191505090505b50905060008090505b82811015612c5857858181518110612c0557fe5b602001015160f81c60f81b828281518110612c1c57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050612bf1565b50600080905060008090505b83811015612d87576000838281518110612c7a57fe5b602001015160f81c60f81b60f81c60ff16905060308110158015612c9f575060398111155b80612cb8575060418110158015612cb75750605a8111155b5b80612cd1575060618110158015612cd0575060668111155b5b612d10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d0790614abe565b60405180910390fd5b60308110158015612d22575060398111155b15612d335760308103601084020192505b60418110158015612d455750605a8111155b15612d565760378103601084020192505b60618110158015612d68575060668111155b15612d795760578103601084020192505b508080600101915050612c64565b508094507f2f00000000000000000000000000000000000000000000000000000000000000868481518110612db857fe5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612e25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e1c90614abe565b60405180910390fd5b6000600184885103039050806040519080825280601f01601f191660200182016040528015612e635781602001600182028038833980820191505090505b50945060008090505b81811015612ede5760008860018784010181518110612e8757fe5b602001015160f81c60f81b905080878381518110612ea157fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350508080600101915050612e6c565b5050505050915091565b6000604051602001612ef99061490f565b6040516020818303038152906040528051906020012082604051602001612f2091906148e3565b604051602081830303815290604052805190602001201480612f8b5750604051602001612f4c906148fa565b6040516020818303038152906040528051906020012082604051602001612f7391906148e3565b60405160208183030381529060405280519060200120145b80612f97575060008251145b15612fa55760009050612fc4565b60008251905060ff811115612fbe576000915050612fc4565b60019150505b919050565b60008060016020601f85510181612fdc57fe5b040190506040518481526020810160005b8381101561300e578060200286015181602002830152806001019050612fed565b5060208260208502604001846000600f600019f1935050505092915050565b600073d2001000000000000000000000000000000000d273ffffffffffffffffffffffffffffffffffffffff166383e781fe6040518163ffffffff1660e01b815260040160206040518083038186803b15801561308957600080fd5b505afa15801561309d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506130c19190810190613c9a565b905090565b600060606130d383612902565b90506000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b82518110156131e45760008260010184600184038151811061313d57fe5b602002602001015160405161315291906148cc565b908152602001604051809103902054116131a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161319890614ade565b60405180910390fd5b816002018360018303815181106131b457fe5b60200260200101516040516131c991906148cc565b9081526020016040518091039020915080600101905061311f565b50606060018351116131f6578461320f565b8260018451038151811061320657fe5b60200260200101515b90506000826001018260405161322591906148e3565b90815260200160405180910390205411613274576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161326b90614ade565b60405180910390fd5b6000826000016001846001018460405161328e91906148e3565b90815260200160405180910390205403815481106132a857fe5b906000526020600020906005020190508094505050505092915050565b60008060016020601f855101816132d857fe5b04019050600060016020601f885101816132ee57fe5b040190506040518781526020810160005b838110156133205780602002890151816020028301528060010190506132ff565b50868360200282015260005b84811015613352578060200287015181856001010160200283015280600101905061332c565b50602082848601602002606001846000600c600019f1945050505050949350505050565b6000613380613a40565b600060016020601f8851018161339257fe5b0401905060006020601f8601816133a557fe5b0490506040518881526020810160005b848110156133d657806020028a0151816020028301528060010190506133b5565b5083602002810188815287816020015283602002868660030160200285600a600019fa9650505050505094509492505050565b60008060016020601f8551018161341c57fe5b040190506040518481526020810160005b8381101561344e57806020028601518160200283015280600101905061342d565b50602082602085026040018460006011600019f1935050505092915050565b60008060016020601f8651018161348057fe5b040190506040518581526020810160005b838110156134b2578060200287015181602002830152806001019050613491565b50846020840282015260208260208502604001846000600b600019f193505050509392505050565b60008060016020601f855101816134ed57fe5b040190506040518481526020810160005b8381101561351f5780602002860151816020028301528060010190506134fe565b5060208260208502604001846000600e600019f1935050505092915050565b600080600060016020601f8651018161355357fe5b040190506040518581526020810160005b83811015613585578060200287015181602002830152806001019050613564565b506020826020850260200184600d600019fa9450815193505050509250929050565b6135af613a65565b600060208301905060405180604001604052808451815260200182815250915050919050565b60008082600001516135f985600001518660200151866000015187602001516136c6565b0190505b83600001518460200151018111613643578180600101925050826000015161363b8560200151830386600001510383866000015187602001516136c6565b0190506135fd565b5092915050565b613652613a65565b61365d8383836137a1565b5092915050565b60608082600001516040519080825280601f01601f19166020018201604052801561369e5781602001600182028038833980820191505090505b50905060006020820190506136bc818560200151866000015161383f565b8192505050919050565b6000808490506000868511613791576020851161374b57600060018660200360080260020a031960001b905060008186511690506000878a8a0103905060008386511690505b82811461373d5781861061372a578a8a019650505050505050613799565b858060010196505083865116905061370c565b859650505050505050613799565b60008585209050600091505b858803821161378f57600086842090508082141561377b5783945050505050613799565b600184019350508180600101925050613757565b505b868601925050505b949350505050565b6137a9613a65565b60006137c785600001518660200151866000015187602001516136c6565b90508460200151836020018181525050846020015181038360000181815250508460000151856020015101811415613809576000856000018181525050613834565b8360000151836000015101856000018181510391508181525050836000015181018560200181815250505b829150509392505050565b5b602081106138635781518352602083019250602082019150602081039050613840565b60006001826020036101000a0390508019835116818551168181178652505050505050565b6040518060a001604052806060815260200160001515815260200160008152602001600060028111156138b757fe5b8152602001606081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061390557805160ff1916838001178555613933565b82800160010185558215613933579182015b82811115613932578251825591602001919060010190613917565b5b5090506139409190613a7f565b5090565b82805482825590600052602060002090601f016020900481019282156139d95791602002820160005b838211156139aa57835183826101000a81548160ff021916908315150217905550926020019260010160208160000104928301926001030261396d565b80156139d75782816101000a81549060ff02191690556001016020816000010492830192600103026139aa565b505b5090506139e69190613aa4565b5090565b815481835581811115613a1757600502816005028360005260206000209182019101613a169190613ad4565b5b505050565b5080546000825560050290600052602060002090810190613a3d9190613ad4565b50565b6040518062100000016040528061800090602082028038833980820191505090505090565b604051806040016040528060008152602001600081525090565b613aa191905b80821115613a9d576000816000905550600101613a85565b5090565b90565b613ad191905b80821115613acd57600081816101000a81549060ff021916905550600101613aaa565b5090565b90565b613b4091905b80821115613b3c5760008082016000613af39190613b43565b6001820160006101000a81549060ff021916905560028201600090556003820160006101000a81549060ff0219169055600482016000613b339190613b8b565b50600501613ada565b5090565b90565b50805460018160011615610100020316600290046000825580601f10613b695750613b88565b601f016020900490600052602060002090810190613b879190613a7f565b5b50565b50805460008255601f016020900490600052602060002090810190613bb09190613a7f565b50565b600081359050613bc281614f18565b92915050565b600081519050613bd781614f18565b92915050565b600082601f830112613bee57600080fd5b8135613c01613bfc82614d06565b614cd9565b91508082526020830160208301858383011115613c1d57600080fd5b613c28838284614eb8565b50505092915050565b600082601f830112613c4257600080fd5b8135613c55613c5082614d32565b614cd9565b91508082526020830160208301858383011115613c7157600080fd5b613c7c838284614eb8565b50505092915050565b600081359050613c9481614f2f565b92915050565b600060208284031215613cac57600080fd5b6000613cba84828501613bc8565b91505092915050565b60008060408385031215613cd657600080fd5b6000613ce485828601613bb3565b9250506020613cf585828601613c85565b9150509250929050565b600060208284031215613d1157600080fd5b600082013567ffffffffffffffff811115613d2b57600080fd5b613d3784828501613c31565b91505092915050565b60008060408385031215613d5357600080fd5b600083013567ffffffffffffffff811115613d6d57600080fd5b613d7985828601613c31565b9250506020613d8a85828601613c85565b9150509250929050565b600080600060608486031215613da957600080fd5b600084013567ffffffffffffffff811115613dc357600080fd5b613dcf86828701613c31565b9350506020613de086828701613c85565b925050604084013567ffffffffffffffff811115613dfd57600080fd5b613e0986828701613bdd565b9150509250925092565b600080600060608486031215613e2857600080fd5b600084013567ffffffffffffffff811115613e4257600080fd5b613e4e86828701613c31565b9350506020613e5f86828701613c85565b9250506040613e7086828701613c85565b9150509250925092565b6000613e868383613fe8565b60208301905092915050565b6000613e9e8383613ff7565b60208301905092915050565b6000613eb68383614831565b905092915050565b6000613ec982614d88565b613ed38185614de7565b9350613ede83614d5e565b8060005b83811015613f0f578151613ef68882613e7a565b9750613f0183614dc0565b925050600181019050613ee2565b5085935050505092915050565b613f2581614d93565b613f2f8184614df8565b9250613f3a82614d6e565b8060005b83811015613f6b578151613f528782613e92565b9650613f5d83614dcd565b925050600181019050613f3e565b505050505050565b6000613f7e82614d9f565b613f888185614e03565b935083602082028501613f9a85614d78565b8060005b85811015613fd65784840389528151613fb78582613eaa565b9450613fc283614dda565b925060208a01995050600181019050613f9e565b50829750879550505050505092915050565b613ff181614e53565b82525050565b61400081614e5f565b82525050565b61400f81614ea6565b82525050565b61401e81614ea6565b82525050565b600061402f82614db5565b6140398185614e36565b9350614049818560208601614ec7565b80840191505092915050565b600061406082614daa565b61406a8185614e14565b935061407a818560208601614ec7565b61408381614efa565b840191505092915050565b600061409982614daa565b6140a38185614e36565b93506140b3818560208601614ec7565b80840191505092915050565b60006140cc601883614e25565b91507f496e636f7272656374206368756e6b20706f736974696f6e00000000000000006000830152602082019050919050565b600061410c601583614e25565b91507f4469726563746f7279206e6f74206372656174656400000000000000000000006000830152602082019050919050565b600061414c602483614e25565b91507f4e6f7420656e6f756768206d656d6f727920696e207468652046696c6573746f60008301527f72616765000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006141b2601b83614e25565b91507f48617368206861736e2774206265656e2063616c63756c6174656400000000006000830152602082019050919050565b60006141f2601983614e25565b91507f4368756e6b20697320616c72656164792075706c6f61646564000000000000006000830152602082019050919050565b6000614232601683614e25565b91507f496e636f7272656374206368756e6b206c656e677468000000000000000000006000830152602082019050919050565b6000614272600f83614e25565b91507f46696c65206e6f742065786973747300000000000000000000000000000000006000830152602082019050919050565b60006142b2600e83614e25565b91507f496e76616c69642073656e6465720000000000000000000000000000000000006000830152602082019050919050565b60006142f2601883614e25565b91507f4469726563746f7279206973206e6f742064656c6574656400000000000000006000830152602082019050919050565b6000614332601083614e25565b91507f46696c65206e6f742064656c65746564000000000000000000000000000000006000830152602082019050919050565b6000614372601383614e25565b91507f496e76616c69642073746f7261676550617468000000000000000000000000006000830152602082019050919050565b60006143b2600c83614e25565b91507f496e76616c6964207061746800000000000000000000000000000000000000006000830152602082019050919050565b60006143f2600183614e36565b91507f2e000000000000000000000000000000000000000000000000000000000000006000830152600182019050919050565b6000614432601683614e25565b91507f496e76616c6964206469726563746f7279206e616d65000000000000000000006000830152602082019050919050565b6000614472601583614e25565b91507f4368756e6b207761736e27742075706c6f6164656400000000000000000000006000830152602082019050919050565b60006144b2602683614e25565b91507f436f756c64206e6f742072657365727665206c657373207468616e207573656460008301527f20737061636500000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614518601683614e25565b91507f4469726563746f7279206973206e6f7420656d707479000000000000000000006000830152602082019050919050565b6000614558602383614e25565b91507f46696c65206861736e2774206265656e2075706c6f6164656420636f7272656360008301527f746c7900000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006145be601183614e25565b91507f4368756e6b207761736e277420726561640000000000000000000000000000006000830152602082019050919050565b60006145fe601883614e25565b91507f46696c656e616d652073686f756c64206265203c2032353600000000000000006000830152602082019050919050565b600061463e601f83614e25565b91507f46696c652073686f756c64206265206c657373207468616e20313030204d42006000830152602082019050919050565b600061467e600283614e36565b91507f2e2e0000000000000000000000000000000000000000000000000000000000006000830152600282019050919050565b60006146be601183614e25565b91507f4469726563746f72792069732066756c6c0000000000000000000000000000006000830152602082019050919050565b60006146fe600e83614e25565b91507f46696c65206e6f7420666f756e640000000000000000000000000000000000006000830152602082019050919050565b600061473e601883614e25565b91507f46696c65206f72206469726563746f72792065786973747300000000000000006000830152602082019050919050565b600061477e601883614e25565b91507f45564d206572726f7220696e2067657446696c6553697a6500000000000000006000830152602082019050919050565b60006147be601083614e25565b91507f46696c65206e6f742063726561746564000000000000000000000000000000006000830152602082019050919050565b60006147fe601983614e25565b91507f46696c65206861736e2774206265656e2075706c6f61646564000000000000006000830152602082019050919050565b600060a083016000830151848203600086015261484e8282614055565b91505060208301516148636020860182613fe8565b50604083015161487660408601826148ae565b5060608301516148896060860182614006565b50608083015184820360808601526148a18282613ebe565b9150508091505092915050565b6148b781614e9c565b82525050565b6148c681614e9c565b82525050565b60006148d8828461408e565b915081905092915050565b60006148ef8284614024565b915081905092915050565b6000614905826143e5565b9150819050919050565b600061491a82614671565b9150819050919050565b6000621000008201905061493b6000830184613f1c565b92915050565b6000602082019050818103600083015261495b8184613f73565b905092915050565b60006020820190506149786000830184614015565b92915050565b60006020820190508181036000830152614997816140bf565b9050919050565b600060208201905081810360008301526149b7816140ff565b9050919050565b600060208201905081810360008301526149d78161413f565b9050919050565b600060208201905081810360008301526149f7816141a5565b9050919050565b60006020820190508181036000830152614a17816141e5565b9050919050565b60006020820190508181036000830152614a3781614225565b9050919050565b60006020820190508181036000830152614a5781614265565b9050919050565b60006020820190508181036000830152614a77816142a5565b9050919050565b60006020820190508181036000830152614a97816142e5565b9050919050565b60006020820190508181036000830152614ab781614325565b9050919050565b60006020820190508181036000830152614ad781614365565b9050919050565b60006020820190508181036000830152614af7816143a5565b9050919050565b60006020820190508181036000830152614b1781614425565b9050919050565b60006020820190508181036000830152614b3781614465565b9050919050565b60006020820190508181036000830152614b57816144a5565b9050919050565b60006020820190508181036000830152614b778161450b565b9050919050565b60006020820190508181036000830152614b978161454b565b9050919050565b60006020820190508181036000830152614bb7816145b1565b9050919050565b60006020820190508181036000830152614bd7816145f1565b9050919050565b60006020820190508181036000830152614bf781614631565b9050919050565b60006020820190508181036000830152614c17816146b1565b9050919050565b60006020820190508181036000830152614c37816146f1565b9050919050565b60006020820190508181036000830152614c5781614731565b9050919050565b60006020820190508181036000830152614c7781614771565b9050919050565b60006020820190508181036000830152614c97816147b1565b9050919050565b60006020820190508181036000830152614cb7816147f1565b9050919050565b6000602082019050614cd360008301846148bd565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614cfc57600080fd5b8060405250919050565b600067ffffffffffffffff821115614d1d57600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614d4957600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050919050565b6000819050602082019050919050565b600081519050919050565b60006180009050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614e4c82614e7c565b9050919050565b60008115159050919050565b6000819050919050565b6000819050614e7782614f0b565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000614eb182614e69565b9050919050565b82818337600083830152505050565b60005b83811015614ee5578082015181840152602081019050614eca565b83811115614ef4576000848401525b50505050565b6000601f19601f8301169050919050565b60038110614f1557fe5b50565b614f2181614e41565b8114614f2c57600080fd5b50565b614f3881614e9c565b8114614f4357600080fd5b5056fea365627a7a723158202ae226b25ad72f9cff2d74c6dc7bcfb78530ab1d2438f48a8dab67499b37a8e56c6578706572696d656e74616cf564736f6c634300050d0040", + "storage": { + "0x0": "2868903936" + }, + "nonce": "0" + }, + "0xD1001000000000000000000000000000000000D1": { + "balance": "0", + "code": "0x608060405260043610603f576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680636d4ce63c146044575b600080fd5b348015604f57600080fd5b506056606c565b6040518082815260200191505060405180910390f35b60006001600060048152602001908152602001600020600060098152602001908152602001600020600101549050905600a165627a7a723058208fe64219becc0bcab1c8f854f05804ebb6bb555da5dbc49e8f7021c31d77636a0029", + "storage": { + "0x3b4da637a1b0e6dbfc6795f2b7f0cb29eebb91b3af4dcc335e1633f6b4af810b": "1111" + }, + "nonce": "0" + }, + "0xca4409573a5129a72edf85d6c51e26760fc9c903": { "balance": "100000000000000000000000" }, + "0x62d8b22c1d71577829b2fee20a5c3fff43aed0ec": { "balance": "100000000000000000000000" }, + "0x1C9abe4ff0CcECa40fc404c74AB7d4923fEF8901": { "balance": "100000000000000000000000" }, + "0xf9817fB82fc767aA9A4A97a1901676244b88ce0E": { "balance": "100000000000000000000000" }, + "0x7a89A6c323FaCfF0ADeF7EEF3e491aD4044d0592": { "balance": "100000000000000000000000" }, + "0x81dcbd71da28fafb9ca99ff5a22bfcebba84fecc": { "balance": "100000000000000000000000" }, + "0xd2c5b39B4e735C17612Bb5a08FD024ccc5dBCb23": { "balance": "100000000000000000000000" }, + "0xD3001000000000000000000000000000000000D3": { + "balance": "0", + "nonce": "0", + "code": "0x60806040526004361061007b5760003560e01c80639623609d1161004e5780639623609d1461013657806399a88ec4146101f5578063f2fde38b14610230578063f3b7dead146102635761007b565b8063204e1c7a14610080578063715018a6146100cf5780637eff275e146100e65780638da5cb5b14610121575b600080fd5b34801561008c57600080fd5b506100b3600480360360208110156100a357600080fd5b50356001600160a01b0316610296565b604080516001600160a01b039092168252519081900360200190f35b3480156100db57600080fd5b506100e4610328565b005b3480156100f257600080fd5b506100e46004803603604081101561010957600080fd5b506001600160a01b03813581169160200135166103ca565b34801561012d57600080fd5b506100b3610496565b6100e46004803603606081101561014c57600080fd5b6001600160a01b03823581169260208101359091169181019060608101604082013564010000000081111561018057600080fd5b82018360208201111561019257600080fd5b803590602001918460018302840111640100000000831117156101b457600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506104a5945050505050565b34801561020157600080fd5b506100e46004803603604081101561021857600080fd5b506001600160a01b03813581169160200135166105dd565b34801561023c57600080fd5b506100e46004803603602081101561025357600080fd5b50356001600160a01b031661068d565b34801561026f57600080fd5b506100b36004803603602081101561028657600080fd5b50356001600160a01b0316610785565b6000806060836001600160a01b03166040518080635c60da1b60e01b8152506004019050600060405180830381855afa9150503d80600081146102f5576040519150601f19603f3d011682016040523d82523d6000602084013e6102fa565b606091505b50915091508161030957600080fd5b80806020019051602081101561031e57600080fd5b5051949350505050565b6103306107e4565b6000546001600160a01b03908116911614610380576040805162461bcd60e51b8152602060048201819052602482015260008051602061080f833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6103d26107e4565b6000546001600160a01b03908116911614610422576040805162461bcd60e51b8152602060048201819052602482015260008051602061080f833981519152604482015290519081900360640190fd5b816001600160a01b0316638f283970826040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050600060405180830381600087803b15801561047a57600080fd5b505af115801561048e573d6000803e3d6000fd5b505050505050565b6000546001600160a01b031690565b6104ad6107e4565b6000546001600160a01b039081169116146104fd576040805162461bcd60e51b8152602060048201819052602482015260008051602061080f833981519152604482015290519081900360640190fd5b826001600160a01b0316634f1ef2863484846040518463ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561057357818101518382015260200161055b565b50505050905090810190601f1680156105a05780820380516001836020036101000a031916815260200191505b5093505050506000604051808303818588803b1580156105bf57600080fd5b505af11580156105d3573d6000803e3d6000fd5b5050505050505050565b6105e56107e4565b6000546001600160a01b03908116911614610635576040805162461bcd60e51b8152602060048201819052602482015260008051602061080f833981519152604482015290519081900360640190fd5b816001600160a01b0316633659cfe6826040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050600060405180830381600087803b15801561047a57600080fd5b6106956107e4565b6000546001600160a01b039081169116146106e5576040805162461bcd60e51b8152602060048201819052602482015260008051602061080f833981519152604482015290519081900360640190fd5b6001600160a01b03811661072a5760405162461bcd60e51b81526004018080602001828103825260268152602001806107e96026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000806060836001600160a01b031660405180806303e1469160e61b8152506004019050600060405180830381855afa9150503d80600081146102f5576040519150601f19603f3d011682016040523d82523d6000602084013e6102fa565b339056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a26469706673582212201d968ac32bef5562c6b4f1bd5d2f2a74c14d07ce008ca6fdc5a3bd0f5fc265f564736f6c63430006080033", + "storage": { + "0x0": "0x907cd0881E50d359bb9Fd120B1A5A143b1C97De6" + } + }, + "0xD3002000000000000000000000000000000000D3": { + "balance": "0", + "nonce": "0", + "code": "0x60806040526004361061004e5760003560e01c80633659cfe6146100655780634f1ef286146100985780635c60da1b146101185780638f28397014610149578063f851a4401461017c5761005d565b3661005d5761005b610191565b005b61005b610191565b34801561007157600080fd5b5061005b6004803603602081101561008857600080fd5b50356001600160a01b03166101ab565b61005b600480360360408110156100ae57600080fd5b6001600160a01b0382351691908101906040810160208201356401000000008111156100d957600080fd5b8201836020820111156100eb57600080fd5b8035906020019184600183028401116401000000008311171561010d57600080fd5b5090925090506101e5565b34801561012457600080fd5b5061012d610292565b604080516001600160a01b039092168252519081900360200190f35b34801561015557600080fd5b5061005b6004803603602081101561016c57600080fd5b50356001600160a01b03166102cf565b34801561018857600080fd5b5061012d610389565b6101996103ba565b6101a96101a461041a565b61043f565b565b6101b3610463565b6001600160a01b0316336001600160a01b031614156101da576101d581610488565b6101e2565b6101e2610191565b50565b6101ed610463565b6001600160a01b0316336001600160a01b031614156102855761020f83610488565b6000836001600160a01b031683836040518083838082843760405192019450600093509091505080830381855af49150503d806000811461026c576040519150601f19603f3d011682016040523d82523d6000602084013e610271565b606091505b505090508061027f57600080fd5b5061028d565b61028d610191565b505050565b600061029c610463565b6001600160a01b0316336001600160a01b031614156102c4576102bd61041a565b90506102cc565b6102cc610191565b90565b6102d7610463565b6001600160a01b0316336001600160a01b031614156101da576001600160a01b0381166103355760405162461bcd60e51b81526004018080602001828103825260368152602001806105876036913960400191505060405180910390fd5b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f61035e610463565b604080516001600160a01b03928316815291841660208301528051918290030190a16101d5816104c8565b6000610393610463565b6001600160a01b0316336001600160a01b031614156102c4576102bd610463565b3b151590565b6103c2610463565b6001600160a01b0316336001600160a01b031614156104125760405162461bcd60e51b81526004018080602001828103825260328152602001806105556032913960400191505060405180910390fd5b6101a96101a9565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b3660008037600080366000845af43d6000803e80801561045e573d6000f35b3d6000fd5b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b610491816104ec565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610355565b6104f5816103b4565b6105305760405162461bcd60e51b815260040180806020018281038252603b8152602001806105bd603b913960400191505060405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5556fe43616e6e6f742063616c6c2066616c6c6261636b2066756e6374696f6e2066726f6d207468652070726f78792061646d696e43616e6e6f74206368616e6765207468652061646d696e206f6620612070726f787920746f20746865207a65726f206164647265737343616e6e6f742073657420612070726f787920696d706c656d656e746174696f6e20746f2061206e6f6e2d636f6e74726163742061646472657373a26469706673582212206e221e2a3547bd97244b05ed46430b1b078ba097cb2a4e25ec3d79cf9ac9f02c64736f6c63430006080033", + "storage": { + "0x0": "1000000", + "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "0xD3001000000000000000000000000000000000D3", + "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0xD3003000000000000000000000000000000000D3" + } + }, + "0xD3003000000000000000000000000000000000D3": { + "balance": "0", + "nonce": "0", + "code": "0x608060405234801561001057600080fd5b50600436106100b45760003560e01c806379210e8e1161007157806379210e8e1461017757806381a8235a146101a757806385aeeb17146101c35780639a9a5593146101f3578063a99100541461020f578063b57321221461022b576100b4565b806307c6e7d3146100b9578063122f4fba146100d55780631c6ec7a9146101055780631cfe4e3b14610121578063373dedb41461013d57806361e46db51461015b575b600080fd5b6100d360048036036100ce9190810190613e94565b61025b565b005b6100ef60048036036100ea9190810190613e94565b610862565b6040516100fc9190614b38565b60405180910390f35b61011f600480360361011a9190810190613e94565b610ba1565b005b61013b60048036036101369190810190613e58565b610fce565b005b6101456111ec565b6040516101529190614eb3565b60405180910390f35b61017560048036036101709190810190613f29565b6111f6565b005b610191600480360361018c9190810190613fa8565b611456565b60405161019e9190614af9565b60405180910390f35b6101c160048036036101bc9190810190613e94565b611756565b005b6101dd60048036036101d89190810190613e94565b6118fb565b6040516101ea9190614b16565b60405180910390f35b61020d60048036036102089190810190613ed5565b611bfa565b005b61022960048036036102249190810190613e94565b612195565b005b61024560048036036102409190810190613e94565b612849565b6040516102529190614eb3565b60405180910390f35b6000339050606061026b83612ac9565b90506000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b825181101561037c576000826001018460018403815181106102d557fe5b60200260200101516040516102ea9190614aa1565b90815260200160405180910390205411610339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161033090614cb3565b60405180910390fd5b8160020183600183038151811061034c57fe5b60200260200101516040516103619190614aa1565b908152602001604051809103902091508060010190506102b7565b506060600183511161038e57846103a7565b8260018451038151811061039e57fe5b60200260200101515b9050600082600101826040516103bd9190614ab8565b9081526020016040518091039020541161040c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161040390614cb3565b60405180910390fd5b600082600201826040516104209190614ab8565b90815260200160405180910390206000018054905014610475576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161046c90614d33565b60405180910390fd5b60006104818587612cc9565b9050806104c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ba90614c53565b60405180910390fd5b6104cb613a4f565b836000016001856000018054905003815481106104e457fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156105965780601f1061056b57610100808354040283529160200191610596565b820191906000526020600020905b81548152906001019060200180831161057957829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff1660028111156105e257fe5b60028111156105ed57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561066557602002820191906000526020600020906000905b82829054906101000a900460ff1615158152602001906001019060208260000104928301926001038202915080841161062f5790505b50505050508152505090508084600001600186600101866040516106899190614ab8565b90815260200160405180910390205403815481106106a357fe5b906000526020600020906005020160008201518160000190805190602001906106cd929190613a8b565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561071c57fe5b0217905550608082015181600401908051906020019061073d929190613b0b565b5090505083600101836040516107539190614ab8565b9081526020016040518091039020548460010182600001516040516107789190614aa1565b9081526020016040518091039020819055506000846001018460405161079e9190614ab8565b908152602001604051809103902081905550836000018054806107bd57fe5b6001900381819060005260206000209060050201600080820160006107e29190613bb1565b6001820160006101000a81549060ff021916905560028201600090556003820160006101000a81549060ff02191690556004820160006108229190613bf9565b5050905583600201836040516108389190614ab8565b9081526020016040518091039020600080820160006108579190613c21565b505050505050505050565b600080606061087084612d2d565b91509150606061087f82612ac9565b90506000600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015610964576000826001018460018403815181106108e957fe5b60200260200101516040516108fe9190614aa1565b908152602001604051809103902054141561092157600095505050505050610b9c565b8160020183600183038151811061093457fe5b60200260200101516040516109499190614aa1565b908152602001604051809103902091508060010190506108cb565b5060606001835111610976578361098f565b8260018451038151811061098657fe5b60200260200101515b9050600082600101826040516109a59190614ab8565b90815260200160405180910390205414156109c857600095505050505050610b9c565b6109d0613a4f565b82600001600184600101846040516109e89190614ab8565b9081526020016040518091039020540381548110610a0257fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610ab45780601f10610a8957610100808354040283529160200191610ab4565b820191906000526020600020905b815481529060010190602001808311610a9757829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115610b0057fe5b6002811115610b0b57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015610b8357602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411610b4d5790505b5050505050815250509050806060015196505050505050505b919050565b600360009054906101000a900460ff16610be457612000600481905550621000006005819055506001600360006101000a81548160ff0219169083151502179055505b6000815111610c28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1f90614cb3565b60405180910390fd5b60003390506060610c3883612ac9565b90506000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015610d4957600082600101846001840381518110610ca257fe5b6020026020010151604051610cb79190614aa1565b90815260200160405180910390205411610d06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cfd90614cb3565b60405180910390fd5b81600201836001830381518110610d1957fe5b6020026020010151604051610d2e9190614aa1565b90815260200160405180910390209150806001019050610c84565b50600454816000018054905010610d95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8c90614dd3565b60405180910390fd5b60606001835111610da65784610dbf565b82600184510381518110610db657fe5b60200260200101515b905060008260010182604051610dd59190614ab8565b90815260200160405180910390205414610e24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1b90614e13565b60405180910390fd5b610e2d816130af565b610e6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6390614cd3565b60405180910390fd5b6000610e788587613190565b905080610eba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb190614b73565b60405180910390fd5b610ec2613a4f565b8281600001819052506000816020019015159081151581525050836000018190806001815401808255809150506001900390600052602060002090600502016000909190919091506000820151816000019080519060200190610f26929190613a8b565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff02191690836002811115610f7557fe5b02179055506080820151816004019080519060200190610f96929190613b0b565b50505083600001805490508460010184604051610fb39190614ab8565b90815260200160405180910390208190555050505050505050565b610fd66131f4565b73ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16148061103b57503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614155b61107a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107190614c33565b60405180910390fd5b80600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411156110fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f390614d13565b60405180910390fd5b60025460095482011115611145576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113c90614b93565b60405180910390fd5b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460096000828254039250508190555080600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550806009600082825401925050819055505050565b6000600254905090565b60003390506000611207828661328d565b90506001600281111561121657fe5b8160030160009054906101000a900460ff16600281111561123357fe5b14611273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126a90614df3565b60405180910390fd5b6000600554858161128057fe5b061480156112915750806002015484105b6112d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c790614b53565b60405180910390fd5b600554848260020154031080156112ed5750838160020154038351145b806112fa57506005548351145b611339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133090614bf3565b60405180910390fd5b6000151581600401600554868161134c57fe5b048154811061135757fe5b90600052602060002090602091828204019190069054906101000a900460ff161515146113b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b090614bd3565b60405180910390fd5b60006113c78387878761348c565b905080611409576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140090614cf3565b60405180910390fd5b600182600401600554878161141a57fe5b048154811061142557fe5b90600052602060002090602091828204019190066101000a81548160ff021916908315150217905550505050505050565b61145e613c45565b6000606061146b86612d2d565b91509150611477613a4f565b611481838361328d565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156115255780601f106114fa57610100808354040283529160200191611525565b820191906000526020600020905b81548152906001019060200180831161150857829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561157157fe5b600281111561157c57fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156115f457602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116115be5790505b505050505081525050905060028081111561160b57fe5b8160600151600281111561161b57fe5b1461165b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165290614e93565b60405180910390fd5b600554851115801561166d5750600085115b6116ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a390614bf3565b60405180910390fd5b806040015185870111156116f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ec90614b53565b60405180910390fd5b60006117038484898961353d565b80965081925050508061174b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174290614d73565b60405180910390fd5b505050509392505050565b60003390506000611767828461328d565b90506001600281111561177657fe5b8160030160009054906101000a900460ff16600281111561179357fe5b146117d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ca90614df3565b60405180910390fd5b60006001905060008260040180549050905060008090505b8181101561183e576000151584600401828154811061180657fe5b90600052602060002090602091828204019190069054906101000a900460ff161515141561183357600092505b8060010190506117eb565b508161187f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187690614d53565b60405180910390fd5b60028360030160006101000a81548160ff021916908360028111156118a057fe5b021790555060006118b185876135d0565b9050806118f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ea90614bb3565b60405180910390fd5b505050505050565b60606000606061190a84612d2d565b91509150606061191982612ac9565b90506000600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008090505b8251811015611a235760008260010184838151811061197f57fe5b60200260200101516040516119949190614aa1565b908152602001604051809103902054116119e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119da90614cb3565b60405180910390fd5b816002018382815181106119f357fe5b6020026020010151604051611a089190614aa1565b90815260200160405180910390209150806001019050611964565b5080600001805480602002602001604051908101604052809291908181526020016000905b82821015611beb57838290600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611b045780601f10611ad957610100808354040283529160200191611b04565b820191906000526020600020905b815481529060010190602001808311611ae757829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115611b5057fe5b6002811115611b5b57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015611bd357602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411611b9d5790505b50505050508152505081526020019060010190611a48565b50505050945050505050919050565b600360009054906101000a900460ff16611c3d57612000600481905550621000006005819055506001600360006101000a81548160ff0219169083151502179055505b60003390506305f5e100821115611c89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8090614db3565b60405180910390fd5b600660008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205483011115611d4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4390614e33565b60405180910390fd5b6060611d5784612ac9565b90506000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015611e6857600082600101846001840381518110611dc157fe5b6020026020010151604051611dd69190614aa1565b90815260200160405180910390205411611e25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1c90614cb3565b60405180910390fd5b81600201836001830381518110611e3857fe5b6020026020010151604051611e4d9190614aa1565b90815260200160405180910390209150806001019050611da3565b50600454816000018054905010611eb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eab90614dd3565b60405180910390fd5b60606001835111611ec55785611ede565b82600184510381518110611ed557fe5b60200260200101515b905060008260010182604051611ef49190614ab8565b90815260200160405180910390205414611f43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3a90614e13565b60405180910390fd5b611f4c816130af565b611f8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8290614d93565b60405180910390fd5b6000611f98858888613634565b905080611fda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd190614e73565b60405180910390fd5b6060600554600160055489010381611fee57fe5b0460405190808252806020026020018201604052801561201d5781602001602082028038833980820191505090505b509050836000016040518060a001604052808581526020016001151581526020018981526020016001600281111561205157fe5b8152602001838152509080600181540180825580915050600190039060005260206000209060050201600090919091909150600082015181600001908051906020019061209f929190613a8b565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff021916908360028111156120ee57fe5b0217905550608082015181600401908051906020019061210f929190613b0b565b5050508360000180549050846001018460405161212c9190614ab8565b90815260200160405180910390208190555086600760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505050505050505050565b60003390506121a2613a4f565b6121ac828461328d565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156122505780601f1061222557610100808354040283529160200191612250565b820191906000526020600020905b81548152906001019060200180831161223357829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561229c57fe5b60028111156122a757fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561231f57602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116122e95790505b50505050508152505090506000600281111561233757fe5b8160600151600281111561234757fe5b1415612388576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161237f90614c13565b60405180910390fd5b600061239483856136a1565b9050806123d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123cd90614c73565b60405180910390fd5b60606123e185612ac9565b90506000600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015612479578160020183600183038151811061244957fe5b602002602001015160405161245e9190614aa1565b9081526020016040518091039020915080600101905061242d565b50600060018260010186600001516040516124949190614aa1565b9081526020016040518091039020540390506124ae613a4f565b826000016001846000018054905003815481106124c757fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156125795780601f1061254e57610100808354040283529160200191612579565b820191906000526020600020905b81548152906001019060200180831161255c57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff1660028111156125c557fe5b60028111156125d057fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561264857602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116126125790505b50505050508152505090508083600001838154811061266357fe5b9060005260206000209060050201600082015181600001908051906020019061268d929190613a8b565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff021916908360028111156126dc57fe5b021790555060808201518160040190805190602001906126fd929190613b0b565b509050508260000180548061270e57fe5b6001900381819060005260206000209060050201600080820160006127339190613bb1565b6001820160006101000a81549060ff021916905560028201600090556003820160006101000a81549060ff02191690556004820160006127739190613bf9565b5050905582600101866000015160405161278d9190614aa1565b9081526020016040518091039020548360010182600001516040516127b29190614aa1565b90815260200160405180910390208190555060008360010187600001516040516127dc9190614aa1565b9081526020016040518091039020819055508560400151600760008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505050505050505050565b600080606061285784612d2d565b91509150612863613a4f565b61286d838361328d565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156129115780601f106128e657610100808354040283529160200191612911565b820191906000526020600020905b8154815290600101906020018083116128f457829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561295d57fe5b600281111561296857fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156129e057602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116129aa5790505b5050505050815250509050600160028111156129f857fe5b81606001516002811115612a0857fe5b1480612a2d5750600280811115612a1b57fe5b81606001516002811115612a2b57fe5b145b612a6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a6390614df3565b60405180910390fd5b6000612a788484613705565b809650819250505080612ac0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ab790614e53565b60405180910390fd5b50505050919050565b6060612ad3613c6a565b612adc8361376e565b9050612ae6613c6a565b612b246040518060400160405280600181526020017f2f0000000000000000000000000000000000000000000000000000000000000081525061376e565b905060606001612b3d838561379c90919063ffffffff16565b01604051908082528060200260200182016040528015612b7157816020015b6060815260200190600190039081612b5c5790505b50905060008090505b8151811015612bc257612b9e612b99848661381190919063ffffffff16565b61382b565b828281518110612baa57fe5b60200260200101819052508080600101915050612b7a565b50600081600183510381518110612bd557fe5b6020026020010151511415612c405780600182510381518110612bf457fe5b6020026020010160608152506001815103604051908082528060200260200182016040528015612c3857816020015b6060815260200190600190039081612c235790505b509350612c79565b8051604051908082528060200260200182016040528015612c7557816020015b6060815260200190600190039081612c605790505b5093505b60008090505b8451811015612cc057818181518110612c9457fe5b6020026020010151858281518110612ca857fe5b60200260200101819052508080600101915050612c7f565b50505050919050565b60008060016020601f85510181612cdc57fe5b040190506040518481526020810160005b83811015612d0e578060200286015181602002830152806001019050612ced565b50602082602085026040018460006010600019f1935050505092915050565b6000606060006028905080845111612d7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d7190614c93565b60405180910390fd5b6060816040519080825280601f01601f191660200182016040528015612daf5781602001600182028038833980820191505090505b50905060008090505b82811015612e1f57858181518110612dcc57fe5b602001015160f81c60f81b828281518110612de357fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050612db8565b50600080905060008090505b83811015612f4e576000838281518110612e4157fe5b602001015160f81c60f81b60f81c60ff16905060308110158015612e66575060398111155b80612e7f575060418110158015612e7e5750605a8111155b5b80612e98575060618110158015612e97575060668111155b5b612ed7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ece90614c93565b60405180910390fd5b60308110158015612ee9575060398111155b15612efa5760308103601084020192505b60418110158015612f0c5750605a8111155b15612f1d5760378103601084020192505b60618110158015612f2f575060668111155b15612f405760578103601084020192505b508080600101915050612e2b565b508094507f2f00000000000000000000000000000000000000000000000000000000000000868481518110612f7f57fe5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612fec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fe390614c93565b60405180910390fd5b6000600184885103039050806040519080825280601f01601f19166020018201604052801561302a5781602001600182028038833980820191505090505b50945060008090505b818110156130a5576000886001878401018151811061304e57fe5b602001015160f81c60f81b90508087838151811061306857fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350508080600101915050613033565b5050505050915091565b60006040516020016130c090614ae4565b60405160208183030381529060405280519060200120826040516020016130e79190614ab8565b604051602081830303815290604052805190602001201480613152575060405160200161311390614acf565b604051602081830303815290604052805190602001208260405160200161313a9190614ab8565b60405160208183030381529060405280519060200120145b8061315e575060008251145b1561316c576000905061318b565b60008251905060ff81111561318557600091505061318b565b60019150505b919050565b60008060016020601f855101816131a357fe5b040190506040518481526020810160005b838110156131d55780602002860151816020028301528060010190506131b4565b5060208260208502604001846000600f600019f1935050505092915050565b600073d2001000000000000000000000000000000000d273ffffffffffffffffffffffffffffffffffffffff166383e781fe6040518163ffffffff1660e01b815260040160206040518083038186803b15801561325057600080fd5b505afa158015613264573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506132889190810190613e2f565b905090565b6000606061329a83612ac9565b90506000600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b82518110156133ab5760008260010184600184038151811061330457fe5b60200260200101516040516133199190614aa1565b90815260200160405180910390205411613368576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161335f90614cb3565b60405180910390fd5b8160020183600183038151811061337b57fe5b60200260200101516040516133909190614aa1565b908152602001604051809103902091508060010190506132e6565b50606060018351116133bd57846133d6565b826001845103815181106133cd57fe5b60200260200101515b9050600082600101826040516133ec9190614ab8565b9081526020016040518091039020541161343b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161343290614cb3565b60405180910390fd5b600082600001600184600101846040516134559190614ab8565b908152602001604051809103902054038154811061346f57fe5b906000526020600020906005020190508094505050505092915050565b60008060016020601f8551018161349f57fe5b04019050600060016020601f885101816134b557fe5b040190506040518781526020810160005b838110156134e75780602002890151816020028301528060010190506134c6565b50868360200282015260005b8481101561351957806020028701518185600101016020028301528060010190506134f3565b50602082848601602002606001846000600c600019f1945050505050949350505050565b6000613547613c45565b600060016020601f8851018161355957fe5b0401905060006020601f86018161356c57fe5b0490506040518881526020810160005b8481101561359d57806020028a01518160200283015280600101905061357c565b5083602002810188815287816020015283602002868660030160200285600a600019fa9650505050505094509492505050565b60008060016020601f855101816135e357fe5b040190506040518481526020810160005b838110156136155780602002860151816020028301528060010190506135f4565b50602082602085026040018460006011600019f1935050505092915050565b60008060016020601f8651018161364757fe5b040190506040518581526020810160005b83811015613679578060200287015181602002830152806001019050613658565b50846020840282015260208260208502604001846000600b600019f193505050509392505050565b60008060016020601f855101816136b457fe5b040190506040518481526020810160005b838110156136e65780602002860151816020028301528060010190506136c5565b5060208260208502604001846000600e600019f1935050505092915050565b600080600060016020601f8651018161371a57fe5b040190506040518581526020810160005b8381101561374c57806020028701518160200283015280600101905061372b565b506020826020850260200184600d600019fa9450815193505050509250929050565b613776613c6a565b600060208301905060405180604001604052808451815260200182815250915050919050565b60008082600001516137c0856000015186602001518660000151876020015161388d565b0190505b8360000151846020015101811161380a578180600101925050826000015161380285602001518303866000015103838660000151876020015161388d565b0190506137c4565b5092915050565b613819613c6a565b613824838383613968565b5092915050565b60608082600001516040519080825280601f01601f1916602001820160405280156138655781602001600182028038833980820191505090505b50905060006020820190506138838185602001518660000151613a06565b8192505050919050565b6000808490506000868511613958576020851161391257600060018660200360080260020a031960001b905060008186511690506000878a8a0103905060008386511690505b828114613904578186106138f1578a8a019650505050505050613960565b85806001019650508386511690506138d3565b859650505050505050613960565b60008585209050600091505b85880382116139565760008684209050808214156139425783945050505050613960565b60018401935050818060010192505061391e565b505b868601925050505b949350505050565b613970613c6a565b600061398e856000015186602001518660000151876020015161388d565b905084602001518360200181815250508460200151810383600001818152505084600001518560200151018114156139d05760008560000181815250506139fb565b8360000151836000015101856000018181510391508181525050836000015181018560200181815250505b829150509392505050565b5b60208110613a2a5781518352602083019250602082019150602081039050613a07565b60006001826020036101000a0390508019835116818551168181178652505050505050565b6040518060a00160405280606081526020016000151581526020016000815260200160006002811115613a7e57fe5b8152602001606081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613acc57805160ff1916838001178555613afa565b82800160010185558215613afa579182015b82811115613af9578251825591602001919060010190613ade565b5b509050613b079190613c84565b5090565b82805482825590600052602060002090601f01602090048101928215613ba05791602002820160005b83821115613b7157835183826101000a81548160ff0219169083151502179055509260200192600101602081600001049283019260010302613b34565b8015613b9e5782816101000a81549060ff0219169055600101602081600001049283019260010302613b71565b505b509050613bad9190613ca9565b5090565b50805460018160011615610100020316600290046000825580601f10613bd75750613bf6565b601f016020900490600052602060002090810190613bf59190613c84565b5b50565b50805460008255601f016020900490600052602060002090810190613c1e9190613c84565b50565b5080546000825560050290600052602060002090810190613c429190613cd9565b50565b6040518062100000016040528061800090602082028038833980820191505090505090565b604051806040016040528060008152602001600081525090565b613ca691905b80821115613ca2576000816000905550600101613c8a565b5090565b90565b613cd691905b80821115613cd257600081816101000a81549060ff021916905550600101613caf565b5090565b90565b613d4591905b80821115613d415760008082016000613cf89190613bb1565b6001820160006101000a81549060ff021916905560028201600090556003820160006101000a81549060ff0219169055600482016000613d389190613bf9565b50600501613cdf565b5090565b90565b600081359050613d578161510d565b92915050565b600081519050613d6c8161510d565b92915050565b600082601f830112613d8357600080fd5b8135613d96613d9182614efb565b614ece565b91508082526020830160208301858383011115613db257600080fd5b613dbd8382846150ad565b50505092915050565b600082601f830112613dd757600080fd5b8135613dea613de582614f27565b614ece565b91508082526020830160208301858383011115613e0657600080fd5b613e118382846150ad565b50505092915050565b600081359050613e2981615124565b92915050565b600060208284031215613e4157600080fd5b6000613e4f84828501613d5d565b91505092915050565b60008060408385031215613e6b57600080fd5b6000613e7985828601613d48565b9250506020613e8a85828601613e1a565b9150509250929050565b600060208284031215613ea657600080fd5b600082013567ffffffffffffffff811115613ec057600080fd5b613ecc84828501613dc6565b91505092915050565b60008060408385031215613ee857600080fd5b600083013567ffffffffffffffff811115613f0257600080fd5b613f0e85828601613dc6565b9250506020613f1f85828601613e1a565b9150509250929050565b600080600060608486031215613f3e57600080fd5b600084013567ffffffffffffffff811115613f5857600080fd5b613f6486828701613dc6565b9350506020613f7586828701613e1a565b925050604084013567ffffffffffffffff811115613f9257600080fd5b613f9e86828701613d72565b9150509250925092565b600080600060608486031215613fbd57600080fd5b600084013567ffffffffffffffff811115613fd757600080fd5b613fe386828701613dc6565b9350506020613ff486828701613e1a565b925050604061400586828701613e1a565b9150509250925092565b600061401b838361417d565b60208301905092915050565b6000614033838361418c565b60208301905092915050565b600061404b8383614a06565b905092915050565b600061405e82614f7d565b6140688185614fdc565b935061407383614f53565b8060005b838110156140a457815161408b888261400f565b975061409683614fb5565b925050600181019050614077565b5085935050505092915050565b6140ba81614f88565b6140c48184614fed565b92506140cf82614f63565b8060005b838110156141005781516140e78782614027565b96506140f283614fc2565b9250506001810190506140d3565b505050505050565b600061411382614f94565b61411d8185614ff8565b93508360208202850161412f85614f6d565b8060005b8581101561416b578484038952815161414c858261403f565b945061415783614fcf565b925060208a01995050600181019050614133565b50829750879550505050505092915050565b61418681615048565b82525050565b61419581615054565b82525050565b6141a48161509b565b82525050565b6141b38161509b565b82525050565b60006141c482614faa565b6141ce818561502b565b93506141de8185602086016150bc565b80840191505092915050565b60006141f582614f9f565b6141ff8185615009565b935061420f8185602086016150bc565b614218816150ef565b840191505092915050565b600061422e82614f9f565b614238818561502b565b93506142488185602086016150bc565b80840191505092915050565b600061426160188361501a565b91507f496e636f7272656374206368756e6b20706f736974696f6e00000000000000006000830152602082019050919050565b60006142a160158361501a565b91507f4469726563746f7279206e6f74206372656174656400000000000000000000006000830152602082019050919050565b60006142e160248361501a565b91507f4e6f7420656e6f756768206d656d6f727920696e207468652046696c6573746f60008301527f72616765000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614347601b8361501a565b91507f48617368206861736e2774206265656e2063616c63756c6174656400000000006000830152602082019050919050565b600061438760198361501a565b91507f4368756e6b20697320616c72656164792075706c6f61646564000000000000006000830152602082019050919050565b60006143c760168361501a565b91507f496e636f7272656374206368756e6b206c656e677468000000000000000000006000830152602082019050919050565b6000614407600f8361501a565b91507f46696c65206e6f742065786973747300000000000000000000000000000000006000830152602082019050919050565b6000614447600e8361501a565b91507f496e76616c69642073656e6465720000000000000000000000000000000000006000830152602082019050919050565b600061448760188361501a565b91507f4469726563746f7279206973206e6f742064656c6574656400000000000000006000830152602082019050919050565b60006144c760108361501a565b91507f46696c65206e6f742064656c65746564000000000000000000000000000000006000830152602082019050919050565b600061450760138361501a565b91507f496e76616c69642073746f7261676550617468000000000000000000000000006000830152602082019050919050565b6000614547600c8361501a565b91507f496e76616c6964207061746800000000000000000000000000000000000000006000830152602082019050919050565b600061458760018361502b565b91507f2e000000000000000000000000000000000000000000000000000000000000006000830152600182019050919050565b60006145c760168361501a565b91507f496e76616c6964206469726563746f7279206e616d65000000000000000000006000830152602082019050919050565b600061460760158361501a565b91507f4368756e6b207761736e27742075706c6f6164656400000000000000000000006000830152602082019050919050565b600061464760268361501a565b91507f436f756c64206e6f742072657365727665206c657373207468616e207573656460008301527f20737061636500000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006146ad60168361501a565b91507f4469726563746f7279206973206e6f7420656d707479000000000000000000006000830152602082019050919050565b60006146ed60238361501a565b91507f46696c65206861736e2774206265656e2075706c6f6164656420636f7272656360008301527f746c7900000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061475360118361501a565b91507f4368756e6b207761736e277420726561640000000000000000000000000000006000830152602082019050919050565b600061479360188361501a565b91507f46696c656e616d652073686f756c64206265203c2032353600000000000000006000830152602082019050919050565b60006147d3601f8361501a565b91507f46696c652073686f756c64206265206c657373207468616e20313030204d42006000830152602082019050919050565b600061481360028361502b565b91507f2e2e0000000000000000000000000000000000000000000000000000000000006000830152600282019050919050565b600061485360118361501a565b91507f4469726563746f72792069732066756c6c0000000000000000000000000000006000830152602082019050919050565b6000614893600e8361501a565b91507f46696c65206e6f7420666f756e640000000000000000000000000000000000006000830152602082019050919050565b60006148d360188361501a565b91507f46696c65206f72206469726563746f72792065786973747300000000000000006000830152602082019050919050565b600061491360198361501a565b91507f4e6f7420656e6f756768207265736572766564207370616365000000000000006000830152602082019050919050565b600061495360188361501a565b91507f45564d206572726f7220696e2067657446696c6553697a6500000000000000006000830152602082019050919050565b600061499360108361501a565b91507f46696c65206e6f742063726561746564000000000000000000000000000000006000830152602082019050919050565b60006149d360198361501a565b91507f46696c65206861736e2774206265656e2075706c6f61646564000000000000006000830152602082019050919050565b600060a0830160008301518482036000860152614a2382826141ea565b9150506020830151614a38602086018261417d565b506040830151614a4b6040860182614a83565b506060830151614a5e606086018261419b565b5060808301518482036080860152614a768282614053565b9150508091505092915050565b614a8c81615091565b82525050565b614a9b81615091565b82525050565b6000614aad8284614223565b915081905092915050565b6000614ac482846141b9565b915081905092915050565b6000614ada8261457a565b9150819050919050565b6000614aef82614806565b9150819050919050565b60006210000082019050614b1060008301846140b1565b92915050565b60006020820190508181036000830152614b308184614108565b905092915050565b6000602082019050614b4d60008301846141aa565b92915050565b60006020820190508181036000830152614b6c81614254565b9050919050565b60006020820190508181036000830152614b8c81614294565b9050919050565b60006020820190508181036000830152614bac816142d4565b9050919050565b60006020820190508181036000830152614bcc8161433a565b9050919050565b60006020820190508181036000830152614bec8161437a565b9050919050565b60006020820190508181036000830152614c0c816143ba565b9050919050565b60006020820190508181036000830152614c2c816143fa565b9050919050565b60006020820190508181036000830152614c4c8161443a565b9050919050565b60006020820190508181036000830152614c6c8161447a565b9050919050565b60006020820190508181036000830152614c8c816144ba565b9050919050565b60006020820190508181036000830152614cac816144fa565b9050919050565b60006020820190508181036000830152614ccc8161453a565b9050919050565b60006020820190508181036000830152614cec816145ba565b9050919050565b60006020820190508181036000830152614d0c816145fa565b9050919050565b60006020820190508181036000830152614d2c8161463a565b9050919050565b60006020820190508181036000830152614d4c816146a0565b9050919050565b60006020820190508181036000830152614d6c816146e0565b9050919050565b60006020820190508181036000830152614d8c81614746565b9050919050565b60006020820190508181036000830152614dac81614786565b9050919050565b60006020820190508181036000830152614dcc816147c6565b9050919050565b60006020820190508181036000830152614dec81614846565b9050919050565b60006020820190508181036000830152614e0c81614886565b9050919050565b60006020820190508181036000830152614e2c816148c6565b9050919050565b60006020820190508181036000830152614e4c81614906565b9050919050565b60006020820190508181036000830152614e6c81614946565b9050919050565b60006020820190508181036000830152614e8c81614986565b9050919050565b60006020820190508181036000830152614eac816149c6565b9050919050565b6000602082019050614ec86000830184614a92565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614ef157600080fd5b8060405250919050565b600067ffffffffffffffff821115614f1257600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614f3e57600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050919050565b6000819050602082019050919050565b600081519050919050565b60006180009050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061504182615071565b9050919050565b60008115159050919050565b6000819050919050565b600081905061506c82615100565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006150a68261505e565b9050919050565b82818337600083830152505050565b60005b838110156150da5780820151818401526020810190506150bf565b838111156150e9576000848401525b50505050565b6000601f19601f8301169050919050565b6003811061510a57fe5b50565b61511681615036565b811461512157600080fd5b50565b61512d81615091565b811461513857600080fd5b5056fea2646970667358221220a549ad9e778ae8bb3048c0a1805e77745871cc1560637ae1c3ebccb76638d9c464736f6c63430006020033", + "storage": {} + } + }, + + "skaleConfig": { + "nodeInfo": { + "nodeName": "Node1", + "nodeID": 1112, + "bindIP": "0.0.0.0", + "basePort": 1231, + "httpRpcPort": 1234, + "httpsRpcPort": 1239, + "wsRpcPort": 1233, + "wssRpcPort": 1238, + "logLevel": "info", + "logLevelProposal": "info", + "rotateAfterBlock": 0, + "ecdsaKeyName": "", + "minCacheSize": 1000, + "maxCacheSize": 2000, + "collectionQueueSize": 2, + "collectionDuration": 10, + "transactionQueueSize": 10000, + "maxOpenLeveldbFiles": 25, + "testSignatures": true + }, + "sChain": { + "schainName": "TestChain", + "schainID": 5, + "schainOwner": "0x907cd0881E50d359bb9Fd120B1A5A143b1C97De6", + "contractStorageLimit": 10000000000, + "emptyBlockIntervalMs": 10000, + "contractStorageZeroValuePatchTimestamp": 1, + "revertableFSPatchTimestamp": 1, + "contractStoragePatchTimestamp": 1, + "verifyDaSigsPatchTimestamp": 1, + "storageDestructionPatchTimestamp": 1, + "powCheckPatchTimestamp": 1, + "skipInvalidTransactionsPatchTimestamp": 1, + "pushZeroPatchTimestamp": 1, + "precompiledConfigPatchTimestamp": 1, + "correctForkInPowPatchTimestamp": 1, + "EIP1559TransactionsPatchTimestamp": 1, + "fastConsensusPatchTimestamp": 1, + "flexibleDeploymentPatchTimestamp": 1, + "verifyBlsSyncPatchTimestamp": 1, + "multiTransactionMode": false, + "levelDBReopenIntervalMs": 1, + "nodes": [ + { "nodeID": 1112, "ip": "127.0.0.1", "basePort": 1231, "schainIndex" : 1, "publicKey":""} + ] + } + } +} + + + diff --git a/test/historicstate/configs/testeth_config_mtm.json b/test/historicstate/configs/testeth_config_mtm.json new file mode 100644 index 000000000..b5c44cee8 --- /dev/null +++ b/test/historicstate/configs/testeth_config_mtm.json @@ -0,0 +1,354 @@ +{ + "unddos": { + "origins": [ + { + "origin": [ "*" ], + "ban_lengthy": 0, + "ban_peak": 0, + "max_calls_per_minute": 1000000000, + "max_calls_per_second": 1000000000, + "max_ws_conn": 65535 + } + ] + }, + "sealEngine": "Ethash", + "params": { + "accountStartNonce": "0x00", + "homesteadForkBlock": "0x0", + "daoHardforkBlock": "0x0", + "EIP150ForkBlock": "0x00", + "EIP158ForkBlock": "0x00", + "byzantiumForkBlock": "0x0", + "constantinopleForkBlock": "0x0", + "networkID": "12313219", + "chainID": "0x12345", + "maximumExtraDataSize": "0x20", + "tieBreakingGas": false, + "minGasLimit": "0xFFFFFFFFF", + "maxGasLimit": "0xFFFFFFFFF", + "gasLimitBoundDivisor": "0x0400", + "minimumDifficulty": "0x0", + "difficultyBoundDivisor": "0x0800", + "durationLimit": "0x0d", + "blockReward": "0x4563918244F40000", + "externalGasDifficulty": "0x01" + }, + "genesis": { + "nonce": "0x0000000000000042", + "difficulty": "0x0", + "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000abc", + "author": "0x0000000000000000000000000000000000000001", + "timestamp": "0x00", + "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "extraData": "0x11bbe8db4e347b4e8c937c1c8370e4b5ed33adb3db69cbdb7a38e1e50b1b82fa", + "gasLimit": "0xFFFFFFFFF" + }, + "accounts": { + "0x66c5a87f4a49DD75e970055A265E8dd5C3F8f852":{ + "balance": "1000000000000000000000" + }, + "0x6d80aAC61F6d92c7F4A3c412850474ba963B698E":{ + "balance": "1000000000000000000000" + }, + "0x7e7E68F04D1799Fa25C8cff57314c8a5d3942e69":{ + "balance": "1000000000000000000000000" + }, + "0x5EF25557E2ed6AFfF321B266C93e95A0B4B05AbC":{ + "balance": "1000000000000000000000000" + }, + "0x6196d135CdDb9d73A0756C1E44b5b02B11acf594":{ + "balance": "2000000000000000000000", + "nonce": "5076", + "code": "", + "storage":{} + }, + "0xa68f946090c600eda6f139783077ee802afeb990": { "balance": "1000000000000000000000000000000" } , + "0x88fd5e01078629cc194c933d9631b9448fe10b1d": { "balance": "1000000000000000000000000000000" } , + "0x77a0bc73442d3d9cb993e8d9752f95babf0ccaa6": { "balance": "1000000000000000000000000000000" } , + "0x0aa6a44690ef52354e976990292cf9c5cd36ad59": { "balance": "1000000000000000000000000000000" } , + "0x863f816036e3cbba90855196c9d1e339fcff1650": { "balance": "1000000000000000000000000000000" } , + "0xe3cc6ec63b5652d1594bc63bb293f4e80f76dbdd": { "balance": "1000000000000000000000000000000" } , + "0x94c6e5746971d6aebeaa42cbbe2feca0f6b5b24f": { "balance": "1000000000000000000000000000000" } , + "0x3f5bdf5d4c274c82b8d17aa2810b00d2cf050f24": { "balance": "1000000000000000000000000000000" } , + "0xbf5aa678b969c0871e2fbcf09c3dbb5d5865ac1e": { "balance": "1000000000000000000000000000000" } , + "0xa6d50055592cecb795bc1ed3b9ea57ed426b0b7c": { "balance": "1000000000000000000000000000000" } , + "0xb70603c505f85130b5b2e73cd82d196dfd7d8b5e": { "balance": "1000000000000000000000000000000" } , + "0x079cf317ef40b16141784b6fabff812d64f7c0fd": { "balance": "1000000000000000000000000000000" } , + "0x482d7f53cba6ae73a354533673c48e2dfd560949": { "balance": "1000000000000000000000000000000" } , + "0xa2969e82619021ea407338f8bdf7c6f2bd679673": { "balance": "1000000000000000000000000000000" } , + "0x28353685b0b986a724b92113debb3d8cd9a6b263": { "balance": "1000000000000000000000000000000" } , + "0x9b77f28285a49601169a33332f08aa309d97edd0": { "balance": "1000000000000000000000000000000" } , + "0xd2cd302eb060e375a65d65946692a3ac2d838d35": { "balance": "1000000000000000000000000000000" } , + "0x811d701d14539d190a8593fe901eafe8eff511f5": { "balance": "1000000000000000000000000000000" } , + "0x194cb9991d3d94c43e400becf21dfea45e7b3b4c": { "balance": "1000000000000000000000000000000" } , + "0xf36620e71327f4a55d550d46e030ccf0c728f154": { "balance": "1000000000000000000000000000000" } , + "0x661bda4daeba3ce9ac2aa30b80d463580f90d31a": { "balance": "1000000000000000000000000000000" } , + "0xdc6a269c58e58a93a22b5df8cdf1af630c47481f": { "balance": "1000000000000000000000000000000" } , + "0x6923877b65e24966efa9efd1207822fa2eaf601a": { "balance": "1000000000000000000000000000000" } , + "0x38855e430611bc179cd777a8704679ffc43921de": { "balance": "1000000000000000000000000000000" } , + "0xc12bcedd9bcad9120150122cd50f39576ecccc08": { "balance": "1000000000000000000000000000000" } , + "0x6b806862a977a0e22ed1752f858e5332647121c8": { "balance": "1000000000000000000000000000000" } , + "0x8e6081e272c8f4d49f5b29157b52f68cbd6307ad": { "balance": "1000000000000000000000000000000" } , + "0x7685d04f0b7657017b77efa004a14ff9f022acab": { "balance": "1000000000000000000000000000000" } , + "0xabf920b89f5a2487fdb70be17fd01a99a0602e62": { "balance": "1000000000000000000000000000000" } , + "0xd3d38f4cb0aeb4c7c2527ddaeec2ab3b910c8528": { "balance": "1000000000000000000000000000000" } , + "0xaa6a87bbb74bc1f3cb40c1efb7fc171ee6407560": { "balance": "1000000000000000000000000000000" } , + "0x138ea4bdf0382c2deffd5b0bff0afe59f471467f": { "balance": "1000000000000000000000000000000" } , + "0xe083a100d51fc4f38aae4a3a68404c36ad96c612": { "balance": "1000000000000000000000000000000" } , + "0xe91ac72a568e752eb7c9f5235100586ce97c8cc1": { "balance": "1000000000000000000000000000000" } , + "0xd951bf4cff429062702a7d8699a5f0bf14845d9b": { "balance": "1000000000000000000000000000000" } , + "0x16e8c390f8e576161cfe966f2c3e5dd303eb9039": { "balance": "1000000000000000000000000000000" } , + "0xe25e5b63dfd4cf59b81eddf64f1195858634b8a6": { "balance": "1000000000000000000000000000000" } , + "0xd23cd6a9ddcc3470300003621bbac1e06a7919d5": { "balance": "1000000000000000000000000000000" } , + "0x32ea0400dc2d20664cc4744b2fab04ecb709445c": { "balance": "1000000000000000000000000000000" } , + "0xb64989ab32b089da3da103b93e6781d6d5dd10b4": { "balance": "1000000000000000000000000000000" } , + "0x6cd5e637266e18d3e888ee99451eb828c6b491f4": { "balance": "1000000000000000000000000000000" } , + "0x13867af77a63048e17380e39248ada90521e97e4": { "balance": "1000000000000000000000000000000" } , + "0x5d012c13b2854bda8b7b6580e97e52751884f827": { "balance": "1000000000000000000000000000000" } , + "0x006d8e49ce0b9eb5646e34a4d91934801b9044fd": { "balance": "1000000000000000000000000000000" } , + "0x3bcca8a8471d55a1a668bc163c0336e4a57e5c99": { "balance": "1000000000000000000000000000000" } , + "0x87ea381878572d63b3453033d7540abddd191186": { "balance": "1000000000000000000000000000000" } , + "0x3d46ee560227c1d73cd6042b47fc8fddd8a06ecb": { "balance": "1000000000000000000000000000000" } , + "0x06104a85a380895b6dd4030113806df2b044905e": { "balance": "1000000000000000000000000000000" } , + "0x12d5d7340a93be7be28ea7a3ae198242f8e1282c": { "balance": "1000000000000000000000000000000" } , + "0x605ba4a05d779f9869bd9a10234c22f516766cfe": { "balance": "1000000000000000000000000000000" } , + "0xdee32ae508cf783f53ab8bc39d878fe323cdfae3": { "balance": "1000000000000000000000000000000" } , + "0x5a3adad4382b3eb1e0c65f2de2845901081039b5": { "balance": "1000000000000000000000000000000" } , + "0x48acbd6a2724eadcc2a11144ab84b6a617d1a241": { "balance": "1000000000000000000000000000000" } , + "0xdc6d02ef4003a4f2d0ccff65ae1a2d8157fbb23e": { "balance": "1000000000000000000000000000000" } , + "0x03309956988ae70152ae4469daf99b0cac2306c5": { "balance": "1000000000000000000000000000000" } , + "0x57829f2ecca390cd9d1c41f92328bad4d1073bbb": { "balance": "1000000000000000000000000000000" } , + "0xb67e6f4a21f93c250fa6ff0cb142bd14dd4ca8eb": { "balance": "1000000000000000000000000000000" } , + "0x7525198d8cd1121d57358a0b0ed037e924581a76": { "balance": "1000000000000000000000000000000" } , + "0x13d19c55ee0a212249d26b9d741ff6d7f416db01": { "balance": "1000000000000000000000000000000" } , + "0x2d93455b07bccf38e8d019f7f43a2c2d70b46b4e": { "balance": "1000000000000000000000000000000" } , + "0x54e228d8fea148cfe2b109b3b152ff21321d09a2": { "balance": "1000000000000000000000000000000" } , + "0xbf2d8cebdeeb8ad8fed7b2a75f35922106f8d75c": { "balance": "1000000000000000000000000000000" } , + "0xa096b05a489831db893fc53aacc7ed20efb36382": { "balance": "1000000000000000000000000000000" } , + "0xd90045420b8abc37b3f9304ed2b385fc1b7fa8c5": { "balance": "1000000000000000000000000000000" } , + "0x3ffe1c9183e0f97f52a816405a7d2350624ec88b": { "balance": "1000000000000000000000000000000" } , + "0xe372377decb3bdc0c7f5272d38ce0ba2a54934fe": { "balance": "1000000000000000000000000000000" } , + "0xe1607990ce800407e3c206e58de4917977181d4d": { "balance": "1000000000000000000000000000000" } , + "0xc7865200e8e51ba1c8d695f327deed432930f2cc": { "balance": "1000000000000000000000000000000" } , + "0x85b33f0853ab8eaa4e602bdfd724d44bc2731e90": { "balance": "1000000000000000000000000000000" } , + "0xd2e75c41ced8699e3176f6e335355701a2568b7b": { "balance": "1000000000000000000000000000000" } , + "0x62971de462ea1ec0d3b43a6a85b6fb975e6c6f64": { "balance": "1000000000000000000000000000000" } , + "0xcc33e23b04b74f7ba8fbe315083182224af973fa": { "balance": "1000000000000000000000000000000" } , + "0x49ef89840e400026eb5c8d79bd1b0adc152fe86d": { "balance": "1000000000000000000000000000000" } , + "0x62cf32dfb9eb6358dc5deb006aef1d75fb153e5f": { "balance": "1000000000000000000000000000000" } , + "0x733ad609ef2e742334d96266fbc13733f1cf5e4a": { "balance": "1000000000000000000000000000000" } , + "0x76b545cb6a2fc671f741950eeb27627e69a1e69b": { "balance": "1000000000000000000000000000000" } , + "0xce1c62d0a77600fb2f959b4da76fcb9b3b9430a3": { "balance": "1000000000000000000000000000000" } , + "0xe8b57f330d56081c856e618210fbedb414925ff0": { "balance": "1000000000000000000000000000000" } , + "0x30aaab366dfac8331f3e827495c789cde9b437c0": { "balance": "1000000000000000000000000000000" } , + "0x54db355342c35085a1a53184162b2fddd0a43b0f": { "balance": "1000000000000000000000000000000" } , + "0x5cdb7392efdce502ccc6fba5c3c1dd1653967b4d": { "balance": "1000000000000000000000000000000" } , + "0x3760dc9594ccac0f33ade5cc5371402131696341": { "balance": "1000000000000000000000000000000" } , + "0xa8c813ee806b4c8537ff5f16084d44db18ea9ab1": { "balance": "1000000000000000000000000000000" } , + "0x98e50c97baf98dc6a81bdb95067339a269a36fc1": { "balance": "1000000000000000000000000000000" } , + "0xfa723938fa8da1a8a2114ad409a11581761ee40d": { "balance": "1000000000000000000000000000000" } , + "0xfaa1038074941571524934ba52d312e88b3577f5": { "balance": "1000000000000000000000000000000" } , + "0x6c0ef9084a57df13c175afea32ea47a510c5506e": { "balance": "1000000000000000000000000000000" } , + "0x8a920edc1021ce76c22774e0e83723a6e51c2439": { "balance": "1000000000000000000000000000000" } , + "0xa7c0789bdeee38c6b59111a789dfb6b815489847": { "balance": "1000000000000000000000000000000" } , + "0xfee314cdc84ecfaa675e41b3559c0101e1eba6b8": { "balance": "1000000000000000000000000000000" } , + "0x69bfcdcb98c9562e0a2faee3ecdfd65e8a0adb19": { "balance": "1000000000000000000000000000000" } , + "0x4e9b85904bca60aeb5b916ca86ac622096908427": { "balance": "1000000000000000000000000000000" } , + "0x2bee474be207bdbeac83d6672da5ed2fd417eac9": { "balance": "1000000000000000000000000000000" } , + "0x0966454f51166c68b73b2865473c8fb2fcdefdd5": { "balance": "1000000000000000000000000000000" } , + "0x4bf989fa6572af36b190032505506f1db888357f": { "balance": "1000000000000000000000000000000" } , + "0xb28c45b98ae43a5e9ee5509c97ea037b5de5d6d9": { "balance": "1000000000000000000000000000000" } , + "0xbee0e5c1961d51be9bd670876caa9c90ba7d9016": { "balance": "1000000000000000000000000000000" } , + "0xaf97a8318a1a51d5daeeb9650024b63ee44f45bd": { "balance": "1000000000000000000000000000000" } , + "0xe3da7c014286258944ab20a31e4d861b4c9262f1": { "balance": "1000000000000000000000000000000" } , + "0x50120c17d7b59200e9b76e89e4e3de2f0cd00090": { "balance": "1000000000000000000000000000000" } , + "0x1a66fc89809112c20aa76a993db712fa9e003e4e": { "balance": "1000000000000000000000000000000" } , + "0xb942414cae2a1ab1056657b905845c0ab6b6280a": { "balance": "1000000000000000000000000000000" } , + "0x236bf02dfafaf03851a4e6f5d69052f4884cec32": { "balance": "1000000000000000000000000000000" } , + "0xc8e4d709eb3eb335dc69c9fbf2d24d447cb86105": { "balance": "1000000000000000000000000000000" } , + "0xf184c8c243a178c1748a0af45caedeca476105b4": { "balance": "1000000000000000000000000000000" } , + "0x97b921ba45e0aa8830701aa62050a83ee00a1bb8": { "balance": "1000000000000000000000000000000" } , + "0x29d83322219fdfb821459d5fdf796360faf3166a": { "balance": "1000000000000000000000000000000" } , + "0x3a921471a2397644c37c88ef9572c421ab37145d": { "balance": "1000000000000000000000000000000" } , + "0x426ec5f07847674aada3856609d8baaa16805d88": { "balance": "1000000000000000000000000000000" } , + "0x60268f799d8f1808e4a32c2eb898e73a8881f6f0": { "balance": "1000000000000000000000000000000" } , + "0x68bca79ae7aae796027ff843d2303444da5cf5d8": { "balance": "1000000000000000000000000000000" } , + "0xd1b6c947fb14060b38945584714491592e84875d": { "balance": "1000000000000000000000000000000" } , + "0x90431f3f75b26657f74abbb5c759b12e78f916cc": { "balance": "1000000000000000000000000000000" } , + "0xc2d3852f3292acb81bd164dbae5f1e2a87535150": { "balance": "1000000000000000000000000000000" } , + "0x9f62f4215cd277ca40dede101b4ccb29290de6bb": { "balance": "1000000000000000000000000000000" } , + "0xc98af661e44c5bf31d2f8bdff4bbf2808ed4e991": { "balance": "1000000000000000000000000000000" } , + "0x1feaf1671c1f0faf0d44c152f72dc755db932569": { "balance": "1000000000000000000000000000000" } , + "0x8945e48bd056f45c8b57f9025d2674bb03a24035": { "balance": "1000000000000000000000000000000" } , + "0x2f971bd38806c3ca45ae0a125d1267118bf5619c": { "balance": "1000000000000000000000000000000" } , + "0xac5df92da5171ba24a9618018b4f79494040334b": { "balance": "1000000000000000000000000000000" } , + "0x0150b461b06922a5030784ba888962c28bb1f188": { "balance": "1000000000000000000000000000000" } , + "0xde14aca36acc62c305a7ee571da37840a408e600": { "balance": "1000000000000000000000000000000" } , + "0x66cd465ddcd85504c0d2cfb1728acee994d55a3f": { "balance": "1000000000000000000000000000000" } , + "0x5d9326c6504833d84f8a0d65ded59b1a6e768ca2": { "balance": "1000000000000000000000000000000" } , + "0x8fe24dbbf9884bd458d8cfac528b4ad70e82497d": { "balance": "1000000000000000000000000000000" } , + "0xfe2c5aa110fff89361806ea7ee080bfffba0d3dd": { "balance": "1000000000000000000000000000000" } , + "0xd5b561a27cca5049650a14ab93dbf1a20c0cefc1": { "balance": "1000000000000000000000000000000" } , + "0x1239fe658b410dbbac5bbd572035f5041542f9e5": { "balance": "1000000000000000000000000000000" } , + "0x26d88f6a8b659be4165ee53774a057e41b5201c9": { "balance": "1000000000000000000000000000000" } , + "0xa3597b1162b6559cb5e966904b63e762ece756a4": { "balance": "1000000000000000000000000000000" } , + "0x137048b9fa4f1234d6519271b2c5ec64f480db0f": { "balance": "1000000000000000000000000000000" } , + "0xc58744e2eceefd45cc5469f0e0a708ad24ddbbdb": { "balance": "1000000000000000000000000000000" } , + "0x83c1479d2a32d9ed9fa699289b6c2db56b7cd045": { "balance": "1000000000000000000000000000000" } , + "0x0fbbe17a0e5a61ee3e8661f442d7f6b177c49820": { "balance": "1000000000000000000000000000000" } , + "0x96672f9e982936e1904b15c948cc81bf18027db6": { "balance": "1000000000000000000000000000000" } , + "0xf1a5912ff318aebf312cdb54c75642a9e632703c": { "balance": "1000000000000000000000000000000" } , + "0x62712ceccb50f62ca4c5402fff6da9c819c866cf": { "balance": "1000000000000000000000000000000" } , + "0x6093f0f2a7b5148b71603ac439adbc4c0e5aa5da": { "balance": "1000000000000000000000000000000" } , + "0xc3820490201e94d76b44655d2df713fec29d9795": { "balance": "1000000000000000000000000000000" } , + "0x6d0d7f0ff51917bd84a5f7270d31a894282aaf4b": { "balance": "1000000000000000000000000000000" } , + "0x1f1d6041e12a18cf1202019f146f2fc150915e8d": { "balance": "1000000000000000000000000000000" } , + "0x6fec280c0ab320715b17d70e8b02c2d4141c1372": { "balance": "1000000000000000000000000000000" } , + "0x4cf9b195f7cb5f86694d9b399fe21a5f34616fd3": { "balance": "1000000000000000000000000000000" } , + "0xfe275c9b5ac792327da509b27eb9614196dfb07d": { "balance": "1000000000000000000000000000000" } , + "0x6a37ad7dceec4595eea9f03b82d2710e738343ac": { "balance": "1000000000000000000000000000000" } , + "0x6d8092cb926daf29236f866cd31c327ff73323d1": { "balance": "1000000000000000000000000000000" } , + "0xa1cd651d99283be60e2a9d2e3bc8a90aedb8244f": { "balance": "1000000000000000000000000000000" } , + "0x5667601b7dcde6f24d06bccc4f291cb06976f4ee": { "balance": "1000000000000000000000000000000" } , + "0x6314956b78bb2eaed1c49b3ae71d4d0ec501cfab": { "balance": "1000000000000000000000000000000" } , + "0x157d38b52196b248e9fe6a2172e32ce2b8c078e6": { "balance": "1000000000000000000000000000000" } , + "0xfa7a8c69810eaf16a395d2a93b3ab51efeed2a1c": { "balance": "1000000000000000000000000000000" } , + "0x765708943c3b791563d1e3f0533b6d7e7d769e4d": { "balance": "1000000000000000000000000000000" } , + "0xf2197b153b4c9086fc5410431fbf7960d284c65e": { "balance": "1000000000000000000000000000000" } , + "0xfe14077c26a507496b7208384d459e21c49c4212": { "balance": "1000000000000000000000000000000" } , + "0xfe3d4f1fc038f4f756ba44995129cd45c9e0e861": { "balance": "1000000000000000000000000000000" } , + "0x099452fedc71897880f584b1bc1706efc4e76e36": { "balance": "1000000000000000000000000000000" } , + "0x907cd0881E50d359bb9Fd120B1A5A143b1C97De6": { "balance": "1000000000000000000000000000000000000000000000000000000000" } , + "0000000000000000000000000000000000000001": { "precompiled": { "name": "ecrecover", "linear": { "base": 3000, "word": 0 } } }, + "0000000000000000000000000000000000000002": { "precompiled": { "name": "sha256", "linear": { "base": 60, "word": 12 } } }, + "0000000000000000000000000000000000000003": { "precompiled": { "name": "ripemd160", "linear": { "base": 600, "word": 120 } } }, + "0000000000000000000000000000000000000004": { "precompiled": { "name": "identity", "linear": { "base": 15, "word": 3 } } }, + "0000000000000000000000000000000000000005": { "precompiled": { "name": "modexp", "startingBlock" : "0x2dc6c0" } }, + "0000000000000000000000000000000000000006": { "precompiled": { "name": "alt_bn128_G1_add", "startingBlock" : "0x2dc6c0", "linear": { "base": 500, "word": 0 } } }, + "0000000000000000000000000000000000000007": { "precompiled": { "name": "alt_bn128_G1_mul", "startingBlock" : "0x2dc6c0", "linear": { "base": 40000, "word": 0 } } }, + "0000000000000000000000000000000000000008": { "precompiled": { "name": "alt_bn128_pairing_product", "startingBlock" : "0x2dc6c0" } }, + "000000000000000000000000000000000000000A": { "precompiled": { "name": "readChunk", "linear": { "base": 15, "word": 0 },"startingBlock" : "0x0"} }, + "000000000000000000000000000000000000000B": { "precompiled": { "name": "createFile", "linear": { "base": 15, "word": 0 },"startingBlock" : "0x0", "restrictAccess": ["69362535ec535F0643cBf62D16aDeDCAf32Ee6F7"] } }, + "000000000000000000000000000000000000000C": { "precompiled": { "name": "uploadChunk", "linear": { "base": 15, "word": 0 },"startingBlock" : "0x0"} }, + "000000000000000000000000000000000000000D": { "precompiled": { "name": "getFileSize", "linear": { "base": 15, "word": 0 },"startingBlock" : "0x0"} }, + "000000000000000000000000000000000000000E": { "precompiled": { "name": "deleteFile", "linear": { "base": 15, "word": 0 },"startingBlock" : "0x0"} }, + "000000000000000000000000000000000000000F": { "precompiled": { "name": "createDirectory", "linear": { "base": 15, "word": 0 },"startingBlock" : "0x0"} }, + "0000000000000000000000000000000000000010": { "precompiled": { "name": "deleteDirectory", "linear": { "base": 15, "word": 0 },"startingBlock" : "0x0"} }, + "0x69362535ec535F0643cBf62D16aDeDCAf32Ee6F8": { + "balance": "0", + "code": "0x608060405234801561001057600080fd5b50600436106100b45760003560e01c806379210e8e1161007157806379210e8e1461017757806381a8235a146101a757806385aeeb17146101c35780639a9a5593146101f3578063a99100541461020f578063b57321221461022b576100b4565b806307c6e7d3146100b9578063122f4fba146100d55780631c6ec7a9146101055780631cfe4e3b14610121578063373dedb41461013d57806361e46db51461015b575b600080fd5b6100d360048036036100ce9190810190613e0d565b61025b565b005b6100ef60048036036100ea9190810190613e0d565b610804565b6040516100fc9190614ab1565b60405180910390f35b61011f600480360361011a9190810190613e0d565b610b43565b005b61013b60048036036101369190810190613dd1565b610f72565b005b610145611190565b6040516101529190614e2c565b60405180910390f35b61017560048036036101709190810190613ea2565b611199565b005b610191600480360361018c9190810190613f21565b6113f9565b60405161019e9190614a72565b60405180910390f35b6101c160048036036101bc9190810190613e0d565b6116f9565b005b6101dd60048036036101d89190810190613e0d565b61189e565b6040516101ea9190614a8f565b60405180910390f35b61020d60048036036102089190810190613e4e565b611b9d565b005b61022960048036036102249190810190613e0d565b61213a565b005b61024560048036036102409190810190613e0d565b612790565b6040516102529190614e2c565b60405180910390f35b6000339050606061026b83612a10565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b825181101561037c576000826001018460018403815181106102d557fe5b60200260200101516040516102ea9190614a1a565b90815260200160405180910390205411610339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161033090614c2c565b60405180910390fd5b8160020183600183038151811061034c57fe5b60200260200101516040516103619190614a1a565b908152602001604051809103902091508060010190506102b7565b506060600183511161038e57846103a7565b8260018451038151811061039e57fe5b60200260200101515b9050600082600101826040516103bd9190614a31565b9081526020016040518091039020541161040c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161040390614c2c565b60405180910390fd5b600082600201826040516104209190614a31565b90815260200160405180910390206000018054905014610475576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161046c90614cac565b60405180910390fd5b60006104818587612c10565b9050806104c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ba90614bcc565b60405180910390fd5b6104cb613996565b836000016001856000018054905003815481106104e457fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156105965780601f1061056b57610100808354040283529160200191610596565b820191906000526020600020905b81548152906001019060200180831161057957829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff1660028111156105e257fe5b60028111156105ed57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561066557602002820191906000526020600020906000905b82829054906101000a900460ff1615158152602001906001019060208260000104928301926001038202915080841161062f5790505b50505050508152505090508084600001600186600101866040516106899190614a31565b90815260200160405180910390205403815481106106a357fe5b906000526020600020906005020160008201518160000190805190602001906106cd9291906139d2565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561071c57fe5b0217905550608082015181600401908051906020019061073d929190613a52565b5090505083600101836040516107539190614a31565b9081526020016040518091039020548460010182600001516040516107789190614a1a565b9081526020016040518091039020819055506000846001018460405161079e9190614a31565b908152602001604051809103902081905550836000018054809190600190036107c79190613af8565b5083600201836040516107da9190614a31565b9081526020016040518091039020600080820160006107f99190613b2a565b505050505050505050565b600080606061081284612c74565b91509150606061082182612a10565b90506000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b82518110156109065760008260010184600184038151811061088b57fe5b60200260200101516040516108a09190614a1a565b90815260200160405180910390205414156108c357600095505050505050610b3e565b816002018360018303815181106108d657fe5b60200260200101516040516108eb9190614a1a565b9081526020016040518091039020915080600101905061086d565b50606060018351116109185783610931565b8260018451038151811061092857fe5b60200260200101515b9050600082600101826040516109479190614a31565b908152602001604051809103902054141561096a57600095505050505050610b3e565b610972613996565b826000016001846001018460405161098a9190614a31565b90815260200160405180910390205403815481106109a457fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610a565780601f10610a2b57610100808354040283529160200191610a56565b820191906000526020600020905b815481529060010190602001808311610a3957829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115610aa257fe5b6002811115610aad57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015610b2557602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411610aef5790505b5050505050815250509050806060015196505050505050505b919050565b600160009054906101000a900460ff16610b85576120006002819055506210000060038190555060018060006101000a81548160ff0219169083151502179055505b6000815111610bc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc090614c2c565b60405180910390fd5b60003390506060610bd983612a10565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015610cea57600082600101846001840381518110610c4357fe5b6020026020010151604051610c589190614a1a565b90815260200160405180910390205411610ca7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9e90614c2c565b60405180910390fd5b81600201836001830381518110610cba57fe5b6020026020010151604051610ccf9190614a1a565b90815260200160405180910390209150806001019050610c25565b50600254816000018054905010610d36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2d90614d4c565b60405180910390fd5b60606001835111610d475784610d60565b82600184510381518110610d5757fe5b60200260200101515b905060008260010182604051610d769190614a31565b90815260200160405180910390205414610dc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbc90614d8c565b60405180910390fd5b610dce81612ff6565b610e0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0490614c4c565b60405180910390fd5b6000610e1985876130d7565b905080610e5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5290614aec565b60405180910390fd5b610e63613996565b82816000018190525060008160200190151590811515815250508360000181908060018154018082558091505090600182039060005260206000209060050201600090919290919091506000820151816000019080519060200190610ec99291906139d2565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff02191690836002811115610f1857fe5b02179055506080820151816004019080519060200190610f39929190613a52565b5050505083600001805490508460010184604051610f579190614a31565b90815260200160405180910390208190555050505050505050565b610f7a61313b565b73ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161480610fdf57503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614155b61101e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101590614bac565b60405180910390fd5b80600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411156110a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109790614c8c565b60405180910390fd5b600054600754820111156110e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e090614b0c565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460076000828254039250508190555080600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550806007600082825401925050819055505050565b60008054905090565b600033905060006111aa82866131d4565b9050600160028111156111b957fe5b8160030160009054906101000a900460ff1660028111156111d657fe5b14611216576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120d90614d6c565b60405180910390fd5b6000600354858161122357fe5b061480156112345750806002015484105b611273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126a90614acc565b60405180910390fd5b600354848260020154031080156112905750838160020154038351145b8061129d57506003548351145b6112dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d390614b6c565b60405180910390fd5b600015158160040160035486816112ef57fe5b04815481106112fa57fe5b90600052602060002090602091828204019190069054906101000a900460ff1615151461135c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135390614b4c565b60405180910390fd5b600061136a838787876133d3565b9050806113ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a390614c6c565b60405180910390fd5b60018260040160035487816113bd57fe5b04815481106113c857fe5b90600052602060002090602091828204019190066101000a81548160ff021916908315150217905550505050505050565b611401613b4e565b6000606061140e86612c74565b9150915061141a613996565b61142483836131d4565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156114c85780601f1061149d576101008083540402835291602001916114c8565b820191906000526020600020905b8154815290600101906020018083116114ab57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561151457fe5b600281111561151f57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561159757602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116115615790505b50505050508152505090506002808111156115ae57fe5b816060015160028111156115be57fe5b146115fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f590614e0c565b60405180910390fd5b60035485111580156116105750600085115b61164f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164690614b6c565b60405180910390fd5b80604001518587011115611698576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168f90614acc565b60405180910390fd5b60006116a684848989613484565b8096508192505050806116ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e590614cec565b60405180910390fd5b505050509392505050565b6000339050600061170a82846131d4565b90506001600281111561171957fe5b8160030160009054906101000a900460ff16600281111561173657fe5b14611776576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176d90614d6c565b60405180910390fd5b60006001905060008260040180549050905060008090505b818110156117e157600015158460040182815481106117a957fe5b90600052602060002090602091828204019190069054906101000a900460ff16151514156117d657600092505b80600101905061178e565b5081611822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181990614ccc565b60405180910390fd5b60028360030160006101000a81548160ff0219169083600281111561184357fe5b021790555060006118548587613517565b905080611896576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188d90614b2c565b60405180910390fd5b505050505050565b6060600060606118ad84612c74565b9150915060606118bc82612a10565b90506000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008090505b82518110156119c65760008260010184838151811061192257fe5b60200260200101516040516119379190614a1a565b90815260200160405180910390205411611986576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197d90614c2c565b60405180910390fd5b8160020183828151811061199657fe5b60200260200101516040516119ab9190614a1a565b90815260200160405180910390209150806001019050611907565b5080600001805480602002602001604051908101604052809291908181526020016000905b82821015611b8e57838290600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611aa75780601f10611a7c57610100808354040283529160200191611aa7565b820191906000526020600020905b815481529060010190602001808311611a8a57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115611af357fe5b6002811115611afe57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015611b7657602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411611b405790505b505050505081525050815260200190600101906119eb565b50505050945050505050919050565b600160009054906101000a900460ff16611bdf576120006002819055506210000060038190555060018060006101000a81548160ff0219169083151502179055505b60003390506305f5e100821115611c2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2290614d2c565b60405180910390fd5b600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205483011115611cee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce590614dac565b60405180910390fd5b6060611cf984612a10565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015611e0a57600082600101846001840381518110611d6357fe5b6020026020010151604051611d789190614a1a565b90815260200160405180910390205411611dc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dbe90614c2c565b60405180910390fd5b81600201836001830381518110611dda57fe5b6020026020010151604051611def9190614a1a565b90815260200160405180910390209150806001019050611d45565b50600254816000018054905010611e56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4d90614d4c565b60405180910390fd5b60606001835111611e675785611e80565b82600184510381518110611e7757fe5b60200260200101515b905060008260010182604051611e969190614a31565b90815260200160405180910390205414611ee5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611edc90614d8c565b60405180910390fd5b611eee81612ff6565b611f2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2490614d0c565b60405180910390fd5b6000611f3a85888861357b565b905080611f7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7390614dec565b60405180910390fd5b6060600354600160035489010381611f9057fe5b04604051908082528060200260200182016040528015611fbf5781602001602082028038833980820191505090505b509050836000016040518060a0016040528085815260200160011515815260200189815260200160016002811115611ff357fe5b8152602001838152509080600181540180825580915050906001820390600052602060002090600502016000909192909190915060008201518160000190805190602001906120439291906139d2565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561209257fe5b021790555060808201518160040190805190602001906120b3929190613a52565b50505050836000018054905084600101846040516120d19190614a31565b90815260200160405180910390208190555086600560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505050505050505050565b6000339050612147613996565b61215182846131d4565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156121f55780601f106121ca576101008083540402835291602001916121f5565b820191906000526020600020905b8154815290600101906020018083116121d857829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561224157fe5b600281111561224c57fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156122c457602002820191906000526020600020906000905b82829054906101000a900460ff1615158152602001906001019060208260000104928301926001038202915080841161228e5790505b5050505050815250509050600060028111156122dc57fe5b816060015160028111156122ec57fe5b141561232d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232490614b8c565b60405180910390fd5b600061233983856135e8565b90508061237b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161237290614bec565b60405180910390fd5b606061238685612a10565b90506000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b825181101561241e57816002018360018303815181106123ee57fe5b60200260200101516040516124039190614a1a565b908152602001604051809103902091508060010190506123d2565b50600060018260010186600001516040516124399190614a1a565b908152602001604051809103902054039050612453613996565b8260000160018460000180549050038154811061246c57fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561251e5780601f106124f35761010080835404028352916020019161251e565b820191906000526020600020905b81548152906001019060200180831161250157829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561256a57fe5b600281111561257557fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156125ed57602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116125b75790505b50505050508152505090508083600001838154811061260857fe5b906000526020600020906005020160008201518160000190805190602001906126329291906139d2565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561268157fe5b021790555060808201518160040190805190602001906126a2929190613a52565b50905050826000018054809190600190036126bd9190613af8565b508260010186600001516040516126d49190614a1a565b9081526020016040518091039020548360010182600001516040516126f99190614a1a565b90815260200160405180910390208190555060008360010187600001516040516127239190614a1a565b9081526020016040518091039020819055508560400151600560008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505050505050505050565b600080606061279e84612c74565b915091506127aa613996565b6127b483836131d4565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156128585780601f1061282d57610100808354040283529160200191612858565b820191906000526020600020905b81548152906001019060200180831161283b57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff1660028111156128a457fe5b60028111156128af57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561292757602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116128f15790505b50505050508152505090506001600281111561293f57fe5b8160600151600281111561294f57fe5b1480612974575060028081111561296257fe5b8160600151600281111561297257fe5b145b6129b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129aa90614d6c565b60405180910390fd5b60006129bf848461364c565b809650819250505080612a07576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129fe90614dcc565b60405180910390fd5b50505050919050565b6060612a1a613b73565b612a23836136b5565b9050612a2d613b73565b612a6b6040518060400160405280600181526020017f2f000000000000000000000000000000000000000000000000000000000000008152506136b5565b905060606001612a8483856136e390919063ffffffff16565b01604051908082528060200260200182016040528015612ab857816020015b6060815260200190600190039081612aa35790505b50905060008090505b8151811015612b0957612ae5612ae0848661375890919063ffffffff16565b613772565b828281518110612af157fe5b60200260200101819052508080600101915050612ac1565b50600081600183510381518110612b1c57fe5b6020026020010151511415612b875780600182510381518110612b3b57fe5b6020026020010160608152506001815103604051908082528060200260200182016040528015612b7f57816020015b6060815260200190600190039081612b6a5790505b509350612bc0565b8051604051908082528060200260200182016040528015612bbc57816020015b6060815260200190600190039081612ba75790505b5093505b60008090505b8451811015612c0757818181518110612bdb57fe5b6020026020010151858281518110612bef57fe5b60200260200101819052508080600101915050612bc6565b50505050919050565b60008060016020601f85510181612c2357fe5b040190506040518481526020810160005b83811015612c55578060200286015181602002830152806001019050612c34565b50602082602085026040018460006010600019f1935050505092915050565b6000606060006028905080845111612cc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cb890614c0c565b60405180910390fd5b6060816040519080825280601f01601f191660200182016040528015612cf65781602001600182028038833980820191505090505b50905060008090505b82811015612d6657858181518110612d1357fe5b602001015160f81c60f81b828281518110612d2a57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050612cff565b50600080905060008090505b83811015612e95576000838281518110612d8857fe5b602001015160f81c60f81b60f81c60ff16905060308110158015612dad575060398111155b80612dc6575060418110158015612dc55750605a8111155b5b80612ddf575060618110158015612dde575060668111155b5b612e1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e1590614c0c565b60405180910390fd5b60308110158015612e30575060398111155b15612e415760308103601084020192505b60418110158015612e535750605a8111155b15612e645760378103601084020192505b60618110158015612e76575060668111155b15612e875760578103601084020192505b508080600101915050612d72565b508094507f2f00000000000000000000000000000000000000000000000000000000000000868481518110612ec657fe5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612f33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f2a90614c0c565b60405180910390fd5b6000600184885103039050806040519080825280601f01601f191660200182016040528015612f715781602001600182028038833980820191505090505b50945060008090505b81811015612fec5760008860018784010181518110612f9557fe5b602001015160f81c60f81b905080878381518110612faf57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350508080600101915050612f7a565b5050505050915091565b600060405160200161300790614a5d565b604051602081830303815290604052805190602001208260405160200161302e9190614a31565b604051602081830303815290604052805190602001201480613099575060405160200161305a90614a48565b60405160208183030381529060405280519060200120826040516020016130819190614a31565b60405160208183030381529060405280519060200120145b806130a5575060008251145b156130b357600090506130d2565b60008251905060ff8111156130cc5760009150506130d2565b60019150505b919050565b60008060016020601f855101816130ea57fe5b040190506040518481526020810160005b8381101561311c5780602002860151816020028301528060010190506130fb565b5060208260208502604001846000600f600019f1935050505092915050565b600073d2001000000000000000000000000000000000d273ffffffffffffffffffffffffffffffffffffffff166383e781fe6040518163ffffffff1660e01b815260040160206040518083038186803b15801561319757600080fd5b505afa1580156131ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506131cf9190810190613da8565b905090565b600060606131e183612a10565b90506000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b82518110156132f25760008260010184600184038151811061324b57fe5b60200260200101516040516132609190614a1a565b908152602001604051809103902054116132af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132a690614c2c565b60405180910390fd5b816002018360018303815181106132c257fe5b60200260200101516040516132d79190614a1a565b9081526020016040518091039020915080600101905061322d565b5060606001835111613304578461331d565b8260018451038151811061331457fe5b60200260200101515b9050600082600101826040516133339190614a31565b90815260200160405180910390205411613382576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161337990614c2c565b60405180910390fd5b6000826000016001846001018460405161339c9190614a31565b90815260200160405180910390205403815481106133b657fe5b906000526020600020906005020190508094505050505092915050565b60008060016020601f855101816133e657fe5b04019050600060016020601f885101816133fc57fe5b040190506040518781526020810160005b8381101561342e57806020028901518160200283015280600101905061340d565b50868360200282015260005b84811015613460578060200287015181856001010160200283015280600101905061343a565b50602082848601602002606001846000600c600019f1945050505050949350505050565b600061348e613b4e565b600060016020601f885101816134a057fe5b0401905060006020601f8601816134b357fe5b0490506040518881526020810160005b848110156134e457806020028a0151816020028301528060010190506134c3565b5083602002810188815287816020015283602002868660030160200285600a600019fa9650505050505094509492505050565b60008060016020601f8551018161352a57fe5b040190506040518481526020810160005b8381101561355c57806020028601518160200283015280600101905061353b565b50602082602085026040018460006011600019f1935050505092915050565b60008060016020601f8651018161358e57fe5b040190506040518581526020810160005b838110156135c057806020028701518160200283015280600101905061359f565b50846020840282015260208260208502604001846000600b600019f193505050509392505050565b60008060016020601f855101816135fb57fe5b040190506040518481526020810160005b8381101561362d57806020028601518160200283015280600101905061360c565b5060208260208502604001846000600e600019f1935050505092915050565b600080600060016020601f8651018161366157fe5b040190506040518581526020810160005b83811015613693578060200287015181602002830152806001019050613672565b506020826020850260200184600d600019fa9450815193505050509250929050565b6136bd613b73565b600060208301905060405180604001604052808451815260200182815250915050919050565b600080826000015161370785600001518660200151866000015187602001516137d4565b0190505b8360000151846020015101811161375157818060010192505082600001516137498560200151830386600001510383866000015187602001516137d4565b01905061370b565b5092915050565b613760613b73565b61376b8383836138af565b5092915050565b60608082600001516040519080825280601f01601f1916602001820160405280156137ac5781602001600182028038833980820191505090505b50905060006020820190506137ca818560200151866000015161394d565b8192505050919050565b600080849050600086851161389f576020851161385957600060018660200360080260020a031960001b905060008186511690506000878a8a0103905060008386511690505b82811461384b57818610613838578a8a0196505050505050506138a7565b858060010196505083865116905061381a565b8596505050505050506138a7565b60008585209050600091505b858803821161389d57600086842090508082141561388957839450505050506138a7565b600184019350508180600101925050613865565b505b868601925050505b949350505050565b6138b7613b73565b60006138d585600001518660200151866000015187602001516137d4565b90508460200151836020018181525050846020015181038360000181815250508460000151856020015101811415613917576000856000018181525050613942565b8360000151836000015101856000018181510391508181525050836000015181018560200181815250505b829150509392505050565b5b60208110613971578151835260208301925060208201915060208103905061394e565b60006001826020036101000a0390508019835116818551168181178652505050505050565b6040518060a001604052806060815260200160001515815260200160008152602001600060028111156139c557fe5b8152602001606081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613a1357805160ff1916838001178555613a41565b82800160010185558215613a41579182015b82811115613a40578251825591602001919060010190613a25565b5b509050613a4e9190613b8d565b5090565b82805482825590600052602060002090601f01602090048101928215613ae75791602002820160005b83821115613ab857835183826101000a81548160ff0219169083151502179055509260200192600101602081600001049283019260010302613a7b565b8015613ae55782816101000a81549060ff0219169055600101602081600001049283019260010302613ab8565b505b509050613af49190613bb2565b5090565b815481835581811115613b2557600502816005028360005260206000209182019101613b249190613be2565b5b505050565b5080546000825560050290600052602060002090810190613b4b9190613be2565b50565b6040518062100000016040528061800090602082028038833980820191505090505090565b604051806040016040528060008152602001600081525090565b613baf91905b80821115613bab576000816000905550600101613b93565b5090565b90565b613bdf91905b80821115613bdb57600081816101000a81549060ff021916905550600101613bb8565b5090565b90565b613c4e91905b80821115613c4a5760008082016000613c019190613c51565b6001820160006101000a81549060ff021916905560028201600090556003820160006101000a81549060ff0219169055600482016000613c419190613c99565b50600501613be8565b5090565b90565b50805460018160011615610100020316600290046000825580601f10613c775750613c96565b601f016020900490600052602060002090810190613c959190613b8d565b5b50565b50805460008255601f016020900490600052602060002090810190613cbe9190613b8d565b50565b600081359050613cd081615086565b92915050565b600081519050613ce581615086565b92915050565b600082601f830112613cfc57600080fd5b8135613d0f613d0a82614e74565b614e47565b91508082526020830160208301858383011115613d2b57600080fd5b613d36838284615026565b50505092915050565b600082601f830112613d5057600080fd5b8135613d63613d5e82614ea0565b614e47565b91508082526020830160208301858383011115613d7f57600080fd5b613d8a838284615026565b50505092915050565b600081359050613da28161509d565b92915050565b600060208284031215613dba57600080fd5b6000613dc884828501613cd6565b91505092915050565b60008060408385031215613de457600080fd5b6000613df285828601613cc1565b9250506020613e0385828601613d93565b9150509250929050565b600060208284031215613e1f57600080fd5b600082013567ffffffffffffffff811115613e3957600080fd5b613e4584828501613d3f565b91505092915050565b60008060408385031215613e6157600080fd5b600083013567ffffffffffffffff811115613e7b57600080fd5b613e8785828601613d3f565b9250506020613e9885828601613d93565b9150509250929050565b600080600060608486031215613eb757600080fd5b600084013567ffffffffffffffff811115613ed157600080fd5b613edd86828701613d3f565b9350506020613eee86828701613d93565b925050604084013567ffffffffffffffff811115613f0b57600080fd5b613f1786828701613ceb565b9150509250925092565b600080600060608486031215613f3657600080fd5b600084013567ffffffffffffffff811115613f5057600080fd5b613f5c86828701613d3f565b9350506020613f6d86828701613d93565b9250506040613f7e86828701613d93565b9150509250925092565b6000613f9483836140f6565b60208301905092915050565b6000613fac8383614105565b60208301905092915050565b6000613fc4838361497f565b905092915050565b6000613fd782614ef6565b613fe18185614f55565b9350613fec83614ecc565b8060005b8381101561401d5781516140048882613f88565b975061400f83614f2e565b925050600181019050613ff0565b5085935050505092915050565b61403381614f01565b61403d8184614f66565b925061404882614edc565b8060005b838110156140795781516140608782613fa0565b965061406b83614f3b565b92505060018101905061404c565b505050505050565b600061408c82614f0d565b6140968185614f71565b9350836020820285016140a885614ee6565b8060005b858110156140e457848403895281516140c58582613fb8565b94506140d083614f48565b925060208a019950506001810190506140ac565b50829750879550505050505092915050565b6140ff81614fc1565b82525050565b61410e81614fcd565b82525050565b61411d81615014565b82525050565b61412c81615014565b82525050565b600061413d82614f23565b6141478185614fa4565b9350614157818560208601615035565b80840191505092915050565b600061416e82614f18565b6141788185614f82565b9350614188818560208601615035565b61419181615068565b840191505092915050565b60006141a782614f18565b6141b18185614fa4565b93506141c1818560208601615035565b80840191505092915050565b60006141da601883614f93565b91507f496e636f7272656374206368756e6b20706f736974696f6e00000000000000006000830152602082019050919050565b600061421a601583614f93565b91507f4469726563746f7279206e6f74206372656174656400000000000000000000006000830152602082019050919050565b600061425a602483614f93565b91507f4e6f7420656e6f756768206d656d6f727920696e207468652046696c6573746f60008301527f72616765000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006142c0601b83614f93565b91507f48617368206861736e2774206265656e2063616c63756c6174656400000000006000830152602082019050919050565b6000614300601983614f93565b91507f4368756e6b20697320616c72656164792075706c6f61646564000000000000006000830152602082019050919050565b6000614340601683614f93565b91507f496e636f7272656374206368756e6b206c656e677468000000000000000000006000830152602082019050919050565b6000614380600f83614f93565b91507f46696c65206e6f742065786973747300000000000000000000000000000000006000830152602082019050919050565b60006143c0600e83614f93565b91507f496e76616c69642073656e6465720000000000000000000000000000000000006000830152602082019050919050565b6000614400601883614f93565b91507f4469726563746f7279206973206e6f742064656c6574656400000000000000006000830152602082019050919050565b6000614440601083614f93565b91507f46696c65206e6f742064656c65746564000000000000000000000000000000006000830152602082019050919050565b6000614480601383614f93565b91507f496e76616c69642073746f7261676550617468000000000000000000000000006000830152602082019050919050565b60006144c0600c83614f93565b91507f496e76616c6964207061746800000000000000000000000000000000000000006000830152602082019050919050565b6000614500600183614fa4565b91507f2e000000000000000000000000000000000000000000000000000000000000006000830152600182019050919050565b6000614540601683614f93565b91507f496e76616c6964206469726563746f7279206e616d65000000000000000000006000830152602082019050919050565b6000614580601583614f93565b91507f4368756e6b207761736e27742075706c6f6164656400000000000000000000006000830152602082019050919050565b60006145c0602683614f93565b91507f436f756c64206e6f742072657365727665206c657373207468616e207573656460008301527f20737061636500000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614626601683614f93565b91507f4469726563746f7279206973206e6f7420656d707479000000000000000000006000830152602082019050919050565b6000614666602383614f93565b91507f46696c65206861736e2774206265656e2075706c6f6164656420636f7272656360008301527f746c7900000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006146cc601183614f93565b91507f4368756e6b207761736e277420726561640000000000000000000000000000006000830152602082019050919050565b600061470c601883614f93565b91507f46696c656e616d652073686f756c64206265203c2032353600000000000000006000830152602082019050919050565b600061474c601f83614f93565b91507f46696c652073686f756c64206265206c657373207468616e20313030204d42006000830152602082019050919050565b600061478c600283614fa4565b91507f2e2e0000000000000000000000000000000000000000000000000000000000006000830152600282019050919050565b60006147cc601183614f93565b91507f4469726563746f72792069732066756c6c0000000000000000000000000000006000830152602082019050919050565b600061480c600e83614f93565b91507f46696c65206e6f7420666f756e640000000000000000000000000000000000006000830152602082019050919050565b600061484c601883614f93565b91507f46696c65206f72206469726563746f72792065786973747300000000000000006000830152602082019050919050565b600061488c601983614f93565b91507f4e6f7420656e6f756768207265736572766564207370616365000000000000006000830152602082019050919050565b60006148cc601883614f93565b91507f45564d206572726f7220696e2067657446696c6553697a6500000000000000006000830152602082019050919050565b600061490c601083614f93565b91507f46696c65206e6f742063726561746564000000000000000000000000000000006000830152602082019050919050565b600061494c601983614f93565b91507f46696c65206861736e2774206265656e2075706c6f61646564000000000000006000830152602082019050919050565b600060a083016000830151848203600086015261499c8282614163565b91505060208301516149b160208601826140f6565b5060408301516149c460408601826149fc565b5060608301516149d76060860182614114565b50608083015184820360808601526149ef8282613fcc565b9150508091505092915050565b614a058161500a565b82525050565b614a148161500a565b82525050565b6000614a26828461419c565b915081905092915050565b6000614a3d8284614132565b915081905092915050565b6000614a53826144f3565b9150819050919050565b6000614a688261477f565b9150819050919050565b60006210000082019050614a89600083018461402a565b92915050565b60006020820190508181036000830152614aa98184614081565b905092915050565b6000602082019050614ac66000830184614123565b92915050565b60006020820190508181036000830152614ae5816141cd565b9050919050565b60006020820190508181036000830152614b058161420d565b9050919050565b60006020820190508181036000830152614b258161424d565b9050919050565b60006020820190508181036000830152614b45816142b3565b9050919050565b60006020820190508181036000830152614b65816142f3565b9050919050565b60006020820190508181036000830152614b8581614333565b9050919050565b60006020820190508181036000830152614ba581614373565b9050919050565b60006020820190508181036000830152614bc5816143b3565b9050919050565b60006020820190508181036000830152614be5816143f3565b9050919050565b60006020820190508181036000830152614c0581614433565b9050919050565b60006020820190508181036000830152614c2581614473565b9050919050565b60006020820190508181036000830152614c45816144b3565b9050919050565b60006020820190508181036000830152614c6581614533565b9050919050565b60006020820190508181036000830152614c8581614573565b9050919050565b60006020820190508181036000830152614ca5816145b3565b9050919050565b60006020820190508181036000830152614cc581614619565b9050919050565b60006020820190508181036000830152614ce581614659565b9050919050565b60006020820190508181036000830152614d05816146bf565b9050919050565b60006020820190508181036000830152614d25816146ff565b9050919050565b60006020820190508181036000830152614d458161473f565b9050919050565b60006020820190508181036000830152614d65816147bf565b9050919050565b60006020820190508181036000830152614d85816147ff565b9050919050565b60006020820190508181036000830152614da58161483f565b9050919050565b60006020820190508181036000830152614dc58161487f565b9050919050565b60006020820190508181036000830152614de5816148bf565b9050919050565b60006020820190508181036000830152614e05816148ff565b9050919050565b60006020820190508181036000830152614e258161493f565b9050919050565b6000602082019050614e416000830184614a0b565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614e6a57600080fd5b8060405250919050565b600067ffffffffffffffff821115614e8b57600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614eb757600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050919050565b6000819050602082019050919050565b600081519050919050565b60006180009050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614fba82614fea565b9050919050565b60008115159050919050565b6000819050919050565b6000819050614fe582615079565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061501f82614fd7565b9050919050565b82818337600083830152505050565b60005b83811015615053578082015181840152602081019050615038565b83811115615062576000848401525b50505050565b6000601f19601f8301169050919050565b6003811061508357fe5b50565b61508f81614faf565b811461509a57600080fd5b50565b6150a68161500a565b81146150b157600080fd5b5056fea365627a7a72315820314a90e541327f2678eaf7815f54348c3702e4fa45cdf1d5595b378d08af86896c6578706572696d656e74616cf564736f6c634300050d0040", + "storage": { + "0x0": "2868903936" + }, + "nonce": "0" + }, + "0x69362535ec535F0643cBf62D16aDeDCAf32Ee6F7": { + "balance": "0", + "code": "0x608060405234801561001057600080fd5b50600436106100b45760003560e01c806379210e8e1161007157806379210e8e1461017757806381a8235a146101a757806385aeeb17146101c35780639a9a5593146101f3578063a99100541461020f578063b57321221461022b576100b4565b806307c6e7d3146100b9578063122f4fba146100d55780631c6ec7a9146101055780631cfe4e3b14610121578063373dedb41461013d57806361e46db51461015b575b600080fd5b6100d360048036036100ce9190810190613e94565b61025b565b005b6100ef60048036036100ea9190810190613e94565b610862565b6040516100fc9190614b38565b60405180910390f35b61011f600480360361011a9190810190613e94565b610ba1565b005b61013b60048036036101369190810190613e58565b610fce565b005b6101456111ec565b6040516101529190614eb3565b60405180910390f35b61017560048036036101709190810190613f29565b6111f6565b005b610191600480360361018c9190810190613fa8565b611456565b60405161019e9190614af9565b60405180910390f35b6101c160048036036101bc9190810190613e94565b611756565b005b6101dd60048036036101d89190810190613e94565b6118fb565b6040516101ea9190614b16565b60405180910390f35b61020d60048036036102089190810190613ed5565b611bfa565b005b61022960048036036102249190810190613e94565b612195565b005b61024560048036036102409190810190613e94565b612849565b6040516102529190614eb3565b60405180910390f35b6000339050606061026b83612ac9565b90506000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b825181101561037c576000826001018460018403815181106102d557fe5b60200260200101516040516102ea9190614aa1565b90815260200160405180910390205411610339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161033090614cb3565b60405180910390fd5b8160020183600183038151811061034c57fe5b60200260200101516040516103619190614aa1565b908152602001604051809103902091508060010190506102b7565b506060600183511161038e57846103a7565b8260018451038151811061039e57fe5b60200260200101515b9050600082600101826040516103bd9190614ab8565b9081526020016040518091039020541161040c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161040390614cb3565b60405180910390fd5b600082600201826040516104209190614ab8565b90815260200160405180910390206000018054905014610475576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161046c90614d33565b60405180910390fd5b60006104818587612cc9565b9050806104c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ba90614c53565b60405180910390fd5b6104cb613a4f565b836000016001856000018054905003815481106104e457fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156105965780601f1061056b57610100808354040283529160200191610596565b820191906000526020600020905b81548152906001019060200180831161057957829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff1660028111156105e257fe5b60028111156105ed57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561066557602002820191906000526020600020906000905b82829054906101000a900460ff1615158152602001906001019060208260000104928301926001038202915080841161062f5790505b50505050508152505090508084600001600186600101866040516106899190614ab8565b90815260200160405180910390205403815481106106a357fe5b906000526020600020906005020160008201518160000190805190602001906106cd929190613a8b565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561071c57fe5b0217905550608082015181600401908051906020019061073d929190613b0b565b5090505083600101836040516107539190614ab8565b9081526020016040518091039020548460010182600001516040516107789190614aa1565b9081526020016040518091039020819055506000846001018460405161079e9190614ab8565b908152602001604051809103902081905550836000018054806107bd57fe5b6001900381819060005260206000209060050201600080820160006107e29190613bb1565b6001820160006101000a81549060ff021916905560028201600090556003820160006101000a81549060ff02191690556004820160006108229190613bf9565b5050905583600201836040516108389190614ab8565b9081526020016040518091039020600080820160006108579190613c21565b505050505050505050565b600080606061087084612d2d565b91509150606061087f82612ac9565b90506000600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015610964576000826001018460018403815181106108e957fe5b60200260200101516040516108fe9190614aa1565b908152602001604051809103902054141561092157600095505050505050610b9c565b8160020183600183038151811061093457fe5b60200260200101516040516109499190614aa1565b908152602001604051809103902091508060010190506108cb565b5060606001835111610976578361098f565b8260018451038151811061098657fe5b60200260200101515b9050600082600101826040516109a59190614ab8565b90815260200160405180910390205414156109c857600095505050505050610b9c565b6109d0613a4f565b82600001600184600101846040516109e89190614ab8565b9081526020016040518091039020540381548110610a0257fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610ab45780601f10610a8957610100808354040283529160200191610ab4565b820191906000526020600020905b815481529060010190602001808311610a9757829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115610b0057fe5b6002811115610b0b57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015610b8357602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411610b4d5790505b5050505050815250509050806060015196505050505050505b919050565b600360009054906101000a900460ff16610be457612000600481905550621000006005819055506001600360006101000a81548160ff0219169083151502179055505b6000815111610c28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1f90614cb3565b60405180910390fd5b60003390506060610c3883612ac9565b90506000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015610d4957600082600101846001840381518110610ca257fe5b6020026020010151604051610cb79190614aa1565b90815260200160405180910390205411610d06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cfd90614cb3565b60405180910390fd5b81600201836001830381518110610d1957fe5b6020026020010151604051610d2e9190614aa1565b90815260200160405180910390209150806001019050610c84565b50600454816000018054905010610d95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8c90614dd3565b60405180910390fd5b60606001835111610da65784610dbf565b82600184510381518110610db657fe5b60200260200101515b905060008260010182604051610dd59190614ab8565b90815260200160405180910390205414610e24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1b90614e13565b60405180910390fd5b610e2d816130af565b610e6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6390614cd3565b60405180910390fd5b6000610e788587613190565b905080610eba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb190614b73565b60405180910390fd5b610ec2613a4f565b8281600001819052506000816020019015159081151581525050836000018190806001815401808255809150506001900390600052602060002090600502016000909190919091506000820151816000019080519060200190610f26929190613a8b565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff02191690836002811115610f7557fe5b02179055506080820151816004019080519060200190610f96929190613b0b565b50505083600001805490508460010184604051610fb39190614ab8565b90815260200160405180910390208190555050505050505050565b610fd66131f4565b73ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16148061103b57503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614155b61107a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107190614c33565b60405180910390fd5b80600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411156110fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f390614d13565b60405180910390fd5b60025460095482011115611145576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113c90614b93565b60405180910390fd5b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460096000828254039250508190555080600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550806009600082825401925050819055505050565b6000600254905090565b60003390506000611207828661328d565b90506001600281111561121657fe5b8160030160009054906101000a900460ff16600281111561123357fe5b14611273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126a90614df3565b60405180910390fd5b6000600554858161128057fe5b061480156112915750806002015484105b6112d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c790614b53565b60405180910390fd5b600554848260020154031080156112ed5750838160020154038351145b806112fa57506005548351145b611339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133090614bf3565b60405180910390fd5b6000151581600401600554868161134c57fe5b048154811061135757fe5b90600052602060002090602091828204019190069054906101000a900460ff161515146113b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b090614bd3565b60405180910390fd5b60006113c78387878761348c565b905080611409576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140090614cf3565b60405180910390fd5b600182600401600554878161141a57fe5b048154811061142557fe5b90600052602060002090602091828204019190066101000a81548160ff021916908315150217905550505050505050565b61145e613c45565b6000606061146b86612d2d565b91509150611477613a4f565b611481838361328d565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156115255780601f106114fa57610100808354040283529160200191611525565b820191906000526020600020905b81548152906001019060200180831161150857829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561157157fe5b600281111561157c57fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156115f457602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116115be5790505b505050505081525050905060028081111561160b57fe5b8160600151600281111561161b57fe5b1461165b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165290614e93565b60405180910390fd5b600554851115801561166d5750600085115b6116ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a390614bf3565b60405180910390fd5b806040015185870111156116f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ec90614b53565b60405180910390fd5b60006117038484898961353d565b80965081925050508061174b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174290614d73565b60405180910390fd5b505050509392505050565b60003390506000611767828461328d565b90506001600281111561177657fe5b8160030160009054906101000a900460ff16600281111561179357fe5b146117d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ca90614df3565b60405180910390fd5b60006001905060008260040180549050905060008090505b8181101561183e576000151584600401828154811061180657fe5b90600052602060002090602091828204019190069054906101000a900460ff161515141561183357600092505b8060010190506117eb565b508161187f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187690614d53565b60405180910390fd5b60028360030160006101000a81548160ff021916908360028111156118a057fe5b021790555060006118b185876135d0565b9050806118f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ea90614bb3565b60405180910390fd5b505050505050565b60606000606061190a84612d2d565b91509150606061191982612ac9565b90506000600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008090505b8251811015611a235760008260010184838151811061197f57fe5b60200260200101516040516119949190614aa1565b908152602001604051809103902054116119e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119da90614cb3565b60405180910390fd5b816002018382815181106119f357fe5b6020026020010151604051611a089190614aa1565b90815260200160405180910390209150806001019050611964565b5080600001805480602002602001604051908101604052809291908181526020016000905b82821015611beb57838290600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611b045780601f10611ad957610100808354040283529160200191611b04565b820191906000526020600020905b815481529060010190602001808311611ae757829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115611b5057fe5b6002811115611b5b57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015611bd357602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411611b9d5790505b50505050508152505081526020019060010190611a48565b50505050945050505050919050565b600360009054906101000a900460ff16611c3d57612000600481905550621000006005819055506001600360006101000a81548160ff0219169083151502179055505b60003390506305f5e100821115611c89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8090614db3565b60405180910390fd5b600660008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205483011115611d4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4390614e33565b60405180910390fd5b6060611d5784612ac9565b90506000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015611e6857600082600101846001840381518110611dc157fe5b6020026020010151604051611dd69190614aa1565b90815260200160405180910390205411611e25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1c90614cb3565b60405180910390fd5b81600201836001830381518110611e3857fe5b6020026020010151604051611e4d9190614aa1565b90815260200160405180910390209150806001019050611da3565b50600454816000018054905010611eb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eab90614dd3565b60405180910390fd5b60606001835111611ec55785611ede565b82600184510381518110611ed557fe5b60200260200101515b905060008260010182604051611ef49190614ab8565b90815260200160405180910390205414611f43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3a90614e13565b60405180910390fd5b611f4c816130af565b611f8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8290614d93565b60405180910390fd5b6000611f98858888613634565b905080611fda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd190614e73565b60405180910390fd5b6060600554600160055489010381611fee57fe5b0460405190808252806020026020018201604052801561201d5781602001602082028038833980820191505090505b509050836000016040518060a001604052808581526020016001151581526020018981526020016001600281111561205157fe5b8152602001838152509080600181540180825580915050600190039060005260206000209060050201600090919091909150600082015181600001908051906020019061209f929190613a8b565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff021916908360028111156120ee57fe5b0217905550608082015181600401908051906020019061210f929190613b0b565b5050508360000180549050846001018460405161212c9190614ab8565b90815260200160405180910390208190555086600760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505050505050505050565b60003390506121a2613a4f565b6121ac828461328d565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156122505780601f1061222557610100808354040283529160200191612250565b820191906000526020600020905b81548152906001019060200180831161223357829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561229c57fe5b60028111156122a757fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561231f57602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116122e95790505b50505050508152505090506000600281111561233757fe5b8160600151600281111561234757fe5b1415612388576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161237f90614c13565b60405180910390fd5b600061239483856136a1565b9050806123d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123cd90614c73565b60405180910390fd5b60606123e185612ac9565b90506000600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015612479578160020183600183038151811061244957fe5b602002602001015160405161245e9190614aa1565b9081526020016040518091039020915080600101905061242d565b50600060018260010186600001516040516124949190614aa1565b9081526020016040518091039020540390506124ae613a4f565b826000016001846000018054905003815481106124c757fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156125795780601f1061254e57610100808354040283529160200191612579565b820191906000526020600020905b81548152906001019060200180831161255c57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff1660028111156125c557fe5b60028111156125d057fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561264857602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116126125790505b50505050508152505090508083600001838154811061266357fe5b9060005260206000209060050201600082015181600001908051906020019061268d929190613a8b565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff021916908360028111156126dc57fe5b021790555060808201518160040190805190602001906126fd929190613b0b565b509050508260000180548061270e57fe5b6001900381819060005260206000209060050201600080820160006127339190613bb1565b6001820160006101000a81549060ff021916905560028201600090556003820160006101000a81549060ff02191690556004820160006127739190613bf9565b5050905582600101866000015160405161278d9190614aa1565b9081526020016040518091039020548360010182600001516040516127b29190614aa1565b90815260200160405180910390208190555060008360010187600001516040516127dc9190614aa1565b9081526020016040518091039020819055508560400151600760008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505050505050505050565b600080606061285784612d2d565b91509150612863613a4f565b61286d838361328d565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156129115780601f106128e657610100808354040283529160200191612911565b820191906000526020600020905b8154815290600101906020018083116128f457829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561295d57fe5b600281111561296857fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156129e057602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116129aa5790505b5050505050815250509050600160028111156129f857fe5b81606001516002811115612a0857fe5b1480612a2d5750600280811115612a1b57fe5b81606001516002811115612a2b57fe5b145b612a6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a6390614df3565b60405180910390fd5b6000612a788484613705565b809650819250505080612ac0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ab790614e53565b60405180910390fd5b50505050919050565b6060612ad3613c6a565b612adc8361376e565b9050612ae6613c6a565b612b246040518060400160405280600181526020017f2f0000000000000000000000000000000000000000000000000000000000000081525061376e565b905060606001612b3d838561379c90919063ffffffff16565b01604051908082528060200260200182016040528015612b7157816020015b6060815260200190600190039081612b5c5790505b50905060008090505b8151811015612bc257612b9e612b99848661381190919063ffffffff16565b61382b565b828281518110612baa57fe5b60200260200101819052508080600101915050612b7a565b50600081600183510381518110612bd557fe5b6020026020010151511415612c405780600182510381518110612bf457fe5b6020026020010160608152506001815103604051908082528060200260200182016040528015612c3857816020015b6060815260200190600190039081612c235790505b509350612c79565b8051604051908082528060200260200182016040528015612c7557816020015b6060815260200190600190039081612c605790505b5093505b60008090505b8451811015612cc057818181518110612c9457fe5b6020026020010151858281518110612ca857fe5b60200260200101819052508080600101915050612c7f565b50505050919050565b60008060016020601f85510181612cdc57fe5b040190506040518481526020810160005b83811015612d0e578060200286015181602002830152806001019050612ced565b50602082602085026040018460006010600019f1935050505092915050565b6000606060006028905080845111612d7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d7190614c93565b60405180910390fd5b6060816040519080825280601f01601f191660200182016040528015612daf5781602001600182028038833980820191505090505b50905060008090505b82811015612e1f57858181518110612dcc57fe5b602001015160f81c60f81b828281518110612de357fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050612db8565b50600080905060008090505b83811015612f4e576000838281518110612e4157fe5b602001015160f81c60f81b60f81c60ff16905060308110158015612e66575060398111155b80612e7f575060418110158015612e7e5750605a8111155b5b80612e98575060618110158015612e97575060668111155b5b612ed7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ece90614c93565b60405180910390fd5b60308110158015612ee9575060398111155b15612efa5760308103601084020192505b60418110158015612f0c5750605a8111155b15612f1d5760378103601084020192505b60618110158015612f2f575060668111155b15612f405760578103601084020192505b508080600101915050612e2b565b508094507f2f00000000000000000000000000000000000000000000000000000000000000868481518110612f7f57fe5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612fec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fe390614c93565b60405180910390fd5b6000600184885103039050806040519080825280601f01601f19166020018201604052801561302a5781602001600182028038833980820191505090505b50945060008090505b818110156130a5576000886001878401018151811061304e57fe5b602001015160f81c60f81b90508087838151811061306857fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350508080600101915050613033565b5050505050915091565b60006040516020016130c090614ae4565b60405160208183030381529060405280519060200120826040516020016130e79190614ab8565b604051602081830303815290604052805190602001201480613152575060405160200161311390614acf565b604051602081830303815290604052805190602001208260405160200161313a9190614ab8565b60405160208183030381529060405280519060200120145b8061315e575060008251145b1561316c576000905061318b565b60008251905060ff81111561318557600091505061318b565b60019150505b919050565b60008060016020601f855101816131a357fe5b040190506040518481526020810160005b838110156131d55780602002860151816020028301528060010190506131b4565b5060208260208502604001846000600f600019f1935050505092915050565b600073d2001000000000000000000000000000000000d273ffffffffffffffffffffffffffffffffffffffff166383e781fe6040518163ffffffff1660e01b815260040160206040518083038186803b15801561325057600080fd5b505afa158015613264573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506132889190810190613e2f565b905090565b6000606061329a83612ac9565b90506000600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b82518110156133ab5760008260010184600184038151811061330457fe5b60200260200101516040516133199190614aa1565b90815260200160405180910390205411613368576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161335f90614cb3565b60405180910390fd5b8160020183600183038151811061337b57fe5b60200260200101516040516133909190614aa1565b908152602001604051809103902091508060010190506132e6565b50606060018351116133bd57846133d6565b826001845103815181106133cd57fe5b60200260200101515b9050600082600101826040516133ec9190614ab8565b9081526020016040518091039020541161343b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161343290614cb3565b60405180910390fd5b600082600001600184600101846040516134559190614ab8565b908152602001604051809103902054038154811061346f57fe5b906000526020600020906005020190508094505050505092915050565b60008060016020601f8551018161349f57fe5b04019050600060016020601f885101816134b557fe5b040190506040518781526020810160005b838110156134e75780602002890151816020028301528060010190506134c6565b50868360200282015260005b8481101561351957806020028701518185600101016020028301528060010190506134f3565b50602082848601602002606001846000600c600019f1945050505050949350505050565b6000613547613c45565b600060016020601f8851018161355957fe5b0401905060006020601f86018161356c57fe5b0490506040518881526020810160005b8481101561359d57806020028a01518160200283015280600101905061357c565b5083602002810188815287816020015283602002868660030160200285600a600019fa9650505050505094509492505050565b60008060016020601f855101816135e357fe5b040190506040518481526020810160005b838110156136155780602002860151816020028301528060010190506135f4565b50602082602085026040018460006011600019f1935050505092915050565b60008060016020601f8651018161364757fe5b040190506040518581526020810160005b83811015613679578060200287015181602002830152806001019050613658565b50846020840282015260208260208502604001846000600b600019f193505050509392505050565b60008060016020601f855101816136b457fe5b040190506040518481526020810160005b838110156136e65780602002860151816020028301528060010190506136c5565b5060208260208502604001846000600e600019f1935050505092915050565b600080600060016020601f8651018161371a57fe5b040190506040518581526020810160005b8381101561374c57806020028701518160200283015280600101905061372b565b506020826020850260200184600d600019fa9450815193505050509250929050565b613776613c6a565b600060208301905060405180604001604052808451815260200182815250915050919050565b60008082600001516137c0856000015186602001518660000151876020015161388d565b0190505b8360000151846020015101811161380a578180600101925050826000015161380285602001518303866000015103838660000151876020015161388d565b0190506137c4565b5092915050565b613819613c6a565b613824838383613968565b5092915050565b60608082600001516040519080825280601f01601f1916602001820160405280156138655781602001600182028038833980820191505090505b50905060006020820190506138838185602001518660000151613a06565b8192505050919050565b6000808490506000868511613958576020851161391257600060018660200360080260020a031960001b905060008186511690506000878a8a0103905060008386511690505b828114613904578186106138f1578a8a019650505050505050613960565b85806001019650508386511690506138d3565b859650505050505050613960565b60008585209050600091505b85880382116139565760008684209050808214156139425783945050505050613960565b60018401935050818060010192505061391e565b505b868601925050505b949350505050565b613970613c6a565b600061398e856000015186602001518660000151876020015161388d565b905084602001518360200181815250508460200151810383600001818152505084600001518560200151018114156139d05760008560000181815250506139fb565b8360000151836000015101856000018181510391508181525050836000015181018560200181815250505b829150509392505050565b5b60208110613a2a5781518352602083019250602082019150602081039050613a07565b60006001826020036101000a0390508019835116818551168181178652505050505050565b6040518060a00160405280606081526020016000151581526020016000815260200160006002811115613a7e57fe5b8152602001606081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613acc57805160ff1916838001178555613afa565b82800160010185558215613afa579182015b82811115613af9578251825591602001919060010190613ade565b5b509050613b079190613c84565b5090565b82805482825590600052602060002090601f01602090048101928215613ba05791602002820160005b83821115613b7157835183826101000a81548160ff0219169083151502179055509260200192600101602081600001049283019260010302613b34565b8015613b9e5782816101000a81549060ff0219169055600101602081600001049283019260010302613b71565b505b509050613bad9190613ca9565b5090565b50805460018160011615610100020316600290046000825580601f10613bd75750613bf6565b601f016020900490600052602060002090810190613bf59190613c84565b5b50565b50805460008255601f016020900490600052602060002090810190613c1e9190613c84565b50565b5080546000825560050290600052602060002090810190613c429190613cd9565b50565b6040518062100000016040528061800090602082028038833980820191505090505090565b604051806040016040528060008152602001600081525090565b613ca691905b80821115613ca2576000816000905550600101613c8a565b5090565b90565b613cd691905b80821115613cd257600081816101000a81549060ff021916905550600101613caf565b5090565b90565b613d4591905b80821115613d415760008082016000613cf89190613bb1565b6001820160006101000a81549060ff021916905560028201600090556003820160006101000a81549060ff0219169055600482016000613d389190613bf9565b50600501613cdf565b5090565b90565b600081359050613d578161510d565b92915050565b600081519050613d6c8161510d565b92915050565b600082601f830112613d8357600080fd5b8135613d96613d9182614efb565b614ece565b91508082526020830160208301858383011115613db257600080fd5b613dbd8382846150ad565b50505092915050565b600082601f830112613dd757600080fd5b8135613dea613de582614f27565b614ece565b91508082526020830160208301858383011115613e0657600080fd5b613e118382846150ad565b50505092915050565b600081359050613e2981615124565b92915050565b600060208284031215613e4157600080fd5b6000613e4f84828501613d5d565b91505092915050565b60008060408385031215613e6b57600080fd5b6000613e7985828601613d48565b9250506020613e8a85828601613e1a565b9150509250929050565b600060208284031215613ea657600080fd5b600082013567ffffffffffffffff811115613ec057600080fd5b613ecc84828501613dc6565b91505092915050565b60008060408385031215613ee857600080fd5b600083013567ffffffffffffffff811115613f0257600080fd5b613f0e85828601613dc6565b9250506020613f1f85828601613e1a565b9150509250929050565b600080600060608486031215613f3e57600080fd5b600084013567ffffffffffffffff811115613f5857600080fd5b613f6486828701613dc6565b9350506020613f7586828701613e1a565b925050604084013567ffffffffffffffff811115613f9257600080fd5b613f9e86828701613d72565b9150509250925092565b600080600060608486031215613fbd57600080fd5b600084013567ffffffffffffffff811115613fd757600080fd5b613fe386828701613dc6565b9350506020613ff486828701613e1a565b925050604061400586828701613e1a565b9150509250925092565b600061401b838361417d565b60208301905092915050565b6000614033838361418c565b60208301905092915050565b600061404b8383614a06565b905092915050565b600061405e82614f7d565b6140688185614fdc565b935061407383614f53565b8060005b838110156140a457815161408b888261400f565b975061409683614fb5565b925050600181019050614077565b5085935050505092915050565b6140ba81614f88565b6140c48184614fed565b92506140cf82614f63565b8060005b838110156141005781516140e78782614027565b96506140f283614fc2565b9250506001810190506140d3565b505050505050565b600061411382614f94565b61411d8185614ff8565b93508360208202850161412f85614f6d565b8060005b8581101561416b578484038952815161414c858261403f565b945061415783614fcf565b925060208a01995050600181019050614133565b50829750879550505050505092915050565b61418681615048565b82525050565b61419581615054565b82525050565b6141a48161509b565b82525050565b6141b38161509b565b82525050565b60006141c482614faa565b6141ce818561502b565b93506141de8185602086016150bc565b80840191505092915050565b60006141f582614f9f565b6141ff8185615009565b935061420f8185602086016150bc565b614218816150ef565b840191505092915050565b600061422e82614f9f565b614238818561502b565b93506142488185602086016150bc565b80840191505092915050565b600061426160188361501a565b91507f496e636f7272656374206368756e6b20706f736974696f6e00000000000000006000830152602082019050919050565b60006142a160158361501a565b91507f4469726563746f7279206e6f74206372656174656400000000000000000000006000830152602082019050919050565b60006142e160248361501a565b91507f4e6f7420656e6f756768206d656d6f727920696e207468652046696c6573746f60008301527f72616765000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614347601b8361501a565b91507f48617368206861736e2774206265656e2063616c63756c6174656400000000006000830152602082019050919050565b600061438760198361501a565b91507f4368756e6b20697320616c72656164792075706c6f61646564000000000000006000830152602082019050919050565b60006143c760168361501a565b91507f496e636f7272656374206368756e6b206c656e677468000000000000000000006000830152602082019050919050565b6000614407600f8361501a565b91507f46696c65206e6f742065786973747300000000000000000000000000000000006000830152602082019050919050565b6000614447600e8361501a565b91507f496e76616c69642073656e6465720000000000000000000000000000000000006000830152602082019050919050565b600061448760188361501a565b91507f4469726563746f7279206973206e6f742064656c6574656400000000000000006000830152602082019050919050565b60006144c760108361501a565b91507f46696c65206e6f742064656c65746564000000000000000000000000000000006000830152602082019050919050565b600061450760138361501a565b91507f496e76616c69642073746f7261676550617468000000000000000000000000006000830152602082019050919050565b6000614547600c8361501a565b91507f496e76616c6964207061746800000000000000000000000000000000000000006000830152602082019050919050565b600061458760018361502b565b91507f2e000000000000000000000000000000000000000000000000000000000000006000830152600182019050919050565b60006145c760168361501a565b91507f496e76616c6964206469726563746f7279206e616d65000000000000000000006000830152602082019050919050565b600061460760158361501a565b91507f4368756e6b207761736e27742075706c6f6164656400000000000000000000006000830152602082019050919050565b600061464760268361501a565b91507f436f756c64206e6f742072657365727665206c657373207468616e207573656460008301527f20737061636500000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006146ad60168361501a565b91507f4469726563746f7279206973206e6f7420656d707479000000000000000000006000830152602082019050919050565b60006146ed60238361501a565b91507f46696c65206861736e2774206265656e2075706c6f6164656420636f7272656360008301527f746c7900000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061475360118361501a565b91507f4368756e6b207761736e277420726561640000000000000000000000000000006000830152602082019050919050565b600061479360188361501a565b91507f46696c656e616d652073686f756c64206265203c2032353600000000000000006000830152602082019050919050565b60006147d3601f8361501a565b91507f46696c652073686f756c64206265206c657373207468616e20313030204d42006000830152602082019050919050565b600061481360028361502b565b91507f2e2e0000000000000000000000000000000000000000000000000000000000006000830152600282019050919050565b600061485360118361501a565b91507f4469726563746f72792069732066756c6c0000000000000000000000000000006000830152602082019050919050565b6000614893600e8361501a565b91507f46696c65206e6f7420666f756e640000000000000000000000000000000000006000830152602082019050919050565b60006148d360188361501a565b91507f46696c65206f72206469726563746f72792065786973747300000000000000006000830152602082019050919050565b600061491360198361501a565b91507f4e6f7420656e6f756768207265736572766564207370616365000000000000006000830152602082019050919050565b600061495360188361501a565b91507f45564d206572726f7220696e2067657446696c6553697a6500000000000000006000830152602082019050919050565b600061499360108361501a565b91507f46696c65206e6f742063726561746564000000000000000000000000000000006000830152602082019050919050565b60006149d360198361501a565b91507f46696c65206861736e2774206265656e2075706c6f61646564000000000000006000830152602082019050919050565b600060a0830160008301518482036000860152614a2382826141ea565b9150506020830151614a38602086018261417d565b506040830151614a4b6040860182614a83565b506060830151614a5e606086018261419b565b5060808301518482036080860152614a768282614053565b9150508091505092915050565b614a8c81615091565b82525050565b614a9b81615091565b82525050565b6000614aad8284614223565b915081905092915050565b6000614ac482846141b9565b915081905092915050565b6000614ada8261457a565b9150819050919050565b6000614aef82614806565b9150819050919050565b60006210000082019050614b1060008301846140b1565b92915050565b60006020820190508181036000830152614b308184614108565b905092915050565b6000602082019050614b4d60008301846141aa565b92915050565b60006020820190508181036000830152614b6c81614254565b9050919050565b60006020820190508181036000830152614b8c81614294565b9050919050565b60006020820190508181036000830152614bac816142d4565b9050919050565b60006020820190508181036000830152614bcc8161433a565b9050919050565b60006020820190508181036000830152614bec8161437a565b9050919050565b60006020820190508181036000830152614c0c816143ba565b9050919050565b60006020820190508181036000830152614c2c816143fa565b9050919050565b60006020820190508181036000830152614c4c8161443a565b9050919050565b60006020820190508181036000830152614c6c8161447a565b9050919050565b60006020820190508181036000830152614c8c816144ba565b9050919050565b60006020820190508181036000830152614cac816144fa565b9050919050565b60006020820190508181036000830152614ccc8161453a565b9050919050565b60006020820190508181036000830152614cec816145ba565b9050919050565b60006020820190508181036000830152614d0c816145fa565b9050919050565b60006020820190508181036000830152614d2c8161463a565b9050919050565b60006020820190508181036000830152614d4c816146a0565b9050919050565b60006020820190508181036000830152614d6c816146e0565b9050919050565b60006020820190508181036000830152614d8c81614746565b9050919050565b60006020820190508181036000830152614dac81614786565b9050919050565b60006020820190508181036000830152614dcc816147c6565b9050919050565b60006020820190508181036000830152614dec81614846565b9050919050565b60006020820190508181036000830152614e0c81614886565b9050919050565b60006020820190508181036000830152614e2c816148c6565b9050919050565b60006020820190508181036000830152614e4c81614906565b9050919050565b60006020820190508181036000830152614e6c81614946565b9050919050565b60006020820190508181036000830152614e8c81614986565b9050919050565b60006020820190508181036000830152614eac816149c6565b9050919050565b6000602082019050614ec86000830184614a92565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614ef157600080fd5b8060405250919050565b600067ffffffffffffffff821115614f1257600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614f3e57600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050919050565b6000819050602082019050919050565b600081519050919050565b60006180009050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061504182615071565b9050919050565b60008115159050919050565b6000819050919050565b600081905061506c82615100565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006150a68261505e565b9050919050565b82818337600083830152505050565b60005b838110156150da5780820151818401526020810190506150bf565b838111156150e9576000848401525b50505050565b6000601f19601f8301169050919050565b6003811061510a57fe5b50565b61511681615036565b811461512157600080fd5b50565b61512d81615091565b811461513857600080fd5b5056fea2646970667358221220a549ad9e778ae8bb3048c0a1805e77745871cc1560637ae1c3ebccb76638d9c464736f6c63430006020033", + "storage": { + "0x0": "2868903936" + }, + "nonce": "0" + }, + "0x69362535ec535F0643cBf62D16aDeDCAf32Ee6F7": { + "balance": "0", + "code": "0x608060405234801561001057600080fd5b50600436106100b45760003560e01c806379210e8e1161007157806379210e8e1461017757806381a8235a146101a757806385aeeb17146101c35780639a9a5593146101f3578063a99100541461020f578063b57321221461022b576100b4565b806307c6e7d3146100b9578063122f4fba146100d55780631c6ec7a9146101055780631cfe4e3b14610121578063373dedb41461013d57806361e46db51461015b575b600080fd5b6100d360048036036100ce9190810190613cff565b61025b565b005b6100ef60048036036100ea9190810190613cff565b610804565b6040516100fc9190614963565b60405180910390f35b61011f600480360361011a9190810190613cff565b610b43565b005b61013b60048036036101369190810190613cc3565b610f72565b005b610145611190565b6040516101529190614cbe565b60405180910390f35b61017560048036036101709190810190613d94565b611199565b005b610191600480360361018c9190810190613e13565b6113f9565b60405161019e9190614924565b60405180910390f35b6101c160048036036101bc9190810190613cff565b6116f9565b005b6101dd60048036036101d89190810190613cff565b61189e565b6040516101ea9190614941565b60405180910390f35b61020d60048036036102089190810190613d40565b611b9d565b005b61022960048036036102249190810190613cff565b61202c565b005b61024560048036036102409190810190613cff565b612682565b6040516102529190614cbe565b60405180910390f35b6000339050606061026b83612902565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b825181101561037c576000826001018460018403815181106102d557fe5b60200260200101516040516102ea91906148cc565b90815260200160405180910390205411610339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161033090614ade565b60405180910390fd5b8160020183600183038151811061034c57fe5b602002602001015160405161036191906148cc565b908152602001604051809103902091508060010190506102b7565b506060600183511161038e57846103a7565b8260018451038151811061039e57fe5b60200260200101515b9050600082600101826040516103bd91906148e3565b9081526020016040518091039020541161040c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161040390614ade565b60405180910390fd5b6000826002018260405161042091906148e3565b90815260200160405180910390206000018054905014610475576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161046c90614b5e565b60405180910390fd5b60006104818587612b02565b9050806104c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ba90614a7e565b60405180910390fd5b6104cb613888565b836000016001856000018054905003815481106104e457fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156105965780601f1061056b57610100808354040283529160200191610596565b820191906000526020600020905b81548152906001019060200180831161057957829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff1660028111156105e257fe5b60028111156105ed57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561066557602002820191906000526020600020906000905b82829054906101000a900460ff1615158152602001906001019060208260000104928301926001038202915080841161062f5790505b505050505081525050905080846000016001866001018660405161068991906148e3565b90815260200160405180910390205403815481106106a357fe5b906000526020600020906005020160008201518160000190805190602001906106cd9291906138c4565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561071c57fe5b0217905550608082015181600401908051906020019061073d929190613944565b50905050836001018360405161075391906148e3565b90815260200160405180910390205484600101826000015160405161077891906148cc565b9081526020016040518091039020819055506000846001018460405161079e91906148e3565b908152602001604051809103902081905550836000018054809190600190036107c791906139ea565b5083600201836040516107da91906148e3565b9081526020016040518091039020600080820160006107f99190613a1c565b505050505050505050565b600080606061081284612b66565b91509150606061082182612902565b90506000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b82518110156109065760008260010184600184038151811061088b57fe5b60200260200101516040516108a091906148cc565b90815260200160405180910390205414156108c357600095505050505050610b3e565b816002018360018303815181106108d657fe5b60200260200101516040516108eb91906148cc565b9081526020016040518091039020915080600101905061086d565b50606060018351116109185783610931565b8260018451038151811061092857fe5b60200260200101515b90506000826001018260405161094791906148e3565b908152602001604051809103902054141561096a57600095505050505050610b3e565b610972613888565b826000016001846001018460405161098a91906148e3565b90815260200160405180910390205403815481106109a457fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610a565780601f10610a2b57610100808354040283529160200191610a56565b820191906000526020600020905b815481529060010190602001808311610a3957829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115610aa257fe5b6002811115610aad57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015610b2557602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411610aef5790505b5050505050815250509050806060015196505050505050505b919050565b600160009054906101000a900460ff16610b85576120006002819055506210000060038190555060018060006101000a81548160ff0219169083151502179055505b6000815111610bc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc090614ade565b60405180910390fd5b60003390506060610bd983612902565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015610cea57600082600101846001840381518110610c4357fe5b6020026020010151604051610c5891906148cc565b90815260200160405180910390205411610ca7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9e90614ade565b60405180910390fd5b81600201836001830381518110610cba57fe5b6020026020010151604051610ccf91906148cc565b90815260200160405180910390209150806001019050610c25565b50600254816000018054905010610d36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2d90614bfe565b60405180910390fd5b60606001835111610d475784610d60565b82600184510381518110610d5757fe5b60200260200101515b905060008260010182604051610d7691906148e3565b90815260200160405180910390205414610dc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbc90614c3e565b60405180910390fd5b610dce81612ee8565b610e0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0490614afe565b60405180910390fd5b6000610e198587612fc9565b905080610e5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e529061499e565b60405180910390fd5b610e63613888565b82816000018190525060008160200190151590811515815250508360000181908060018154018082558091505090600182039060005260206000209060050201600090919290919091506000820151816000019080519060200190610ec99291906138c4565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff02191690836002811115610f1857fe5b02179055506080820151816004019080519060200190610f39929190613944565b5050505083600001805490508460010184604051610f5791906148e3565b90815260200160405180910390208190555050505050505050565b610f7a61302d565b73ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161480610fdf57503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614155b61101e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101590614a5e565b60405180910390fd5b80600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411156110a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109790614b3e565b60405180910390fd5b600054600754820111156110e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e0906149be565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460076000828254039250508190555080600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550806007600082825401925050819055505050565b60008054905090565b600033905060006111aa82866130c6565b9050600160028111156111b957fe5b8160030160009054906101000a900460ff1660028111156111d657fe5b14611216576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120d90614c1e565b60405180910390fd5b6000600354858161122357fe5b061480156112345750806002015484105b611273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126a9061497e565b60405180910390fd5b600354848260020154031080156112905750838160020154038351145b8061129d57506003548351145b6112dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d390614a1e565b60405180910390fd5b600015158160040160035486816112ef57fe5b04815481106112fa57fe5b90600052602060002090602091828204019190069054906101000a900460ff1615151461135c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611353906149fe565b60405180910390fd5b600061136a838787876132c5565b9050806113ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a390614b1e565b60405180910390fd5b60018260040160035487816113bd57fe5b04815481106113c857fe5b90600052602060002090602091828204019190066101000a81548160ff021916908315150217905550505050505050565b611401613a40565b6000606061140e86612b66565b9150915061141a613888565b61142483836130c6565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156114c85780601f1061149d576101008083540402835291602001916114c8565b820191906000526020600020905b8154815290600101906020018083116114ab57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561151457fe5b600281111561151f57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561159757602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116115615790505b50505050508152505090506002808111156115ae57fe5b816060015160028111156115be57fe5b146115fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f590614c9e565b60405180910390fd5b60035485111580156116105750600085115b61164f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164690614a1e565b60405180910390fd5b80604001518587011115611698576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168f9061497e565b60405180910390fd5b60006116a684848989613376565b8096508192505050806116ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e590614b9e565b60405180910390fd5b505050509392505050565b6000339050600061170a82846130c6565b90506001600281111561171957fe5b8160030160009054906101000a900460ff16600281111561173657fe5b14611776576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176d90614c1e565b60405180910390fd5b60006001905060008260040180549050905060008090505b818110156117e157600015158460040182815481106117a957fe5b90600052602060002090602091828204019190069054906101000a900460ff16151514156117d657600092505b80600101905061178e565b5081611822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181990614b7e565b60405180910390fd5b60028360030160006101000a81548160ff0219169083600281111561184357fe5b021790555060006118548587613409565b905080611896576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188d906149de565b60405180910390fd5b505050505050565b6060600060606118ad84612b66565b9150915060606118bc82612902565b90506000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008090505b82518110156119c65760008260010184838151811061192257fe5b602002602001015160405161193791906148cc565b90815260200160405180910390205411611986576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197d90614ade565b60405180910390fd5b8160020183828151811061199657fe5b60200260200101516040516119ab91906148cc565b90815260200160405180910390209150806001019050611907565b5080600001805480602002602001604051908101604052809291908181526020016000905b82821015611b8e57838290600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611aa75780601f10611a7c57610100808354040283529160200191611aa7565b820191906000526020600020905b815481529060010190602001808311611a8a57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115611af357fe5b6002811115611afe57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015611b7657602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411611b405790505b505050505081525050815260200190600101906119eb565b50505050945050505050919050565b600160009054906101000a900460ff16611bdf576120006002819055506210000060038190555060018060006101000a81548160ff0219169083151502179055505b60003390506305f5e100821115611c2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2290614bde565b60405180910390fd5b6060611c3684612902565b90506000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015611d4757600082600101846001840381518110611ca057fe5b6020026020010151604051611cb591906148cc565b90815260200160405180910390205411611d04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cfb90614ade565b60405180910390fd5b81600201836001830381518110611d1757fe5b6020026020010151604051611d2c91906148cc565b90815260200160405180910390209150806001019050611c82565b5060606001835111611d595785611d72565b82600184510381518110611d6957fe5b60200260200101515b905060008260010182604051611d8891906148e3565b90815260200160405180910390205414611dd7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dce90614c3e565b60405180910390fd5b611de081612ee8565b611e1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1690614bbe565b60405180910390fd5b6000611e2c85888861346d565b905080611e6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6590614c7e565b60405180910390fd5b6060600354600160035489010381611e8257fe5b04604051908082528060200260200182016040528015611eb15781602001602082028038833980820191505090505b509050836000016040518060a0016040528085815260200160011515815260200189815260200160016002811115611ee557fe5b815260200183815250908060018154018082558091505090600182039060005260206000209060050201600090919290919091506000820151816000019080519060200190611f359291906138c4565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff02191690836002811115611f8457fe5b02179055506080820151816004019080519060200190611fa5929190613944565b5050505083600001805490508460010184604051611fc391906148e3565b90815260200160405180910390208190555086600560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505050505050505050565b6000339050612039613888565b61204382846130c6565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156120e75780601f106120bc576101008083540402835291602001916120e7565b820191906000526020600020905b8154815290600101906020018083116120ca57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561213357fe5b600281111561213e57fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156121b657602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116121805790505b5050505050815250509050600060028111156121ce57fe5b816060015160028111156121de57fe5b141561221f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221690614a3e565b60405180910390fd5b600061222b83856134da565b90508061226d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226490614a9e565b60405180910390fd5b606061227885612902565b90506000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b825181101561231057816002018360018303815181106122e057fe5b60200260200101516040516122f591906148cc565b908152602001604051809103902091508060010190506122c4565b506000600182600101866000015160405161232b91906148cc565b908152602001604051809103902054039050612345613888565b8260000160018460000180549050038154811061235e57fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156124105780601f106123e557610100808354040283529160200191612410565b820191906000526020600020905b8154815290600101906020018083116123f357829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561245c57fe5b600281111561246757fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156124df57602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116124a95790505b5050505050815250509050808360000183815481106124fa57fe5b906000526020600020906005020160008201518160000190805190602001906125249291906138c4565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561257357fe5b02179055506080820151816004019080519060200190612594929190613944565b50905050826000018054809190600190036125af91906139ea565b508260010186600001516040516125c691906148cc565b9081526020016040518091039020548360010182600001516040516125eb91906148cc565b908152602001604051809103902081905550600083600101876000015160405161261591906148cc565b9081526020016040518091039020819055508560400151600560008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505050505050505050565b600080606061269084612b66565b9150915061269c613888565b6126a683836130c6565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561274a5780601f1061271f5761010080835404028352916020019161274a565b820191906000526020600020905b81548152906001019060200180831161272d57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561279657fe5b60028111156127a157fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561281957602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116127e35790505b50505050508152505090506001600281111561283157fe5b8160600151600281111561284157fe5b1480612866575060028081111561285457fe5b8160600151600281111561286457fe5b145b6128a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161289c90614c1e565b60405180910390fd5b60006128b1848461353e565b8096508192505050806128f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128f090614c5e565b60405180910390fd5b50505050919050565b606061290c613a65565b612915836135a7565b905061291f613a65565b61295d6040518060400160405280600181526020017f2f000000000000000000000000000000000000000000000000000000000000008152506135a7565b90506060600161297683856135d590919063ffffffff16565b016040519080825280602002602001820160405280156129aa57816020015b60608152602001906001900390816129955790505b50905060008090505b81518110156129fb576129d76129d2848661364a90919063ffffffff16565b613664565b8282815181106129e357fe5b602002602001018190525080806001019150506129b3565b50600081600183510381518110612a0e57fe5b6020026020010151511415612a795780600182510381518110612a2d57fe5b6020026020010160608152506001815103604051908082528060200260200182016040528015612a7157816020015b6060815260200190600190039081612a5c5790505b509350612ab2565b8051604051908082528060200260200182016040528015612aae57816020015b6060815260200190600190039081612a995790505b5093505b60008090505b8451811015612af957818181518110612acd57fe5b6020026020010151858281518110612ae157fe5b60200260200101819052508080600101915050612ab8565b50505050919050565b60008060016020601f85510181612b1557fe5b040190506040518481526020810160005b83811015612b47578060200286015181602002830152806001019050612b26565b50602082602085026040018460006010600019f1935050505092915050565b6000606060006028905080845111612bb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612baa90614abe565b60405180910390fd5b6060816040519080825280601f01601f191660200182016040528015612be85781602001600182028038833980820191505090505b50905060008090505b82811015612c5857858181518110612c0557fe5b602001015160f81c60f81b828281518110612c1c57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050612bf1565b50600080905060008090505b83811015612d87576000838281518110612c7a57fe5b602001015160f81c60f81b60f81c60ff16905060308110158015612c9f575060398111155b80612cb8575060418110158015612cb75750605a8111155b5b80612cd1575060618110158015612cd0575060668111155b5b612d10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d0790614abe565b60405180910390fd5b60308110158015612d22575060398111155b15612d335760308103601084020192505b60418110158015612d455750605a8111155b15612d565760378103601084020192505b60618110158015612d68575060668111155b15612d795760578103601084020192505b508080600101915050612c64565b508094507f2f00000000000000000000000000000000000000000000000000000000000000868481518110612db857fe5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612e25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e1c90614abe565b60405180910390fd5b6000600184885103039050806040519080825280601f01601f191660200182016040528015612e635781602001600182028038833980820191505090505b50945060008090505b81811015612ede5760008860018784010181518110612e8757fe5b602001015160f81c60f81b905080878381518110612ea157fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350508080600101915050612e6c565b5050505050915091565b6000604051602001612ef99061490f565b6040516020818303038152906040528051906020012082604051602001612f2091906148e3565b604051602081830303815290604052805190602001201480612f8b5750604051602001612f4c906148fa565b6040516020818303038152906040528051906020012082604051602001612f7391906148e3565b60405160208183030381529060405280519060200120145b80612f97575060008251145b15612fa55760009050612fc4565b60008251905060ff811115612fbe576000915050612fc4565b60019150505b919050565b60008060016020601f85510181612fdc57fe5b040190506040518481526020810160005b8381101561300e578060200286015181602002830152806001019050612fed565b5060208260208502604001846000600f600019f1935050505092915050565b600073d2001000000000000000000000000000000000d273ffffffffffffffffffffffffffffffffffffffff166383e781fe6040518163ffffffff1660e01b815260040160206040518083038186803b15801561308957600080fd5b505afa15801561309d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506130c19190810190613c9a565b905090565b600060606130d383612902565b90506000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b82518110156131e45760008260010184600184038151811061313d57fe5b602002602001015160405161315291906148cc565b908152602001604051809103902054116131a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161319890614ade565b60405180910390fd5b816002018360018303815181106131b457fe5b60200260200101516040516131c991906148cc565b9081526020016040518091039020915080600101905061311f565b50606060018351116131f6578461320f565b8260018451038151811061320657fe5b60200260200101515b90506000826001018260405161322591906148e3565b90815260200160405180910390205411613274576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161326b90614ade565b60405180910390fd5b6000826000016001846001018460405161328e91906148e3565b90815260200160405180910390205403815481106132a857fe5b906000526020600020906005020190508094505050505092915050565b60008060016020601f855101816132d857fe5b04019050600060016020601f885101816132ee57fe5b040190506040518781526020810160005b838110156133205780602002890151816020028301528060010190506132ff565b50868360200282015260005b84811015613352578060200287015181856001010160200283015280600101905061332c565b50602082848601602002606001846000600c600019f1945050505050949350505050565b6000613380613a40565b600060016020601f8851018161339257fe5b0401905060006020601f8601816133a557fe5b0490506040518881526020810160005b848110156133d657806020028a0151816020028301528060010190506133b5565b5083602002810188815287816020015283602002868660030160200285600a600019fa9650505050505094509492505050565b60008060016020601f8551018161341c57fe5b040190506040518481526020810160005b8381101561344e57806020028601518160200283015280600101905061342d565b50602082602085026040018460006011600019f1935050505092915050565b60008060016020601f8651018161348057fe5b040190506040518581526020810160005b838110156134b2578060200287015181602002830152806001019050613491565b50846020840282015260208260208502604001846000600b600019f193505050509392505050565b60008060016020601f855101816134ed57fe5b040190506040518481526020810160005b8381101561351f5780602002860151816020028301528060010190506134fe565b5060208260208502604001846000600e600019f1935050505092915050565b600080600060016020601f8651018161355357fe5b040190506040518581526020810160005b83811015613585578060200287015181602002830152806001019050613564565b506020826020850260200184600d600019fa9450815193505050509250929050565b6135af613a65565b600060208301905060405180604001604052808451815260200182815250915050919050565b60008082600001516135f985600001518660200151866000015187602001516136c6565b0190505b83600001518460200151018111613643578180600101925050826000015161363b8560200151830386600001510383866000015187602001516136c6565b0190506135fd565b5092915050565b613652613a65565b61365d8383836137a1565b5092915050565b60608082600001516040519080825280601f01601f19166020018201604052801561369e5781602001600182028038833980820191505090505b50905060006020820190506136bc818560200151866000015161383f565b8192505050919050565b6000808490506000868511613791576020851161374b57600060018660200360080260020a031960001b905060008186511690506000878a8a0103905060008386511690505b82811461373d5781861061372a578a8a019650505050505050613799565b858060010196505083865116905061370c565b859650505050505050613799565b60008585209050600091505b858803821161378f57600086842090508082141561377b5783945050505050613799565b600184019350508180600101925050613757565b505b868601925050505b949350505050565b6137a9613a65565b60006137c785600001518660200151866000015187602001516136c6565b90508460200151836020018181525050846020015181038360000181815250508460000151856020015101811415613809576000856000018181525050613834565b8360000151836000015101856000018181510391508181525050836000015181018560200181815250505b829150509392505050565b5b602081106138635781518352602083019250602082019150602081039050613840565b60006001826020036101000a0390508019835116818551168181178652505050505050565b6040518060a001604052806060815260200160001515815260200160008152602001600060028111156138b757fe5b8152602001606081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061390557805160ff1916838001178555613933565b82800160010185558215613933579182015b82811115613932578251825591602001919060010190613917565b5b5090506139409190613a7f565b5090565b82805482825590600052602060002090601f016020900481019282156139d95791602002820160005b838211156139aa57835183826101000a81548160ff021916908315150217905550926020019260010160208160000104928301926001030261396d565b80156139d75782816101000a81549060ff02191690556001016020816000010492830192600103026139aa565b505b5090506139e69190613aa4565b5090565b815481835581811115613a1757600502816005028360005260206000209182019101613a169190613ad4565b5b505050565b5080546000825560050290600052602060002090810190613a3d9190613ad4565b50565b6040518062100000016040528061800090602082028038833980820191505090505090565b604051806040016040528060008152602001600081525090565b613aa191905b80821115613a9d576000816000905550600101613a85565b5090565b90565b613ad191905b80821115613acd57600081816101000a81549060ff021916905550600101613aaa565b5090565b90565b613b4091905b80821115613b3c5760008082016000613af39190613b43565b6001820160006101000a81549060ff021916905560028201600090556003820160006101000a81549060ff0219169055600482016000613b339190613b8b565b50600501613ada565b5090565b90565b50805460018160011615610100020316600290046000825580601f10613b695750613b88565b601f016020900490600052602060002090810190613b879190613a7f565b5b50565b50805460008255601f016020900490600052602060002090810190613bb09190613a7f565b50565b600081359050613bc281614f18565b92915050565b600081519050613bd781614f18565b92915050565b600082601f830112613bee57600080fd5b8135613c01613bfc82614d06565b614cd9565b91508082526020830160208301858383011115613c1d57600080fd5b613c28838284614eb8565b50505092915050565b600082601f830112613c4257600080fd5b8135613c55613c5082614d32565b614cd9565b91508082526020830160208301858383011115613c7157600080fd5b613c7c838284614eb8565b50505092915050565b600081359050613c9481614f2f565b92915050565b600060208284031215613cac57600080fd5b6000613cba84828501613bc8565b91505092915050565b60008060408385031215613cd657600080fd5b6000613ce485828601613bb3565b9250506020613cf585828601613c85565b9150509250929050565b600060208284031215613d1157600080fd5b600082013567ffffffffffffffff811115613d2b57600080fd5b613d3784828501613c31565b91505092915050565b60008060408385031215613d5357600080fd5b600083013567ffffffffffffffff811115613d6d57600080fd5b613d7985828601613c31565b9250506020613d8a85828601613c85565b9150509250929050565b600080600060608486031215613da957600080fd5b600084013567ffffffffffffffff811115613dc357600080fd5b613dcf86828701613c31565b9350506020613de086828701613c85565b925050604084013567ffffffffffffffff811115613dfd57600080fd5b613e0986828701613bdd565b9150509250925092565b600080600060608486031215613e2857600080fd5b600084013567ffffffffffffffff811115613e4257600080fd5b613e4e86828701613c31565b9350506020613e5f86828701613c85565b9250506040613e7086828701613c85565b9150509250925092565b6000613e868383613fe8565b60208301905092915050565b6000613e9e8383613ff7565b60208301905092915050565b6000613eb68383614831565b905092915050565b6000613ec982614d88565b613ed38185614de7565b9350613ede83614d5e565b8060005b83811015613f0f578151613ef68882613e7a565b9750613f0183614dc0565b925050600181019050613ee2565b5085935050505092915050565b613f2581614d93565b613f2f8184614df8565b9250613f3a82614d6e565b8060005b83811015613f6b578151613f528782613e92565b9650613f5d83614dcd565b925050600181019050613f3e565b505050505050565b6000613f7e82614d9f565b613f888185614e03565b935083602082028501613f9a85614d78565b8060005b85811015613fd65784840389528151613fb78582613eaa565b9450613fc283614dda565b925060208a01995050600181019050613f9e565b50829750879550505050505092915050565b613ff181614e53565b82525050565b61400081614e5f565b82525050565b61400f81614ea6565b82525050565b61401e81614ea6565b82525050565b600061402f82614db5565b6140398185614e36565b9350614049818560208601614ec7565b80840191505092915050565b600061406082614daa565b61406a8185614e14565b935061407a818560208601614ec7565b61408381614efa565b840191505092915050565b600061409982614daa565b6140a38185614e36565b93506140b3818560208601614ec7565b80840191505092915050565b60006140cc601883614e25565b91507f496e636f7272656374206368756e6b20706f736974696f6e00000000000000006000830152602082019050919050565b600061410c601583614e25565b91507f4469726563746f7279206e6f74206372656174656400000000000000000000006000830152602082019050919050565b600061414c602483614e25565b91507f4e6f7420656e6f756768206d656d6f727920696e207468652046696c6573746f60008301527f72616765000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006141b2601b83614e25565b91507f48617368206861736e2774206265656e2063616c63756c6174656400000000006000830152602082019050919050565b60006141f2601983614e25565b91507f4368756e6b20697320616c72656164792075706c6f61646564000000000000006000830152602082019050919050565b6000614232601683614e25565b91507f496e636f7272656374206368756e6b206c656e677468000000000000000000006000830152602082019050919050565b6000614272600f83614e25565b91507f46696c65206e6f742065786973747300000000000000000000000000000000006000830152602082019050919050565b60006142b2600e83614e25565b91507f496e76616c69642073656e6465720000000000000000000000000000000000006000830152602082019050919050565b60006142f2601883614e25565b91507f4469726563746f7279206973206e6f742064656c6574656400000000000000006000830152602082019050919050565b6000614332601083614e25565b91507f46696c65206e6f742064656c65746564000000000000000000000000000000006000830152602082019050919050565b6000614372601383614e25565b91507f496e76616c69642073746f7261676550617468000000000000000000000000006000830152602082019050919050565b60006143b2600c83614e25565b91507f496e76616c6964207061746800000000000000000000000000000000000000006000830152602082019050919050565b60006143f2600183614e36565b91507f2e000000000000000000000000000000000000000000000000000000000000006000830152600182019050919050565b6000614432601683614e25565b91507f496e76616c6964206469726563746f7279206e616d65000000000000000000006000830152602082019050919050565b6000614472601583614e25565b91507f4368756e6b207761736e27742075706c6f6164656400000000000000000000006000830152602082019050919050565b60006144b2602683614e25565b91507f436f756c64206e6f742072657365727665206c657373207468616e207573656460008301527f20737061636500000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614518601683614e25565b91507f4469726563746f7279206973206e6f7420656d707479000000000000000000006000830152602082019050919050565b6000614558602383614e25565b91507f46696c65206861736e2774206265656e2075706c6f6164656420636f7272656360008301527f746c7900000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006145be601183614e25565b91507f4368756e6b207761736e277420726561640000000000000000000000000000006000830152602082019050919050565b60006145fe601883614e25565b91507f46696c656e616d652073686f756c64206265203c2032353600000000000000006000830152602082019050919050565b600061463e601f83614e25565b91507f46696c652073686f756c64206265206c657373207468616e20313030204d42006000830152602082019050919050565b600061467e600283614e36565b91507f2e2e0000000000000000000000000000000000000000000000000000000000006000830152600282019050919050565b60006146be601183614e25565b91507f4469726563746f72792069732066756c6c0000000000000000000000000000006000830152602082019050919050565b60006146fe600e83614e25565b91507f46696c65206e6f7420666f756e640000000000000000000000000000000000006000830152602082019050919050565b600061473e601883614e25565b91507f46696c65206f72206469726563746f72792065786973747300000000000000006000830152602082019050919050565b600061477e601883614e25565b91507f45564d206572726f7220696e2067657446696c6553697a6500000000000000006000830152602082019050919050565b60006147be601083614e25565b91507f46696c65206e6f742063726561746564000000000000000000000000000000006000830152602082019050919050565b60006147fe601983614e25565b91507f46696c65206861736e2774206265656e2075706c6f61646564000000000000006000830152602082019050919050565b600060a083016000830151848203600086015261484e8282614055565b91505060208301516148636020860182613fe8565b50604083015161487660408601826148ae565b5060608301516148896060860182614006565b50608083015184820360808601526148a18282613ebe565b9150508091505092915050565b6148b781614e9c565b82525050565b6148c681614e9c565b82525050565b60006148d8828461408e565b915081905092915050565b60006148ef8284614024565b915081905092915050565b6000614905826143e5565b9150819050919050565b600061491a82614671565b9150819050919050565b6000621000008201905061493b6000830184613f1c565b92915050565b6000602082019050818103600083015261495b8184613f73565b905092915050565b60006020820190506149786000830184614015565b92915050565b60006020820190508181036000830152614997816140bf565b9050919050565b600060208201905081810360008301526149b7816140ff565b9050919050565b600060208201905081810360008301526149d78161413f565b9050919050565b600060208201905081810360008301526149f7816141a5565b9050919050565b60006020820190508181036000830152614a17816141e5565b9050919050565b60006020820190508181036000830152614a3781614225565b9050919050565b60006020820190508181036000830152614a5781614265565b9050919050565b60006020820190508181036000830152614a77816142a5565b9050919050565b60006020820190508181036000830152614a97816142e5565b9050919050565b60006020820190508181036000830152614ab781614325565b9050919050565b60006020820190508181036000830152614ad781614365565b9050919050565b60006020820190508181036000830152614af7816143a5565b9050919050565b60006020820190508181036000830152614b1781614425565b9050919050565b60006020820190508181036000830152614b3781614465565b9050919050565b60006020820190508181036000830152614b57816144a5565b9050919050565b60006020820190508181036000830152614b778161450b565b9050919050565b60006020820190508181036000830152614b978161454b565b9050919050565b60006020820190508181036000830152614bb7816145b1565b9050919050565b60006020820190508181036000830152614bd7816145f1565b9050919050565b60006020820190508181036000830152614bf781614631565b9050919050565b60006020820190508181036000830152614c17816146b1565b9050919050565b60006020820190508181036000830152614c37816146f1565b9050919050565b60006020820190508181036000830152614c5781614731565b9050919050565b60006020820190508181036000830152614c7781614771565b9050919050565b60006020820190508181036000830152614c97816147b1565b9050919050565b60006020820190508181036000830152614cb7816147f1565b9050919050565b6000602082019050614cd360008301846148bd565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614cfc57600080fd5b8060405250919050565b600067ffffffffffffffff821115614d1d57600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614d4957600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050919050565b6000819050602082019050919050565b600081519050919050565b60006180009050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614e4c82614e7c565b9050919050565b60008115159050919050565b6000819050919050565b6000819050614e7782614f0b565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000614eb182614e69565b9050919050565b82818337600083830152505050565b60005b83811015614ee5578082015181840152602081019050614eca565b83811115614ef4576000848401525b50505050565b6000601f19601f8301169050919050565b60038110614f1557fe5b50565b614f2181614e41565b8114614f2c57600080fd5b50565b614f3881614e9c565b8114614f4357600080fd5b5056fea365627a7a723158202ae226b25ad72f9cff2d74c6dc7bcfb78530ab1d2438f48a8dab67499b37a8e56c6578706572696d656e74616cf564736f6c634300050d0040", + "storage": { + "0x0": "2868903936" + }, + "nonce": "0" + }, + "0xD1001000000000000000000000000000000000D1": { + "balance": "0", + "code": "0x608060405260043610603f576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680636d4ce63c146044575b600080fd5b348015604f57600080fd5b506056606c565b6040518082815260200191505060405180910390f35b60006001600060048152602001908152602001600020600060098152602001908152602001600020600101549050905600a165627a7a723058208fe64219becc0bcab1c8f854f05804ebb6bb555da5dbc49e8f7021c31d77636a0029", + "storage": { + "0x3b4da637a1b0e6dbfc6795f2b7f0cb29eebb91b3af4dcc335e1633f6b4af810b": "1111" + }, + "nonce": "0" + }, + "0xca4409573a5129a72edf85d6c51e26760fc9c903": { "balance": "100000000000000000000000" }, + "0x62d8b22c1d71577829b2fee20a5c3fff43aed0ec": { "balance": "100000000000000000000000" }, + "0x1C9abe4ff0CcECa40fc404c74AB7d4923fEF8901": { "balance": "100000000000000000000000" }, + "0xf9817fB82fc767aA9A4A97a1901676244b88ce0E": { "balance": "100000000000000000000000" }, + "0x7a89A6c323FaCfF0ADeF7EEF3e491aD4044d0592": { "balance": "100000000000000000000000" }, + "0x81dcbd71da28fafb9ca99ff5a22bfcebba84fecc": { "balance": "100000000000000000000000" }, + "0xd2c5b39B4e735C17612Bb5a08FD024ccc5dBCb23": { "balance": "100000000000000000000000" }, + "0xD3001000000000000000000000000000000000D3": { + "balance": "0", + "nonce": "0", + "code": "0x60806040526004361061007b5760003560e01c80639623609d1161004e5780639623609d1461013657806399a88ec4146101f5578063f2fde38b14610230578063f3b7dead146102635761007b565b8063204e1c7a14610080578063715018a6146100cf5780637eff275e146100e65780638da5cb5b14610121575b600080fd5b34801561008c57600080fd5b506100b3600480360360208110156100a357600080fd5b50356001600160a01b0316610296565b604080516001600160a01b039092168252519081900360200190f35b3480156100db57600080fd5b506100e4610328565b005b3480156100f257600080fd5b506100e46004803603604081101561010957600080fd5b506001600160a01b03813581169160200135166103ca565b34801561012d57600080fd5b506100b3610496565b6100e46004803603606081101561014c57600080fd5b6001600160a01b03823581169260208101359091169181019060608101604082013564010000000081111561018057600080fd5b82018360208201111561019257600080fd5b803590602001918460018302840111640100000000831117156101b457600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506104a5945050505050565b34801561020157600080fd5b506100e46004803603604081101561021857600080fd5b506001600160a01b03813581169160200135166105dd565b34801561023c57600080fd5b506100e46004803603602081101561025357600080fd5b50356001600160a01b031661068d565b34801561026f57600080fd5b506100b36004803603602081101561028657600080fd5b50356001600160a01b0316610785565b6000806060836001600160a01b03166040518080635c60da1b60e01b8152506004019050600060405180830381855afa9150503d80600081146102f5576040519150601f19603f3d011682016040523d82523d6000602084013e6102fa565b606091505b50915091508161030957600080fd5b80806020019051602081101561031e57600080fd5b5051949350505050565b6103306107e4565b6000546001600160a01b03908116911614610380576040805162461bcd60e51b8152602060048201819052602482015260008051602061080f833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6103d26107e4565b6000546001600160a01b03908116911614610422576040805162461bcd60e51b8152602060048201819052602482015260008051602061080f833981519152604482015290519081900360640190fd5b816001600160a01b0316638f283970826040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050600060405180830381600087803b15801561047a57600080fd5b505af115801561048e573d6000803e3d6000fd5b505050505050565b6000546001600160a01b031690565b6104ad6107e4565b6000546001600160a01b039081169116146104fd576040805162461bcd60e51b8152602060048201819052602482015260008051602061080f833981519152604482015290519081900360640190fd5b826001600160a01b0316634f1ef2863484846040518463ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561057357818101518382015260200161055b565b50505050905090810190601f1680156105a05780820380516001836020036101000a031916815260200191505b5093505050506000604051808303818588803b1580156105bf57600080fd5b505af11580156105d3573d6000803e3d6000fd5b5050505050505050565b6105e56107e4565b6000546001600160a01b03908116911614610635576040805162461bcd60e51b8152602060048201819052602482015260008051602061080f833981519152604482015290519081900360640190fd5b816001600160a01b0316633659cfe6826040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050600060405180830381600087803b15801561047a57600080fd5b6106956107e4565b6000546001600160a01b039081169116146106e5576040805162461bcd60e51b8152602060048201819052602482015260008051602061080f833981519152604482015290519081900360640190fd5b6001600160a01b03811661072a5760405162461bcd60e51b81526004018080602001828103825260268152602001806107e96026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000806060836001600160a01b031660405180806303e1469160e61b8152506004019050600060405180830381855afa9150503d80600081146102f5576040519150601f19603f3d011682016040523d82523d6000602084013e6102fa565b339056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a26469706673582212201d968ac32bef5562c6b4f1bd5d2f2a74c14d07ce008ca6fdc5a3bd0f5fc265f564736f6c63430006080033", + "storage": { + "0x0": "0x907cd0881E50d359bb9Fd120B1A5A143b1C97De6" + } + }, + "0xD3002000000000000000000000000000000000D3": { + "balance": "0", + "nonce": "0", + "code": "0x60806040526004361061004e5760003560e01c80633659cfe6146100655780634f1ef286146100985780635c60da1b146101185780638f28397014610149578063f851a4401461017c5761005d565b3661005d5761005b610191565b005b61005b610191565b34801561007157600080fd5b5061005b6004803603602081101561008857600080fd5b50356001600160a01b03166101ab565b61005b600480360360408110156100ae57600080fd5b6001600160a01b0382351691908101906040810160208201356401000000008111156100d957600080fd5b8201836020820111156100eb57600080fd5b8035906020019184600183028401116401000000008311171561010d57600080fd5b5090925090506101e5565b34801561012457600080fd5b5061012d610292565b604080516001600160a01b039092168252519081900360200190f35b34801561015557600080fd5b5061005b6004803603602081101561016c57600080fd5b50356001600160a01b03166102cf565b34801561018857600080fd5b5061012d610389565b6101996103ba565b6101a96101a461041a565b61043f565b565b6101b3610463565b6001600160a01b0316336001600160a01b031614156101da576101d581610488565b6101e2565b6101e2610191565b50565b6101ed610463565b6001600160a01b0316336001600160a01b031614156102855761020f83610488565b6000836001600160a01b031683836040518083838082843760405192019450600093509091505080830381855af49150503d806000811461026c576040519150601f19603f3d011682016040523d82523d6000602084013e610271565b606091505b505090508061027f57600080fd5b5061028d565b61028d610191565b505050565b600061029c610463565b6001600160a01b0316336001600160a01b031614156102c4576102bd61041a565b90506102cc565b6102cc610191565b90565b6102d7610463565b6001600160a01b0316336001600160a01b031614156101da576001600160a01b0381166103355760405162461bcd60e51b81526004018080602001828103825260368152602001806105876036913960400191505060405180910390fd5b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f61035e610463565b604080516001600160a01b03928316815291841660208301528051918290030190a16101d5816104c8565b6000610393610463565b6001600160a01b0316336001600160a01b031614156102c4576102bd610463565b3b151590565b6103c2610463565b6001600160a01b0316336001600160a01b031614156104125760405162461bcd60e51b81526004018080602001828103825260328152602001806105556032913960400191505060405180910390fd5b6101a96101a9565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b3660008037600080366000845af43d6000803e80801561045e573d6000f35b3d6000fd5b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b610491816104ec565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610355565b6104f5816103b4565b6105305760405162461bcd60e51b815260040180806020018281038252603b8152602001806105bd603b913960400191505060405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5556fe43616e6e6f742063616c6c2066616c6c6261636b2066756e6374696f6e2066726f6d207468652070726f78792061646d696e43616e6e6f74206368616e6765207468652061646d696e206f6620612070726f787920746f20746865207a65726f206164647265737343616e6e6f742073657420612070726f787920696d706c656d656e746174696f6e20746f2061206e6f6e2d636f6e74726163742061646472657373a26469706673582212206e221e2a3547bd97244b05ed46430b1b078ba097cb2a4e25ec3d79cf9ac9f02c64736f6c63430006080033", + "storage": { + "0x0": "1000000", + "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "0xD3001000000000000000000000000000000000D3", + "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0xD3003000000000000000000000000000000000D3" + } + }, + "0xD3003000000000000000000000000000000000D3": { + "balance": "0", + "nonce": "0", + "code": "0x608060405234801561001057600080fd5b50600436106100b45760003560e01c806379210e8e1161007157806379210e8e1461017757806381a8235a146101a757806385aeeb17146101c35780639a9a5593146101f3578063a99100541461020f578063b57321221461022b576100b4565b806307c6e7d3146100b9578063122f4fba146100d55780631c6ec7a9146101055780631cfe4e3b14610121578063373dedb41461013d57806361e46db51461015b575b600080fd5b6100d360048036036100ce9190810190613e94565b61025b565b005b6100ef60048036036100ea9190810190613e94565b610862565b6040516100fc9190614b38565b60405180910390f35b61011f600480360361011a9190810190613e94565b610ba1565b005b61013b60048036036101369190810190613e58565b610fce565b005b6101456111ec565b6040516101529190614eb3565b60405180910390f35b61017560048036036101709190810190613f29565b6111f6565b005b610191600480360361018c9190810190613fa8565b611456565b60405161019e9190614af9565b60405180910390f35b6101c160048036036101bc9190810190613e94565b611756565b005b6101dd60048036036101d89190810190613e94565b6118fb565b6040516101ea9190614b16565b60405180910390f35b61020d60048036036102089190810190613ed5565b611bfa565b005b61022960048036036102249190810190613e94565b612195565b005b61024560048036036102409190810190613e94565b612849565b6040516102529190614eb3565b60405180910390f35b6000339050606061026b83612ac9565b90506000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b825181101561037c576000826001018460018403815181106102d557fe5b60200260200101516040516102ea9190614aa1565b90815260200160405180910390205411610339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161033090614cb3565b60405180910390fd5b8160020183600183038151811061034c57fe5b60200260200101516040516103619190614aa1565b908152602001604051809103902091508060010190506102b7565b506060600183511161038e57846103a7565b8260018451038151811061039e57fe5b60200260200101515b9050600082600101826040516103bd9190614ab8565b9081526020016040518091039020541161040c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161040390614cb3565b60405180910390fd5b600082600201826040516104209190614ab8565b90815260200160405180910390206000018054905014610475576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161046c90614d33565b60405180910390fd5b60006104818587612cc9565b9050806104c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ba90614c53565b60405180910390fd5b6104cb613a4f565b836000016001856000018054905003815481106104e457fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156105965780601f1061056b57610100808354040283529160200191610596565b820191906000526020600020905b81548152906001019060200180831161057957829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff1660028111156105e257fe5b60028111156105ed57fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561066557602002820191906000526020600020906000905b82829054906101000a900460ff1615158152602001906001019060208260000104928301926001038202915080841161062f5790505b50505050508152505090508084600001600186600101866040516106899190614ab8565b90815260200160405180910390205403815481106106a357fe5b906000526020600020906005020160008201518160000190805190602001906106cd929190613a8b565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff0219169083600281111561071c57fe5b0217905550608082015181600401908051906020019061073d929190613b0b565b5090505083600101836040516107539190614ab8565b9081526020016040518091039020548460010182600001516040516107789190614aa1565b9081526020016040518091039020819055506000846001018460405161079e9190614ab8565b908152602001604051809103902081905550836000018054806107bd57fe5b6001900381819060005260206000209060050201600080820160006107e29190613bb1565b6001820160006101000a81549060ff021916905560028201600090556003820160006101000a81549060ff02191690556004820160006108229190613bf9565b5050905583600201836040516108389190614ab8565b9081526020016040518091039020600080820160006108579190613c21565b505050505050505050565b600080606061087084612d2d565b91509150606061087f82612ac9565b90506000600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015610964576000826001018460018403815181106108e957fe5b60200260200101516040516108fe9190614aa1565b908152602001604051809103902054141561092157600095505050505050610b9c565b8160020183600183038151811061093457fe5b60200260200101516040516109499190614aa1565b908152602001604051809103902091508060010190506108cb565b5060606001835111610976578361098f565b8260018451038151811061098657fe5b60200260200101515b9050600082600101826040516109a59190614ab8565b90815260200160405180910390205414156109c857600095505050505050610b9c565b6109d0613a4f565b82600001600184600101846040516109e89190614ab8565b9081526020016040518091039020540381548110610a0257fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610ab45780601f10610a8957610100808354040283529160200191610ab4565b820191906000526020600020905b815481529060010190602001808311610a9757829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115610b0057fe5b6002811115610b0b57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015610b8357602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411610b4d5790505b5050505050815250509050806060015196505050505050505b919050565b600360009054906101000a900460ff16610be457612000600481905550621000006005819055506001600360006101000a81548160ff0219169083151502179055505b6000815111610c28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1f90614cb3565b60405180910390fd5b60003390506060610c3883612ac9565b90506000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015610d4957600082600101846001840381518110610ca257fe5b6020026020010151604051610cb79190614aa1565b90815260200160405180910390205411610d06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cfd90614cb3565b60405180910390fd5b81600201836001830381518110610d1957fe5b6020026020010151604051610d2e9190614aa1565b90815260200160405180910390209150806001019050610c84565b50600454816000018054905010610d95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8c90614dd3565b60405180910390fd5b60606001835111610da65784610dbf565b82600184510381518110610db657fe5b60200260200101515b905060008260010182604051610dd59190614ab8565b90815260200160405180910390205414610e24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1b90614e13565b60405180910390fd5b610e2d816130af565b610e6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6390614cd3565b60405180910390fd5b6000610e788587613190565b905080610eba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb190614b73565b60405180910390fd5b610ec2613a4f565b8281600001819052506000816020019015159081151581525050836000018190806001815401808255809150506001900390600052602060002090600502016000909190919091506000820151816000019080519060200190610f26929190613a8b565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff02191690836002811115610f7557fe5b02179055506080820151816004019080519060200190610f96929190613b0b565b50505083600001805490508460010184604051610fb39190614ab8565b90815260200160405180910390208190555050505050505050565b610fd66131f4565b73ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16148061103b57503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614155b61107a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107190614c33565b60405180910390fd5b80600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411156110fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f390614d13565b60405180910390fd5b60025460095482011115611145576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113c90614b93565b60405180910390fd5b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460096000828254039250508190555080600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550806009600082825401925050819055505050565b6000600254905090565b60003390506000611207828661328d565b90506001600281111561121657fe5b8160030160009054906101000a900460ff16600281111561123357fe5b14611273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126a90614df3565b60405180910390fd5b6000600554858161128057fe5b061480156112915750806002015484105b6112d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c790614b53565b60405180910390fd5b600554848260020154031080156112ed5750838160020154038351145b806112fa57506005548351145b611339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133090614bf3565b60405180910390fd5b6000151581600401600554868161134c57fe5b048154811061135757fe5b90600052602060002090602091828204019190069054906101000a900460ff161515146113b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b090614bd3565b60405180910390fd5b60006113c78387878761348c565b905080611409576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140090614cf3565b60405180910390fd5b600182600401600554878161141a57fe5b048154811061142557fe5b90600052602060002090602091828204019190066101000a81548160ff021916908315150217905550505050505050565b61145e613c45565b6000606061146b86612d2d565b91509150611477613a4f565b611481838361328d565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156115255780601f106114fa57610100808354040283529160200191611525565b820191906000526020600020905b81548152906001019060200180831161150857829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561157157fe5b600281111561157c57fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156115f457602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116115be5790505b505050505081525050905060028081111561160b57fe5b8160600151600281111561161b57fe5b1461165b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165290614e93565b60405180910390fd5b600554851115801561166d5750600085115b6116ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a390614bf3565b60405180910390fd5b806040015185870111156116f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ec90614b53565b60405180910390fd5b60006117038484898961353d565b80965081925050508061174b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174290614d73565b60405180910390fd5b505050509392505050565b60003390506000611767828461328d565b90506001600281111561177657fe5b8160030160009054906101000a900460ff16600281111561179357fe5b146117d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ca90614df3565b60405180910390fd5b60006001905060008260040180549050905060008090505b8181101561183e576000151584600401828154811061180657fe5b90600052602060002090602091828204019190069054906101000a900460ff161515141561183357600092505b8060010190506117eb565b508161187f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187690614d53565b60405180910390fd5b60028360030160006101000a81548160ff021916908360028111156118a057fe5b021790555060006118b185876135d0565b9050806118f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ea90614bb3565b60405180910390fd5b505050505050565b60606000606061190a84612d2d565b91509150606061191982612ac9565b90506000600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008090505b8251811015611a235760008260010184838151811061197f57fe5b60200260200101516040516119949190614aa1565b908152602001604051809103902054116119e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119da90614cb3565b60405180910390fd5b816002018382815181106119f357fe5b6020026020010151604051611a089190614aa1565b90815260200160405180910390209150806001019050611964565b5080600001805480602002602001604051908101604052809291908181526020016000905b82821015611beb57838290600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611b045780601f10611ad957610100808354040283529160200191611b04565b820191906000526020600020905b815481529060010190602001808311611ae757829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff166002811115611b5057fe5b6002811115611b5b57fe5b815260200160048201805480602002602001604051908101604052809291908181526020018280548015611bd357602002820191906000526020600020906000905b82829054906101000a900460ff16151581526020019060010190602082600001049283019260010382029150808411611b9d5790505b50505050508152505081526020019060010190611a48565b50505050945050505050919050565b600360009054906101000a900460ff16611c3d57612000600481905550621000006005819055506001600360006101000a81548160ff0219169083151502179055505b60003390506305f5e100821115611c89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8090614db3565b60405180910390fd5b600660008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205483011115611d4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4390614e33565b60405180910390fd5b6060611d5784612ac9565b90506000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015611e6857600082600101846001840381518110611dc157fe5b6020026020010151604051611dd69190614aa1565b90815260200160405180910390205411611e25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1c90614cb3565b60405180910390fd5b81600201836001830381518110611e3857fe5b6020026020010151604051611e4d9190614aa1565b90815260200160405180910390209150806001019050611da3565b50600454816000018054905010611eb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eab90614dd3565b60405180910390fd5b60606001835111611ec55785611ede565b82600184510381518110611ed557fe5b60200260200101515b905060008260010182604051611ef49190614ab8565b90815260200160405180910390205414611f43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3a90614e13565b60405180910390fd5b611f4c816130af565b611f8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8290614d93565b60405180910390fd5b6000611f98858888613634565b905080611fda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd190614e73565b60405180910390fd5b6060600554600160055489010381611fee57fe5b0460405190808252806020026020018201604052801561201d5781602001602082028038833980820191505090505b509050836000016040518060a001604052808581526020016001151581526020018981526020016001600281111561205157fe5b8152602001838152509080600181540180825580915050600190039060005260206000209060050201600090919091909150600082015181600001908051906020019061209f929190613a8b565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff021916908360028111156120ee57fe5b0217905550608082015181600401908051906020019061210f929190613b0b565b5050508360000180549050846001018460405161212c9190614ab8565b90815260200160405180910390208190555086600760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505050505050505050565b60003390506121a2613a4f565b6121ac828461328d565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156122505780601f1061222557610100808354040283529160200191612250565b820191906000526020600020905b81548152906001019060200180831161223357829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561229c57fe5b60028111156122a757fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561231f57602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116122e95790505b50505050508152505090506000600281111561233757fe5b8160600151600281111561234757fe5b1415612388576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161237f90614c13565b60405180910390fd5b600061239483856136a1565b9050806123d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123cd90614c73565b60405180910390fd5b60606123e185612ac9565b90506000600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b8251811015612479578160020183600183038151811061244957fe5b602002602001015160405161245e9190614aa1565b9081526020016040518091039020915080600101905061242d565b50600060018260010186600001516040516124949190614aa1565b9081526020016040518091039020540390506124ae613a4f565b826000016001846000018054905003815481106124c757fe5b90600052602060002090600502016040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156125795780601f1061254e57610100808354040283529160200191612579565b820191906000526020600020905b81548152906001019060200180831161255c57829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff1660028111156125c557fe5b60028111156125d057fe5b81526020016004820180548060200260200160405190810160405280929190818152602001828054801561264857602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116126125790505b50505050508152505090508083600001838154811061266357fe5b9060005260206000209060050201600082015181600001908051906020019061268d929190613a8b565b5060208201518160010160006101000a81548160ff0219169083151502179055506040820151816002015560608201518160030160006101000a81548160ff021916908360028111156126dc57fe5b021790555060808201518160040190805190602001906126fd929190613b0b565b509050508260000180548061270e57fe5b6001900381819060005260206000209060050201600080820160006127339190613bb1565b6001820160006101000a81549060ff021916905560028201600090556003820160006101000a81549060ff02191690556004820160006127739190613bf9565b5050905582600101866000015160405161278d9190614aa1565b9081526020016040518091039020548360010182600001516040516127b29190614aa1565b90815260200160405180910390208190555060008360010187600001516040516127dc9190614aa1565b9081526020016040518091039020819055508560400151600760008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505050505050505050565b600080606061285784612d2d565b91509150612863613a4f565b61286d838361328d565b6040518060a0016040529081600082018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156129115780601f106128e657610100808354040283529160200191612911565b820191906000526020600020905b8154815290600101906020018083116128f457829003601f168201915b505050505081526020016001820160009054906101000a900460ff16151515158152602001600282015481526020016003820160009054906101000a900460ff16600281111561295d57fe5b600281111561296857fe5b8152602001600482018054806020026020016040519081016040528092919081815260200182805480156129e057602002820191906000526020600020906000905b82829054906101000a900460ff161515815260200190600101906020826000010492830192600103820291508084116129aa5790505b5050505050815250509050600160028111156129f857fe5b81606001516002811115612a0857fe5b1480612a2d5750600280811115612a1b57fe5b81606001516002811115612a2b57fe5b145b612a6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a6390614df3565b60405180910390fd5b6000612a788484613705565b809650819250505080612ac0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ab790614e53565b60405180910390fd5b50505050919050565b6060612ad3613c6a565b612adc8361376e565b9050612ae6613c6a565b612b246040518060400160405280600181526020017f2f0000000000000000000000000000000000000000000000000000000000000081525061376e565b905060606001612b3d838561379c90919063ffffffff16565b01604051908082528060200260200182016040528015612b7157816020015b6060815260200190600190039081612b5c5790505b50905060008090505b8151811015612bc257612b9e612b99848661381190919063ffffffff16565b61382b565b828281518110612baa57fe5b60200260200101819052508080600101915050612b7a565b50600081600183510381518110612bd557fe5b6020026020010151511415612c405780600182510381518110612bf457fe5b6020026020010160608152506001815103604051908082528060200260200182016040528015612c3857816020015b6060815260200190600190039081612c235790505b509350612c79565b8051604051908082528060200260200182016040528015612c7557816020015b6060815260200190600190039081612c605790505b5093505b60008090505b8451811015612cc057818181518110612c9457fe5b6020026020010151858281518110612ca857fe5b60200260200101819052508080600101915050612c7f565b50505050919050565b60008060016020601f85510181612cdc57fe5b040190506040518481526020810160005b83811015612d0e578060200286015181602002830152806001019050612ced565b50602082602085026040018460006010600019f1935050505092915050565b6000606060006028905080845111612d7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d7190614c93565b60405180910390fd5b6060816040519080825280601f01601f191660200182016040528015612daf5781602001600182028038833980820191505090505b50905060008090505b82811015612e1f57858181518110612dcc57fe5b602001015160f81c60f81b828281518110612de357fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050612db8565b50600080905060008090505b83811015612f4e576000838281518110612e4157fe5b602001015160f81c60f81b60f81c60ff16905060308110158015612e66575060398111155b80612e7f575060418110158015612e7e5750605a8111155b5b80612e98575060618110158015612e97575060668111155b5b612ed7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ece90614c93565b60405180910390fd5b60308110158015612ee9575060398111155b15612efa5760308103601084020192505b60418110158015612f0c5750605a8111155b15612f1d5760378103601084020192505b60618110158015612f2f575060668111155b15612f405760578103601084020192505b508080600101915050612e2b565b508094507f2f00000000000000000000000000000000000000000000000000000000000000868481518110612f7f57fe5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612fec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fe390614c93565b60405180910390fd5b6000600184885103039050806040519080825280601f01601f19166020018201604052801561302a5781602001600182028038833980820191505090505b50945060008090505b818110156130a5576000886001878401018151811061304e57fe5b602001015160f81c60f81b90508087838151811061306857fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350508080600101915050613033565b5050505050915091565b60006040516020016130c090614ae4565b60405160208183030381529060405280519060200120826040516020016130e79190614ab8565b604051602081830303815290604052805190602001201480613152575060405160200161311390614acf565b604051602081830303815290604052805190602001208260405160200161313a9190614ab8565b60405160208183030381529060405280519060200120145b8061315e575060008251145b1561316c576000905061318b565b60008251905060ff81111561318557600091505061318b565b60019150505b919050565b60008060016020601f855101816131a357fe5b040190506040518481526020810160005b838110156131d55780602002860151816020028301528060010190506131b4565b5060208260208502604001846000600f600019f1935050505092915050565b600073d2001000000000000000000000000000000000d273ffffffffffffffffffffffffffffffffffffffff166383e781fe6040518163ffffffff1660e01b815260040160206040518083038186803b15801561325057600080fd5b505afa158015613264573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506132889190810190613e2f565b905090565b6000606061329a83612ac9565b90506000600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600190505b82518110156133ab5760008260010184600184038151811061330457fe5b60200260200101516040516133199190614aa1565b90815260200160405180910390205411613368576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161335f90614cb3565b60405180910390fd5b8160020183600183038151811061337b57fe5b60200260200101516040516133909190614aa1565b908152602001604051809103902091508060010190506132e6565b50606060018351116133bd57846133d6565b826001845103815181106133cd57fe5b60200260200101515b9050600082600101826040516133ec9190614ab8565b9081526020016040518091039020541161343b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161343290614cb3565b60405180910390fd5b600082600001600184600101846040516134559190614ab8565b908152602001604051809103902054038154811061346f57fe5b906000526020600020906005020190508094505050505092915050565b60008060016020601f8551018161349f57fe5b04019050600060016020601f885101816134b557fe5b040190506040518781526020810160005b838110156134e75780602002890151816020028301528060010190506134c6565b50868360200282015260005b8481101561351957806020028701518185600101016020028301528060010190506134f3565b50602082848601602002606001846000600c600019f1945050505050949350505050565b6000613547613c45565b600060016020601f8851018161355957fe5b0401905060006020601f86018161356c57fe5b0490506040518881526020810160005b8481101561359d57806020028a01518160200283015280600101905061357c565b5083602002810188815287816020015283602002868660030160200285600a600019fa9650505050505094509492505050565b60008060016020601f855101816135e357fe5b040190506040518481526020810160005b838110156136155780602002860151816020028301528060010190506135f4565b50602082602085026040018460006011600019f1935050505092915050565b60008060016020601f8651018161364757fe5b040190506040518581526020810160005b83811015613679578060200287015181602002830152806001019050613658565b50846020840282015260208260208502604001846000600b600019f193505050509392505050565b60008060016020601f855101816136b457fe5b040190506040518481526020810160005b838110156136e65780602002860151816020028301528060010190506136c5565b5060208260208502604001846000600e600019f1935050505092915050565b600080600060016020601f8651018161371a57fe5b040190506040518581526020810160005b8381101561374c57806020028701518160200283015280600101905061372b565b506020826020850260200184600d600019fa9450815193505050509250929050565b613776613c6a565b600060208301905060405180604001604052808451815260200182815250915050919050565b60008082600001516137c0856000015186602001518660000151876020015161388d565b0190505b8360000151846020015101811161380a578180600101925050826000015161380285602001518303866000015103838660000151876020015161388d565b0190506137c4565b5092915050565b613819613c6a565b613824838383613968565b5092915050565b60608082600001516040519080825280601f01601f1916602001820160405280156138655781602001600182028038833980820191505090505b50905060006020820190506138838185602001518660000151613a06565b8192505050919050565b6000808490506000868511613958576020851161391257600060018660200360080260020a031960001b905060008186511690506000878a8a0103905060008386511690505b828114613904578186106138f1578a8a019650505050505050613960565b85806001019650508386511690506138d3565b859650505050505050613960565b60008585209050600091505b85880382116139565760008684209050808214156139425783945050505050613960565b60018401935050818060010192505061391e565b505b868601925050505b949350505050565b613970613c6a565b600061398e856000015186602001518660000151876020015161388d565b905084602001518360200181815250508460200151810383600001818152505084600001518560200151018114156139d05760008560000181815250506139fb565b8360000151836000015101856000018181510391508181525050836000015181018560200181815250505b829150509392505050565b5b60208110613a2a5781518352602083019250602082019150602081039050613a07565b60006001826020036101000a0390508019835116818551168181178652505050505050565b6040518060a00160405280606081526020016000151581526020016000815260200160006002811115613a7e57fe5b8152602001606081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613acc57805160ff1916838001178555613afa565b82800160010185558215613afa579182015b82811115613af9578251825591602001919060010190613ade565b5b509050613b079190613c84565b5090565b82805482825590600052602060002090601f01602090048101928215613ba05791602002820160005b83821115613b7157835183826101000a81548160ff0219169083151502179055509260200192600101602081600001049283019260010302613b34565b8015613b9e5782816101000a81549060ff0219169055600101602081600001049283019260010302613b71565b505b509050613bad9190613ca9565b5090565b50805460018160011615610100020316600290046000825580601f10613bd75750613bf6565b601f016020900490600052602060002090810190613bf59190613c84565b5b50565b50805460008255601f016020900490600052602060002090810190613c1e9190613c84565b50565b5080546000825560050290600052602060002090810190613c429190613cd9565b50565b6040518062100000016040528061800090602082028038833980820191505090505090565b604051806040016040528060008152602001600081525090565b613ca691905b80821115613ca2576000816000905550600101613c8a565b5090565b90565b613cd691905b80821115613cd257600081816101000a81549060ff021916905550600101613caf565b5090565b90565b613d4591905b80821115613d415760008082016000613cf89190613bb1565b6001820160006101000a81549060ff021916905560028201600090556003820160006101000a81549060ff0219169055600482016000613d389190613bf9565b50600501613cdf565b5090565b90565b600081359050613d578161510d565b92915050565b600081519050613d6c8161510d565b92915050565b600082601f830112613d8357600080fd5b8135613d96613d9182614efb565b614ece565b91508082526020830160208301858383011115613db257600080fd5b613dbd8382846150ad565b50505092915050565b600082601f830112613dd757600080fd5b8135613dea613de582614f27565b614ece565b91508082526020830160208301858383011115613e0657600080fd5b613e118382846150ad565b50505092915050565b600081359050613e2981615124565b92915050565b600060208284031215613e4157600080fd5b6000613e4f84828501613d5d565b91505092915050565b60008060408385031215613e6b57600080fd5b6000613e7985828601613d48565b9250506020613e8a85828601613e1a565b9150509250929050565b600060208284031215613ea657600080fd5b600082013567ffffffffffffffff811115613ec057600080fd5b613ecc84828501613dc6565b91505092915050565b60008060408385031215613ee857600080fd5b600083013567ffffffffffffffff811115613f0257600080fd5b613f0e85828601613dc6565b9250506020613f1f85828601613e1a565b9150509250929050565b600080600060608486031215613f3e57600080fd5b600084013567ffffffffffffffff811115613f5857600080fd5b613f6486828701613dc6565b9350506020613f7586828701613e1a565b925050604084013567ffffffffffffffff811115613f9257600080fd5b613f9e86828701613d72565b9150509250925092565b600080600060608486031215613fbd57600080fd5b600084013567ffffffffffffffff811115613fd757600080fd5b613fe386828701613dc6565b9350506020613ff486828701613e1a565b925050604061400586828701613e1a565b9150509250925092565b600061401b838361417d565b60208301905092915050565b6000614033838361418c565b60208301905092915050565b600061404b8383614a06565b905092915050565b600061405e82614f7d565b6140688185614fdc565b935061407383614f53565b8060005b838110156140a457815161408b888261400f565b975061409683614fb5565b925050600181019050614077565b5085935050505092915050565b6140ba81614f88565b6140c48184614fed565b92506140cf82614f63565b8060005b838110156141005781516140e78782614027565b96506140f283614fc2565b9250506001810190506140d3565b505050505050565b600061411382614f94565b61411d8185614ff8565b93508360208202850161412f85614f6d565b8060005b8581101561416b578484038952815161414c858261403f565b945061415783614fcf565b925060208a01995050600181019050614133565b50829750879550505050505092915050565b61418681615048565b82525050565b61419581615054565b82525050565b6141a48161509b565b82525050565b6141b38161509b565b82525050565b60006141c482614faa565b6141ce818561502b565b93506141de8185602086016150bc565b80840191505092915050565b60006141f582614f9f565b6141ff8185615009565b935061420f8185602086016150bc565b614218816150ef565b840191505092915050565b600061422e82614f9f565b614238818561502b565b93506142488185602086016150bc565b80840191505092915050565b600061426160188361501a565b91507f496e636f7272656374206368756e6b20706f736974696f6e00000000000000006000830152602082019050919050565b60006142a160158361501a565b91507f4469726563746f7279206e6f74206372656174656400000000000000000000006000830152602082019050919050565b60006142e160248361501a565b91507f4e6f7420656e6f756768206d656d6f727920696e207468652046696c6573746f60008301527f72616765000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614347601b8361501a565b91507f48617368206861736e2774206265656e2063616c63756c6174656400000000006000830152602082019050919050565b600061438760198361501a565b91507f4368756e6b20697320616c72656164792075706c6f61646564000000000000006000830152602082019050919050565b60006143c760168361501a565b91507f496e636f7272656374206368756e6b206c656e677468000000000000000000006000830152602082019050919050565b6000614407600f8361501a565b91507f46696c65206e6f742065786973747300000000000000000000000000000000006000830152602082019050919050565b6000614447600e8361501a565b91507f496e76616c69642073656e6465720000000000000000000000000000000000006000830152602082019050919050565b600061448760188361501a565b91507f4469726563746f7279206973206e6f742064656c6574656400000000000000006000830152602082019050919050565b60006144c760108361501a565b91507f46696c65206e6f742064656c65746564000000000000000000000000000000006000830152602082019050919050565b600061450760138361501a565b91507f496e76616c69642073746f7261676550617468000000000000000000000000006000830152602082019050919050565b6000614547600c8361501a565b91507f496e76616c6964207061746800000000000000000000000000000000000000006000830152602082019050919050565b600061458760018361502b565b91507f2e000000000000000000000000000000000000000000000000000000000000006000830152600182019050919050565b60006145c760168361501a565b91507f496e76616c6964206469726563746f7279206e616d65000000000000000000006000830152602082019050919050565b600061460760158361501a565b91507f4368756e6b207761736e27742075706c6f6164656400000000000000000000006000830152602082019050919050565b600061464760268361501a565b91507f436f756c64206e6f742072657365727665206c657373207468616e207573656460008301527f20737061636500000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006146ad60168361501a565b91507f4469726563746f7279206973206e6f7420656d707479000000000000000000006000830152602082019050919050565b60006146ed60238361501a565b91507f46696c65206861736e2774206265656e2075706c6f6164656420636f7272656360008301527f746c7900000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061475360118361501a565b91507f4368756e6b207761736e277420726561640000000000000000000000000000006000830152602082019050919050565b600061479360188361501a565b91507f46696c656e616d652073686f756c64206265203c2032353600000000000000006000830152602082019050919050565b60006147d3601f8361501a565b91507f46696c652073686f756c64206265206c657373207468616e20313030204d42006000830152602082019050919050565b600061481360028361502b565b91507f2e2e0000000000000000000000000000000000000000000000000000000000006000830152600282019050919050565b600061485360118361501a565b91507f4469726563746f72792069732066756c6c0000000000000000000000000000006000830152602082019050919050565b6000614893600e8361501a565b91507f46696c65206e6f7420666f756e640000000000000000000000000000000000006000830152602082019050919050565b60006148d360188361501a565b91507f46696c65206f72206469726563746f72792065786973747300000000000000006000830152602082019050919050565b600061491360198361501a565b91507f4e6f7420656e6f756768207265736572766564207370616365000000000000006000830152602082019050919050565b600061495360188361501a565b91507f45564d206572726f7220696e2067657446696c6553697a6500000000000000006000830152602082019050919050565b600061499360108361501a565b91507f46696c65206e6f742063726561746564000000000000000000000000000000006000830152602082019050919050565b60006149d360198361501a565b91507f46696c65206861736e2774206265656e2075706c6f61646564000000000000006000830152602082019050919050565b600060a0830160008301518482036000860152614a2382826141ea565b9150506020830151614a38602086018261417d565b506040830151614a4b6040860182614a83565b506060830151614a5e606086018261419b565b5060808301518482036080860152614a768282614053565b9150508091505092915050565b614a8c81615091565b82525050565b614a9b81615091565b82525050565b6000614aad8284614223565b915081905092915050565b6000614ac482846141b9565b915081905092915050565b6000614ada8261457a565b9150819050919050565b6000614aef82614806565b9150819050919050565b60006210000082019050614b1060008301846140b1565b92915050565b60006020820190508181036000830152614b308184614108565b905092915050565b6000602082019050614b4d60008301846141aa565b92915050565b60006020820190508181036000830152614b6c81614254565b9050919050565b60006020820190508181036000830152614b8c81614294565b9050919050565b60006020820190508181036000830152614bac816142d4565b9050919050565b60006020820190508181036000830152614bcc8161433a565b9050919050565b60006020820190508181036000830152614bec8161437a565b9050919050565b60006020820190508181036000830152614c0c816143ba565b9050919050565b60006020820190508181036000830152614c2c816143fa565b9050919050565b60006020820190508181036000830152614c4c8161443a565b9050919050565b60006020820190508181036000830152614c6c8161447a565b9050919050565b60006020820190508181036000830152614c8c816144ba565b9050919050565b60006020820190508181036000830152614cac816144fa565b9050919050565b60006020820190508181036000830152614ccc8161453a565b9050919050565b60006020820190508181036000830152614cec816145ba565b9050919050565b60006020820190508181036000830152614d0c816145fa565b9050919050565b60006020820190508181036000830152614d2c8161463a565b9050919050565b60006020820190508181036000830152614d4c816146a0565b9050919050565b60006020820190508181036000830152614d6c816146e0565b9050919050565b60006020820190508181036000830152614d8c81614746565b9050919050565b60006020820190508181036000830152614dac81614786565b9050919050565b60006020820190508181036000830152614dcc816147c6565b9050919050565b60006020820190508181036000830152614dec81614846565b9050919050565b60006020820190508181036000830152614e0c81614886565b9050919050565b60006020820190508181036000830152614e2c816148c6565b9050919050565b60006020820190508181036000830152614e4c81614906565b9050919050565b60006020820190508181036000830152614e6c81614946565b9050919050565b60006020820190508181036000830152614e8c81614986565b9050919050565b60006020820190508181036000830152614eac816149c6565b9050919050565b6000602082019050614ec86000830184614a92565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614ef157600080fd5b8060405250919050565b600067ffffffffffffffff821115614f1257600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614f3e57600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050919050565b6000819050602082019050919050565b600081519050919050565b60006180009050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061504182615071565b9050919050565b60008115159050919050565b6000819050919050565b600081905061506c82615100565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006150a68261505e565b9050919050565b82818337600083830152505050565b60005b838110156150da5780820151818401526020810190506150bf565b838111156150e9576000848401525b50505050565b6000601f19601f8301169050919050565b6003811061510a57fe5b50565b61511681615036565b811461512157600080fd5b50565b61512d81615091565b811461513857600080fd5b5056fea2646970667358221220a549ad9e778ae8bb3048c0a1805e77745871cc1560637ae1c3ebccb76638d9c464736f6c63430006020033", + "storage": {} + } + }, + + "skaleConfig": { + "nodeInfo": { + "nodeName": "Node1", + "nodeID": 1112, + "bindIP": "0.0.0.0", + "basePort": 1231, + "httpRpcPort": 1234, + "httpsRpcPort": 1239, + "wsRpcPort": 1233, + "wssRpcPort": 1238, + "logLevel": "info", + "logLevelProposal": "info", + "rotateAfterBlock": 0, + "ecdsaKeyName": "", + "minCacheSize": 1000, + "maxCacheSize": 2000, + "collectionQueueSize": 2, + "collectionDuration": 10, + "transactionQueueSize": 10000, + "maxOpenLeveldbFiles": 25, + "testSignatures": true + }, + "sChain": { + "schainName": "TestChain", + "schainID": 5, + "schainOwner": "0x907cd0881E50d359bb9Fd120B1A5A143b1C97De6", + "contractStorageLimit": 10000000000, + "emptyBlockIntervalMs": 10000, + "contractStorageZeroValuePatchTimestamp": 1, + "revertableFSPatchTimestamp": 1, + "contractStoragePatchTimestamp": 1, + "verifyDaSigsPatchTimestamp": 1, + "storageDestructionPatchTimestamp": 1, + "powCheckPatchTimestamp": 1, + "skipInvalidTransactionsPatchTimestamp": 1, + "pushZeroPatchTimestamp": 1, + "precompiledConfigPatchTimestamp": 1, + "correctForkInPowPatchTimestamp": 1, + "EIP1559TransactionsPatchTimestamp": 1, + "fastConsensusPatchTimestamp": 1, + "flexibleDeploymentPatchTimestamp": 1, + "verifyBlsSyncPatchTimestamp": 1, + "multiTransactionMode": true, + "levelDBReopenIntervalMs": 1, + "nodes": [ + { "nodeID": 1112, "ip": "127.0.0.1", "basePort": 1231, "schainIndex" : 1, "publicKey":""} + ] + } + } +} + + + diff --git a/test/historicstate/hardhat/scripts/infinite_transaction_loop_with_call.ts b/test/historicstate/hardhat/scripts/infinite_transaction_loop_with_call.ts new file mode 100644 index 000000000..61ac002c0 --- /dev/null +++ b/test/historicstate/hardhat/scripts/infinite_transaction_loop_with_call.ts @@ -0,0 +1,225 @@ +import {mkdir, readdir, writeFileSync, readFile, unlink} from "fs"; + +const fs = require('fs'); +import {existsSync} from "fs"; +import deepDiff, {diff} from 'deep-diff'; +import {expect} from "chai"; +import * as path from 'path'; +import {int, string} from "hardhat/internal/core/params/argumentTypes"; +import internal from "node:stream"; + +const OWNER_ADDRESS: string = "0x907cd0881E50d359bb9Fd120B1A5A143b1C97De6"; +const CALL_ADDRESS: string = "0xCe5c7ca85F8cB94FA284a303348ef42ADD23f5e7"; + +const ZERO_ADDRESS: string = '0x0000000000000000000000000000000000000000'; +const INITIAL_MINT: bigint = 10000000000000000000000000000000000000000n; +const TEST_CONTRACT_NAME = "Tracer"; +const EXECUTE_FUNCTION_NAME = "mint"; +const EXECUTE2_FUNCTION_NAME = "mint2"; +const EXECUTE3_FUNCTION_NAME = "readableRevert"; +const CALL_FUNCTION_NAME = "getBalance"; + + + + + +var DEPLOYED_CONTRACT_ADDRESS_LOWER_CASE: string = ""; +var globalCallCount = 0; + +async function waitUntilNextBlock() { + + const current = await hre.ethers.provider.getBlockNumber(); + let newBlock = current; + console.log(`BLOCK_NUMBER ${current}`); + + while (newBlock == current) { + newBlock = await hre.ethers.provider.getBlockNumber(); + } + + console.log(`BLOCK_NUMBER ${newBlock}`); + + return current; + +} + +function CHECK(result: any): void { + if (!result) { + const message: string = `Check failed ${result}` + console.log(message); + throw message; + } + + +} + + + + +async function deployTestContract(): Promise { + + console.log(`Deploying ` + TEST_CONTRACT_NAME); + + const factory = await ethers.getContractFactory(TEST_CONTRACT_NAME); + const testContractName = await factory.deploy({ + gasLimit: 2100000, // this is just an example value; you'll need to set an appropriate gas limit for your specific function call + }); + const deployedTestContract = await testContractName.deployed(); + + const deployReceipt = await ethers.provider.getTransactionReceipt(deployedTestContract.deployTransaction.hash) + const deployBlockNumber: number = deployReceipt.blockNumber; + + const hash = deployedTestContract.deployTransaction.hash; + console.log(`Contract deployed to ${deployedTestContract.address} at block ${deployBlockNumber.toString(16)} tx hash ${hash}`); + + const tracer = await factory.attach(deployedTestContract.address); + let result = await tracer.callStatic.mint2(1000); + + console.log("Got result"); + + console.log(result); + + return deployedTestContract; + +} + + +function generateNewWallet() { + const wallet = hre.ethers.Wallet.createRandom(); + console.log("Address:", wallet.address); + return wallet; +} + +function sleep(ms: number) { + return new Promise(resolve => setTimeout(resolve, ms)); +} + + +async function sendMoneyWithoutConfirmation(): Promise { + // Generate a new wallet + const newWallet = generateNewWallet(); + + await sleep(3000); // Sleep for 1000 milliseconds (1 second) + + // Get the first signer from Hardhat's local network + const [signer] = await hre.ethers.getSigners(); + + const currentNonce = await signer.getTransactionCount(); + + // Define the transaction + const tx = { + to: newWallet.address, + value: hre.ethers.utils.parseEther("0.1"), + nonce: currentNonce + }; + + // Send the transaction and wait until it is submitted ot the queue + const txResponse = signer.sendTransaction(tx); + + if (hre.network.name == "geth") { + await txResponse; + } + + console.log(`Submitted a tx to send 0.1 ETH to ${newWallet.address}`); + + return currentNonce; +} + +async function sendTransferWithConfirmation(): Promise { + // Generate a new wallet + const newWallet = generateNewWallet(); + + await sleep(3000); // Sleep for 1000 milliseconds (1 second) + + // Get the first signer from Hardhat's local network + const [signer] = await hre.ethers.getSigners(); + + const currentNonce = await signer.getTransactionCount(); + + // Define the transaction + const tx = { + to: "0x388C818CA8B9251b393131C08a736A67ccB19297", + value: hre.ethers.utils.parseEther("0.1"), + }; + + // Send the transaction and wait until it is submitted ot the queue + const txResponse = await signer.sendTransaction(tx); + const txReceipt = await txResponse.wait(); + + console.log(`Submitted a tx to send 0.1 ETH to ${newWallet.address}`); + + return txReceipt.transactionHash!; +} + + +async function executeTransferAndThenTestContractMintInSingleBlock(deployedContract: any): Promise { + + let currentNonce: int = await sendMoneyWithoutConfirmation(); + + const mintReceipt = await deployedContract[EXECUTE_FUNCTION_NAME](1000, { + gasLimit: 2100000, // this is just an example value; you'll need to set an appropriate gas limit for your specific function call + nonce: currentNonce + 1, + }); + + expect(mintReceipt.blockNumber).not.to.be.null; + + + return mintReceipt.hash!; + +} + +async function executeMintCall(deployedContract: any): Promise { + + const result = await deployedContract.mint2(1000); + + console.log("Executed mint2 call"); + +} + + +async function executeRevert(deployedContract: any): Promise { + + const revertReceipt = await deployedContract[EXECUTE3_FUNCTION_NAME](1000, { + gasLimit: 2100000, // this is just an example value; you'll need to set an appropriate gas limit for your specific function call, + }); + + expect(revertReceipt.blockNumber).not.to.be.null; + + + return revertReceipt.hash!; + +} + +async function main(): Promise { + + let deployedContract = await deployTestContract(); + + + + + + DEPLOYED_CONTRACT_ADDRESS_LOWER_CASE = deployedContract.address.toString().toLowerCase(); + + + + while (true) { + + const firstMintHash: string = await executeTransferAndThenTestContractMintInSingleBlock(deployedContract); + + const secondTransferHash: string = await sendTransferWithConfirmation(); + + + const secondMintHash: string = await executeMintCall(deployedContract); + + + const revertHash: string = await executeRevert(deployedContract); + } + +} + + +// We recommend this pattern to be able to use async/await everywhere +// and properly handle errors. +main().catch((error: any) => { + console.error(error); + process.exitCode = 1; +}); diff --git a/test/tools/fuzzTesting/BoostRandomCode.cpp b/test/tools/fuzzTesting/BoostRandomCode.cpp index 595ee45ef..43224e39b 100644 --- a/test/tools/fuzzTesting/BoostRandomCode.cpp +++ b/test/tools/fuzzTesting/BoostRandomCode.cpp @@ -55,13 +55,14 @@ BoostRandomCode::BoostRandomCode() { u256 BoostRandomCode::randomUniInt( u256 const& _minVal, u256 const& _maxVal ) { assert( _minVal <= _maxVal ); - std::uniform_int_distribution< uint64_t > uint64Dist{0, std::numeric_limits< uint64_t >::max()}; + std::uniform_int_distribution< uint64_t > uint64Dist{ 0, + std::numeric_limits< uint64_t >::max() }; u256 value = _minVal + ( u256 ) uint64Dist( gen ) % ( _maxVal - _minVal ); return value; } uint8_t BoostRandomCode::weightedOpcode( std::vector< int > const& _weights ) { - DescreteDistrib opCodeProbability = DescreteDistrib{_weights.begin(), _weights.end()}; + DescreteDistrib opCodeProbability = DescreteDistrib{ _weights.begin(), _weights.end() }; return opCodeProbability( gen ); } } // namespace test diff --git a/test/tools/fuzzTesting/fuzzHelper.cpp b/test/tools/fuzzTesting/fuzzHelper.cpp index 3b1df9682..2207923b6 100644 --- a/test/tools/fuzzTesting/fuzzHelper.cpp +++ b/test/tools/fuzzTesting/fuzzHelper.cpp @@ -31,7 +31,7 @@ using namespace dev; using namespace std; -const static std::array< eth::Instruction, 47 > invalidOpcodes{{eth::Instruction::INVALID, +const static std::array< eth::Instruction, 47 > invalidOpcodes{ { eth::Instruction::INVALID, eth::Instruction::PUSHC, eth::Instruction::JUMPC, eth::Instruction::JUMPCI, eth::Instruction::JUMPTO, eth::Instruction::JUMPIF, eth::Instruction::JUMPSUB, eth::Instruction::JUMPV, eth::Instruction::JUMPSUBV, eth::Instruction::BEGINSUB, @@ -45,7 +45,7 @@ const static std::array< eth::Instruction, 47 > invalidOpcodes{{eth::Instruction eth::Instruction::XROR, eth::Instruction::XPUSH, eth::Instruction::XMLOAD, eth::Instruction::XMSTORE, eth::Instruction::XSLOAD, eth::Instruction::XSSTORE, eth::Instruction::XVTOWIDE, eth::Instruction::XWIDETOV, eth::Instruction::XPUT, - eth::Instruction::XGET, eth::Instruction::XSWIZZLE, eth::Instruction::XSHUFFLE}}; + eth::Instruction::XGET, eth::Instruction::XSWIZZLE, eth::Instruction::XSHUFFLE } }; namespace dev { namespace test { @@ -227,7 +227,7 @@ std::string RandomCodeBase::generate( int _maxOpNumber, RandomCodeOptions const& opcode = makeOpcodeDefined( opcode ); eth::Instruction inst = ( eth::Instruction ) opcode; eth::InstructionInfo info = eth::instructionInfo( inst ); - if ( std::string{info.name}.find( "PUSH" ) != std::string::npos ) { + if ( std::string{ info.name }.find( "PUSH" ) != std::string::npos ) { code += toCompactHex( opcode ); code += fillArguments( inst, _options ); } else { diff --git a/test/tools/jsontests/BlockChainTests.cpp b/test/tools/jsontests/BlockChainTests.cpp index 2959da8eb..036480b44 100644 --- a/test/tools/jsontests/BlockChainTests.cpp +++ b/test/tools/jsontests/BlockChainTests.cpp @@ -237,7 +237,7 @@ json_spirit::mObject fillBCTest( json_spirit::mObject const& _input ) { size_t importBlockNumber = 0; string chainname = "default"; string chainnetwork = "default"; - std::map< string, ChainBranch* > chainMap = {{chainname, new ChainBranch( genesisBlock )}}; + std::map< string, ChainBranch* > chainMap = { { chainname, new ChainBranch( genesisBlock ) } }; if ( _input.count( "network" ) > 0 ) output["network"] = _input.at( "network" ); @@ -387,13 +387,13 @@ json_spirit::mObject fillBCTest( json_spirit::mObject const& _input ) { } output["blocks"] = blArray; - output["postState"] = fillJsonWithState( testChain.topBlock().state().createStateReadOnlyCopy() ); + output["postState"] = fillJsonWithState( testChain.topBlock().state() ); output["lastblockhash"] = toHexPrefixed( testChain.topBlock().blockHeader().hash( WithSeal ) ); // make all values hex in pre section State prestate = State(); ImportTest::importState( _input.at( "pre" ).get_obj(), prestate ); - output["pre"] = fillJsonWithState( prestate.createStateReadOnlyCopy() ); + output["pre"] = fillJsonWithState( prestate ); for ( auto iterator = chainMap.begin(); iterator != chainMap.end(); iterator++ ) delete iterator->second; @@ -507,7 +507,8 @@ void testBCTest( json_spirit::mObject const& _o ) { if ( blockFromFields.blockHeader().parentHash() == preHash ) { State const postState = testChain.topBlock().state(); assert( testChain.getInterface().sealEngine() ); - bigint reward = calculateMiningReward( testChain.topBlock().blockHeader().timestamp(), testChain.topBlock().blockHeader().number(), + bigint reward = calculateMiningReward( testChain.topBlock().blockHeader().timestamp(), + testChain.topBlock().blockHeader().number(), uncleNumbers.size() >= 1 ? uncleNumbers[0] : 0, uncleNumbers.size() >= 2 ? uncleNumbers[1] : 0, testChain.getInterface().sealEngine()->chainParams() ); @@ -537,15 +538,15 @@ void testBCTest( json_spirit::mObject const& _o ) { // blocks!"); State postState = State(); // Compare post states - postState.setStorageLimit(1000000000); + postState.setStorageLimit( 1000000000 ); BOOST_REQUIRE( ( _o.count( "postState" ) > 0 ) ); ImportTest::importState( _o.at( "postState" ).get_obj(), postState ); ImportTest::compareStates( postState, testChain.topBlock().state() ); ImportTest::compareStates( postState, blockchain.topBlock().state() ); } -bigint calculateMiningReward( time_t _committedBlockTimestamp, u256 const& _blNumber, u256 const& _unNumber1, u256 const& _unNumber2, - ChainOperationParams const& _cp ) { +bigint calculateMiningReward( time_t _committedBlockTimestamp, u256 const& _blNumber, + u256 const& _unNumber1, u256 const& _unNumber2, ChainOperationParams const& _cp ) { bigint const baseReward = _cp.blockReward( _committedBlockTimestamp, _blNumber ); bigint reward = baseReward; // INCLUDE_UNCLE = BASE_REWARD / 32 @@ -584,10 +585,9 @@ void overwriteBlockHeaderForTest( header.transactionsRoot(), ho.count( "receiptTrie" ) ? h256( ho["receiptTrie"].get_str() ) : header.receiptsRoot(), ho.count( "bloom" ) ? LogBloom( ho["bloom"].get_str() ) : header.logBloom(), - ho.count( "difficulty" ) ? - toInt( ho["difficulty"] ) : - ho.count( "relDifficulty" ) ? header.difficulty() + toInt( ho["relDifficulty"] ) : - header.difficulty(), + ho.count( "difficulty" ) ? toInt( ho["difficulty"] ) : + ho.count( "relDifficulty" ) ? header.difficulty() + toInt( ho["relDifficulty"] ) : + header.difficulty(), ho.count( "number" ) ? toInt( ho["number"] ) : header.number(), ho.count( "gasLimit" ) ? toInt( ho["gasLimit"] ) : header.gasLimit(), ho.count( "gasUsed" ) ? toInt( ho["gasUsed"] ) : header.gasUsed(), @@ -754,11 +754,10 @@ void overwriteUncleHeaderForTest( mObject& uncleHeaderObj, TestBlock& uncle, uncleHeader.transactionsRoot(), uncleHeader.receiptsRoot(), uncleHeader.logBloom(), overwrite == "difficulty" ? toInt( uncleHeaderObj.at( "difficulty" ) ) : - overwrite == "timestamp" ? + overwrite == "timestamp" ? ( ( const Ethash* ) sealEngine ) - ->calculateDifficulty( - uncleHeader, importedBlocks.at( ( size_t ) uncleHeader.number() - 1 ) - .blockHeader() ) : + ->calculateDifficulty( uncleHeader, + importedBlocks.at( ( size_t ) uncleHeader.number() - 1 ).blockHeader() ) : uncleHeader.difficulty(), overwrite == "number" ? toInt( uncleHeaderObj.at( "number" ) ) : uncleHeader.number(), overwrite == "gasLimit" ? toInt( uncleHeaderObj.at( "gasLimit" ) ) : @@ -833,7 +832,7 @@ mObject writeBlockHeaderToJson( BlockHeader const& _bi ) { } void checkExpectedException( mObject& _blObj, Exception const& _e ) { - string exWhat{_e.what()}; + string exWhat{ _e.what() }; bool isNetException = ( _blObj.count( "expectException" + test::netIdToString( test::TestBlockChain::s_sealEngineNetwork ) ) > 0 ); @@ -1018,16 +1017,14 @@ BOOST_FIXTURE_TEST_SUITE( BlockchainTests, bcTestFixture ) BOOST_AUTO_TEST_CASE( bcStateTests ) {} BOOST_AUTO_TEST_CASE( bcBlockGasLimitTest ) {} BOOST_AUTO_TEST_CASE( bcGasPricerTest ) {} -BOOST_AUTO_TEST_CASE( bcInvalidHeaderTest ) {} BOOST_AUTO_TEST_CASE( bcUncleHeaderValidity ) {} -BOOST_AUTO_TEST_CASE( bcUncleTest ) {} +// Commenting this out as we do not support this BOOST_AUTO_TEST_CASE( bcValidBlockTest ) {} -BOOST_AUTO_TEST_CASE( bcWalletTest, - *boost::unit_test::precondition( dev::test::run_not_express ) ) {} -BOOST_AUTO_TEST_CASE( bcForgedTest, - *boost::unit_test::precondition( dev::test::run_not_express ) ) {} +BOOST_AUTO_TEST_CASE( + bcWalletTest, *boost::unit_test::precondition( dev::test::run_not_express ) ) {} +BOOST_AUTO_TEST_CASE( + bcForgedTest, *boost::unit_test::precondition( dev::test::run_not_express ) ) {} BOOST_AUTO_TEST_CASE( bcRandomBlockhashTest ) {} -BOOST_AUTO_TEST_CASE( bcExploitTest ) {} BOOST_AUTO_TEST_SUITE_END() @@ -1043,110 +1040,103 @@ BOOST_AUTO_TEST_SUITE_END() BOOST_FIXTURE_TEST_SUITE( BCGeneralStateTests, bcGeneralTestsFixture ) // Frontier Tests -BOOST_AUTO_TEST_CASE( stCallCodes, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( stCallCodes, *boost::unit_test::precondition( dev::test::run_not_express ) ) { } -BOOST_AUTO_TEST_CASE( stCallCreateCallCodeTest, - *boost::unit_test::precondition( dev::test::run_not_express ) ) {} -BOOST_AUTO_TEST_CASE( stExample, - *boost::unit_test::precondition( dev::test::run_not_express ) * +BOOST_AUTO_TEST_CASE( + stCallCreateCallCodeTest, *boost::unit_test::precondition( dev::test::run_not_express ) ) {} +BOOST_AUTO_TEST_CASE( + stExample, *boost::unit_test::precondition( dev::test::run_not_express ) * boost::unit_test::precondition( dev::test::run_not_express ) ) {} -BOOST_AUTO_TEST_CASE( stInitCodeTest, - *boost::unit_test::precondition( dev::test::run_not_express ) ) {} -BOOST_AUTO_TEST_CASE( stLogTests, - *boost::unit_test::precondition( dev::test::run_not_express ) ) {} -BOOST_AUTO_TEST_CASE( stMemoryTest, - *boost::unit_test::precondition( dev::test::run_not_express ) ) {} -BOOST_AUTO_TEST_CASE( stPreCompiledContracts, - *boost::unit_test::precondition( dev::test::run_not_express ) ) {} -BOOST_AUTO_TEST_CASE( stPreCompiledContracts2, - *boost::unit_test::precondition( dev::test::run_not_express ) ) {} -BOOST_AUTO_TEST_CASE( stRandom, - *boost::unit_test::precondition( dev::test::run_not_express ) ) {} -BOOST_AUTO_TEST_CASE( stRandom2, - *boost::unit_test::precondition( dev::test::run_not_express ) ) {} -BOOST_AUTO_TEST_CASE( stRecursiveCreate, - *boost::unit_test::precondition( dev::test::run_not_express ) ) {} -BOOST_AUTO_TEST_CASE( stRefundTest, - *boost::unit_test::precondition( dev::test::run_not_express ) ) {} -BOOST_AUTO_TEST_CASE( stSolidityTest, - *boost::unit_test::precondition( dev::test::run_not_express ) ) {} -BOOST_AUTO_TEST_CASE( stSpecialTest, - *boost::unit_test::precondition( dev::test::run_not_express ) ) {} -BOOST_AUTO_TEST_CASE( stSystemOperationsTest, - *boost::unit_test::precondition( dev::test::run_not_express ) ) {} -BOOST_AUTO_TEST_CASE( stTransactionTest, - *boost::unit_test::precondition( dev::test::run_not_express ) ) {} -BOOST_AUTO_TEST_CASE( stTransitionTest, - *boost::unit_test::precondition( dev::test::run_not_express ) ) {} -BOOST_AUTO_TEST_CASE( stWalletTest, - *boost::unit_test::precondition( dev::test::run_not_express ) ) {} +BOOST_AUTO_TEST_CASE( + stInitCodeTest, *boost::unit_test::precondition( dev::test::run_not_express ) ) {} +BOOST_AUTO_TEST_CASE( stLogTests, *boost::unit_test::precondition( dev::test::run_not_express ) ) {} +BOOST_AUTO_TEST_CASE( + stMemoryTest, *boost::unit_test::precondition( dev::test::run_not_express ) ) {} +BOOST_AUTO_TEST_CASE( + stPreCompiledContracts, *boost::unit_test::precondition( dev::test::run_not_express ) ) {} +BOOST_AUTO_TEST_CASE( + stPreCompiledContracts2, *boost::unit_test::precondition( dev::test::run_not_express ) ) {} +BOOST_AUTO_TEST_CASE( stRandom, *boost::unit_test::precondition( dev::test::run_not_express ) ) {} +BOOST_AUTO_TEST_CASE( stRandom2, *boost::unit_test::precondition( dev::test::run_not_express ) ) {} +BOOST_AUTO_TEST_CASE( + stRecursiveCreate, *boost::unit_test::precondition( dev::test::run_not_express ) ) {} +BOOST_AUTO_TEST_CASE( + stRefundTest, *boost::unit_test::precondition( dev::test::run_not_express ) ) {} +BOOST_AUTO_TEST_CASE( + stSolidityTest, *boost::unit_test::precondition( dev::test::run_not_express ) ) {} +BOOST_AUTO_TEST_CASE( + stSpecialTest, *boost::unit_test::precondition( dev::test::run_not_express ) ) {} +BOOST_AUTO_TEST_CASE( + stSystemOperationsTest, *boost::unit_test::precondition( dev::test::run_not_express ) ) {} +BOOST_AUTO_TEST_CASE( + stTransactionTest, *boost::unit_test::precondition( dev::test::run_not_express ) ) {} +BOOST_AUTO_TEST_CASE( + stTransitionTest, *boost::unit_test::precondition( dev::test::run_not_express ) ) {} +BOOST_AUTO_TEST_CASE( + stWalletTest, *boost::unit_test::precondition( dev::test::run_not_express ) ) {} // Homestead Tests BOOST_AUTO_TEST_CASE( stCallDelegateCodesCallCodeHomestead, *boost::unit_test::precondition( dev::test::run_not_express ) ) {} -BOOST_AUTO_TEST_CASE( stCallDelegateCodesHomestead, - *boost::unit_test::precondition( dev::test::run_not_express ) ) {} -BOOST_AUTO_TEST_CASE( stHomesteadSpecific, - *boost::unit_test::precondition( dev::test::run_not_express ) ) {} -BOOST_AUTO_TEST_CASE( stDelegatecallTestHomestead, - *boost::unit_test::precondition( dev::test::run_not_express ) ) {} +BOOST_AUTO_TEST_CASE( + stCallDelegateCodesHomestead, *boost::unit_test::precondition( dev::test::run_not_express ) ) {} +BOOST_AUTO_TEST_CASE( + stHomesteadSpecific, *boost::unit_test::precondition( dev::test::run_not_express ) ) {} +BOOST_AUTO_TEST_CASE( + stDelegatecallTestHomestead, *boost::unit_test::precondition( dev::test::run_not_express ) ) {} // EIP150 Tests -BOOST_AUTO_TEST_CASE( stChangedEIP150, - *boost::unit_test::precondition( dev::test::run_not_express ) ) {} -BOOST_AUTO_TEST_CASE( stEIP150singleCodeGasPrices, - *boost::unit_test::precondition( dev::test::run_not_express ) ) {} -BOOST_AUTO_TEST_CASE( stMemExpandingEIP150Calls, - *boost::unit_test::precondition( dev::test::run_not_express ) ) {} -BOOST_AUTO_TEST_CASE( stEIP150Specific, - *boost::unit_test::precondition( dev::test::run_not_express ) ) {} +BOOST_AUTO_TEST_CASE( + stChangedEIP150, *boost::unit_test::precondition( dev::test::run_not_express ) ) {} +BOOST_AUTO_TEST_CASE( + stEIP150singleCodeGasPrices, *boost::unit_test::precondition( dev::test::run_not_express ) ) {} +BOOST_AUTO_TEST_CASE( + stMemExpandingEIP150Calls, *boost::unit_test::precondition( dev::test::run_not_express ) ) {} +BOOST_AUTO_TEST_CASE( + stEIP150Specific, *boost::unit_test::precondition( dev::test::run_not_express ) ) {} // EIP158 Tests -BOOST_AUTO_TEST_CASE( stEIP158Specific, - *boost::unit_test::precondition( dev::test::run_not_express ) ) {} -BOOST_AUTO_TEST_CASE( stNonZeroCallsTest, - *boost::unit_test::precondition( dev::test::run_not_express ) ) {} -BOOST_AUTO_TEST_CASE( stZeroCallsTest, - *boost::unit_test::precondition( dev::test::run_not_express ) ) {} -BOOST_AUTO_TEST_CASE( stZeroCallsRevert, - *boost::unit_test::precondition( dev::test::run_not_express ) ) {} -BOOST_AUTO_TEST_CASE( stRevertTest, - *boost::unit_test::precondition( dev::test::run_not_express ) ) {} +BOOST_AUTO_TEST_CASE( + stEIP158Specific, *boost::unit_test::precondition( dev::test::run_not_express ) ) {} +BOOST_AUTO_TEST_CASE( + stNonZeroCallsTest, *boost::unit_test::precondition( dev::test::run_not_express ) ) {} +BOOST_AUTO_TEST_CASE( + stZeroCallsTest, *boost::unit_test::precondition( dev::test::run_not_express ) ) {} +BOOST_AUTO_TEST_CASE( + stZeroCallsRevert, *boost::unit_test::precondition( dev::test::run_not_express ) ) {} +BOOST_AUTO_TEST_CASE( + stRevertTest, *boost::unit_test::precondition( dev::test::run_not_express ) ) {} // Metropolis Tests -BOOST_AUTO_TEST_CASE( stStackTests, - *boost::unit_test::precondition( dev::test::run_not_express ) ) {} -BOOST_AUTO_TEST_CASE( stStaticCall, - *boost::unit_test::precondition( dev::test::run_not_express ) ) {} -BOOST_AUTO_TEST_CASE( stReturnDataTest, - *boost::unit_test::precondition( dev::test::run_not_express ) ) {} -BOOST_AUTO_TEST_CASE( stZeroKnowledge, - *boost::unit_test::precondition( dev::test::run_not_express ) ) {} -BOOST_AUTO_TEST_CASE( stZeroKnowledge2, - *boost::unit_test::precondition( dev::test::run_not_express ) ) {} -BOOST_AUTO_TEST_CASE( stBugs, - *boost::unit_test::precondition( dev::test::run_not_express ) ) {} +BOOST_AUTO_TEST_CASE( + stStackTests, *boost::unit_test::precondition( dev::test::run_not_express ) ) {} +BOOST_AUTO_TEST_CASE( + stStaticCall, *boost::unit_test::precondition( dev::test::run_not_express ) ) {} +BOOST_AUTO_TEST_CASE( + stReturnDataTest, *boost::unit_test::precondition( dev::test::run_not_express ) ) {} +BOOST_AUTO_TEST_CASE( + stZeroKnowledge, *boost::unit_test::precondition( dev::test::run_not_express ) ) {} +BOOST_AUTO_TEST_CASE( + stZeroKnowledge2, *boost::unit_test::precondition( dev::test::run_not_express ) ) {} +BOOST_AUTO_TEST_CASE( stBugs, *boost::unit_test::precondition( dev::test::run_not_express ) ) {} // Constantinople Tests -BOOST_AUTO_TEST_CASE( stShift, - *boost::unit_test::precondition( dev::test::run_not_express ) ) {} +BOOST_AUTO_TEST_CASE( stShift, *boost::unit_test::precondition( dev::test::run_not_express ) ) {} // Stress Tests -BOOST_AUTO_TEST_CASE( stAttackTest, - *boost::unit_test::precondition( dev::test::run_not_express ) ) {} -BOOST_AUTO_TEST_CASE( stMemoryStressTest, - *boost::unit_test::precondition( dev::test::run_not_express ) ) {} -BOOST_AUTO_TEST_CASE( stQuadraticComplexityTest, - *boost::unit_test::precondition( dev::test::run_not_express ) ) {} +BOOST_AUTO_TEST_CASE( + stAttackTest, *boost::unit_test::precondition( dev::test::run_not_express ) ) {} +BOOST_AUTO_TEST_CASE( + stMemoryStressTest, *boost::unit_test::precondition( dev::test::run_not_express ) ) {} +BOOST_AUTO_TEST_CASE( + stQuadraticComplexityTest, *boost::unit_test::precondition( dev::test::run_not_express ) ) {} // Bad opcodes test -BOOST_AUTO_TEST_CASE( stBadOpcode, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( stBadOpcode, *boost::unit_test::precondition( dev::test::run_not_express ) ) { } // New Tests -BOOST_AUTO_TEST_CASE( stArgsZeroOneBalance, - *boost::unit_test::precondition( dev::test::run_not_express ) ) {} +BOOST_AUTO_TEST_CASE( + stArgsZeroOneBalance, *boost::unit_test::precondition( dev::test::run_not_express ) ) {} BOOST_AUTO_TEST_SUITE_END() diff --git a/test/tools/jsontests/BlockChainTests.h b/test/tools/jsontests/BlockChainTests.h index 0312859b9..870258539 100644 --- a/test/tools/jsontests/BlockChainTests.h +++ b/test/tools/jsontests/BlockChainTests.h @@ -77,8 +77,8 @@ void checkJsonSectionForInvalidBlock( mObject& _blObj ); void checkExpectedException( mObject& _blObj, Exception const& _e ); void checkBlocks( TestBlock const& _blockFromFields, TestBlock const& _blockFromRlp, string const& _testname ); -bigint calculateMiningReward( time_t _committedBlockTimestamp, u256 const& _blNumber, u256 const& _unNumber1, u256 const& _unNumber2, - ChainOperationParams const& _cp ); +bigint calculateMiningReward( time_t _committedBlockTimestamp, u256 const& _blNumber, + u256 const& _unNumber1, u256 const& _unNumber2, ChainOperationParams const& _cp ); json_spirit::mObject fillBCTest( json_spirit::mObject const& _input ); void testBCTest( json_spirit::mObject const& _o ); diff --git a/test/tools/jsontests/StateTests.cpp b/test/tools/jsontests/StateTests.cpp index 85e886413..9ca46cbcd 100644 --- a/test/tools/jsontests/StateTests.cpp +++ b/test/tools/jsontests/StateTests.cpp @@ -78,7 +78,7 @@ json_spirit::mValue StateTestSuite::doTests( inputTest.count( "transaction" ) > 0, testname + " transaction not set!" ); ImportTest importer( inputTest, outputTest ); - Listener::ExecTimeGuard guard{i.first}; + Listener::ExecTimeGuard guard{ i.first }; importer.executeTest( _fillin ); if ( _fillin ) { @@ -162,43 +162,40 @@ class GeneralTestFixture { BOOST_FIXTURE_TEST_SUITE( GeneralStateTests, GeneralTestFixture ) // Frontier Tests -BOOST_AUTO_TEST_CASE( stCallCodes, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( stCallCodes, *boost::unit_test::precondition( dev::test::run_not_express ) ) { } -BOOST_AUTO_TEST_CASE( stCallCreateCallCodeTest, - *boost::unit_test::precondition( dev::test::run_not_express ) ) {} -BOOST_AUTO_TEST_CASE( stExample, *boost::unit_test::precondition( dev::test::run_not_express ) * +BOOST_AUTO_TEST_CASE( + stCallCreateCallCodeTest, *boost::unit_test::precondition( dev::test::run_not_express ) ) {} +BOOST_AUTO_TEST_CASE( + stExample, *boost::unit_test::precondition( dev::test::run_not_express ) * boost::unit_test::precondition( dev::test::run_not_express ) ) {} -BOOST_AUTO_TEST_CASE( stInitCodeTest, - *boost::unit_test::precondition( dev::test::run_not_express ) ) {} -BOOST_AUTO_TEST_CASE( stLogTests, - *boost::unit_test::precondition( dev::test::run_not_express ) ) {} -BOOST_AUTO_TEST_CASE( stMemoryTest, - *boost::unit_test::precondition( dev::test::run_not_express ) ) {} -BOOST_AUTO_TEST_CASE( stPreCompiledContracts, - *boost::unit_test::precondition( dev::test::run_not_express ) ) {} -BOOST_AUTO_TEST_CASE( stPreCompiledContracts2, - *boost::unit_test::precondition( dev::test::run_not_express ) ) {} -BOOST_AUTO_TEST_CASE( stRandom, - *boost::unit_test::precondition( dev::test::run_not_express ) ) {} -BOOST_AUTO_TEST_CASE( stRandom2, - *boost::unit_test::precondition( dev::test::run_not_express ) ) {} -BOOST_AUTO_TEST_CASE( stRecursiveCreate, - *boost::unit_test::precondition( dev::test::run_not_express ) ) {} -BOOST_AUTO_TEST_CASE( stRefundTest, - *boost::unit_test::precondition( dev::test::run_not_express ) ) {} -BOOST_AUTO_TEST_CASE( stSolidityTest, - *boost::unit_test::precondition( dev::test::run_not_express ) ) {} -BOOST_AUTO_TEST_CASE( stSpecialTest, - *boost::unit_test::precondition( dev::test::run_not_express ) ) {} -BOOST_AUTO_TEST_CASE( stSystemOperationsTest, - *boost::unit_test::precondition( dev::test::run_not_express ) ) {} -BOOST_AUTO_TEST_CASE( stTransactionTest, - *boost::unit_test::precondition( dev::test::run_not_express ) ) {} -BOOST_AUTO_TEST_CASE( stTransitionTest, - *boost::unit_test::precondition( dev::test::run_not_express ) ) {} -BOOST_AUTO_TEST_CASE( stWalletTest, - *boost::unit_test::precondition( dev::test::run_not_express ) ) {} +BOOST_AUTO_TEST_CASE( + stInitCodeTest, *boost::unit_test::precondition( dev::test::run_not_express ) ) {} +BOOST_AUTO_TEST_CASE( stLogTests, *boost::unit_test::precondition( dev::test::run_not_express ) ) {} +BOOST_AUTO_TEST_CASE( + stMemoryTest, *boost::unit_test::precondition( dev::test::run_not_express ) ) {} +BOOST_AUTO_TEST_CASE( + stPreCompiledContracts, *boost::unit_test::precondition( dev::test::run_not_express ) ) {} +BOOST_AUTO_TEST_CASE( + stPreCompiledContracts2, *boost::unit_test::precondition( dev::test::run_not_express ) ) {} +BOOST_AUTO_TEST_CASE( stRandom, *boost::unit_test::precondition( dev::test::run_not_express ) ) {} +BOOST_AUTO_TEST_CASE( stRandom2, *boost::unit_test::precondition( dev::test::run_not_express ) ) {} +BOOST_AUTO_TEST_CASE( + stRecursiveCreate, *boost::unit_test::precondition( dev::test::run_not_express ) ) {} +BOOST_AUTO_TEST_CASE( + stRefundTest, *boost::unit_test::precondition( dev::test::run_not_express ) ) {} +BOOST_AUTO_TEST_CASE( + stSolidityTest, *boost::unit_test::precondition( dev::test::run_not_express ) ) {} +BOOST_AUTO_TEST_CASE( + stSpecialTest, *boost::unit_test::precondition( dev::test::run_not_express ) ) {} +BOOST_AUTO_TEST_CASE( + stSystemOperationsTest, *boost::unit_test::precondition( dev::test::run_not_express ) ) {} +BOOST_AUTO_TEST_CASE( + stTransactionTest, *boost::unit_test::precondition( dev::test::run_not_express ) ) {} +BOOST_AUTO_TEST_CASE( + stTransitionTest, *boost::unit_test::precondition( dev::test::run_not_express ) ) {} +BOOST_AUTO_TEST_CASE( + stWalletTest, *boost::unit_test::precondition( dev::test::run_not_express ) ) {} // Homestead Tests BOOST_AUTO_TEST_CASE( stCallDelegateCodesCallCodeHomestead, @@ -207,72 +204,71 @@ BOOST_AUTO_TEST_CASE( stCallDelegateCodesCallCodeHomestead, BOOST_AUTO_TEST_CASE( stCallDelegateCodesHomestead, *boost::unit_test::precondition( dev::test::run_not_express ) * boost::unit_test::precondition( dev::test::run_not_express ) ) {} -BOOST_AUTO_TEST_CASE( stHomesteadSpecific, - *boost::unit_test::precondition( dev::test::run_not_express ) ) {} -BOOST_AUTO_TEST_CASE( stDelegatecallTestHomestead, - *boost::unit_test::precondition( dev::test::run_not_express ) ) {} +BOOST_AUTO_TEST_CASE( + stHomesteadSpecific, *boost::unit_test::precondition( dev::test::run_not_express ) ) {} +BOOST_AUTO_TEST_CASE( + stDelegatecallTestHomestead, *boost::unit_test::precondition( dev::test::run_not_express ) ) {} // EIP150 Tests -BOOST_AUTO_TEST_CASE( stChangedEIP150, - *boost::unit_test::precondition( dev::test::run_not_express ) ) {} -BOOST_AUTO_TEST_CASE( stEIP150singleCodeGasPrices, - *boost::unit_test::precondition( dev::test::run_not_express ) ) {} -BOOST_AUTO_TEST_CASE( stMemExpandingEIP150Calls, *boost::unit_test::precondition( dev::test::run_not_express ) * +BOOST_AUTO_TEST_CASE( + stChangedEIP150, *boost::unit_test::precondition( dev::test::run_not_express ) ) {} +BOOST_AUTO_TEST_CASE( + stEIP150singleCodeGasPrices, *boost::unit_test::precondition( dev::test::run_not_express ) ) {} +BOOST_AUTO_TEST_CASE( + stMemExpandingEIP150Calls, *boost::unit_test::precondition( dev::test::run_not_express ) * boost::unit_test::precondition( dev::test::run_not_express ) ) {} -BOOST_AUTO_TEST_CASE( stEIP150Specific, - *boost::unit_test::precondition( dev::test::run_not_express ) ) {} +BOOST_AUTO_TEST_CASE( + stEIP150Specific, *boost::unit_test::precondition( dev::test::run_not_express ) ) {} // EIP158 Tests -BOOST_AUTO_TEST_CASE( stEIP158Specific, - *boost::unit_test::precondition( dev::test::run_not_express ) ) {} -BOOST_AUTO_TEST_CASE( stNonZeroCallsTest, - *boost::unit_test::precondition( dev::test::run_not_express ) ) {} -BOOST_AUTO_TEST_CASE( stZeroCallsTest, - *boost::unit_test::precondition( dev::test::run_not_express ) ) {} -BOOST_AUTO_TEST_CASE( stZeroCallsRevert, - *boost::unit_test::precondition( dev::test::run_not_express ) ) {} -BOOST_AUTO_TEST_CASE( stCodeSizeLimit, - *boost::unit_test::precondition( dev::test::run_not_express ) ) {} -BOOST_AUTO_TEST_CASE( stCreateTest, - *boost::unit_test::precondition( dev::test::run_not_express ) ) {} -BOOST_AUTO_TEST_CASE( stRevertTest, - *boost::unit_test::precondition( dev::test::run_not_express ) ) {} +BOOST_AUTO_TEST_CASE( + stEIP158Specific, *boost::unit_test::precondition( dev::test::run_not_express ) ) {} +BOOST_AUTO_TEST_CASE( + stNonZeroCallsTest, *boost::unit_test::precondition( dev::test::run_not_express ) ) {} +BOOST_AUTO_TEST_CASE( + stZeroCallsTest, *boost::unit_test::precondition( dev::test::run_not_express ) ) {} +BOOST_AUTO_TEST_CASE( + stZeroCallsRevert, *boost::unit_test::precondition( dev::test::run_not_express ) ) {} +BOOST_AUTO_TEST_CASE( + stCodeSizeLimit, *boost::unit_test::precondition( dev::test::run_not_express ) ) {} +BOOST_AUTO_TEST_CASE( + stCreateTest, *boost::unit_test::precondition( dev::test::run_not_express ) ) {} +BOOST_AUTO_TEST_CASE( + stRevertTest, *boost::unit_test::precondition( dev::test::run_not_express ) ) {} // Metropolis Tests -BOOST_AUTO_TEST_CASE( stStackTests, - *boost::unit_test::precondition( dev::test::run_not_express ) ) {} -BOOST_AUTO_TEST_CASE( stStaticCall, - *boost::unit_test::precondition( dev::test::run_not_express ) ) {} -BOOST_AUTO_TEST_CASE( stReturnDataTest, - *boost::unit_test::precondition( dev::test::run_not_express ) ) {} -BOOST_AUTO_TEST_CASE( stZeroKnowledge, - *boost::unit_test::precondition( dev::test::run_not_express ) ) {} -BOOST_AUTO_TEST_CASE( stZeroKnowledge2, - *boost::unit_test::precondition( dev::test::run_not_express ) ) {} +BOOST_AUTO_TEST_CASE( + stStackTests, *boost::unit_test::precondition( dev::test::run_not_express ) ) {} +BOOST_AUTO_TEST_CASE( + stStaticCall, *boost::unit_test::precondition( dev::test::run_not_express ) ) {} +BOOST_AUTO_TEST_CASE( + stReturnDataTest, *boost::unit_test::precondition( dev::test::run_not_express ) ) {} +BOOST_AUTO_TEST_CASE( + stZeroKnowledge, *boost::unit_test::precondition( dev::test::run_not_express ) ) {} +BOOST_AUTO_TEST_CASE( + stZeroKnowledge2, *boost::unit_test::precondition( dev::test::run_not_express ) ) {} BOOST_AUTO_TEST_CASE( stCodeCopyTest ) {} -BOOST_AUTO_TEST_CASE( stBugs, - *boost::unit_test::precondition( dev::test::run_not_express ) ) {} +BOOST_AUTO_TEST_CASE( stBugs, *boost::unit_test::precondition( dev::test::run_not_express ) ) {} // Constantinople Tests -BOOST_AUTO_TEST_CASE( stShift, - *boost::unit_test::precondition( dev::test::run_not_express ) ) {} +BOOST_AUTO_TEST_CASE( stShift, *boost::unit_test::precondition( dev::test::run_not_express ) ) {} // Stress Tests -BOOST_AUTO_TEST_CASE( stAttackTest, - *boost::unit_test::precondition( dev::test::run_not_express ) ) {} -BOOST_AUTO_TEST_CASE( stMemoryStressTest, - *boost::unit_test::precondition( dev::test::run_not_express ) ) {} -BOOST_AUTO_TEST_CASE( stQuadraticComplexityTest, *boost::unit_test::precondition( dev::test::run_not_express ) * +BOOST_AUTO_TEST_CASE( + stAttackTest, *boost::unit_test::precondition( dev::test::run_not_express ) ) {} +BOOST_AUTO_TEST_CASE( + stMemoryStressTest, *boost::unit_test::precondition( dev::test::run_not_express ) ) {} +BOOST_AUTO_TEST_CASE( + stQuadraticComplexityTest, *boost::unit_test::precondition( dev::test::run_not_express ) * boost::unit_test::precondition( dev::test::run_not_express ) ) {} // Invalid Opcode Tests -BOOST_AUTO_TEST_CASE( stBadOpcode, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( stBadOpcode, *boost::unit_test::precondition( dev::test::run_not_express ) ) { } // New Tests -BOOST_AUTO_TEST_CASE( stArgsZeroOneBalance, - *boost::unit_test::precondition( dev::test::run_not_express ) ) {} -BOOST_AUTO_TEST_CASE( stEWASMTests, - *boost::unit_test::precondition( dev::test::run_not_express ) ) {} +BOOST_AUTO_TEST_CASE( + stArgsZeroOneBalance, *boost::unit_test::precondition( dev::test::run_not_express ) ) {} +BOOST_AUTO_TEST_CASE( + stEWASMTests, *boost::unit_test::precondition( dev::test::run_not_express ) ) {} BOOST_AUTO_TEST_SUITE_END() diff --git a/test/tools/jsontests/TransactionTests.cpp b/test/tools/jsontests/TransactionTests.cpp index 96b19dd67..f75791cca 100644 --- a/test/tools/jsontests/TransactionTests.cpp +++ b/test/tools/jsontests/TransactionTests.cpp @@ -103,7 +103,8 @@ json_spirit::mObject FillTransactionTest( json_spirit::mObject const& _o ) { "transaction from RLP signature is invalid" ) ); // TODO Remove SealEngine from tests too! - se->verifyTransaction( se->chainParams(), ImportRequirements::Everything, txFromFields, 0, bh, 0 ); + se->verifyTransaction( + se->chainParams(), ImportRequirements::Everything, txFromFields, 0, bh, 0 ); if ( expectSection.count( "sender" ) > 0 ) { string expectSender = toString( expectSection["sender"].get_str() ); BOOST_CHECK_MESSAGE( toString( txFromFields.sender() ) == expectSender, @@ -162,7 +163,8 @@ void TestTransactionTest( json_spirit::mObject const& _o ) { txFromRlp = Transaction( rlp.data(), CheckTransaction::Everything ); bool onExperimentalAndZeroSig = onExperimental && txFromRlp.hasZeroSignature(); // TODO Remove SealEngine from tests too! - se->verifyTransaction( se->chainParams(), ImportRequirements::Everything, txFromRlp, 0, bh, 0 ); + se->verifyTransaction( + se->chainParams(), ImportRequirements::Everything, txFromRlp, 0, bh, 0 ); if ( !( txFromRlp.signature().isValid() || onExperimentalAndZeroSig ) ) BOOST_THROW_EXCEPTION( Exception() << errinfo_comment( testname + diff --git a/test/tools/jsontests/vm.cpp b/test/tools/jsontests/vm.cpp index 939dd07da..704b3f01b 100644 --- a/test/tools/jsontests/vm.cpp +++ b/test/tools/jsontests/vm.cpp @@ -50,13 +50,13 @@ CreateResult FakeExtVM::create( u256 _endowment, u256& io_gas, bytesConstRef _init, Instruction, u256, OnOpFunc const& ) { Address address = right160( sha3( rlpList( myAddress, get< 1 >( addresses[myAddress] ) ) ) ); callcreates.emplace_back( _endowment, gasPrice, io_gas, _init.toBytes() ); - return {EVMC_SUCCESS, {}, address}; + return { EVMC_SUCCESS, {}, address }; } CallResult FakeExtVM::call( CallParameters& _p ) { Transaction t( _p.valueTransfer, gasPrice, _p.gas, _p.receiveAddress, _p.data.toVector() ); callcreates.push_back( t ); - return {EVMC_SUCCESS, {}}; // Return empty output. + return { EVMC_SUCCESS, {} }; // Return empty output. } h256 FakeExtVM::blockHash( u256 _number ) { @@ -92,7 +92,8 @@ mObject FakeExtVM::exportEnv() { return ret; } -EnvInfo FakeExtVM::importEnv( mObject const& _o, LastBlockHashesFace const& _lastBlockHashes, time_t _committedBlockTimestamp ) { +EnvInfo FakeExtVM::importEnv( mObject const& _o, LastBlockHashesFace const& _lastBlockHashes, + time_t _committedBlockTimestamp ) { // cant use BOOST_REQUIRE, because this function is used outside boost test (createRandomTest) assert( _o.count( "currentGasLimit" ) > 0 ); assert( _o.count( "currentDifficulty" ) > 0 ); @@ -313,7 +314,8 @@ json_spirit::mValue VmTestSuite::doTests( json_spirit::mValue const& _input, boo BOOST_REQUIRE_MESSAGE( testInput.count( "expect" ) == 0, testname + " expect set!" ); TestLastBlockHashes lastBlockHashes( h256s( 256, h256() ) ); - eth::EnvInfo env = FakeExtVM::importEnv( testInput.at( "env" ).get_obj(), lastBlockHashes, 0 ); + eth::EnvInfo env = + FakeExtVM::importEnv( testInput.at( "env" ).get_obj(), lastBlockHashes, 0 ); FakeExtVM fev( env ); fev.importState( testInput.at( "pre" ).get_obj() ); @@ -336,7 +338,7 @@ json_spirit::mValue VmTestSuite::doTests( json_spirit::mValue const& _input, boo auto vm = eth::VMFactory::create(); auto vmtrace = Options::get().vmtrace ? fev.simpleTrace() : OnOpFunc{}; { - Listener::ExecTimeGuard guard{i.first}; + Listener::ExecTimeGuard guard{ i.first }; auto gas = static_cast< int64_t >( fev.gas ); output = vm->exec( fev.gas, fev, vmtrace ); gas -= static_cast< int64_t >( fev.gas ); @@ -368,9 +370,9 @@ json_spirit::mValue VmTestSuite::doTests( json_spirit::mValue const& _input, boo BOOST_REQUIRE_MESSAGE( testInput.count( "expect" ) == 1, testname + " multiple expect set!" ); State postState = State(); - postState.setStorageLimit(1000000000); + postState.setStorageLimit( 1000000000 ); State expectState = State(); - expectState.setStorageLimit(1000000000); + expectState.setStorageLimit( 1000000000 ); AccountMaskMap expectStateMap; ImportTest::importState( mValue( fev.exportState() ).get_obj(), postState ); ImportTest::importState( @@ -390,9 +392,9 @@ json_spirit::mValue VmTestSuite::doTests( json_spirit::mValue const& _input, boo testInput.count( "expect" ) == 1, testname + " multiple expect set!" ); State postState = State(); - postState.setStorageLimit(1000000000); + postState.setStorageLimit( 1000000000 ); State expectState = State(); - expectState.setStorageLimit(1000000000); + expectState.setStorageLimit( 1000000000 ); AccountMaskMap expectStateMap; // json_spirit::mObject const& debug_var = testOutput.at("post").get_obj(); @@ -447,7 +449,8 @@ json_spirit::mValue VmTestSuite::doTests( json_spirit::mValue const& _input, boo testname + " logs field is not a string." ); // use all patches here ("1") - dev::test::FakeExtVM test( eth::EnvInfo{BlockHeader{}, lastBlockHashes, 1, 0, 0} ); + dev::test::FakeExtVM test( + eth::EnvInfo{ BlockHeader{}, lastBlockHashes, 1, 0, 0 } ); test.importState( testInput.at( "post" ).get_obj() ); test.importCallCreates( testInput.at( "callcreates" ).get_array() ); @@ -456,9 +459,9 @@ json_spirit::mValue VmTestSuite::doTests( json_spirit::mValue const& _input, boo BOOST_CHECK_EQUAL( toInt( testInput.at( "gas" ) ), fev.gas ); State postState = State(); - postState.setStorageLimit(1000000000); + postState.setStorageLimit( 1000000000 ); State expectState = State(); - expectState.setStorageLimit(1000000000); + expectState.setStorageLimit( 1000000000 ); mObject mPostState = fev.exportState(); ImportTest::importState( mPostState, postState ); ImportTest::importState( testInput.at( "post" ).get_obj(), expectState ); @@ -505,21 +508,20 @@ class VmTestFixture { BOOST_FIXTURE_TEST_SUITE( VMTests, VmTestFixture ) BOOST_AUTO_TEST_CASE( vmArithmeticTest ) {} -BOOST_AUTO_TEST_CASE( vmBitwiseLogicOperation, - *boost::unit_test::precondition( dev::test::run_not_express ) ) {} -BOOST_AUTO_TEST_CASE( vmBlockInfoTest, - *boost::unit_test::precondition( dev::test::run_not_express ) ) {} -BOOST_AUTO_TEST_CASE( vmEnvironmentalInfo, - *boost::unit_test::precondition( dev::test::run_not_express ) ) {} +BOOST_AUTO_TEST_CASE( + vmBitwiseLogicOperation, *boost::unit_test::precondition( dev::test::run_not_express ) ) {} +BOOST_AUTO_TEST_CASE( + vmBlockInfoTest, *boost::unit_test::precondition( dev::test::run_not_express ) ) {} +BOOST_AUTO_TEST_CASE( + vmEnvironmentalInfo, *boost::unit_test::precondition( dev::test::run_not_express ) ) {} BOOST_AUTO_TEST_CASE( vmIOandFlowOperations ) {} BOOST_AUTO_TEST_CASE( vmLogTest ) {} -BOOST_AUTO_TEST_CASE( vmPerformance, - *boost::unit_test::precondition( dev::test::run_not_express ) ) {} +BOOST_AUTO_TEST_CASE( + vmPerformance, *boost::unit_test::precondition( dev::test::run_not_express ) ) {} BOOST_AUTO_TEST_CASE( vmPushDupSwapTest ) {} -BOOST_AUTO_TEST_CASE( vmRandomTest, - *boost::unit_test::precondition( dev::test::run_not_express ) ) {} -BOOST_AUTO_TEST_CASE( vmSha3Test, - *boost::unit_test::precondition( dev::test::run_not_express ) ) {} +BOOST_AUTO_TEST_CASE( + vmRandomTest, *boost::unit_test::precondition( dev::test::run_not_express ) ) {} +BOOST_AUTO_TEST_CASE( vmSha3Test, *boost::unit_test::precondition( dev::test::run_not_express ) ) {} BOOST_AUTO_TEST_CASE( vmSystemOperations ) {} BOOST_AUTO_TEST_CASE( vmTests ) {} diff --git a/test/tools/jsontests/vm.h b/test/tools/jsontests/vm.h index 4c0c510cd..0d24d83c4 100644 --- a/test/tools/jsontests/vm.h +++ b/test/tools/jsontests/vm.h @@ -76,8 +76,8 @@ class FakeExtVM : public eth::ExtVMFace { void reset( u256 _myBalance, u256 _myNonce, std::map< u256, u256 > const& _storage ); u256 doPosts(); json_spirit::mObject exportEnv(); - static dev::eth::EnvInfo importEnv( - json_spirit::mObject const& _o, eth::LastBlockHashesFace const& _lastBlockHashes, time_t _committedBlockTimestamp ); + static dev::eth::EnvInfo importEnv( json_spirit::mObject const& _o, + eth::LastBlockHashesFace const& _lastBlockHashes, time_t _committedBlockTimestamp ); json_spirit::mObject exportState(); void importState( json_spirit::mObject const& _object ); json_spirit::mObject exportExec(); @@ -94,7 +94,7 @@ class FakeExtVM : public eth::ExtVMFace { u256 gas; u256 execGas; - mutable Logger m_logger{createLogger( VerbosityTrace, "EVM" )}; + mutable Logger m_logger{ createLogger( VerbosityTrace, "EVM" ) }; }; class VmTestSuite : public TestSuite { diff --git a/test/tools/libtesteth/BlockChainHelper.cpp b/test/tools/libtesteth/BlockChainHelper.cpp index 53b3ce334..d563f44f6 100644 --- a/test/tools/libtesteth/BlockChainHelper.cpp +++ b/test/tools/libtesteth/BlockChainHelper.cpp @@ -99,7 +99,7 @@ void TestBlock::initBlockFromJsonHeader( mObject const& _blockHeader, mObject co m_state = std::unique_ptr< State >( new State( 0, m_tempDirState.get()->path(), h256{}, BaseState::Empty, 0, 1000000000 ) ); ImportTest::importState( _stateObj, *m_state ); - m_state->createStateModifyCopy().commit( dev::eth::CommitBehaviour::KeepEmptyAccounts ); + m_state->createStateCopyAndClearCaches().commit( dev::eth::CommitBehaviour::KeepEmptyAccounts ); json_spirit::mObject state = _stateObj; dev::test::replaceCodeInState( state ); @@ -360,7 +360,7 @@ void TestBlock::verify( TestBlockChain const& _bc ) const { if ( ( m_blockHeader.number() >= daoHardfork && m_blockHeader.number() <= daoHardfork + 9 ) || m_blockHeader.number() == 0 ) { - string exWhat{_e.what()}; + string exWhat{ _e.what() }; string exExpect = "InvalidTransactionsRoot"; BOOST_REQUIRE_MESSAGE( exWhat.find( exExpect ) != string::npos, TestOutputHelper::get().testName() + @@ -472,8 +472,7 @@ void TestBlockChain::reset( TestBlock const& _genesisBlock ) { } bool TestBlockChain::addBlock( TestBlock const& _block ) { - - SchainPatch::useLatestBlockTimestamp(m_blockChain->info().timestamp()); + SchainPatch::useLatestBlockTimestamp( m_blockChain->info().timestamp() ); while ( true ) { try { @@ -497,7 +496,7 @@ bool TestBlockChain::addBlock( TestBlock const& _block ) { State st( block.state() ); m_lastBlock.setState( st ); - SchainPatch::useLatestBlockTimestamp(m_blockChain->info().timestamp()); + SchainPatch::useLatestBlockTimestamp( m_blockChain->info().timestamp() ); return true; } diff --git a/test/tools/libtesteth/FillJsonFunctions.cpp b/test/tools/libtesteth/FillJsonFunctions.cpp index 142344bc0..3b42f2983 100644 --- a/test/tools/libtesteth/FillJsonFunctions.cpp +++ b/test/tools/libtesteth/FillJsonFunctions.cpp @@ -61,7 +61,9 @@ json_spirit::mObject fillJsonWithStateChange( // Sort the vector by address field skale::ChangeLog changeLog = _changeLog; std::sort( changeLog.begin(), changeLog.end(), - []( const skale::Change& lhs, const skale::Change& rhs ) { return lhs.address < rhs.address; } ); + []( const skale::Change& lhs, const skale::Change& rhs ) { + return lhs.address < rhs.address; + } ); std::ostringstream log; json_spirit::mObject o; diff --git a/test/tools/libtesteth/ImportTest.cpp b/test/tools/libtesteth/ImportTest.cpp index 0a3bf579b..ca8e4598a 100644 --- a/test/tools/libtesteth/ImportTest.cpp +++ b/test/tools/libtesteth/ImportTest.cpp @@ -60,8 +60,8 @@ ImportTest::ImportTest( json_spirit::mObject const& _input, json_spirit::mObject m_statePost( 0 ), m_testInputObject( _input ), m_testOutputObject( _output ) { - m_statePre.setStorageLimit(1000000000); - m_statePost.setStorageLimit(1000000000); + m_statePre.setStorageLimit( 1000000000 ); + m_statePost.setStorageLimit( 1000000000 ); importEnv( _input.at( "env" ).get_obj() ); importTransaction( _input.at( "transaction" ).get_obj() ); importState( _input.at( "pre" ).get_obj(), m_statePre ); @@ -93,7 +93,7 @@ void ImportTest::makeBlockchainTestFromStateTest( set< eth::Network > const& _ne State s = State( 0 ); AccountMaskMap m; - StateAndMap smap{s, m}; + StateAndMap smap{ s, m }; vector< size_t > stateIndexesToPrint; json_spirit::mArray expetSectionArray; @@ -102,18 +102,18 @@ void ImportTest::makeBlockchainTestFromStateTest( set< eth::Network > const& _ne trDup.netId = net; // Calculate the block reward - ChainParams const chainParams{genesisInfo( net )}; + ChainParams const chainParams{ genesisInfo( net ) }; EVMSchedule const schedule = chainParams.makeEvmSchedule( 0, 1 ); // u256 const blockReward = chainParams.blockReward(schedule); - TrExpectSection search{trDup, smap}; + TrExpectSection search{ trDup, smap }; for ( auto const& exp : m_testInputObject.at( "expect" ).get_array() ) { TrExpectSection* search2 = &search; checkGeneralTestSectionSearch( exp.get_obj(), stateIndexesToPrint, "", search2 ); throw std::logic_error( "Skale state does not support addresses list" ); } // for exp - } // for net + } // for net testObj["expect"] = expetSectionArray; @@ -157,14 +157,14 @@ set< eth::Network > ImportTest::getAllNetworksFromExpectSections( BOOST_REQUIRE( exp.get_obj().count( "network" ) > 0 ); if ( exp.get_obj().at( "network" ).type() == json_spirit::str_type ) requireJsonFields( exp.get_obj(), "expect", - {{"network", jsonVType::str_type}, {"result", jsonVType::obj_type}} ); + { { "network", jsonVType::str_type }, { "result", jsonVType::obj_type } } ); else requireJsonFields( exp.get_obj(), "expect", - {{"network", jsonVType::array_type}, {"result", jsonVType::obj_type}} ); + { { "network", jsonVType::array_type }, { "result", jsonVType::obj_type } } ); } else if ( _testType == testType::StateTest ) requireJsonFields( exp.get_obj(), "expect", - {{"indexes", jsonVType::obj_type}, {"network", jsonVType::array_type}, - {"result", jsonVType::obj_type}} ); + { { "indexes", jsonVType::obj_type }, { "network", jsonVType::array_type }, + { "result", jsonVType::obj_type } } ); ImportTest::parseJsonStrValueIntoSet( exp.get_obj().at( "network" ), allNetworks ); } @@ -209,7 +209,7 @@ bytes ImportTest::executeTest( bool _isFilling ) { if ( statePreIsChanged ) { // revert changes in m_statePre m_statePre = State( 0 ); - m_statePre.setStorageLimit(1000000000); + m_statePre.setStorageLimit( 1000000000 ); importState( m_testInputObject.at( "pre" ).get_obj(), m_statePre ); } @@ -229,12 +229,11 @@ bytes ImportTest::executeTest( bool _isFilling ) { } void ImportTest::checkBalance( State const& _pre, State const& _post, bigint _miningReward ) { - State pre = _pre.createStateReadOnlyCopy(), post = _post.createStateReadOnlyCopy(); bigint preBalance = 0; bigint postBalance = 0; - for ( auto const& addr : pre.addresses() ) + for ( auto const& addr : _pre.addresses() ) preBalance += addr.second; - for ( auto const& addr : post.addresses() ) + for ( auto const& addr : _post.addresses() ) postBalance += addr.second; // account could destroy ether if it suicides to itself @@ -250,7 +249,7 @@ std::tuple< State, ImportTest::ExecOutput, skale::ChangeLog > ImportTest::execut assert( m_envInfo ); bool removeEmptyAccounts = false; - State initialState = _preState.createStateModifyCopy(); + State initialState = _preState; initialState.addBalance( _env.author(), 0 ); // imitate mining reward ExecOutput out( std::make_pair( eth::ExecutionResult(), eth::TransactionReceipt( h256(), u256(), eth::LogEntries() ) ) ); @@ -262,7 +261,8 @@ std::tuple< State, ImportTest::ExecOutput, skale::ChangeLog > ImportTest::execut StandardTrace st; st.setShowMnemonics(); st.setOptions( Options::get().jsontraceOptions ); - out = initialState.execute( _env, se->chainParams(), _tr, Permanence::Committed, st.onOp() ); + out = initialState.execute( + _env, se->chainParams(), _tr, Permanence::Committed, st.onOp() ); cout << st.json(); cout << "{\"stateRoot\": \"Is not supported\"}"; } else @@ -296,9 +296,9 @@ std::tuple< State, ImportTest::ExecOutput, skale::ChangeLog > ImportTest::execut json_spirit::mObject ImportTest::makeAllFieldsHex( json_spirit::mObject const& _input, bool _isHeader ) { - static const set< string > hashes{"bloom", "coinbase", "hash", "mixHash", "parentHash", + static const set< string > hashes{ "bloom", "coinbase", "hash", "mixHash", "parentHash", "receiptTrie", "stateRoot", "transactionsTrie", "uncleHash", "currentCoinbase", - "previousHash", "to", "address", "caller", "origin", "secretKey", "data", "extraData"}; + "previousHash", "to", "address", "caller", "origin", "secretKey", "data", "extraData" }; json_spirit::mObject output = _input; @@ -344,9 +344,10 @@ json_spirit::mObject ImportTest::makeAllFieldsHex( void ImportTest::importEnv( json_spirit::mObject const& _o ) { requireJsonFields( _o, "env", - {{"currentCoinbase", jsonVType::str_type}, {"currentDifficulty", jsonVType::str_type}, - {"currentGasLimit", jsonVType::str_type}, {"currentNumber", jsonVType::str_type}, - {"currentTimestamp", jsonVType::str_type}, {"previousHash", jsonVType::str_type}} ); + { { "currentCoinbase", jsonVType::str_type }, { "currentDifficulty", jsonVType::str_type }, + { "currentGasLimit", jsonVType::str_type }, { "currentNumber", jsonVType::str_type }, + { "currentTimestamp", jsonVType::str_type }, + { "previousHash", jsonVType::str_type } } ); auto gasLimit = toInt( _o.at( "currentGasLimit" ) ); BOOST_REQUIRE( gasLimit <= std::numeric_limits< int64_t >::max() ); BlockHeader header; @@ -373,7 +374,7 @@ void ImportTest::importState( validation::validateAccountMaskObj( accountMaskJson ); } std::string jsondata = json_spirit::write_string( ( json_spirit::mValue ) o, false ); - _state.createStateModifyCopy().populateFrom( jsonToAccountMap( jsondata, 0, &o_mask ) ); + _state.populateFrom( jsonToAccountMap( jsondata, 0, &o_mask ) ); } void ImportTest::importState( json_spirit::mObject const& _o, State& _state ) { @@ -381,8 +382,8 @@ void ImportTest::importState( json_spirit::mObject const& _o, State& _state ) { BOOST_REQUIRE_MESSAGE( account.second.type() == jsonVType::obj_type, "State account is required to be json Object!" ); requireJsonFields( account.second.get_obj(), account.first, - {{"balance", jsonVType::str_type}, {"code", jsonVType::str_type}, - {"nonce", jsonVType::str_type}, {"storage", jsonVType::obj_type}} ); + { { "balance", jsonVType::str_type }, { "code", jsonVType::str_type }, + { "nonce", jsonVType::str_type }, { "storage", jsonVType::obj_type } } ); } AccountMaskMap mask; @@ -392,10 +393,10 @@ void ImportTest::importState( json_spirit::mObject const& _o, State& _state ) { void ImportTest::importTransaction( json_spirit::mObject const& _o, eth::Transaction& o_tr ) { if ( _o.count( "secretKey" ) > 0 ) { requireJsonFields( _o, "transaction", - {{"data", jsonVType::str_type}, {"gasLimit", jsonVType::str_type}, - {"gasPrice", jsonVType::str_type}, {"nonce", jsonVType::str_type}, - {"secretKey", jsonVType::str_type}, {"to", jsonVType::str_type}, - {"value", jsonVType::str_type}} ); + { { "data", jsonVType::str_type }, { "gasLimit", jsonVType::str_type }, + { "gasPrice", jsonVType::str_type }, { "nonce", jsonVType::str_type }, + { "secretKey", jsonVType::str_type }, { "to", jsonVType::str_type }, + { "value", jsonVType::str_type } } ); if ( bigint( _o.at( "nonce" ).get_str() ) >= c_max256plus1 ) BOOST_THROW_EXCEPTION( ValueTooLarge() << errinfo_comment( @@ -421,10 +422,11 @@ void ImportTest::importTransaction( json_spirit::mObject const& _o, eth::Transac o_tr.ignoreExternalGas(); } else { requireJsonFields( _o, "transaction", - {{"data", jsonVType::str_type}, {"gasLimit", jsonVType::str_type}, - {"gasPrice", jsonVType::str_type}, {"nonce", jsonVType::str_type}, - {"v", jsonVType::str_type}, {"r", jsonVType::str_type}, {"s", jsonVType::str_type}, - {"to", jsonVType::str_type}, {"value", jsonVType::str_type}} ); + { { "data", jsonVType::str_type }, { "gasLimit", jsonVType::str_type }, + { "gasPrice", jsonVType::str_type }, { "nonce", jsonVType::str_type }, + { "v", jsonVType::str_type }, { "r", jsonVType::str_type }, + { "s", jsonVType::str_type }, { "to", jsonVType::str_type }, + { "value", jsonVType::str_type } } ); RLPStream transactionRLPStream = createRLPStreamFromTransactionFields( _o ); RLP transactionRLP( transactionRLPStream.out() ); @@ -450,16 +452,17 @@ void ImportTest::importTransaction( json_spirit::mObject const& _o, eth::Transac void ImportTest::importTransaction( json_spirit::mObject const& o_tr ) { if ( o_tr.count( "secretKey" ) ) requireJsonFields( o_tr, "transaction", - {{"data", jsonVType::array_type}, {"gasLimit", jsonVType::array_type}, - {"gasPrice", jsonVType::str_type}, {"nonce", jsonVType::str_type}, - {"secretKey", jsonVType::str_type}, {"to", jsonVType::str_type}, - {"value", jsonVType::array_type}} ); + { { "data", jsonVType::array_type }, { "gasLimit", jsonVType::array_type }, + { "gasPrice", jsonVType::str_type }, { "nonce", jsonVType::str_type }, + { "secretKey", jsonVType::str_type }, { "to", jsonVType::str_type }, + { "value", jsonVType::array_type } } ); else requireJsonFields( o_tr, "transaction", - {{"data", jsonVType::array_type}, {"gasLimit", jsonVType::array_type}, - {"gasPrice", jsonVType::str_type}, {"nonce", jsonVType::str_type}, - {"v", jsonVType::str_type}, {"r", jsonVType::str_type}, {"s", jsonVType::str_type}, - {"to", jsonVType::str_type}, {"value", jsonVType::array_type}} ); + { { "data", jsonVType::array_type }, { "gasLimit", jsonVType::array_type }, + { "gasPrice", jsonVType::str_type }, { "nonce", jsonVType::str_type }, + { "v", jsonVType::str_type }, { "r", jsonVType::str_type }, + { "s", jsonVType::str_type }, { "to", jsonVType::str_type }, + { "value", jsonVType::array_type } } ); // Parse extended transaction size_t dataVectorSize = o_tr.at( "data" ).get_array().size(); @@ -491,7 +494,6 @@ void ImportTest::importTransaction( json_spirit::mObject const& o_tr ) { int ImportTest::compareStates( State const& _stateExpect, State const& _statePost, AccountMaskMap const _expectedStateOptions, WhenError _throw ) { - State stateExpect = _stateExpect.createStateReadOnlyCopy(), statePost = _statePost.createStateReadOnlyCopy(); bool wasError = false; #define CHECK( a, b ) \ { \ @@ -506,11 +508,12 @@ int ImportTest::compareStates( State const& _stateExpect, State const& _statePos } \ } - for ( auto const& a : stateExpect.addresses() ) { + for ( auto const& a : _stateExpect.addresses() ) { AccountMask addressOptions( true ); + auto accountAddress = a.first; if ( _expectedStateOptions.size() ) { try { - addressOptions = _expectedStateOptions.at( a.first ); + addressOptions = _expectedStateOptions.at( accountAddress ); } catch ( std::out_of_range const& ) { BOOST_ERROR( TestOutputHelper::get().testName() + " expectedStateOptions map does not match expectedState in " @@ -520,57 +523,69 @@ int ImportTest::compareStates( State const& _stateExpect, State const& _statePos } if ( addressOptions.shouldExist() ) { - CHECK( statePost.addressInUse( a.first ), + CHECK( _statePost.addressInUse( accountAddress ), TestOutputHelper::get().testName() + " Compare States: " - << a.first << " missing expected address!" ); + << accountAddress << " missing expected address!" ); } else { - CHECK( !statePost.addressInUse( a.first ), + CHECK( !_statePost.addressInUse( accountAddress ), TestOutputHelper::get().testName() + " Compare States: " - << a.first << " address not expected to exist!" ); + << accountAddress << " address not expected to exist!" ); } - if ( statePost.addressInUse( a.first ) ) { + if ( _statePost.addressInUse( accountAddress ) ) { if ( addressOptions.hasBalance() ) - CHECK( ( stateExpect.balance( a.first ) == statePost.balance( a.first ) ), + CHECK( ( _stateExpect.balance( accountAddress ) == + _statePost.balance( accountAddress ) ), TestOutputHelper::get().testName() + " Check State: " - << a.first << ": incorrect balance " << _statePost.balance( a.first ) - << ", expected " << stateExpect.balance( a.first ) ); + << accountAddress << ": incorrect balance " + << _statePost.balance( accountAddress ) << ", expected " + << _stateExpect.balance( accountAddress ) ); if ( addressOptions.hasNonce() ) - CHECK( ( stateExpect.getNonce( a.first ) == statePost.getNonce( a.first ) ), + CHECK( ( _stateExpect.getNonce( accountAddress ) == + _statePost.getNonce( accountAddress ) ), TestOutputHelper::get().testName() + " Check State: " - << a.first << ": incorrect nonce " << statePost.getNonce( a.first ) - << ", expected " << stateExpect.getNonce( a.first ) ); + << accountAddress << ": incorrect nonce " + << _statePost.getNonce( accountAddress ) << ", expected " + << _stateExpect.getNonce( accountAddress ) ); if ( addressOptions.hasStorage() ) { - map< h256, pair< u256, u256 > > stateStorage = statePost.storage( a.first ); - for ( auto const& s : stateExpect.storage( a.first ) ) + map< h256, pair< u256, u256 > > stateStorage = _statePost.storage( accountAddress ); + for ( auto const& s : _stateExpect.storage( accountAddress ) ) CHECK( ( stateStorage[s.first] == s.second ), TestOutputHelper::get().testName() + " Check State: " - << a.first << ": incorrect storage [" + << accountAddress << ": incorrect storage [" << toCompactHexPrefixed( s.second.first ) << "] = " << toCompactHexPrefixed( stateStorage[s.first].second ) << ", expected [" << toCompactHexPrefixed( s.second.first ) << "] = " << toCompactHexPrefixed( s.second.second ) ); // Check for unexpected storage values - map< h256, pair< u256, u256 > > expectedStorage = stateExpect.storage( a.first ); - for ( auto const& s : statePost.storage( a.first ) ) + map< h256, pair< u256, u256 > > expectedStorage = + _stateExpect.storage( accountAddress ); + for ( auto const& s : _statePost.storage( accountAddress ) ) { + if ( s.second.second == 0 && expectedStorage.count( s.first ) == 0 ) { + // take into account fact that storage() in skaled historically + // can return zero values of storage, which could just be omitted + // since Ethereum default value for storage is zero anyway + continue; + } CHECK( ( expectedStorage[s.first] == s.second ), TestOutputHelper::get().testName() + " Check State: " - << a.first << ": incorrect storage [" + << accountAddress << ": unexpected incorrect storage [" << toCompactHexPrefixed( s.second.first ) << "] = " << toCompactHexPrefixed( s.second.second ) << ", expected [" << toCompactHexPrefixed( s.second.first ) << "] = " << toCompactHexPrefixed( expectedStorage[s.first].second ) ); + } } if ( addressOptions.hasCode() ) - CHECK( ( stateExpect.code( a.first ) == statePost.code( a.first ) ), + CHECK( ( _stateExpect.code( accountAddress ) == _statePost.code( accountAddress ) ), TestOutputHelper::get().testName() + " Check State: " - << a.first << ": incorrect code '" - << toHexPrefixed( statePost.code( a.first ) ) << "', expected '" - << toHexPrefixed( stateExpect.code( a.first ) ) << "'" ); + << accountAddress << ": incorrect code '" + << toHexPrefixed( _statePost.code( accountAddress ) ) << "', expected '" + << toHexPrefixed( _stateExpect.code( accountAddress ) ) << "'" ); } } @@ -627,13 +642,13 @@ bool ImportTest::checkGeneralTestSectionSearch( json_spirit::mObject const& _exp vector< size_t >& _errorTransactions, string const& _network, TrExpectSection* _search ) const { if ( _expects.count( "result" ) ) { requireJsonFields( _expects, "expect", - {{"indexes", jsonVType::obj_type}, {"network", jsonVType::array_type}, - {"result", jsonVType::obj_type}} ); + { { "indexes", jsonVType::obj_type }, { "network", jsonVType::array_type }, + { "result", jsonVType::obj_type } } ); } else { // Expect section in filled test requireJsonFields( _expects, "expect", - {{"indexes", jsonVType::obj_type}, {"hash", jsonVType::str_type}, - {"logs", jsonVType::str_type}} ); + { { "indexes", jsonVType::obj_type }, { "hash", jsonVType::str_type }, + { "logs", jsonVType::str_type } } ); } vector< int > d; @@ -652,7 +667,7 @@ bool ImportTest::checkGeneralTestSectionSearch( json_spirit::mObject const& _exp if ( !Options::get().singleTestNet.empty() ) { // skip this check if we execute transactions only on another specified network - if ( !network.count( Options::get().singleTestNet ) && !network.count( string{"ALL"} ) ) + if ( !network.count( Options::get().singleTestNet ) && !network.count( string{ "ALL" } ) ) return false; } diff --git a/test/tools/libtesteth/ImportTest.h b/test/tools/libtesteth/ImportTest.h index ed4f1c298..f72ad274d 100644 --- a/test/tools/libtesteth/ImportTest.h +++ b/test/tools/libtesteth/ImportTest.h @@ -112,7 +112,7 @@ class ImportTest { json_spirit::mObject const& m_testInputObject; json_spirit::mObject& m_testOutputObject; - Logger m_logger{createLogger( VerbosityInfo, "state" )}; + Logger m_logger{ createLogger( VerbosityInfo, "state" ) }; }; template < class T > diff --git a/test/tools/libtesteth/Options.cpp b/test/tools/libtesteth/Options.cpp index 5f6074367..f37ddfacd 100644 --- a/test/tools/libtesteth/Options.cpp +++ b/test/tools/libtesteth/Options.cpp @@ -133,7 +133,7 @@ Options::Options( int argc, const char** argv ) { // For some reason boost is confused by -- separator. This extra parser "skips" the --. auto skipDoubleDash = []( const std::string& s ) -> std::pair< std::string, std::string > { if ( s == "--" ) - return {"--", {}}; + return { "--", {} }; return {}; }; @@ -155,7 +155,7 @@ Options::Options( int argc, const char** argv ) { setDatabaseKind( DatabaseKind::LevelDB ); // default to LevelDB in the interest of reduced // test execution time for ( auto i = 0; i < argc; ++i ) { - auto arg = std::string{argv[i]}; + auto arg = std::string{ argv[i] }; auto throwIfNoArgumentFollows = [&i, &argc, &arg]() { if ( i + 1 >= argc ) BOOST_THROW_EXCEPTION( @@ -202,7 +202,7 @@ Options::Options( int argc, const char** argv ) { } else if ( arg == "--jsontrace" ) { throwIfNoArgumentFollows(); jsontrace = true; - auto arg = std::string{argv[++i]}; + auto arg = std::string{ argv[++i] }; Json::Value value; Json::Reader().parse( arg, value ); StandardTrace::DebugOptions op; @@ -226,10 +226,10 @@ Options::Options( int argc, const char** argv ) { else if ( arg == "--singletest" ) { throwIfNoArgumentFollows(); singleTest = true; - auto name1 = std::string{argv[++i]}; + auto name1 = std::string{ argv[++i] }; if ( i + 1 < argc ) // two params { - auto name2 = std::string{argv[++i]}; + auto name2 = std::string{ argv[++i] }; if ( name2[0] == '-' ) // not param, another option { singleTestName = std::move( name1 ); @@ -242,7 +242,7 @@ Options::Options( int argc, const char** argv ) { singleTestName = std::move( name1 ); } else if ( arg == "--singlenet" ) { throwIfNoArgumentFollows(); - singleTestNet = std::string{argv[++i]}; + singleTestNet = std::string{ argv[++i] }; ImportTest::checkAllowedNetwork( singleTestNet ); } else if ( arg == "--fulloutput" ) fulloutput = true; @@ -251,7 +251,7 @@ Options::Options( int argc, const char** argv ) { verbosity = std::max( verbosity, atoi( argv[++i] ) ); } else if ( arg == "--options" ) { throwIfNoArgumentFollows(); - boost::filesystem::path file( std::string{argv[++i]} ); + boost::filesystem::path file( std::string{ argv[++i] } ); if ( boost::filesystem::exists( file ) ) randomCodeOptionsPath = file; else { @@ -264,7 +264,7 @@ Options::Options( int argc, const char** argv ) { } else if ( arg == "-t" ) { throwIfAfterSeparator(); throwIfNoArgumentFollows(); - rCurrentTestSuite = std::string{argv[++i]}; + rCurrentTestSuite = std::string{ argv[++i] }; } else if ( arg == "-d" ) { throwIfNoArgumentFollows(); trDataIndex = atoi( argv[++i] ); @@ -276,7 +276,7 @@ Options::Options( int argc, const char** argv ) { trValueIndex = atoi( argv[++i] ); } else if ( arg == "--testpath" ) { throwIfNoArgumentFollows(); - testpath = std::string{argv[++i]}; + testpath = std::string{ argv[++i] }; } else if ( arg == "--statediff" ) { statediff = true; verbosity = VerbosityTrace; @@ -294,7 +294,7 @@ Options::Options( int argc, const char** argv ) { createRandomTest = true; if ( i + 1 < argc ) // two params { - auto options = std::string{argv[++i]}; + auto options = std::string{ argv[++i] }; if ( options[0] == '-' ) // not param, another option i--; else { diff --git a/test/tools/libtesteth/Stats.cpp b/test/tools/libtesteth/Stats.cpp index 2350415e6..733228cf6 100644 --- a/test/tools/libtesteth/Stats.cpp +++ b/test/tools/libtesteth/Stats.cpp @@ -41,7 +41,7 @@ void Stats::testStarted( std::string const& _name ) { } void Stats::testFinished( int64_t _gasUsed ) { - m_stats.push_back( {clock::now() - m_tp, _gasUsed, m_currentSuite + "/" + m_currentTest} ); + m_stats.push_back( { clock::now() - m_tp, _gasUsed, m_currentSuite + "/" + m_currentTest } ); } std::ostream& operator<<( std::ostream& out, Stats::clock::duration const& d ) { @@ -81,7 +81,7 @@ Stats::~Stats() { out << "\n"; } else if ( !Options::get().statsOutFile.empty() ) { // Output stats to file - std::ofstream file{Options::get().statsOutFile}; + std::ofstream file{ Options::get().statsOutFile }; for ( auto&& s : m_stats ) { auto usecs = std::chrono::duration_cast< std::chrono::microseconds >( s.duration ).count(); diff --git a/test/tools/libtesteth/TestHelper.cpp b/test/tools/libtesteth/TestHelper.cpp index 9e8918e51..19bf9dddc 100644 --- a/test/tools/libtesteth/TestHelper.cpp +++ b/test/tools/libtesteth/TestHelper.cpp @@ -112,17 +112,18 @@ void mine( BlockHeader& _bi, SealEngineFace* _sealer, bool _verify ) { _sealer->verify( JustSeal, _bi ); } -void simulateMining( Client& client, size_t numBlocks, const dev::Address &address ) { +void simulateMining( Client& client, size_t numBlocks, const dev::Address& address ) { const auto balanceBefore = client.balanceAt( address ); - State state = client.state().createStateModifyCopy(); + State state = client.state(); u256 reward = 0; for ( size_t blockNumber = 0; blockNumber < numBlocks; ++blockNumber ) { reward += client.sealEngine()->blockReward( 1, blockNumber ); } state.addBalance( address, reward ); state.commit(); + state.getOriginalDb()->createBlockSnap( 1 ); const auto balanceAfter = client.balanceAt( address ); - balanceAfter > balanceBefore; // make compiler happy + balanceAfter > balanceBefore; // make compiler happy assert( balanceAfter > balanceBefore ); } @@ -172,13 +173,13 @@ string netIdToString( eth::Network _netId ) { eth::Network stringToNetId( string const& _netname ) { // Networks that used in .json tests - static vector< eth::Network > const networks{ - {eth::Network::FrontierTest, eth::Network::HomesteadTest, eth::Network::EIP150Test, - eth::Network::EIP158Test, eth::Network::ByzantiumTest, eth::Network::ConstantinopleTest, - eth::Network::ConstantinopleFixTest, eth::Network::IstanbulTest, - eth::Network::FrontierToHomesteadAt5, eth::Network::HomesteadToDaoAt5, - eth::Network::HomesteadToEIP150At5, eth::Network::EIP158ToByzantiumAt5, - eth::Network::ByzantiumToConstantinopleFixAt5, eth::Network::TransitionnetTest}}; + static vector< eth::Network > const networks{ { eth::Network::FrontierTest, + eth::Network::HomesteadTest, eth::Network::EIP150Test, eth::Network::EIP158Test, + eth::Network::ByzantiumTest, eth::Network::ConstantinopleTest, + eth::Network::ConstantinopleFixTest, eth::Network::IstanbulTest, + eth::Network::FrontierToHomesteadAt5, eth::Network::HomesteadToDaoAt5, + eth::Network::HomesteadToEIP150At5, eth::Network::EIP158ToByzantiumAt5, + eth::Network::ByzantiumToConstantinopleFixAt5, eth::Network::TransitionnetTest } }; for ( auto const& net : networks ) if ( netIdToString( net ) == _netname ) @@ -209,10 +210,10 @@ bool isDisabledNetwork( eth::Network _net ) { set< eth::Network > const& getNetworks() { // Networks for the test case execution when filling the tests - static set< eth::Network > const networks{ - {eth::Network::FrontierTest, eth::Network::HomesteadTest, eth::Network::EIP150Test, - eth::Network::EIP158Test, eth::Network::ByzantiumTest, eth::Network::ConstantinopleTest, - eth::Network::ConstantinopleFixTest, eth::Network::IstanbulTest}}; + static set< eth::Network > const networks{ { eth::Network::FrontierTest, + eth::Network::HomesteadTest, eth::Network::EIP150Test, eth::Network::EIP158Test, + eth::Network::ByzantiumTest, eth::Network::ConstantinopleTest, + eth::Network::ConstantinopleFixTest, eth::Network::IstanbulTest } }; return networks; } @@ -325,7 +326,7 @@ int64_t toPositiveInt64( const json_spirit::mValue& _v ) { } if ( n < 0 ) - throw std::out_of_range{"unexpected negative value: " + std::to_string( n )}; + throw std::out_of_range{ "unexpected negative value: " + std::to_string( n ) }; return n; } @@ -389,9 +390,9 @@ string replaceCode( string const& _code ) { } void replaceCodeInState( json_spirit::mObject& _o ) { - json_spirit::mObject& fieldsObj = _o.count( "alloc" ) ? - _o["alloc"].get_obj() : - _o.count( "accounts" ) ? _o["accounts"].get_obj() : _o; + json_spirit::mObject& fieldsObj = _o.count( "alloc" ) ? _o["alloc"].get_obj() : + _o.count( "accounts" ) ? _o["accounts"].get_obj() : + _o; for ( auto& account : fieldsObj ) { auto obj = account.second.get_obj(); if ( obj.count( "code" ) && obj["code"].type() == json_spirit::str_type ) @@ -596,7 +597,7 @@ void requireJsonFields( json_spirit::mObject const& _o, string const& _section, } string prepareVersionString() { - return string{"testeth "} + skale_get_buildinfo()->project_version; + return string{ "testeth " } + skale_get_buildinfo()->project_version; } // A simple C++ implementation of the Levenshtein distance algorithm to measure the amount of @@ -734,7 +735,6 @@ void Listener::notifySuiteStarted( string const& _name ) { } void Listener::notifyTestStarted( string const& _name ) { - if ( g_listener ) g_listener->testStarted( _name ); } diff --git a/test/tools/libtesteth/TestHelper.h b/test/tools/libtesteth/TestHelper.h index aa9a730d1..2b5974575 100644 --- a/test/tools/libtesteth/TestHelper.h +++ b/test/tools/libtesteth/TestHelper.h @@ -66,7 +66,7 @@ void mine( Client& c, int numBlocks ); * @brief simulateMining gives money to miner but do not create block. Use it only for testing * instead of mine( Client& c, int numBlocks ) */ -void simulateMining( Client& client, size_t numBlocks, const dev::Address &address ); +void simulateMining( Client& client, size_t numBlocks, const dev::Address& address ); void simulateMining( Client& client, size_t numBlocks ); void mineMoney( Client& c, int numBlocks ); void mineTransaction( Client& c, int numBlocks ); @@ -84,7 +84,8 @@ typedef json_spirit::Value_type jsonVType; class ZeroGasPricer : public eth::GasPricer { protected: u256 ask( eth::Block const& ) const override { return 0; } - u256 bid( unsigned = dev::eth::LatestBlock, eth::TransactionPriority = eth::TransactionPriority::Medium ) const override { + u256 bid( unsigned = dev::eth::LatestBlock, + eth::TransactionPriority = eth::TransactionPriority::Medium ) const override { return 0; } }; @@ -141,8 +142,8 @@ dev::eth::BlockHeader constructHeader( h256 const& _parentHash, h256 const& _sha void updateEthashSeal( dev::eth::BlockHeader& _header, h256 const& _mixHash, dev::eth::Nonce const& _nonce ); RLPStream createRLPStreamFromTransactionFields( json_spirit::mObject const& _tObj ); -json_spirit::mObject fillJsonWithStateChange( State const& _stateOrig, - skale::State const& _statePost, skale::ChangeLog const& _changeLog ); +json_spirit::mObject fillJsonWithStateChange( + State const& _stateOrig, skale::State const& _statePost, skale::ChangeLog const& _changeLog ); json_spirit::mObject fillJsonWithState( State const& _state ); json_spirit::mObject fillJsonWithState( skale::State const& _state, eth::AccountMaskMap const& _map ); diff --git a/test/tools/libtesteth/TestOutputHelper.cpp b/test/tools/libtesteth/TestOutputHelper.cpp index 745896c64..f2e0fed72 100644 --- a/test/tools/libtesteth/TestOutputHelper.cpp +++ b/test/tools/libtesteth/TestOutputHelper.cpp @@ -20,9 +20,9 @@ * Fixture class for boost output when running testeth */ -#include #include #include +#include #include #include @@ -108,5 +108,5 @@ TestOutputHelperFixture::TestOutputHelperFixture() { TestOutputHelperFixture::~TestOutputHelperFixture() { TestOutputHelper::get().finishTest(); // XXX used in Personal test. do it more nicely! - unsetenv("DATA_DIR"); + unsetenv( "DATA_DIR" ); } diff --git a/test/tools/libtesteth/TestSuite.cpp b/test/tools/libtesteth/TestSuite.cpp index b5a680d68..e1ac421e5 100644 --- a/test/tools/libtesteth/TestSuite.cpp +++ b/test/tools/libtesteth/TestSuite.cpp @@ -143,7 +143,7 @@ void TestSuite::runAllTestsInFolder( string const& _testFolder ) const { string() : test::Options::get().singleTestName; vector< fs::path > const compiledFiles = - test::getFiles( getFullPath( _testFolder ), {".json", ".yml"}, filter ); + test::getFiles( getFullPath( _testFolder ), { ".json", ".yml" }, filter ); for ( auto const& file : compiledFiles ) { fs::path const expectedFillerName = getFullPathFiller( _testFolder ) / @@ -177,7 +177,7 @@ void TestSuite::runAllTestsInFolder( string const& _testFolder ) const { // run all tests vector< fs::path > const files = test::getFiles( getFullPathFiller( _testFolder ), - {".json", ".yml"}, filter.empty() ? filter : filter + "Filler" ); + { ".json", ".yml" }, filter.empty() ? filter : filter + "Filler" ); auto& testOutput = test::TestOutputHelper::get(); testOutput.initTest( files.size() ); diff --git a/test/tools/libtesteth/TestUtils.cpp b/test/tools/libtesteth/TestUtils.cpp index 09bdb3a34..5ff74ccd4 100644 --- a/test/tools/libtesteth/TestUtils.cpp +++ b/test/tools/libtesteth/TestUtils.cpp @@ -92,7 +92,7 @@ void ClientBaseFixture::enumerateClients( cerr << "void ClientBaseFixture::enumerateClients. FixedClient now accepts block not sate!" << endl; _state.commit( dev::eth::CommitBehaviour::KeepEmptyAccounts ); // unused variable. remove - // this line + // this line eth::Block b( Block::Null ); b.noteChain( _bc ); FixedClient client( _bc, b ); diff --git a/test/tools/libtesteth/boostTest.cpp b/test/tools/libtesteth/boostTest.cpp index 45fb63b2b..a56044de8 100644 --- a/test/tools/libtesteth/boostTest.cpp +++ b/test/tools/libtesteth/boostTest.cpp @@ -136,7 +136,7 @@ void setCLocale() { // Custom Boost Unit Test Main int main( int argc, const char* argv[] ) { MicroProfileSetEnableAllGroups( true ); - UnsafeRegion::init("."); + UnsafeRegion::init( "." ); std::string const dynamicTestSuiteName = "customTestSuite"; setCLocale(); @@ -154,7 +154,7 @@ int main( int argc, const char* argv[] ) { bool testSuiteFound = false; for ( int i = 0; i < argc; i++ ) { // replace test suite to custom tests - std::string arg = std::string{argv[i]}; + std::string arg = std::string{ argv[i] }; if ( arg == "-t" && i + 1 < argc ) { testSuiteFound = true; argv[i + 1] = ( char* ) dynamicTestSuiteName.c_str(); @@ -193,7 +193,7 @@ int main( int argc, const char* argv[] ) { std::cout << "Running tests using path: " << test::getTestPath() << std::endl; int result = 0; - auto fakeInit = []( int, char* [] ) -> boost::unit_test::test_suite* { return nullptr; }; + auto fakeInit = []( int, char*[] ) -> boost::unit_test::test_suite* { return nullptr; }; if ( opt.jsontrace || opt.vmtrace || opt.statediff ) { // Do not use travis '.' output thread if debug is defined result = unit_test_main( fakeInit, argc, const_cast< char** >( argv ) ); @@ -205,7 +205,7 @@ int main( int argc, const char* argv[] ) { return result; } else { // Initialize travis '.' output thread for log activity - std::atomic_bool stopTravisOut{false}; + std::atomic_bool stopTravisOut{ false }; std::thread outputThread( travisOut, &stopTravisOut ); result = unit_test_main( fakeInit, argc, const_cast< char** >( argv ) ); stopTravisOut = true; diff --git a/test/tools/libtestutils/FixedClient.h b/test/tools/libtestutils/FixedClient.h index d4b00016a..9b8217379 100644 --- a/test/tools/libtestutils/FixedClient.h +++ b/test/tools/libtestutils/FixedClient.h @@ -69,13 +69,14 @@ class FixedClient : public dev::eth::ClientBase { h256 submitTransaction( eth::TransactionSkeleton const&, Secret const& ) override { return {}; }; - h256 importTransaction( eth::Transaction const& ) override { return {}; } - eth::ExecutionResult call( - Address const&, u256, Address, bytes const&, u256, u256, + h256 importTransaction( eth::Transaction const&, dev::eth::TransactionBroadcast ) override { + return {}; + } + eth::ExecutionResult call( Address const&, u256, Address, bytes const&, u256, u256, #ifdef HISTORIC_STATE - BlockNumber, + BlockNumber, #endif -eth::FudgeFactor ) override { + eth::FudgeFactor ) override { return {}; }; eth::TransactionSkeleton populateTransactionWithDefaults( @@ -84,16 +85,11 @@ eth::FudgeFactor ) override { }; #ifdef HISTORIC_STATE - u256 historicStateBalanceAt(Address, BlockNumber) const override - {return 0;} - u256 historicStateCountAt(Address, BlockNumber) const override - {return 0;} - u256 historicStateAt(Address, u256, BlockNumber) const override - {return 0;} - h256 historicStateRootAt(Address, BlockNumber) const override - {return h256();} - bytes historicStateCodeAt(Address, BlockNumber) const override - {return bytes();}; + u256 historicStateBalanceAt( Address, BlockNumber ) const override { return 0; } + u256 historicStateCountAt( Address, BlockNumber ) const override { return 0; } + u256 historicStateAt( Address, u256, BlockNumber ) const override { return 0; } + h256 historicStateRootAt( Address, BlockNumber ) const override { return h256(); } + bytes historicStateCodeAt( Address, BlockNumber ) const override { return bytes(); }; #endif private: @@ -102,5 +98,6 @@ eth::FudgeFactor ) override { mutable SharedMutex x_stateDB; ///< Lock on the state DB, effectively a lock on m_postSeal. }; + } // namespace test } // namespace dev diff --git a/test/unittests/external-dependencies/boost.cpp b/test/unittests/external-dependencies/boost.cpp index 39d1fbc00..af1f78e13 100644 --- a/test/unittests/external-dependencies/boost.cpp +++ b/test/unittests/external-dependencies/boost.cpp @@ -31,7 +31,8 @@ using namespace boost::multiprecision; BOOST_FIXTURE_TEST_SUITE( boostTests, TestOutputHelperFixture ) // test that reproduces issue https://github.com/ethereum/cpp-ethereum/issues/1977 -BOOST_AUTO_TEST_CASE( u256_overflow_test, *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( + u256_overflow_test, *boost::unit_test::precondition( dev::test::run_not_express ) ) { dev::u256 a = 14; dev::bigint b = dev::bigint( "115792089237316195423570985008687907853269984665640564039457584007913129639948" ); @@ -39,13 +40,14 @@ BOOST_AUTO_TEST_CASE( u256_overflow_test, *boost::unit_test::precondition( dev:: BOOST_CHECK( a < b ); } -BOOST_AUTO_TEST_CASE( u256_shift_left, *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( + u256_shift_left, *boost::unit_test::precondition( dev::test::run_not_express ) ) { u256 a = 1; uint64_t amount = 1; auto b = a << amount; BOOST_CHECK_EQUAL( b, 2 ); - auto high_bit = u256{0}; + auto high_bit = u256{ 0 }; bit_set( high_bit, 255 ); BOOST_CHECK_EQUAL( a << 255, high_bit ); BOOST_CHECK_EQUAL( a << uint64_t( 256 ), 0 ); @@ -60,13 +62,15 @@ BOOST_AUTO_TEST_CASE( u256_shift_left, *boost::unit_test::precondition( dev::tes BOOST_CHECK_EQUAL( static_cast< u256 >( bigint( u256( 3 ) ) << 255 ), u256( 1 ) << 255 ); } -BOOST_AUTO_TEST_CASE( u256_shift_left_bug, *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( + u256_shift_left_bug, *boost::unit_test::precondition( dev::test::run_not_express ) ) { // Bug reported: https://github.com/boostorg/multiprecision/issues/31 using uint256 = number< cpp_int_backend< 256, 256, unsigned_magnitude, unchecked, void > >; BOOST_CHECK_EQUAL( uint256( 3 ) << 255, uint256( 1 ) << 255 ); } -BOOST_AUTO_TEST_CASE( u256_logical_shift_right, *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( + u256_logical_shift_right, *boost::unit_test::precondition( dev::test::run_not_express ) ) { u256 a = 1; uint64_t amount = 1; auto b = a >> amount; @@ -109,7 +113,8 @@ BOOST_AUTO_TEST_CASE( u256_logical_shift_right, *boost::unit_test::precondition( constexpr auto int64_min = std::numeric_limits< int64_t >::min(); static_assert( int64_min >> 1 == int64_min / 2, "I cannot shift!" ); -BOOST_AUTO_TEST_CASE( u256_arithmetic_shift_right, *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( + u256_arithmetic_shift_right, *boost::unit_test::precondition( dev::test::run_not_express ) ) { s256 a = 1; uint64_t amount = 1; auto b = a >> amount; diff --git a/test/unittests/libdevcore/CommonJS.cpp b/test/unittests/libdevcore/CommonJS.cpp index 4896d9b76..7a8ecf5bf 100644 --- a/test/unittests/libdevcore/CommonJS.cpp +++ b/test/unittests/libdevcore/CommonJS.cpp @@ -36,7 +36,7 @@ BOOST_AUTO_TEST_CASE( test_toJS, *boost::unit_test::precondition( dev::test::run h64 a( "0xbaadf00ddeadbeef" ); u64 b( "0xffff0000bbbaaaa" ); uint64_t c = 38990234243; - bytes d = {0xff, 0x0, 0xef, 0xbc}; + bytes d = { 0xff, 0x0, 0xef, 0xbc }; BOOST_CHECK( toJS( a ) == "0xbaadf00ddeadbeef" ); BOOST_CHECK( toJS( b ) == "0xffff0000bbbaaaa" ); @@ -44,9 +44,10 @@ BOOST_AUTO_TEST_CASE( test_toJS, *boost::unit_test::precondition( dev::test::run BOOST_CHECK( toJS( d ) == "0xff00efbc" ); } -BOOST_AUTO_TEST_CASE( test_jsToBytes, *boost::unit_test::precondition( dev::test::run_not_express ) ) { - bytes a = {0xff, 0xaa, 0xbb, 0xcc}; - bytes b = {0x03, 0x89, 0x90, 0x23, 0x42, 0x43}; +BOOST_AUTO_TEST_CASE( + test_jsToBytes, *boost::unit_test::precondition( dev::test::run_not_express ) ) { + bytes a = { 0xff, 0xaa, 0xbb, 0xcc }; + bytes b = { 0x03, 0x89, 0x90, 0x23, 0x42, 0x43 }; BOOST_CHECK( a == jsToBytes( "0xffaabbcc" ) ); BOOST_CHECK( b == jsToBytes( "38990234243" ) ); BOOST_CHECK( bytes() == jsToBytes( "" ) ); @@ -54,42 +55,46 @@ BOOST_AUTO_TEST_CASE( test_jsToBytes, *boost::unit_test::precondition( dev::test } BOOST_AUTO_TEST_CASE( test_padded, *boost::unit_test::precondition( dev::test::run_not_express ) ) { - bytes a = {0xff, 0xaa}; - BOOST_CHECK( bytes( {0x00, 0x00, 0xff, 0xaa} ) == padded( a, 4 ) ); + bytes a = { 0xff, 0xaa }; + BOOST_CHECK( bytes( { 0x00, 0x00, 0xff, 0xaa } ) == padded( a, 4 ) ); bytes b = {}; - BOOST_CHECK( bytes( {0x00, 0x00, 0x00, 0x00} ) == padded( b, 4 ) ); - bytes c = {0xff, 0xaa, 0xbb, 0xcc}; - BOOST_CHECK( bytes{0xcc} == padded( c, 1 ) ); + BOOST_CHECK( bytes( { 0x00, 0x00, 0x00, 0x00 } ) == padded( b, 4 ) ); + bytes c = { 0xff, 0xaa, 0xbb, 0xcc }; + BOOST_CHECK( bytes{ 0xcc } == padded( c, 1 ) ); } -BOOST_AUTO_TEST_CASE( test_paddedRight, *boost::unit_test::precondition( dev::test::run_not_express ) ) { - bytes a = {0xff, 0xaa}; - BOOST_CHECK( bytes( {0xff, 0xaa, 0x00, 0x00} ) == paddedRight( a, 4 ) ); +BOOST_AUTO_TEST_CASE( + test_paddedRight, *boost::unit_test::precondition( dev::test::run_not_express ) ) { + bytes a = { 0xff, 0xaa }; + BOOST_CHECK( bytes( { 0xff, 0xaa, 0x00, 0x00 } ) == paddedRight( a, 4 ) ); bytes b = {}; - BOOST_CHECK( bytes( {0x00, 0x00, 0x00, 0x00} ) == paddedRight( b, 4 ) ); - bytes c = {0xff, 0xaa, 0xbb, 0xcc}; - BOOST_CHECK( bytes{0xff} == paddedRight( c, 1 ) ); + BOOST_CHECK( bytes( { 0x00, 0x00, 0x00, 0x00 } ) == paddedRight( b, 4 ) ); + bytes c = { 0xff, 0xaa, 0xbb, 0xcc }; + BOOST_CHECK( bytes{ 0xff } == paddedRight( c, 1 ) ); } -BOOST_AUTO_TEST_CASE( test_unpadded, *boost::unit_test::precondition( dev::test::run_not_express ) ) { - bytes a = {0xff, 0xaa, 0x00, 0x00, 0x00}; - BOOST_CHECK( bytes( {0xff, 0xaa} ) == unpadded( a ) ); - bytes b = {0x00, 0x00}; +BOOST_AUTO_TEST_CASE( + test_unpadded, *boost::unit_test::precondition( dev::test::run_not_express ) ) { + bytes a = { 0xff, 0xaa, 0x00, 0x00, 0x00 }; + BOOST_CHECK( bytes( { 0xff, 0xaa } ) == unpadded( a ) ); + bytes b = { 0x00, 0x00 }; BOOST_CHECK( bytes() == unpadded( b ) ); bytes c = {}; BOOST_CHECK( bytes() == unpadded( c ) ); } -BOOST_AUTO_TEST_CASE( test_unpaddedLeft, *boost::unit_test::precondition( dev::test::run_not_express ) ) { - bytes a = {0x00, 0x00, 0x00, 0xff, 0xaa}; - BOOST_CHECK( bytes( {0xff, 0xaa} ) == unpadLeft( a ) ); - bytes b = {0x00, 0x00}; +BOOST_AUTO_TEST_CASE( + test_unpaddedLeft, *boost::unit_test::precondition( dev::test::run_not_express ) ) { + bytes a = { 0x00, 0x00, 0x00, 0xff, 0xaa }; + BOOST_CHECK( bytes( { 0xff, 0xaa } ) == unpadLeft( a ) ); + bytes b = { 0x00, 0x00 }; BOOST_CHECK( bytes() == unpadLeft( b ) ); bytes c = {}; BOOST_CHECK( bytes() == unpadLeft( c ) ); } -BOOST_AUTO_TEST_CASE( test_fromRaw, *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( + test_fromRaw, *boost::unit_test::precondition( dev::test::run_not_express ) ) { // non ascii characters means empty string h256 a( "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" ); BOOST_CHECK( "" == fromRaw( a ) ); @@ -99,7 +104,8 @@ BOOST_AUTO_TEST_CASE( test_fromRaw, *boost::unit_test::precondition( dev::test:: BOOST_CHECK( "AsciiCharacters" == fromRaw( c ) ); } -BOOST_AUTO_TEST_CASE( test_jsToFixed, *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( + test_jsToFixed, *boost::unit_test::precondition( dev::test::run_not_express ) ) { h256 a( "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" ); BOOST_CHECK( a == jsToFixed< 32 >( "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" ) ); @@ -108,7 +114,8 @@ BOOST_AUTO_TEST_CASE( test_jsToFixed, *boost::unit_test::precondition( dev::test BOOST_CHECK_THROW( jsToFixed< 32 >( "NotAHexadecimalOrDecimal" ), std::invalid_argument ); } -BOOST_AUTO_TEST_CASE( test_jsToInt, *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( + test_jsToInt, *boost::unit_test::precondition( dev::test::run_not_express ) ) { BOOST_CHECK( 43832124 == jsToInt( "43832124" ) ); BOOST_CHECK( 1342356623 == jsToInt( "0x5002bc8f" ) ); BOOST_CHECK( 3483942 == jsToInt( "015224446" ) ); @@ -122,7 +129,8 @@ BOOST_AUTO_TEST_CASE( test_jsToInt, *boost::unit_test::precondition( dev::test:: BOOST_CHECK_THROW( jsToInt< 16 >( "NotAHexadecimalOrDecimal" ), std::invalid_argument ); } -BOOST_AUTO_TEST_CASE( test_jsToU256, *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( + test_jsToU256, *boost::unit_test::precondition( dev::test::run_not_express ) ) { BOOST_CHECK( u256( "983298932490823474234" ) == jsToU256( "983298932490823474234" ) ); BOOST_CHECK_THROW( jsToU256( "NotAHexadecimalOrDecimal" ), std::invalid_argument ); } diff --git a/test/unittests/libdevcore/FixedHash.cpp b/test/unittests/libdevcore/FixedHash.cpp index 1bec7bbc7..b43ffdf9f 100644 --- a/test/unittests/libdevcore/FixedHash.cpp +++ b/test/unittests/libdevcore/FixedHash.cpp @@ -34,8 +34,8 @@ namespace test { BOOST_FIXTURE_TEST_SUITE( FixedHashTests, TestOutputHelperFixture ) -BOOST_AUTO_TEST_CASE( FixedHashComparisons, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( + FixedHashComparisons, *boost::unit_test::precondition( dev::test::run_not_express ) ) { FixedHash< 4 > h1( sha3( "abcd" ) ); FixedHash< 4 > h2( sha3( "abcd" ) ); FixedHash< 4 > h3( sha3( "aadd" ) ); @@ -52,8 +52,8 @@ BOOST_AUTO_TEST_CASE( FixedHashComparisons, BOOST_CHECK( h6 >= h4 ); } -BOOST_AUTO_TEST_CASE( FixedHashXOR, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( + FixedHashXOR, *boost::unit_test::precondition( dev::test::run_not_express ) ) { FixedHash< 2 > h1( "0xAAAA" ); FixedHash< 2 > h2( "0xBBBB" ); @@ -62,8 +62,7 @@ BOOST_AUTO_TEST_CASE( FixedHashXOR, BOOST_CHECK( h1 == FixedHash< 2 >( "0x1111" ) ); } -BOOST_AUTO_TEST_CASE( FixedHashOR, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( FixedHashOR, *boost::unit_test::precondition( dev::test::run_not_express ) ) { FixedHash< 4 > h1( "0xD3ADB33F" ); FixedHash< 4 > h2( "0xBAADF00D" ); FixedHash< 4 > res( "0xFBADF33F" ); @@ -73,8 +72,8 @@ BOOST_AUTO_TEST_CASE( FixedHashOR, BOOST_CHECK( h1 == res ); } -BOOST_AUTO_TEST_CASE( FixedHashAND, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( + FixedHashAND, *boost::unit_test::precondition( dev::test::run_not_express ) ) { FixedHash< 4 > h1( "0xD3ADB33F" ); FixedHash< 4 > h2( "0xBAADF00D" ); FixedHash< 4 > h3( "0x92aDB00D" ); @@ -84,16 +83,16 @@ BOOST_AUTO_TEST_CASE( FixedHashAND, BOOST_CHECK( h1 = h3 ); } -BOOST_AUTO_TEST_CASE( FixedHashInvert, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( + FixedHashInvert, *boost::unit_test::precondition( dev::test::run_not_express ) ) { FixedHash< 4 > h1( "0xD3ADB33F" ); FixedHash< 4 > h2( "0x2C524CC0" ); BOOST_CHECK( ~h1 == h2 ); } -BOOST_AUTO_TEST_CASE( FixedHashContains, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( + FixedHashContains, *boost::unit_test::precondition( dev::test::run_not_express ) ) { FixedHash< 4 > h1( "0xD3ADB331" ); FixedHash< 4 > h2( "0x0000B331" ); FixedHash< 4 > h3( "0x0000000C" ); @@ -126,8 +125,8 @@ void incrementSingleIteration( unsigned seed ) { BOOST_CHECK_EQUAL( next, reverse2 ); } -BOOST_AUTO_TEST_CASE( FixedHashIncrement, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( + FixedHashIncrement, *boost::unit_test::precondition( dev::test::run_not_express ) ) { incrementSingleIteration( 0 ); incrementSingleIteration( 1 ); incrementSingleIteration( 0xBAD ); diff --git a/test/unittests/libdevcore/LevelDB.cpp b/test/unittests/libdevcore/LevelDB.cpp index d8c955e3e..651dd3d4c 100644 --- a/test/unittests/libdevcore/LevelDB.cpp +++ b/test/unittests/libdevcore/LevelDB.cpp @@ -115,7 +115,7 @@ BOOST_AUTO_TEST_CASE( rotation_test ) { const int rotateInterval = 10; const int nPreserved = ( nPieces - 1 ) * rotateInterval; - auto batcher = make_shared( td.path(), nPieces, false ); + auto batcher = make_shared< batched_io::rotating_db_io >( td.path(), nPieces, false ); db::ManuallyRotatingLevelDB rdb( batcher ); for ( int i = 0; i < nPreserved * 3; ++i ) { @@ -149,7 +149,7 @@ BOOST_AUTO_TEST_CASE( rotation_rewrite_test ) { TransientDirectory td; const int nPieces = 3; - auto batcher = make_shared( td.path(), nPieces, false ); + auto batcher = make_shared< batched_io::rotating_db_io >( td.path(), nPieces, false ); db::ManuallyRotatingLevelDB rdb( batcher ); rdb.insert( string( "a" ), string( "va" ) ); @@ -172,11 +172,11 @@ BOOST_AUTO_TEST_CASE( rotation_rewrite_test ) { BOOST_REQUIRE_EQUAL( rdb.lookup( string( "a" ) ), string( "va_new_new" ) ); } -BOOST_AUTO_TEST_CASE( rotation_circle_test ){ +BOOST_AUTO_TEST_CASE( rotation_circle_test ) { TransientDirectory td; const int nPieces = 3; - auto batcher = make_shared( td.path(), nPieces, false ); + auto batcher = make_shared< batched_io::rotating_db_io >( td.path(), nPieces, false ); db::ManuallyRotatingLevelDB rdb( batcher ); rdb.insert( string( "a" ), string( "va1" ) ); @@ -184,46 +184,46 @@ BOOST_AUTO_TEST_CASE( rotation_circle_test ){ rdb.insert( string( "a" ), string( "va2" ) ); int cnt = 0; - for(int i=0; i( td.path(), nPieces, false ); + auto batcher = make_shared< batched_io::rotating_db_io >( td.path(), nPieces, false ); db::ManuallyRotatingLevelDB rdb( batcher ); - rdb.insert( string( "a" ), to_string(0) ); - for(int i=1; i<=pre_rotate; ++i){ + rdb.insert( string( "a" ), to_string( 0 ) ); + for ( int i = 1; i <= pre_rotate; ++i ) { rdb.rotate(); - rdb.insert( string( "a" ), to_string(i) ); + rdb.insert( string( "a" ), to_string( i ) ); } - BOOST_REQUIRE_EQUAL( rdb.lookup(string("a")), to_string(pre_rotate)); + BOOST_REQUIRE_EQUAL( rdb.lookup( string( "a" ) ), to_string( pre_rotate ) ); } // scope 2 { - auto batcher = make_shared( td.path(), nPieces, false ); + auto batcher = make_shared< batched_io::rotating_db_io >( td.path(), nPieces, false ); db::ManuallyRotatingLevelDB rdb( batcher ); - BOOST_REQUIRE_EQUAL( rdb.lookup(string("a")), to_string(pre_rotate)); + BOOST_REQUIRE_EQUAL( rdb.lookup( string( "a" ) ), to_string( pre_rotate ) ); } - }// for pre_rotate + } // for pre_rotate } BOOST_AUTO_TEST_SUITE_END() diff --git a/test/unittests/libdevcore/RangeMask.cpp b/test/unittests/libdevcore/RangeMask.cpp index 13540eb55..8c5fcf344 100644 --- a/test/unittests/libdevcore/RangeMask.cpp +++ b/test/unittests/libdevcore/RangeMask.cpp @@ -34,11 +34,10 @@ namespace test { BOOST_FIXTURE_TEST_SUITE( RangeMaskTest, TestOutputHelperFixture ) -BOOST_AUTO_TEST_CASE( constructor, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( constructor, *boost::unit_test::precondition( dev::test::run_not_express ) ) { using RM = RangeMask; using Range = pair< unsigned, unsigned >; - for ( RM r : {RM(), RM( 1, 10 ), RM( Range( 2, 10 ) )} ) { + for ( RM r : { RM(), RM( 1, 10 ), RM( Range( 2, 10 ) ) } ) { BOOST_CHECK( r.empty() ); BOOST_CHECK( !r.contains( 0 ) ); BOOST_CHECK( !r.contains( 1 ) ); @@ -49,8 +48,8 @@ BOOST_AUTO_TEST_CASE( constructor, BOOST_CHECK( !RM( Range( 2, 10 ) ).full() ); } -BOOST_AUTO_TEST_CASE( simple_unions, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( + simple_unions, *boost::unit_test::precondition( dev::test::run_not_express ) ) { using RM = RangeMask; using Range = pair< unsigned, unsigned >; RM m( Range( 0, 2000 ) ); @@ -70,8 +69,7 @@ BOOST_AUTO_TEST_CASE( simple_unions, BOOST_CHECK( !m.contains( 258 ) ); } -BOOST_AUTO_TEST_CASE( empty_union, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( empty_union, *boost::unit_test::precondition( dev::test::run_not_express ) ) { using RM = RangeMask; using Range = pair< unsigned, unsigned >; RM m( Range( 0, 2000 ) ); @@ -89,8 +87,8 @@ BOOST_AUTO_TEST_CASE( empty_union, BOOST_CHECK_EQUAL( m.size(), 3 ); } -BOOST_AUTO_TEST_CASE( overlapping_unions, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( + overlapping_unions, *boost::unit_test::precondition( dev::test::run_not_express ) ) { using RM = RangeMask; using Range = pair< unsigned, unsigned >; RM m( Range( 0, 2000 ) ); @@ -112,8 +110,7 @@ BOOST_AUTO_TEST_CASE( overlapping_unions, BOOST_CHECK_EQUAL( 70 - 5, m.size() ); } -BOOST_AUTO_TEST_CASE( complement, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( complement, *boost::unit_test::precondition( dev::test::run_not_express ) ) { using RM = RangeMask; using Range = pair< unsigned, unsigned >; RM m( Range( 0, 2000 ) ); @@ -129,8 +126,7 @@ BOOST_AUTO_TEST_CASE( complement, BOOST_CHECK_EQUAL( m.size(), 1000 - 10 ); } -BOOST_AUTO_TEST_CASE( iterator, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( iterator, *boost::unit_test::precondition( dev::test::run_not_express ) ) { using RM = RangeMask; using Range = pair< unsigned, unsigned >; RM m( Range( 0, 2000 ) ); @@ -140,7 +136,7 @@ BOOST_AUTO_TEST_CASE( iterator, vector< unsigned > elements; copy( m.begin(), m.end(), back_inserter( elements ) ); - BOOST_CHECK( elements == ( vector< unsigned >{7, 8, 11, 200, 201, 202, 203, 204} ) ); + BOOST_CHECK( elements == ( vector< unsigned >{ 7, 8, 11, 200, 201, 202, 203, 204 } ) ); } BOOST_AUTO_TEST_SUITE_END() diff --git a/test/unittests/libdevcore/core.cpp b/test/unittests/libdevcore/core.cpp index 54eb7e81f..f52933e2c 100644 --- a/test/unittests/libdevcore/core.cpp +++ b/test/unittests/libdevcore/core.cpp @@ -36,8 +36,7 @@ using namespace dev::test; BOOST_FIXTURE_TEST_SUITE( CoreLibTests, TestOutputHelperFixture ) -BOOST_AUTO_TEST_CASE( toHex, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( toHex, *boost::unit_test::precondition( dev::test::run_not_express ) ) { dev::bytes b = dev::fromHex( "f0e1d2c3b4a59687" ); BOOST_CHECK_EQUAL( dev::toHex( b ), "f0e1d2c3b4a59687" ); BOOST_CHECK_EQUAL( dev::toHexPrefixed( b ), "0xf0e1d2c3b4a59687" ); @@ -49,15 +48,14 @@ BOOST_AUTO_TEST_CASE( toHex, "0x705a1849c02140e7197fbde82987a9eb623f97e32fc479a3cd8e4b3b52dcc4b2" ); } -BOOST_AUTO_TEST_CASE( toCompactHex, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( + toCompactHex, *boost::unit_test::precondition( dev::test::run_not_express ) ) { dev::u256 i( "0x123456789abcdef" ); BOOST_CHECK_EQUAL( dev::toCompactHex( i ), "0123456789abcdef" ); BOOST_CHECK_EQUAL( dev::toCompactHexPrefixed( i ), "0x0123456789abcdef" ); } -BOOST_AUTO_TEST_CASE( byteRef, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( byteRef, *boost::unit_test::precondition( dev::test::run_not_express ) ) { cnote << "bytesRef copyTo and toString..."; dev::bytes originalSequence = dev::fromHex( "0102030405060708091011121314151617181920212223242526272829303132" ); @@ -71,8 +69,7 @@ BOOST_AUTO_TEST_CASE( byteRef, out.toBytes() == originalSequence, "Error when h256::ref().copyTo(dev::bytesRef out)" ); } -BOOST_AUTO_TEST_CASE( isHex, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( isHex, *boost::unit_test::precondition( dev::test::run_not_express ) ) { BOOST_CHECK( dev::isHex( "0x" ) ); BOOST_CHECK( dev::isHex( "0xA" ) ); BOOST_CHECK( dev::isHex( "0xAB" ) ); diff --git a/test/unittests/libdevcore/rlp.cpp b/test/unittests/libdevcore/rlp.cpp index f6edca2a0..6676b1c41 100644 --- a/test/unittests/libdevcore/rlp.cpp +++ b/test/unittests/libdevcore/rlp.cpp @@ -221,8 +221,8 @@ BOOST_AUTO_TEST_CASE( EmptyArrayList ) { } } -BOOST_AUTO_TEST_CASE( invalidRLPtest, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( + invalidRLPtest, *boost::unit_test::precondition( dev::test::run_not_express ) ) { runRlpTest( "invalidRLPTest", "/RLPTests" ); } @@ -234,7 +234,7 @@ BOOST_AUTO_TEST_CASE( rlpRandom ) { fs::path testPath = dev::test::getTestPath(); testPath /= fs::path( "RLPTests/RandomRLPTests" ); - vector< boost::filesystem::path > testFiles = test::getFiles( testPath, {".json"} ); + vector< boost::filesystem::path > testFiles = test::getFiles( testPath, { ".json" } ); for ( auto& path : testFiles ) { try { cnote << "Testing ..." << path.filename(); diff --git a/test/unittests/libdevcore/sharedspace.cpp b/test/unittests/libdevcore/sharedspace.cpp index f3305f609..8c885ad00 100644 --- a/test/unittests/libdevcore/sharedspace.cpp +++ b/test/unittests/libdevcore/sharedspace.cpp @@ -15,18 +15,16 @@ BOOST_FIXTURE_TEST_SUITE( SharedSpaceTests, TestOutputHelperFixture ) BOOST_AUTO_TEST_CASE( All ) { TransientDirectory td; - SharedSpace space(td.path()); + SharedSpace space( td.path() ); space.lock(); - BOOST_ASSERT(!space.try_lock()); + BOOST_ASSERT( !space.try_lock() ); - auto th = std::thread([&space](){ - space.unlock(); - }); + auto th = std::thread( [&space]() { space.unlock(); } ); th.join(); - BOOST_ASSERT(space.try_lock()); - BOOST_ASSERT(!space.try_lock()); + BOOST_ASSERT( space.try_lock() ); + BOOST_ASSERT( !space.try_lock() ); space.unlock(); } diff --git a/test/unittests/libdevcrypto/AES.cpp b/test/unittests/libdevcrypto/AES.cpp index 10545e8a5..e2c7edb3d 100644 --- a/test/unittests/libdevcrypto/AES.cpp +++ b/test/unittests/libdevcrypto/AES.cpp @@ -43,7 +43,8 @@ BOOST_AUTO_TEST_CASE( AesDecrypt, *boost::unit_test::precondition( dev::test::ru BOOST_CHECK( Address( "07746f871de684297923f933279555dda418f8a2" ) == kp.address() ); } -BOOST_AUTO_TEST_CASE( AesDecryptWrongSeed, *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( + AesDecryptWrongSeed, *boost::unit_test::precondition( dev::test::run_not_express ) ) { cnote << "AesDecryptWrongSeed"; bytes seed = fromHex( "badaead416c20cfd00c2fc9f1788ff9f965a2000799c96a624767cb0e1e90d2d7191efdd92349226742fdc73d1" @@ -53,7 +54,8 @@ BOOST_AUTO_TEST_CASE( AesDecryptWrongSeed, *boost::unit_test::precondition( dev: BOOST_CHECK( Address( "07746f871de684297923f933279555dda418f8a2" ) != kp.address() ); } -BOOST_AUTO_TEST_CASE( AesDecryptWrongPassword, *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( + AesDecryptWrongPassword, *boost::unit_test::precondition( dev::test::run_not_express ) ) { cnote << "AesDecryptWrongPassword"; bytes seed = fromHex( "2dbaead416c20cfd00c2fc9f1788ff9f965a2000799c96a624767cb0e1e90d2d7191efdd92349226742fdc73d1" @@ -63,7 +65,8 @@ BOOST_AUTO_TEST_CASE( AesDecryptWrongPassword, *boost::unit_test::precondition( BOOST_CHECK( Address( "07746f871de684297923f933279555dda418f8a2" ) != kp.address() ); } -BOOST_AUTO_TEST_CASE( AesDecryptFailInvalidSeed, *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( + AesDecryptFailInvalidSeed, *boost::unit_test::precondition( dev::test::run_not_express ) ) { cnote << "AesDecryptFailInvalidSeed"; bytes seed = fromHex( "xdbaead416c20cfd00c2fc9f1788ff9f965a2000799c96a624767cb0e1e90d2d7191efdd92349226742fdc73d1" @@ -72,13 +75,15 @@ BOOST_AUTO_TEST_CASE( AesDecryptFailInvalidSeed, *boost::unit_test::precondition BOOST_CHECK( bytes() == aesDecrypt( &seed, "test" ) ); } -BOOST_AUTO_TEST_CASE( AesDecryptFailInvalidSeedSize, *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( + AesDecryptFailInvalidSeedSize, *boost::unit_test::precondition( dev::test::run_not_express ) ) { cnote << "AesDecryptFailInvalidSeedSize"; bytes seed = fromHex( "000102030405060708090a0b0c0d0e0f" ); BOOST_CHECK( bytes() == aesDecrypt( &seed, "test" ) ); } -BOOST_AUTO_TEST_CASE( AesDecryptFailInvalidSeed2, *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( + AesDecryptFailInvalidSeed2, *boost::unit_test::precondition( dev::test::run_not_express ) ) { cnote << "AesDecryptFailInvalidSeed2"; bytes seed = fromHex( "000102030405060708090a0b0c0d0e0f000102030405060708090a0b0c0d0e0f" ); BOOST_CHECK( bytes() == aesDecrypt( &seed, "test" ) ); diff --git a/test/unittests/libdevcrypto/LibSnark.cpp b/test/unittests/libdevcrypto/LibSnark.cpp index 232e46c71..de7c4cd8d 100644 --- a/test/unittests/libdevcrypto/LibSnark.cpp +++ b/test/unittests/libdevcrypto/LibSnark.cpp @@ -82,7 +82,8 @@ BOOST_AUTO_TEST_CASE( ecadd, *boost::unit_test::precondition( run_not_express ) BOOST_AUTO_TEST_CASE( fieldPointInvalid, *boost::unit_test::precondition( run_not_express ) ) { u256 const pMod{ - "21888242871839275222246405745257275088696311157297823662689037894645226208583"}; + "21888242871839275222246405745257275088696311157297823662689037894645226208583" + }; bytes input = toBigEndian( pMod ); BOOST_CHECK( !alt_bn128_G1_add( ref( input ) ).first ); @@ -512,7 +513,7 @@ BOOST_AUTO_TEST_CASE( benchECMULWorstCase1, *boost::unit_test::precondition( run bytes v = fromHex( "1fa111cf23c269b75957c715b762ef37074d341c280d113707ff342211b794571db10707e7cb4ba3c851f6bbb4" "3399701da0c7675ca0f9cfc595774fd055b2fb" ); - u256 const k{"21888242871839275222246405745257275088696311157297823662689037894645226208582"}; + u256 const k{ "21888242871839275222246405745257275088696311157297823662689037894645226208582" }; for ( int i = 0; i < 1000; ++i ) { bool success = false; @@ -531,7 +532,7 @@ BOOST_AUTO_TEST_CASE( benchECMULWorstCase2, *boost::unit_test::precondition( run bytes v = fromHex( "1fa111cf23c269b75957c715b762ef37074d341c280d113707ff342211b794571db10707e7cb4ba3c851f6bbb4" "3399701da0c7675ca0f9cfc595774fd055b2fb" ); - u256 const k{"10944121435919637611123202872628637544348155578648911831344518947322613104291"}; + u256 const k{ "10944121435919637611123202872628637544348155578648911831344518947322613104291" }; for ( int i = 0; i < 1000; ++i ) { bool success = false; @@ -564,7 +565,8 @@ BOOST_AUTO_TEST_CASE( benchECMULIdentity, *boost::unit_test::precondition( run_n BOOST_CHECK_EQUAL( toHex( v ), toHex( w ) ); } -BOOST_AUTO_TEST_CASE( ECMULuseCaseFromRopsten, *boost::unit_test::precondition( run_not_express ) ) { +BOOST_AUTO_TEST_CASE( + ECMULuseCaseFromRopsten, *boost::unit_test::precondition( run_not_express ) ) { bytes const input = fromHex( "277a420332215ead37ba61fee84f0d216a345e762af8efd15453697170b3cdc5" "1b312cd37d4ad474fc299c9689fc0f347a2ec2b5b474a41b343142ee5fdd097a" diff --git a/test/unittests/libdevcrypto/SecretStore.cpp b/test/unittests/libdevcrypto/SecretStore.cpp index 513523304..77f3c8066 100644 --- a/test/unittests/libdevcrypto/SecretStore.cpp +++ b/test/unittests/libdevcrypto/SecretStore.cpp @@ -40,8 +40,7 @@ BOOST_AUTO_TEST_SUITE( Crypto ) BOOST_FIXTURE_TEST_SUITE( KeyStore, TestOutputHelperFixture ) -BOOST_AUTO_TEST_CASE( basic_tests, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( basic_tests, *boost::unit_test::precondition( dev::test::run_not_express ) ) { fs::path testPath = test::getTestPath(); testPath /= fs::path( "KeyStoreTests" ); @@ -66,8 +65,8 @@ BOOST_AUTO_TEST_CASE( basic_tests, } } -BOOST_AUTO_TEST_CASE( import_key_from_file, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( + import_key_from_file, *boost::unit_test::precondition( dev::test::run_not_express ) ) { // Imports a key from an external file. Tests that the imported key is there // and that the external file is not deleted. TransientDirectory importDir; @@ -111,9 +110,9 @@ BOOST_AUTO_TEST_CASE( import_key_from_file, } } -BOOST_AUTO_TEST_CASE( import_secret, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { - for ( string const& password : {"foobar", ""} ) { +BOOST_AUTO_TEST_CASE( + import_secret, *boost::unit_test::precondition( dev::test::run_not_express ) ) { + for ( string const& password : { "foobar", "" } ) { TransientDirectory storeDir; string priv = "0202020202020202020202020202020202020202020202020202020202020202"; @@ -137,7 +136,7 @@ BOOST_AUTO_TEST_CASE( import_secret, } BOOST_AUTO_TEST_CASE( import_secret_bytesConstRef ) { - for ( string const& password : {"foobar", ""} ) { + for ( string const& password : { "foobar", "" } ) { TransientDirectory storeDir; string priv = "0202020202020202020202020202020202020202020202020202020202020202"; @@ -161,8 +160,8 @@ BOOST_AUTO_TEST_CASE( import_secret_bytesConstRef ) { } } -BOOST_AUTO_TEST_CASE( wrong_password, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( + wrong_password, *boost::unit_test::precondition( dev::test::run_not_express ) ) { TransientDirectory storeDir; SecretStore store( storeDir.path() ); string password = "foobar"; @@ -188,8 +187,7 @@ BOOST_AUTO_TEST_CASE( wrong_password, } } -BOOST_AUTO_TEST_CASE( recode, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( recode, *boost::unit_test::precondition( dev::test::run_not_express ) ) { TransientDirectory storeDir; SecretStore store( storeDir.path() ); string password = "foobar"; @@ -228,8 +226,8 @@ BOOST_AUTO_TEST_CASE( recode, } } -BOOST_AUTO_TEST_CASE( keyImport_PBKDF2SHA256, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( + keyImport_PBKDF2SHA256, *boost::unit_test::precondition( dev::test::run_not_express ) ) { // Imports a key from an external file. Tests that the imported key is there // and that the external file is not deleted. TransientDirectory importDir; @@ -269,8 +267,8 @@ BOOST_AUTO_TEST_CASE( keyImport_PBKDF2SHA256, fs::remove( importFile ); } -BOOST_AUTO_TEST_CASE( keyImport_Scrypt, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( + keyImport_Scrypt, *boost::unit_test::precondition( dev::test::run_not_express ) ) { // Imports a key from an external file. Tests that the imported key is there // and that the external file is not deleted. TransientDirectory importDir; diff --git a/test/unittests/libdevcrypto/crypto.cpp b/test/unittests/libdevcrypto/crypto.cpp index 0fd4ab8c5..948186a24 100644 --- a/test/unittests/libdevcrypto/crypto.cpp +++ b/test/unittests/libdevcrypto/crypto.cpp @@ -75,16 +75,15 @@ static CryptoPP::DL_GroupParameters_EC< CryptoPP::ECP >& params() { return s_params; } -BOOST_AUTO_TEST_CASE( sha3general, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( sha3general, *boost::unit_test::precondition( dev::test::run_not_express ) ) { BOOST_REQUIRE_EQUAL( sha3( "" ), h256( "c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470" ) ); BOOST_REQUIRE_EQUAL( sha3( "hello" ), h256( "1c8aff950685c2ed4bc3174f3472287b56d9517b9c948127319a09a7a36deac8" ) ); } -BOOST_AUTO_TEST_CASE( emptySHA3Types, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( + emptySHA3Types, *boost::unit_test::precondition( dev::test::run_not_express ) ) { h256 emptySHA3( fromHex( "c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470" ) ); BOOST_REQUIRE_EQUAL( emptySHA3, EmptySHA3 ); @@ -93,14 +92,13 @@ BOOST_AUTO_TEST_CASE( emptySHA3Types, BOOST_REQUIRE_EQUAL( emptyListSHA3, EmptyListSHA3 ); } -BOOST_AUTO_TEST_CASE( pubkeyOfZero, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( + pubkeyOfZero, *boost::unit_test::precondition( dev::test::run_not_express ) ) { auto pub = toPublic( {} ); BOOST_REQUIRE_EQUAL( pub, Public{} ); } -BOOST_AUTO_TEST_CASE( KeyPairMix, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( KeyPairMix, *boost::unit_test::precondition( dev::test::run_not_express ) ) { KeyPair k = KeyPair::create(); BOOST_REQUIRE( !!k.secret() ); BOOST_REQUIRE( !!k.pub() ); @@ -131,19 +129,19 @@ BOOST_AUTO_TEST_CASE( keypairs ) { BOOST_CHECK_EQUAL( t.sender(), p.address() ); } -BOOST_AUTO_TEST_CASE( KeyPairVerifySecret, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( + KeyPairVerifySecret, *boost::unit_test::precondition( dev::test::run_not_express ) ) { auto keyPair = KeyPair::create(); auto* ctx = secp256k1_context_create( SECP256K1_CONTEXT_NONE ); BOOST_CHECK( secp256k1_ec_seckey_verify( ctx, keyPair.secret().data() ) ); secp256k1_context_destroy( ctx ); } -BOOST_AUTO_TEST_CASE( SignAndRecover, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( + SignAndRecover, *boost::unit_test::precondition( dev::test::run_not_express ) ) { // This basic test that compares **fixed** results. Useful to test new // implementations or changes to implementations. - auto sec = Secret{sha3( "sec" )}; + auto sec = Secret{ sha3( "sec" ) }; auto msg = sha3( "msg" ); auto sig = sign( sec, msg ); auto expectedSig = @@ -158,8 +156,8 @@ BOOST_AUTO_TEST_CASE( SignAndRecover, BOOST_CHECK_EQUAL( pub.hex(), expectedPub ); } -BOOST_AUTO_TEST_CASE( SignAndRecoverLoop, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( + SignAndRecoverLoop, *boost::unit_test::precondition( dev::test::run_not_express ) ) { auto num = 13; auto msg = h256::random(); while ( --num ) { @@ -179,8 +177,8 @@ BOOST_AUTO_TEST_CASE( cryptopp_patch ) { BOOST_REQUIRE_EQUAL( io_text.size(), 0 ); } -BOOST_AUTO_TEST_CASE( verify_secert, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( + verify_secert, *boost::unit_test::precondition( dev::test::run_not_express ) ) { Secret empty; KeyPair kNot( empty ); BOOST_REQUIRE( !kNot.address() ); @@ -188,8 +186,8 @@ BOOST_AUTO_TEST_CASE( verify_secert, BOOST_REQUIRE( k.address() ); } -BOOST_AUTO_TEST_CASE( common_encrypt_decrypt, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( + common_encrypt_decrypt, *boost::unit_test::precondition( dev::test::run_not_express ) ) { string message( "Now is the time for all good persons to come to the aid of humanity." ); bytes m = asBytes( message ); bytesConstRef bcr( &m ); @@ -206,8 +204,8 @@ BOOST_AUTO_TEST_CASE( common_encrypt_decrypt, BOOST_REQUIRE( plain == asBytes( message ) ); } -BOOST_AUTO_TEST_CASE( sha3_norestart, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( + sha3_norestart, *boost::unit_test::precondition( dev::test::run_not_express ) ) { CryptoPP::Keccak_256 ctx; bytes input( asBytes( "test" ) ); ctx.Update( input.data(), 4 ); @@ -237,8 +235,7 @@ BOOST_AUTO_TEST_CASE( sha3_norestart, BOOST_REQUIRE( finalDigest2 != finalDigest3 ); } -BOOST_AUTO_TEST_CASE( ecies_kdf, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( ecies_kdf, *boost::unit_test::precondition( dev::test::run_not_express ) ) { KeyPair local = KeyPair::create(); KeyPair remote = KeyPair::create(); // nonce @@ -266,8 +263,8 @@ BOOST_AUTO_TEST_CASE( ecies_kdf, BOOST_REQUIRE( key1 == key2 ); } -BOOST_AUTO_TEST_CASE( ecdh_agree_invalid_pubkey, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( + ecdh_agree_invalid_pubkey, *boost::unit_test::precondition( dev::test::run_not_express ) ) { KeyPair ok = KeyPair::create(); Public pubkey; ~pubkey; // Create a pubkey of all 1s. @@ -275,8 +272,8 @@ BOOST_AUTO_TEST_CASE( ecdh_agree_invalid_pubkey, BOOST_CHECK( !ecdh::agree( ok.secret(), pubkey, z ) ); } -BOOST_AUTO_TEST_CASE( ecdh_agree_invalid_seckey, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( + ecdh_agree_invalid_seckey, *boost::unit_test::precondition( dev::test::run_not_express ) ) { KeyPair ok = KeyPair::create(); Secret seckey; // "Null" seckey is invalid. BOOST_CHECK( !ecdh::agree( seckey, ok.pub(), seckey ) ); @@ -320,8 +317,8 @@ BOOST_AUTO_TEST_CASE( ecies_sharedMacData ) { BOOST_CHECK_EQUAL( toHex( decrypted ), toHex( original ) ); } -BOOST_AUTO_TEST_CASE( ecies_eckeypair, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( + ecies_eckeypair, *boost::unit_test::precondition( dev::test::run_not_express ) ) { KeyPair k = KeyPair::create(); string message( "Now is the time for all good persons to come to the aid of humanity." ); @@ -335,8 +332,8 @@ BOOST_AUTO_TEST_CASE( ecies_eckeypair, BOOST_REQUIRE( b == asBytes( original ) ); } -BOOST_AUTO_TEST_CASE( ecdhCryptopp, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( + ecdhCryptopp, *boost::unit_test::precondition( dev::test::run_not_express ) ) { CryptoPP::ECDH< CryptoPP::ECP >::Domain dhLocal( curveOID() ); CryptoPP::SecByteBlock privLocal( dhLocal.PrivateKeyLength() ); CryptoPP::SecByteBlock pubLocal( dhLocal.PublicKeyLength() ); @@ -370,11 +367,11 @@ BOOST_AUTO_TEST_CASE( ecdhCryptopp, // Now use our keys KeyPair a = KeyPair::create(); - _byte_ puba[65] = {0x04}; + _byte_ puba[65] = { 0x04 }; memcpy( &puba[1], a.pub().data(), 64 ); KeyPair b = KeyPair::create(); - _byte_ pubb[65] = {0x04}; + _byte_ pubb[65] = { 0x04 }; memcpy( &pubb[1], b.pub().data(), 64 ); CryptoPP::ECDH< CryptoPP::ECP >::Domain dhA( curveOID() ); @@ -383,8 +380,7 @@ BOOST_AUTO_TEST_CASE( ecdhCryptopp, BOOST_REQUIRE( shared ); } -BOOST_AUTO_TEST_CASE( ecdhe, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( ecdhe, *boost::unit_test::precondition( dev::test::run_not_express ) ) { auto local = KeyPair::create(); auto remote = KeyPair::create(); BOOST_CHECK_NE( local.pub(), remote.pub() ); @@ -402,9 +398,8 @@ BOOST_AUTO_TEST_CASE( ecdhe, BOOST_CHECK_EQUAL( sremote, slocal ); } -BOOST_AUTO_TEST_CASE( ecdhAgree, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { - auto sec = Secret{sha3( "ecdhAgree" )}; +BOOST_AUTO_TEST_CASE( ecdhAgree, *boost::unit_test::precondition( dev::test::run_not_express ) ) { + auto sec = Secret{ sha3( "ecdhAgree" ) }; auto pub = toPublic( sec ); Secret sharedSec; BOOST_CHECK( ecdh::agree( sec, pub, sharedSec ) ); @@ -413,8 +408,8 @@ BOOST_AUTO_TEST_CASE( ecdhAgree, BOOST_CHECK_EQUAL( sharedSec.makeInsecure().hex(), expectedSharedSec ); } -BOOST_AUTO_TEST_CASE( handshakeNew, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( + handshakeNew, *boost::unit_test::precondition( dev::test::run_not_express ) ) { // authInitiator -> E(remote-pubk, S(ecdhe-random, ecdh-shared-secret^nonce) || // H(ecdhe-random-pubk) || pubk || nonce || 0x0) authRecipient -> E(remote-pubk, // ecdhe-random-pubk || nonce || 0x0) @@ -605,12 +600,12 @@ BOOST_AUTO_TEST_CASE( handshakeNew, BOOST_REQUIRE_EQUAL( bEgressMac, aIngressMac ); } -BOOST_AUTO_TEST_CASE( ecies_aes128_ctr_unaligned, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( + ecies_aes128_ctr_unaligned, *boost::unit_test::precondition( dev::test::run_not_express ) ) { SecureFixedHash< 16 > encryptK( sha3( "..." ), h128::AlignLeft ); h256 egressMac( sha3( "+++" ) ); // TESTING: send encrypt magic sequence - bytes magic{0x22, 0x40, 0x08, 0x91}; + bytes magic{ 0x22, 0x40, 0x08, 0x91 }; bytes magicCipherAndMac; magicCipherAndMac = encryptSymNoAuth( encryptK, h128(), &magic ); @@ -628,8 +623,8 @@ BOOST_AUTO_TEST_CASE( ecies_aes128_ctr_unaligned, BOOST_REQUIRE( magic == plaintext ); } -BOOST_AUTO_TEST_CASE( ecies_aes128_ctr, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( + ecies_aes128_ctr, *boost::unit_test::precondition( dev::test::run_not_express ) ) { SecureFixedHash< 16 > k( sha3( "0xAAAA" ), h128::AlignLeft ); string m = "AAAAAAAAAAAAAAAA"; bytesConstRef msg( ( _byte_* ) m.data(), m.size() ); @@ -642,8 +637,8 @@ BOOST_AUTO_TEST_CASE( ecies_aes128_ctr, BOOST_REQUIRE_EQUAL( asString( plaintext ), m ); } -BOOST_AUTO_TEST_CASE( cryptopp_aes128_ctr, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( + cryptopp_aes128_ctr, *boost::unit_test::precondition( dev::test::run_not_express ) ) { const int aesKeyLen = 16; BOOST_REQUIRE( sizeof( char ) == sizeof( _byte_ ) ); @@ -707,8 +702,8 @@ BOOST_AUTO_TEST_CASE( cryptopp_aes128_ctr, } } -BOOST_AUTO_TEST_CASE( cryptopp_aes128_cbc, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( + cryptopp_aes128_cbc, *boost::unit_test::precondition( dev::test::run_not_express ) ) { const int aesKeyLen = 16; BOOST_REQUIRE( sizeof( char ) == sizeof( _byte_ ) ); @@ -750,8 +745,7 @@ BOOST_AUTO_TEST_CASE( cryptopp_aes128_cbc, BOOST_REQUIRE( string192 == plainOriginal ); } -BOOST_AUTO_TEST_CASE( recoverVgt3, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( recoverVgt3, *boost::unit_test::precondition( dev::test::run_not_express ) ) { // base secret Secret secret( sha3( "privacy" ) ); diff --git a/test/unittests/libdevcrypto/hexPrefix.cpp b/test/unittests/libdevcrypto/hexPrefix.cpp index 200d11eda..d9f579efb 100644 --- a/test/unittests/libdevcrypto/hexPrefix.cpp +++ b/test/unittests/libdevcrypto/hexPrefix.cpp @@ -37,8 +37,8 @@ BOOST_AUTO_TEST_SUITE( Crypto ) BOOST_FIXTURE_TEST_SUITE( Basic, TestOutputHelperFixture ) -BOOST_AUTO_TEST_CASE( hexPrefix_test, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( + hexPrefix_test, *boost::unit_test::precondition( dev::test::run_not_express ) ) { fs::path testPath = test::getTestPath(); testPath /= fs::path( "BasicTests" ); @@ -61,29 +61,29 @@ BOOST_AUTO_TEST_CASE( hexPrefix_test, } } -BOOST_AUTO_TEST_CASE( base64, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { - static char const* const s_tests[][2] = {{"", ""}, {"f", "Zg=="}, {"fo", "Zm8="}, - {"foo", "Zm9v"}, {"foob", "Zm9vYg=="}, {"fooba", "Zm9vYmE="}, {"foobar", "Zm9vYmFy"}, - {"So?

" - "This 4, 5, 6, 7, 8, 9, z, {, |, } tests Base64 encoder. " - "Show me: @, A, B, C, D, E, F, G, H, I, J, K, L, M, " - "N, O, P, Q, R, S, T, U, V, W, X, Y, Z, [, \\, ], ^, _, `, " - "a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s.", +BOOST_AUTO_TEST_CASE( base64, *boost::unit_test::precondition( dev::test::run_not_express ) ) { + static char const* const s_tests[][2] = { { "", "" }, { "f", "Zg==" }, { "fo", "Zm8=" }, + { "foo", "Zm9v" }, { "foob", "Zm9vYg==" }, { "fooba", "Zm9vYmE=" }, + { "foobar", "Zm9vYmFy" }, + { "So?

" + "This 4, 5, 6, 7, 8, 9, z, {, |, } tests Base64 encoder. " + "Show me: @, A, B, C, D, E, F, G, H, I, J, K, L, M, " + "N, O, P, Q, R, S, T, U, V, W, X, Y, Z, [, \\, ], ^, _, `, " + "a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s.", "U28/PHA+VGhpcyA0LCA1LCA2LCA3LCA4LCA5LCB6LCB7LCB8LCB9IHRlc3RzIEJhc2U2NCBlbmNv" "ZGVyLiBTaG93IG1lOiBALCBBLCBCLCBDLCBELCBFLCBGLCBHLCBILCBJLCBKLCBLLCBMLCBNLCBO" "LCBPLCBQLCBRLCBSLCBTLCBULCBVLCBWLCBXLCBYLCBZLCBaLCBbLCBcLCBdLCBeLCBfLCBgLCBh" - "LCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrLCBsLCBtLCBuLCBvLCBwLCBxLCByLCBzLg=="}}; + "LCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrLCBsLCBtLCBuLCBvLCBwLCBxLCByLCBzLg==" } }; static const auto c_numTests = sizeof( s_tests ) / sizeof( s_tests[0] ); for ( size_t i = 0; i < c_numTests; ++i ) { - auto expectedDecoded = std::string{s_tests[i][0]}; - auto expectedEncoded = std::string{s_tests[i][1]}; + auto expectedDecoded = std::string{ s_tests[i][0] }; + auto expectedEncoded = std::string{ s_tests[i][1] }; auto encoded = toBase64( expectedDecoded ); BOOST_CHECK_EQUAL( expectedEncoded, encoded ); auto decodedBytes = fromBase64( expectedEncoded ); - auto decoded = bytesConstRef{decodedBytes.data(), decodedBytes.size()}.toString(); + auto decoded = bytesConstRef{ decodedBytes.data(), decodedBytes.size() }.toString(); BOOST_CHECK_EQUAL( decoded, expectedDecoded ); } } diff --git a/test/unittests/libdevcrypto/trie.cpp b/test/unittests/libdevcrypto/trie.cpp index d42787fec..7e4d00544 100644 --- a/test/unittests/libdevcrypto/trie.cpp +++ b/test/unittests/libdevcrypto/trie.cpp @@ -23,7 +23,6 @@ #include #include #include -#include #include #include #include @@ -67,7 +66,8 @@ BOOST_AUTO_TEST_CASE( fat_trie ) { } } -BOOST_AUTO_TEST_CASE( hex_encoded_securetrie_test, *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( + hex_encoded_securetrie_test, *boost::unit_test::precondition( dev::test::run_not_express ) ) { fs::path const testPath = test::getTestPath() / fs::path( "TrieTests" ); cnote << "Testing Secure Trie..."; @@ -128,7 +128,8 @@ BOOST_AUTO_TEST_CASE( hex_encoded_securetrie_test, *boost::unit_test::preconditi } } -BOOST_AUTO_TEST_CASE( trie_test_anyorder, *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( + trie_test_anyorder, *boost::unit_test::precondition( dev::test::run_not_express ) ) { fs::path const testPath = test::getTestPath() / fs::path( "TrieTests" ); cnote << "Testing Trie..."; @@ -189,7 +190,8 @@ BOOST_AUTO_TEST_CASE( trie_test_anyorder, *boost::unit_test::precondition( dev:: } } -BOOST_AUTO_TEST_CASE( trie_tests_ordered, *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( + trie_tests_ordered, *boost::unit_test::precondition( dev::test::run_not_express ) ) { fs::path const testPath = test::getTestPath() / fs::path( "TrieTests" ); cnote << "Testing Trie..."; @@ -285,7 +287,8 @@ bytes stringMapRlp256( StringMap const& _s ) { return rlp256( bytesMap ); } -BOOST_AUTO_TEST_CASE( moreTrieTests, *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( + moreTrieTests, *boost::unit_test::precondition( dev::test::run_not_express ) ) { cnote << "Testing Trie more..."; // More tests... { @@ -301,13 +304,13 @@ BOOST_AUTO_TEST_CASE( moreTrieTests, *boost::unit_test::precondition( dev::test: cnote << t; cnote << m; cnote << t.root(); - cnote << stringMapHash256( {{"test", "test"}} ); + cnote << stringMapHash256( { { "test", "test" } } ); t.insert( string( "tesa" ), string( "testy" ) ); cnote << t; cnote << m; cnote << t.root(); - cnote << stringMapHash256( {{"test", "test"}, {"te", "testy"}} ); + cnote << stringMapHash256( { { "test", "test" }, { "te", "testy" } } ); cnote << t.at( string( "test" ) ); cnote << t.at( string( "te" ) ); cnote << t.at( string( "t" ) ); @@ -315,7 +318,7 @@ BOOST_AUTO_TEST_CASE( moreTrieTests, *boost::unit_test::precondition( dev::test: t.remove( string( "te" ) ); cnote << m; cnote << t.root(); - cnote << stringMapHash256( {{"test", "test"}} ); + cnote << stringMapHash256( { { "test", "test" } } ); t.remove( string( "test" ) ); cnote << m; @@ -331,8 +334,8 @@ BOOST_AUTO_TEST_CASE( moreTrieTests, *boost::unit_test::precondition( dev::test: cnote << t; cnote << m; cnote << t.root(); - cnote << stringMapHash256( {{"b", "B"}, {"a", "A"}} ); - bytes r( stringMapRlp256( {{"b", "B"}, {"a", "A"}} ) ); + cnote << stringMapHash256( { { "b", "B" }, { "a", "A" } } ); + bytes r( stringMapRlp256( { { "b", "B" }, { "a", "A" } } ) ); cnote << RLP( r ); } { @@ -351,7 +354,7 @@ BOOST_AUTO_TEST_CASE( moreTrieTests, *boost::unit_test::precondition( dev::test: cnote << RLP( r ); } { - cnote << hex << stringMapHash256( {{"dog", "puppy"}, {"doe", "reindeer"}} ); + cnote << hex << stringMapHash256( { { "dog", "puppy" }, { "doe", "reindeer" } } ); MemTrie t; t.insert( "dog", "puppy" ); t.insert( "doe", "reindeer" ); @@ -440,7 +443,8 @@ std::string randomWord() { } } // namespace -BOOST_AUTO_TEST_CASE( trieLowerBound, *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( + trieLowerBound, *boost::unit_test::precondition( dev::test::run_not_express ) ) { cnote << "Stress-testing Trie.lower_bound..."; if ( 0 ) { MemoryDB dm; diff --git a/test/unittests/libethashseal/EthashTest.cpp b/test/unittests/libethashseal/EthashTest.cpp index 52be8f137..bc6122259 100644 --- a/test/unittests/libethashseal/EthashTest.cpp +++ b/test/unittests/libethashseal/EthashTest.cpp @@ -117,12 +117,12 @@ BOOST_AUTO_TEST_CASE( epochSeed, *boost::unit_test::precondition( dev::test::run header.setNumber( 30000 ); seed = Ethash::seedHash( header ); BOOST_CHECK_EQUAL( - seed, h256{"290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563"} ); + seed, h256{ "290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563" } ); header.setNumber( 2048 * 30000 ); seed = Ethash::seedHash( header ); BOOST_CHECK_EQUAL( - seed, h256{"20a7678ca7b50829183baac2e1e3c43fa3c4bcbc171b11cf5a9f30bebd172920"} ); + seed, h256{ "20a7678ca7b50829183baac2e1e3c43fa3c4bcbc171b11cf5a9f30bebd172920" } ); } namespace { @@ -190,9 +190,9 @@ BOOST_AUTO_TEST_CASE( ethashEvalHeader ) { // FIXME: Drop this test as ethash library has this test cases in its test suite. for ( auto& t : ethashTestCases ) { - BlockHeader header{fromHex( t.header ), HeaderData}; - h256 headerHash{t.headerHash}; - eth::Nonce nonce{t.nonce}; + BlockHeader header{ fromHex( t.header ), HeaderData }; + h256 headerHash{ t.headerHash }; + eth::Nonce nonce{ t.nonce }; BOOST_REQUIRE_EQUAL( headerHash, header.hash( WithoutSeal ) ); BOOST_REQUIRE_EQUAL( nonce, Ethash::nonce( header ) ); @@ -201,10 +201,10 @@ BOOST_AUTO_TEST_CASE( ethashEvalHeader ) { ethash::hash256_from_bytes( header.hash( WithoutSeal ).data() ), ( uint64_t )( u64 ) nonce ); - h256 mix{result.mix_hash.bytes, h256::ConstructFromPointer}; - h256 final{result.final_hash.bytes, h256::ConstructFromPointer}; + h256 mix{ result.mix_hash.bytes, h256::ConstructFromPointer }; + h256 final{ result.final_hash.bytes, h256::ConstructFromPointer }; - BOOST_REQUIRE_EQUAL( final, h256{t.result} ); + BOOST_REQUIRE_EQUAL( final, h256{ t.result } ); BOOST_REQUIRE_EQUAL( mix, Ethash::mixHash( header ) ); } } diff --git a/test/unittests/libethcore/SealEngineTest.cpp b/test/unittests/libethcore/SealEngineTest.cpp index 4ee30ce56..ce4a1fb6a 100644 --- a/test/unittests/libethcore/SealEngineTest.cpp +++ b/test/unittests/libethcore/SealEngineTest.cpp @@ -45,7 +45,8 @@ class UnsignedTransactionFixture : public TestOutputHelperFixture { ChainOperationParams params; Ethash ethash; BlockHeader header; - Transaction tx{0, 0, 21000, Address( "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" ), bytes(), 0}; + Transaction tx{ 0, 0, 21000, Address( "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" ), bytes(), + 0 }; }; } // namespace @@ -61,15 +62,15 @@ BOOST_AUTO_TEST_CASE( UnsignedTransactionIsValidBeforeExperimental, header.setNumber( 1 ); - SealEngineFace::verifyTransaction( params, ImportRequirements::TransactionSignatures, - tx, 1, header, 0 ); // check that it doesn't throw + SealEngineFace::verifyTransaction( params, ImportRequirements::TransactionSignatures, tx, 1, + header, 0 ); // check that it doesn't throw } BOOST_AUTO_TEST_CASE( UnsignedTransactionIsValidInExperimental ) { header.setNumber( 0x1010 ); - SealEngineFace::verifyTransaction( params, ImportRequirements::TransactionSignatures, - tx, 1, header, 0 ); // check that it doesn't throw + SealEngineFace::verifyTransaction( params, ImportRequirements::TransactionSignatures, tx, 1, + header, 0 ); // check that it doesn't throw } BOOST_AUTO_TEST_SUITE_END() diff --git a/test/unittests/libethcore/difficulty.cpp b/test/unittests/libethcore/difficulty.cpp index fd26f197d..8e463d1ae 100644 --- a/test/unittests/libethcore/difficulty.cpp +++ b/test/unittests/libethcore/difficulty.cpp @@ -162,8 +162,8 @@ BOOST_AUTO_TEST_CASE( difficultyTestsFrontier ) { testDifficulty( testFileFullName, sealEngine ); } -BOOST_AUTO_TEST_CASE( difficultyTestsRopsten, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( + difficultyTestsRopsten, *boost::unit_test::precondition( dev::test::run_not_express ) ) { fs::path const testFileFullName = test::getTestPath() / fs::path( "BasicTests/difficultyRopsten.json" ); @@ -189,8 +189,8 @@ BOOST_AUTO_TEST_CASE( difficultyTestsHomestead ) { testDifficulty( testFileFullName, sealEngine ); } -BOOST_AUTO_TEST_CASE( difficultyByzantium, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( + difficultyByzantium, *boost::unit_test::precondition( dev::test::run_not_express ) ) { fs::path const testFileFullName = test::getTestPath() / fs::path( "BasicTests/difficultyByzantium.json" ); @@ -203,8 +203,8 @@ BOOST_AUTO_TEST_CASE( difficultyByzantium, testDifficulty( testFileFullName, sealEngine ); } -BOOST_AUTO_TEST_CASE( difficultyTestsMainNetwork, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( + difficultyTestsMainNetwork, *boost::unit_test::precondition( dev::test::run_not_express ) ) { fs::path const testFileFullName = test::getTestPath() / fs::path( "BasicTests/difficultyMainNetwork.json" ); @@ -226,10 +226,10 @@ BOOST_AUTO_TEST_CASE( difficultyTestsCustomMainNetwork ) { if ( dev::test::Options::get().filltests ) { int64_t byzantiumBlockNumber = 4370000; - std::vector< int64_t > blockNumberVector = { - byzantiumBlockNumber - 100000, byzantiumBlockNumber, byzantiumBlockNumber + 100000}; - std::vector< u256 > parentDifficultyVector = {1000, 2048, 4000, 1000000}; - std::vector< int > timestampDeltaVector = {0, 1, 8, 10, 13, 20, 100, 800, 1000, 1500}; + std::vector< int64_t > blockNumberVector = { byzantiumBlockNumber - 100000, + byzantiumBlockNumber, byzantiumBlockNumber + 100000 }; + std::vector< u256 > parentDifficultyVector = { 1000, 2048, 4000, 1000000 }; + std::vector< int > timestampDeltaVector = { 0, 1, 8, 10, 13, 20, 100, 800, 1000, 1500 }; int testN = 0; ostringstream finalTest; diff --git a/test/unittests/libethcore/keymanager.cpp b/test/unittests/libethcore/keymanager.cpp index 0e9e8a44e..b6a3fec77 100644 --- a/test/unittests/libethcore/keymanager.cpp +++ b/test/unittests/libethcore/keymanager.cpp @@ -37,15 +37,15 @@ namespace fs = boost::filesystem; BOOST_FIXTURE_TEST_SUITE( KeyManagerTests, TestOutputHelperFixture ) BOOST_AUTO_TEST_CASE( KeyInfoDefaultConstructor, - + *boost::unit_test::precondition( dev::test::run_not_express ) ) { KeyInfo kiDefault; BOOST_CHECK_EQUAL( kiDefault.accountName, "" ); BOOST_CHECK( kiDefault.passHash == h256() ); } -BOOST_AUTO_TEST_CASE( KeyInfoConstructor, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( + KeyInfoConstructor, *boost::unit_test::precondition( dev::test::run_not_express ) ) { h256 passHash( "0x2a" ); string accountName = "myAccount"; KeyInfo ki( passHash, accountName ); @@ -53,8 +53,8 @@ BOOST_AUTO_TEST_CASE( KeyInfoConstructor, BOOST_CHECK( ki.passHash == h256( "0x2a" ) ); } -BOOST_AUTO_TEST_CASE( KeyManagerConstructor, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( + KeyManagerConstructor, *boost::unit_test::precondition( dev::test::run_not_express ) ) { KeyManager km; BOOST_CHECK_EQUAL( km.keysFile(), km.defaultPath() ); BOOST_CHECK_EQUAL( km.defaultPath(), getDataDir( "ethereum" ) / fs::path( "keys.info" ) ); @@ -63,8 +63,8 @@ BOOST_AUTO_TEST_CASE( KeyManagerConstructor, km.kill( a ); } -BOOST_AUTO_TEST_CASE( KeyManagerKeysFile, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( + KeyManagerKeysFile, *boost::unit_test::precondition( dev::test::run_not_express ) ) { KeyManager km; string password = "hardPassword"; BOOST_CHECK( !km.load( password ) ); @@ -86,8 +86,8 @@ BOOST_AUTO_TEST_CASE( KeyManagerKeysFile, km.kill( a ); } -BOOST_AUTO_TEST_CASE( KeyManagerHints, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( + KeyManagerHints, *boost::unit_test::precondition( dev::test::run_not_express ) ) { KeyManager km; string password = "hardPassword"; @@ -105,8 +105,8 @@ BOOST_AUTO_TEST_CASE( KeyManagerHints, km.kill( a ); } -BOOST_AUTO_TEST_CASE( KeyManagerAccounts, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( + KeyManagerAccounts, *boost::unit_test::precondition( dev::test::run_not_express ) ) { string password = "hardPassword"; TransientDirectory tmpDir; @@ -120,8 +120,8 @@ BOOST_AUTO_TEST_CASE( KeyManagerAccounts, km.kill( a ); } -BOOST_AUTO_TEST_CASE( KeyManagerKill, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( + KeyManagerKill, *boost::unit_test::precondition( dev::test::run_not_express ) ) { string password = "hardPassword"; TransientDirectory tmpDir; KeyPair kp = KeyPair::create(); diff --git a/test/unittests/libethereum/Block.cpp b/test/unittests/libethereum/Block.cpp index ba7236c22..f35389176 100644 --- a/test/unittests/libethereum/Block.cpp +++ b/test/unittests/libethereum/Block.cpp @@ -38,7 +38,8 @@ BOOST_FIXTURE_TEST_SUITE( BlockSuite, TestOutputHelperFixture ) BOOST_FIXTURE_TEST_SUITE( GasPricer, TestOutputHelperFixture ) -BOOST_AUTO_TEST_CASE( bNormalTransactionInput, *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( + bNormalTransactionInput, *boost::unit_test::precondition( dev::test::run_not_express ) ) { TestBlockChain testBlockchain( TestBlockChain::defaultGenesisBlock( 63000 ) ); TestBlock const& genesisBlock = testBlockchain.testGenesis(); State const& genesisState = genesisBlock.state(); @@ -79,7 +80,8 @@ BOOST_AUTO_TEST_CASE( bBlockNotSyncedToBlockchain ) { BOOST_REQUIRE( testBlockT.transactionQueue().topTransactions( 4 ).size() == 2 ); } -BOOST_AUTO_TEST_CASE( bExceedBlockGasLimit, *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( + bExceedBlockGasLimit, *boost::unit_test::precondition( dev::test::run_not_express ) ) { TestBlockChain testBlockchain( TestBlockChain::defaultGenesisBlock( 63000 ) ); TestBlock const& genesisBlock = testBlockchain.testGenesis(); State const& genesisState = genesisBlock.state(); @@ -139,7 +141,8 @@ BOOST_AUTO_TEST_CASE( bTemporaryNoGasLeft ) { BOOST_REQUIRE( testBlockT.transactionQueue().topTransactions( 4 ).size() == 3 ); } -BOOST_AUTO_TEST_CASE( bInvalidNonceNoncesAhead, *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( + bInvalidNonceNoncesAhead, *boost::unit_test::precondition( dev::test::run_not_express ) ) { // Add some amount of gas because block limit decreases TestBlockChain testBlockchain( TestBlockChain::defaultGenesisBlock( 63000 + 21000 ) ); TestBlock const& genesisBlock = testBlockchain.testGenesis(); @@ -173,7 +176,8 @@ BOOST_AUTO_TEST_CASE( bInvalidNonceNoncesAhead, *boost::unit_test::precondition( u256( 3 ) ); // nonce starts with 1 } -BOOST_AUTO_TEST_CASE( bInvalidNonceNonceTooLow, *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( + bInvalidNonceNonceTooLow, *boost::unit_test::precondition( dev::test::run_not_express ) ) { TestBlockChain testBlockchain( TestBlockChain::defaultGenesisBlock( 63000 ) ); TestBlock const& genesisBlock = testBlockchain.testGenesis(); State const& genesisState = genesisBlock.state(); diff --git a/test/unittests/libethereum/BlockChain.cpp b/test/unittests/libethereum/BlockChain.cpp index b4c4175c2..1b3c33a5a 100644 --- a/test/unittests/libethereum/BlockChain.cpp +++ b/test/unittests/libethereum/BlockChain.cpp @@ -295,7 +295,8 @@ BOOST_AUTO_TEST_CASE( updateStats ) { bcRef.garbageCollect( true ); } -BOOST_AUTO_TEST_CASE( invalidJsonThrows, *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( + invalidJsonThrows, *boost::unit_test::precondition( dev::test::run_not_express ) ) { h256 emptyStateRoot; /* Below, a comma is missing between fields. */ BOOST_CHECK_THROW( diff --git a/test/unittests/libethereum/ClientTest.cpp b/test/unittests/libethereum/ClientTest.cpp index 9cc2e0b93..3c05bd48a 100644 --- a/test/unittests/libethereum/ClientTest.cpp +++ b/test/unittests/libethereum/ClientTest.cpp @@ -26,11 +26,11 @@ #include #include #include -#include -#include +#include #include #include -#include +#include +#include using namespace std; using namespace dev; @@ -39,7 +39,7 @@ using namespace dev::test; using namespace dev::p2p; namespace fs = boost::filesystem; -static size_t rand_port = ( srand(time(nullptr)), 1024 + rand() % 64000 ); +static size_t rand_port = ( srand( time( nullptr ) ), 1024 + rand() % 64000 ); struct FixtureCommon { const string BTRFS_FILE_PATH = "btrfs.file"; @@ -107,12 +107,10 @@ struct FixtureCommon { class TestClientFixture : public TestOutputHelperFixture { public: TestClientFixture( const std::string& _config = "" ) try { - ChainParams chainParams; if ( _config != "" ) { chainParams = chainParams.loadConfig( _config ); - } - else { + } else { chainParams.nodeInfo.port = chainParams.nodeInfo.port6 = rand_port; chainParams.sChain.nodes[0].port = chainParams.sChain.nodes[0].port6 = rand_port; } @@ -133,9 +131,9 @@ class TestClientFixture : public TestOutputHelperFixture { // ), dir, // dir, chainParams, WithExisting::Kill, {"eth"}, testingMode ) ); - auto monitor = make_shared< InstanceMonitor >("test"); + auto monitor = make_shared< InstanceMonitor >( "test" ); - setenv("DATA_DIR", m_tmpDir.path().c_str(), 1); + setenv( "DATA_DIR", m_tmpDir.path().c_str(), 1 ); m_ethereum.reset( new eth::ClientTest( chainParams, ( int ) chainParams.networkID, shared_ptr< GasPricer >(), NULL, monitor, m_tmpDir.path(), WithExisting::Kill ) ); @@ -147,9 +145,7 @@ class TestClientFixture : public TestOutputHelperFixture { // wait for 1st block - because it's always empty std::promise< void > block_promise; auto importHandler = m_ethereum->setOnBlockImport( - [&block_promise]( BlockHeader const& ) { - block_promise.set_value(); - } ); + [&block_promise]( BlockHeader const& ) { block_promise.set_value(); } ); m_ethereum->injectSkaleHost(); m_ethereum->startWorking(); @@ -159,7 +155,7 @@ class TestClientFixture : public TestOutputHelperFixture { m_ethereum->setAuthor( coinbase.address() ); accountHolder.reset( new FixedAccountHolder( [&]() { return m_ethereum.get(); }, {} ) ); - accountHolder->setAccounts( {coinbase} ); + accountHolder->setAccounts( { coinbase } ); } catch ( const std::exception& ex ) { clog( VerbosityError, "TestClientFixture" ) << "CRITICAL " << dev::nested_exception_what( ex ); @@ -170,47 +166,47 @@ class TestClientFixture : public TestOutputHelperFixture { } dev::eth::Client* ethereum() { return m_ethereum.get(); } - dev::KeyPair coinbase{KeyPair::create()}; + dev::KeyPair coinbase{ KeyPair::create() }; - bool getTransactionStatus(const Json::Value& json) { + bool getTransactionStatus( const Json::Value& json ) { try { - { // block + { // block Json::FastWriter fastWriter; std::string s = fastWriter.write( json ); nlohmann::json jo = nlohmann::json::parse( s ); - clog( VerbosityInfo, "TestClientFixture::getTransactionStatus()" ) << - ( cc::debug( "Will compute status of transaction: " ) + cc::j( jo ) + cc::debug( " ..." ) ); - } // block - Transaction tx = tx_from_json(json); - auto txHash = m_ethereum->importTransaction(tx); - clog( VerbosityInfo, "TestClientFixture::getTransactionStatus()" ) << - ( cc::debug( "Mining transaction..." ) ); - dev::eth::mineTransaction(*(m_ethereum), 1); - clog( VerbosityInfo, "TestClientFixture::getTransactionStatus()" ) << - ( cc::debug( "Getting transaction receipt..." ) ); - Json::Value receipt = toJson(m_ethereum->localisedTransactionReceipt(txHash)); - { // block + clog( VerbosityInfo, "TestClientFixture::getTransactionStatus()" ) + << ( cc::debug( "Will compute status of transaction: " ) + cc::j( jo ) + + cc::debug( " ..." ) ); + } // block + Transaction tx = tx_from_json( json ); + auto txHash = m_ethereum->importTransaction( tx ); + clog( VerbosityInfo, "TestClientFixture::getTransactionStatus()" ) + << ( cc::debug( "Mining transaction..." ) ); + dev::eth::mineTransaction( *( m_ethereum ), 1 ); + clog( VerbosityInfo, "TestClientFixture::getTransactionStatus()" ) + << ( cc::debug( "Getting transaction receipt..." ) ); + Json::Value receipt = toJson( m_ethereum->localisedTransactionReceipt( txHash ) ); + { // block Json::FastWriter fastWriter; std::string s = fastWriter.write( receipt ); nlohmann::json jo = nlohmann::json::parse( s ); - clog( VerbosityInfo, "TestClientFixture::getTransactionStatus()" ) << - ( cc::debug( "Got transaction receipt: " ) + cc::j( jo ) + cc::debug( " ..." ) ); - } // block + clog( VerbosityInfo, "TestClientFixture::getTransactionStatus()" ) + << ( cc::debug( "Got transaction receipt: " ) + cc::j( jo ) + + cc::debug( " ..." ) ); + } // block bool bStatusFlag = ( receipt["status"] == "0x1" ) ? true : false; - if( bStatusFlag ) - clog( VerbosityInfo, "TestClientFixture::getTransactionStatus()" ) << - ( cc::success( "SUCCESS: Got positive transaction status" ) ); + if ( bStatusFlag ) + clog( VerbosityInfo, "TestClientFixture::getTransactionStatus()" ) + << ( cc::success( "SUCCESS: Got positive transaction status" ) ); else - clog( VerbosityError, "TestClientFixture::getTransactionStatus()" ) << - ( cc::fatal( "ERROR:" ) + " " + cc::error( "Got negative transaction status" ) ); + cerr << "TestClientFixture::getTransactionStatus() ERROR:" << receipt["status"] + << endl; return bStatusFlag; - } catch ( std::exception & ex ) { - clog( VerbosityError, "TestClientFixture::getTransactionStatus()" ) << - ( cc::fatal( "ERROR:" ) + " " + cc::error( "exception:" ) + cc::warn( ex.what() ) ); + } catch ( std::exception& ex ) { + cerr << "TestClientFixture::getTransactionStatus() ERROR:" << ex.what() << endl; return false; - } catch (...) { - clog( VerbosityError, "TestClientFixture::getTransactionStatus()" ) << - ( cc::fatal( "ERROR:" ) + " " + cc::error( "unknown exception" ) ); + } catch ( ... ) { + cerr << "TestClientFixture::getTransactionStatus() Unknown exception" << endl; return false; } } @@ -240,10 +236,11 @@ class TestClientSnapshotsFixture : public TestOutputHelperFixture, public Fixtur rv = system( ( "mkdir " + m_tmpDir.path() ).c_str() ); gainRoot(); - rv = system( ( "mount -o user_subvol_rm_allowed " + BTRFS_FILE_PATH + " " + m_tmpDir.path() ) - .c_str() ); + rv = + system( ( "mount -o user_subvol_rm_allowed " + BTRFS_FILE_PATH + " " + m_tmpDir.path() ) + .c_str() ); rv = chown( m_tmpDir.path().c_str(), sudo_uid, sudo_gid ); - ( void )rv; + ( void ) rv; dropRoot(); // btrfs.subvolume.create( ( BTRFS_DIR_PATH + "/vol1" ).c_str() ); @@ -262,19 +259,21 @@ class TestClientSnapshotsFixture : public TestOutputHelperFixture, public Fixtur // ), dir, // dir, chainParams, WithExisting::Kill, {"eth"}, testingMode ) ); std::shared_ptr< SnapshotManager > mgr; - mgr.reset( new SnapshotManager( chainParams, m_tmpDir.path(), { BlockChain::getChainDirName( chainParams ), "vol2", "filestorage"} ) ); + mgr.reset( new SnapshotManager( chainParams, m_tmpDir.path(), + { BlockChain::getChainDirName( chainParams ), "vol2", "filestorage" } ) ); // boost::filesystem::create_directory( // m_tmpDir.path() / "vol1" / "12041" ); // boost::filesystem::create_directory( // m_tmpDir.path() / "vol1" / "12041" / "state" ); - // std::unique_ptr< dev::db::DatabaseFace > db_state( new dev::db::LevelDB( m_tmpDir.path() / "vol1" / "12041" / "state" ) ); - // boost::filesystem::create_directory( + // std::unique_ptr< dev::db::DatabaseFace > db_state( new dev::db::LevelDB( m_tmpDir.path() + // / "vol1" / "12041" / "state" ) ); boost::filesystem::create_directory( // m_tmpDir.path() / "vol1" / "blocks_and_extras" ); - // std::unique_ptr< dev::db::DatabaseFace > db_blocks_and_extras( new dev::db::LevelDB( m_tmpDir.path() / "vol1" / "12041" / "blocks_and_extras" ) ); + // std::unique_ptr< dev::db::DatabaseFace > db_blocks_and_extras( new dev::db::LevelDB( + // m_tmpDir.path() / "vol1" / "12041" / "blocks_and_extras" ) ); - auto monitor = make_shared< InstanceMonitor >("test"); + auto monitor = make_shared< InstanceMonitor >( "test" ); - setenv("DATA_DIR", m_tmpDir.path().c_str(), 1); + setenv( "DATA_DIR", m_tmpDir.path().c_str(), 1 ); m_ethereum.reset( new eth::ClientTest( chainParams, ( int ) chainParams.networkID, shared_ptr< GasPricer >(), mgr, monitor, m_tmpDir.path(), WithExisting::Kill ) ); @@ -286,9 +285,7 @@ class TestClientSnapshotsFixture : public TestOutputHelperFixture, public Fixtur // wait for 1st block - because it's always empty std::promise< void > block_promise; auto importHandler = m_ethereum->setOnBlockImport( - [&block_promise]( BlockHeader const& ) { - block_promise.set_value(); - } ); + [&block_promise]( BlockHeader const& ) { block_promise.set_value(); } ); m_ethereum->injectSkaleHost(); m_ethereum->startWorking(); @@ -311,7 +308,7 @@ class TestClientSnapshotsFixture : public TestOutputHelperFixture, public Fixtur fs::path getTmpDataDir() { return m_tmpDir.path(); } ~TestClientSnapshotsFixture() { - m_ethereum.reset(0); + m_ethereum.reset( 0 ); const char* NC = getenv( "NC" ); if ( NC ) return; @@ -325,7 +322,7 @@ class TestClientSnapshotsFixture : public TestOutputHelperFixture, public Fixtur private: std::unique_ptr< dev::eth::Client > m_ethereum; TransientDirectory m_tmpDir; - dev::KeyPair coinbase{KeyPair::create()}; + dev::KeyPair coinbase{ KeyPair::create() }; }; // genesis config string from solidity @@ -408,7 +405,8 @@ static std::string const c_genesisInfoSkaleTest = std::string() + "nodeName": "Node1", "nodeID": 1112, "bindIP": "127.0.0.1", - "basePort": )E"+std::to_string( rand_port ) + R"E(, + "basePort": )E" + std::to_string( rand_port ) + + R"E(, "logLevel": "trace", "logLevelProposal": "trace", "testSignatures": true @@ -420,7 +418,9 @@ static std::string const c_genesisInfoSkaleTest = std::string() + "emptyBlockIntervalMs": -1, "correctForkInPowPatchTimestamp": 1, "nodes": [ - { "nodeID": 1112, "ip": "127.0.0.1", "basePort": )E"+std::to_string( rand_port ) + R"E(, "schainIndex" : 1, "publicKey": "0xfa"} + { "nodeID": 1112, "ip": "127.0.0.1", "basePort": )E" + + std::to_string( rand_port ) + + R"E(, "schainIndex" : 1, "publicKey": "0xfa"} ] } }, @@ -454,15 +454,13 @@ BOOST_AUTO_TEST_CASE( transactionWithData ) { Address addr( "0xca4409573a5129a72edf85d6c51e26760fc9c903" ); - bytes data = - jsToBytes( "0x11223344556600770000" ); + bytes data = jsToBytes( "0x11223344556600770000" ); - u256 estimate = testClient - ->estimateGas( addr, 0, addr, data, 10000000, 1000000, - GasEstimationCallback() ) - .first; + u256 estimate = + testClient->estimateGas( addr, 0, addr, data, 10000000, 1000000, GasEstimationCallback() ) + .first; - BOOST_CHECK_EQUAL( estimate, u256( 21000+7*16+3*4 ) ); + BOOST_CHECK_EQUAL( estimate, u256( 21000 + 7 * 16 + 3 * 4 ) ); } BOOST_AUTO_TEST_CASE( constantConsumption ) { @@ -643,24 +641,25 @@ BOOST_AUTO_TEST_CASE( consumptionWithRefunds ) { // data to call method setA(0) bytes data = - jsToBytes( "0xee919d500000000000000000000000000000000000000000000000000000000000000000" ); + jsToBytes( "0xee919d500000000000000000000000000000000000000000000000000000000000000000" ); int64_t maxGas = 100000; u256 estimate = testClient - ->estimateGas( from, 0, contractAddress, data, maxGas, 1000000, - GasEstimationCallback() ) - .first; + ->estimateGas( from, 0, contractAddress, data, maxGas, 1000000, + GasEstimationCallback() ) + .first; Json::Value estimateTransaction; - estimateTransaction["from"] = toJS(from ); - estimateTransaction["to"] = toJS (contractAddress); - estimateTransaction["data"] = toJS (data); + estimateTransaction["from"] = toJS( from ); + estimateTransaction["to"] = toJS( contractAddress ); + estimateTransaction["data"] = toJS( data ); - estimateTransaction["gas"] = toJS(estimate - 1); - BOOST_CHECK( !fixture.getTransactionStatus(estimateTransaction) ); + estimateTransaction["gas"] = toJS( estimate - 1 ); + BOOST_CHECK( !fixture.getTransactionStatus( estimateTransaction ) ); + fixture.ethereum()->state().getOriginalDb()->createBlockSnap( 2 ); - estimateTransaction["gas"] = toJS(estimate); - BOOST_CHECK( fixture.getTransactionStatus(estimateTransaction) ); + estimateTransaction["gas"] = toJS( estimate ); + BOOST_CHECK( fixture.getTransactionStatus( estimateTransaction ) ); } BOOST_AUTO_TEST_CASE( consumptionWithRefunds2 ) { @@ -691,29 +690,34 @@ BOOST_AUTO_TEST_CASE( consumptionWithRefunds2 ) { // } Address from = fixture.coinbase.address(); + + u256 balance = testClient->balanceAt( from ); + BOOST_CHECK( balance > 0 ); + Address contractAddress( "0xD40b89C063a23eb85d739f6fA9B14341838eeB2b" ); // setA(3) already "called" (see "storage" in c_genesisInfoSkaleTest) // data to call getA(3) bytes data = - jsToBytes( "0xd82cf7900000000000000000000000000000000000000000000000000000000000000003" ); + jsToBytes( "0xd82cf7900000000000000000000000000000000000000000000000000000000000000003" ); int64_t maxGas = 100000; u256 estimate = testClient - ->estimateGas( from, 0, contractAddress, data, maxGas, 1000000, - GasEstimationCallback() ) - .first; + ->estimateGas( from, 0, contractAddress, data, maxGas, 1000000, + GasEstimationCallback() ) + .first; Json::Value estimateTransaction; - estimateTransaction["from"] = toJS(from); - estimateTransaction["to"] = toJS(contractAddress); - estimateTransaction["data"] = toJS (data); + estimateTransaction["from"] = toJS( from ); + estimateTransaction["to"] = toJS( contractAddress ); + estimateTransaction["data"] = toJS( data ); - estimateTransaction["gas"] = toJS(estimate - 1); - BOOST_CHECK( !fixture.getTransactionStatus(estimateTransaction) ); + estimateTransaction["gas"] = toJS( estimate - 1 ); + BOOST_CHECK( !fixture.getTransactionStatus( estimateTransaction ) ); + fixture.ethereum()->state().getOriginalDb()->createBlockSnap( 2 ); - estimateTransaction["gas"] = toJS(estimate); - BOOST_CHECK( fixture.getTransactionStatus(estimateTransaction) ); + estimateTransaction["gas"] = toJS( estimate ); + BOOST_CHECK( fixture.getTransactionStatus( estimateTransaction ) ); } BOOST_AUTO_TEST_CASE( nonLinearConsumption ) { @@ -741,29 +745,29 @@ BOOST_AUTO_TEST_CASE( nonLinearConsumption ) { // data to call method test(100000) bytes data = - jsToBytes( "0xd37165fa00000000000000000000000000000000000000000000000000000000000186a0" ); + jsToBytes( "0xd37165fa00000000000000000000000000000000000000000000000000000000000186a0" ); int64_t maxGas = 100000; u256 estimate = testClient - ->estimateGas( from, 0, contractAddress, data, maxGas, 1000000, - GasEstimationCallback() ) - .first; + ->estimateGas( from, 0, contractAddress, data, maxGas, 1000000, + GasEstimationCallback() ) + .first; BOOST_CHECK( estimate < u256( maxGas ) ); maxGas = 50000; estimate = testClient - ->estimateGas( from, 0, contractAddress, data, maxGas, 1000000, - GasEstimationCallback() ) - .first; + ->estimateGas( + from, 0, contractAddress, data, maxGas, 1000000, GasEstimationCallback() ) + .first; BOOST_CHECK_EQUAL( estimate, u256( maxGas ) ); maxGas = 200000; estimate = testClient - ->estimateGas( from, 0, contractAddress, data, maxGas, 1000000, - GasEstimationCallback() ) - .first; + ->estimateGas( + from, 0, contractAddress, data, maxGas, 1000000, GasEstimationCallback() ) + .first; BOOST_CHECK_EQUAL( estimate, u256( maxGas ) ); } @@ -811,31 +815,33 @@ BOOST_AUTO_TEST_CASE( consumptionWithReverts ) { // data to call method testRequire(50000) bytes data = - jsToBytes( "0xb8bd717f000000000000000000000000000000000000000000000000000000000000c350" ); + jsToBytes( "0xb8bd717f000000000000000000000000000000000000000000000000000000000000c350" ); u256 estimate = testClient - ->estimateGas( from, 0, contractAddress, data, maxGas, 1000000, - GasEstimationCallback() ) - .first; + ->estimateGas( from, 0, contractAddress, data, maxGas, 1000000, + GasEstimationCallback() ) + .first; BOOST_CHECK_EQUAL( estimate, u256( maxGas ) ); // data to call method testRevert(50000) - data = jsToBytes( "0x20987767000000000000000000000000000000000000000000000000000000000000c350" ); + data = + jsToBytes( "0x20987767000000000000000000000000000000000000000000000000000000000000c350" ); estimate = testClient - ->estimateGas( from, 0, contractAddress, data, maxGas, 1000000, - GasEstimationCallback() ) - .first; + ->estimateGas( + from, 0, contractAddress, data, maxGas, 1000000, GasEstimationCallback() ) + .first; BOOST_CHECK_EQUAL( estimate, u256( maxGas ) ); // data to call method testRequireOff(50000) - data = jsToBytes( "0xfdde8d66000000000000000000000000000000000000000000000000000000000000c350" ); + data = + jsToBytes( "0xfdde8d66000000000000000000000000000000000000000000000000000000000000c350" ); estimate = testClient - ->estimateGas( from, 0, contractAddress, data, maxGas, 1000000, - GasEstimationCallback() ) - .first; + ->estimateGas( + from, 0, contractAddress, data, maxGas, 1000000, GasEstimationCallback() ) + .first; BOOST_CHECK_EQUAL( estimate, u256( 121632 ) ); } @@ -844,8 +850,9 @@ BOOST_AUTO_TEST_SUITE_END() BOOST_AUTO_TEST_SUITE( getHistoricNodesData ) -static std::string const c_genesisInfoSkaleIMABLSPublicKeyTest = std::string() + - R"E( +static std::string const c_genesisInfoSkaleIMABLSPublicKeyTest = + std::string() + + R"E( { "sealEngine": "Ethash", "params": { @@ -884,7 +891,8 @@ static std::string const c_genesisInfoSkaleIMABLSPublicKeyTest = std::string() + "nodeName": "Node1", "nodeID": 1112, "bindIP": "127.0.0.1", - "basePort": )E"+std::to_string( rand_port ) + R"E(, + "basePort": )E" + + std::to_string( rand_port ) + R"E(, "logLevel": "trace", "logLevelProposal": "trace", "testSignatures": true @@ -929,7 +937,8 @@ static std::string const c_genesisInfoSkaleIMABLSPublicKeyTest = std::string() + } }, "nodes": [ - { "nodeID": 1112, "ip": "127.0.0.1", "basePort": )E"+std::to_string( rand_port ) + R"E(, "schainIndex" : 1, "publicKey": "0xfa"} + { "nodeID": 1112, "ip": "127.0.0.1", "basePort": )E" + + std::to_string( rand_port ) + R"E(, "schainIndex" : 1, "publicKey": "0xfa"} ] } }, @@ -950,28 +959,41 @@ BOOST_AUTO_TEST_CASE( initAndUpdateHistoricConfigFields ) { TestClientFixture fixture( c_genesisInfoSkaleIMABLSPublicKeyTest ); ClientTest* testClient = asClientTest( fixture.ethereum() ); - std::array< std::string, 4 > imaBLSPublicKeyOnStartUp = { "12457351342169393659284905310882617316356538373005664536506840512800919345414", "11573096151310346982175966190385407867176668720531590318594794283907348596326", "13929944172721019694880576097738949215943314024940461401664534665129747139387", "7375214420811287025501422512322868338311819657776589198925786170409964211914" }; + std::array< std::string, 4 > imaBLSPublicKeyOnStartUp = { + "12457351342169393659284905310882617316356538373005664536506840512800919345414", + "11573096151310346982175966190385407867176668720531590318594794283907348596326", + "13929944172721019694880576097738949215943314024940461401664534665129747139387", + "7375214420811287025501422512322868338311819657776589198925786170409964211914" + }; BOOST_REQUIRE( testClient->getIMABLSPublicKey() == imaBLSPublicKeyOnStartUp ); - BOOST_REQUIRE( testClient->getHistoricNodePublicKey( 0 ) == "0x3a581d62b12232dade30c3710215a271984841657449d1f474295a13737b778266f57e298f123ae80cbab7cc35ead1b62a387556f94b326d5c65d4a7aa2abcba" ); + BOOST_REQUIRE( testClient->getHistoricNodePublicKey( 0 ) == + "0x3a581d62b12232dade30c3710215a271984841657449d1f474295a13737b778266f57e298f123" + "ae80cbab7cc35ead1b62a387556f94b326d5c65d4a7aa2abcba" ); BOOST_REQUIRE( testClient->getHistoricNodeId( 0 ) == "26" ); BOOST_REQUIRE( testClient->getHistoricNodeIndex( 0 ) == "3" ); - BOOST_REQUIRE( testClient->mineBlocks( 1 ) ); - testClient->importTransactionsAsBlock( Transactions(), 1000, 4294967294 ); - std::array< std::string, 4 > imaBLSPublicKeyAfterBlock = { "10860211539819517237363395256510340030868592687836950245163587507107792195621", "2419969454136313127863904023626922181546178935031521540751337209075607503568", "3399776985251727272800732947224655319335094876742988846345707000254666193993", "16982202412630419037827505223148517434545454619191931299977913428346639096984" }; + std::array< std::string, 4 > imaBLSPublicKeyAfterBlock = { + "10860211539819517237363395256510340030868592687836950245163587507107792195621", + "2419969454136313127863904023626922181546178935031521540751337209075607503568", + "3399776985251727272800732947224655319335094876742988846345707000254666193993", + "16982202412630419037827505223148517434545454619191931299977913428346639096984" + }; BOOST_REQUIRE( testClient->getIMABLSPublicKey() == imaBLSPublicKeyAfterBlock ); - BOOST_REQUIRE( testClient->getHistoricNodePublicKey( 0 ) == "0x6180cde2cbbcc6b6a17efec4503a7d4316f8612f411ee171587089f770335f484003ad236c534b9afa82befc1f69533723abdb6ec2601e582b72dcfd7919338b" ); + BOOST_REQUIRE( testClient->getHistoricNodePublicKey( 0 ) == + "0x6180cde2cbbcc6b6a17efec4503a7d4316f8612f411ee171587089f770335f484003ad236c534" + "b9afa82befc1f69533723abdb6ec2601e582b72dcfd7919338b" ); BOOST_REQUIRE( testClient->getHistoricNodeId( 0 ) == "30" ); BOOST_REQUIRE( testClient->getHistoricNodeIndex( 0 ) == "0" ); } BOOST_AUTO_TEST_SUITE_END() -static std::string const c_skaleConfigString = R"E( +static std::string const c_skaleConfigString = + R"E( { "sealEngine": "NoProof", "params": { @@ -1001,7 +1023,8 @@ static std::string const c_skaleConfigString = R"E( "nodeName": "TestNode", "nodeID": 1112, "bindIP": "127.0.0.1", - "basePort": )E"+std::to_string( rand_port ) + R"E(, + "basePort": )E" + + std::to_string( rand_port ) + R"E(, "testSignatures": true }, "sChain": { @@ -1010,7 +1033,9 @@ static std::string const c_skaleConfigString = R"E( "snapshotIntervalSec": 10, "emptyBlockIntervalMs": -1, "nodes": [ - { "nodeID": 1112, "ip": "127.0.0.1", "basePort": )E"+std::to_string( rand_port ) + R"E(, "ip6": "::1", "basePort6": 1231, "schainIndex" : 1, "publicKey" : "0xfa"} + { "nodeID": 1112, "ip": "127.0.0.1", "basePort": )E" + + std::to_string( rand_port ) + + R"E(, "ip6": "::1", "basePort6": 1231, "schainIndex" : 1, "publicKey" : "0xfa"} ] } }, @@ -1030,7 +1055,8 @@ static std::string const c_skaleConfigString = R"E( BOOST_AUTO_TEST_SUITE( ClientSnapshotsSuite, *boost::unit_test::precondition( option_all_tests ) ) -BOOST_AUTO_TEST_CASE( ClientSnapshotsTest, *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( + ClientSnapshotsTest, *boost::unit_test::precondition( dev::test::run_not_express ) ) { TestClientSnapshotsFixture fixture( c_skaleConfigString ); ClientTest* testClient = asClientTest( fixture.ethereum() ); @@ -1056,7 +1082,8 @@ BOOST_AUTO_TEST_CASE( ClientSnapshotsTest, *boost::unit_test::precondition( dev: BOOST_REQUIRE( testClient->latestBlock().info().stateRoot() == empty_state_root_hash ); std::this_thread::sleep_for( 6000ms ); - BOOST_REQUIRE( fs::exists( fs::path( fixture.getTmpDataDir() ) / "snapshots" / "3" / "snapshot_hash.txt" ) ); + BOOST_REQUIRE( fs::exists( + fs::path( fixture.getTmpDataDir() ) / "snapshots" / "3" / "snapshot_hash.txt" ) ); dev::h256 hash = testClient->hashFromNumber( 3 ); uint64_t timestampFromBlockchain = testClient->blockInfo( hash ).timestamp(); diff --git a/test/unittests/libethereum/ExtVMTest.cpp b/test/unittests/libethereum/ExtVMTest.cpp index 548d30033..9ee4cab4c 100644 --- a/test/unittests/libethereum/ExtVMTest.cpp +++ b/test/unittests/libethereum/ExtVMTest.cpp @@ -27,8 +27,7 @@ using namespace dev; using namespace dev::eth; using namespace dev::test; -using skale:: -State; +using skale::State; class ExtVMConstantinopleFixTestFixture : public TestOutputHelperFixture { public: @@ -49,7 +48,7 @@ class ExtVMConstantinopleFixTestFixture : public TestOutputHelperFixture { } EnvInfo createEnvInfo( BlockHeader const& _header ) const { - return {_header, lastBlockHashes, 1, 0, blockchain.chainID()}; + return { _header, lastBlockHashes, 1, 0, blockchain.chainID() }; } NetworkSelector networkSelector; @@ -59,7 +58,7 @@ class ExtVMConstantinopleFixTestFixture : public TestOutputHelperFixture { BlockChain const& blockchain; h256 preExperimentalBlockHash; h256 experimentalBlockHash; - TestLastBlockHashes lastBlockHashes{{}}; + TestLastBlockHashes lastBlockHashes{ {} }; }; BOOST_FIXTURE_TEST_SUITE( ExtVmSuite, ExtVMConstantinopleFixTestFixture ) @@ -72,8 +71,8 @@ BOOST_AUTO_TEST_CASE( BlockhashOutOfBoundsRetunsZero, TestLastBlockHashes lastBlockHashes( {} ); EnvInfo envInfo( createEnvInfo( block.info() ) ); Address addr( "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b" ); - ExtVM extVM( block.mutableState(), envInfo, blockchain.sealEngine()->chainParams(), addr, addr, addr, 0, 0, - {}, {}, {}, 0, 0, false, false ); + ExtVM extVM( block.mutableState(), envInfo, blockchain.sealEngine()->chainParams(), addr, addr, + addr, 0, 0, {}, {}, {}, 0, 0, false, false ); BOOST_CHECK_EQUAL( extVM.blockHash( 100 ), h256() ); } @@ -83,12 +82,13 @@ BOOST_AUTO_TEST_CASE( BlockhashBeforeConstantinopleReliesOnLastHashes, Block block = blockchain.genesisBlock( genesisState ); block.sync( blockchain ); - h256s lastHashes{h256( "0xaaabbbccc" ), h256( "0xdddeeefff" )}; + h256s lastHashes{ h256( "0xaaabbbccc" ), h256( "0xdddeeefff" ) }; TestLastBlockHashes lastBlockHashes( lastHashes ); - EnvInfo envInfo( block.info(), lastBlockHashes, block.info().timestamp(), 0, blockchain.chainID() ); + EnvInfo envInfo( + block.info(), lastBlockHashes, block.info().timestamp(), 0, blockchain.chainID() ); Address addr( "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b" ); - ExtVM extVM( block.mutableState(), envInfo, blockchain.sealEngine()->chainParams(), addr, addr, addr, 0, 0, - {}, {}, {}, 0, 0, false, false ); + ExtVM extVM( block.mutableState(), envInfo, blockchain.sealEngine()->chainParams(), addr, addr, + addr, 0, 0, {}, {}, {}, 0, 0, false, false ); h256 hash = extVM.blockHash( 1 ); BOOST_REQUIRE_EQUAL( hash, lastHashes[0] ); } diff --git a/test/unittests/libethereum/GasPricer.cpp b/test/unittests/libethereum/GasPricer.cpp index 70bae8380..d97b78668 100644 --- a/test/unittests/libethereum/GasPricer.cpp +++ b/test/unittests/libethereum/GasPricer.cpp @@ -54,7 +54,8 @@ void executeGasPricerTest( string const& name, double _etherPrice, double _block "ASK Got: " + toString( gp.ask( Block( Block::Null ) ) ) + " Expected: " + toString( _expectedAsk ) ); BOOST_CHECK_MESSAGE( abs( gp.bid( dev::eth::LatestBlock, _txPrio ) - _expectedBid ) < 100000000, - "BID Got: " + toString( gp.bid( dev::eth::LatestBlock, _txPrio ) ) + " Expected: " + toString( _expectedBid ) ); + "BID Got: " + toString( gp.bid( dev::eth::LatestBlock, _txPrio ) ) + + " Expected: " + toString( _expectedBid ) ); } } // namespace test } // namespace dev @@ -66,13 +67,14 @@ BOOST_AUTO_TEST_CASE( trivialGasPricer ) { BOOST_CHECK_EQUAL( gp->ask( Block( Block::Null ) ), DefaultGasPrice ); BOOST_CHECK_EQUAL( gp->bid(), DefaultGasPrice ); - gp->update( BlockChain( eth::ChainParams(), TransientDirectory().path(), false, WithExisting::Kill ) ); + gp->update( + BlockChain( eth::ChainParams(), TransientDirectory().path(), false, WithExisting::Kill ) ); BOOST_CHECK_EQUAL( gp->ask( Block( Block::Null ) ), DefaultGasPrice ); BOOST_CHECK_EQUAL( gp->bid(), DefaultGasPrice ); } -BOOST_AUTO_TEST_CASE( basicGasPricerNoUpdate, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( + basicGasPricerNoUpdate, *boost::unit_test::precondition( dev::test::run_not_express ) ) { BasicGasPricer gp( u256( double( ether / 1000 ) / 30.679 ), u256( 15.0 * 1000 ) ); BOOST_CHECK_EQUAL( gp.ask( Block( Block::Null ) ), 103754996057 ); BOOST_CHECK_EQUAL( gp.bid(), 103754996057 ); diff --git a/test/unittests/libethereum/Genesis.cpp b/test/unittests/libethereum/Genesis.cpp index 33c6cafd4..2a12d03e6 100644 --- a/test/unittests/libethereum/Genesis.cpp +++ b/test/unittests/libethereum/Genesis.cpp @@ -43,8 +43,8 @@ namespace js = json_spirit; BOOST_FIXTURE_TEST_SUITE( BasicTests, TestOutputHelperFixture ) -BOOST_AUTO_TEST_CASE( emptySHA3Types, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( + emptySHA3Types, *boost::unit_test::precondition( dev::test::run_not_express ) ) { h256 emptyListSHA3( fromHex( "1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" ) ); BOOST_REQUIRE_EQUAL( emptyListSHA3, EmptyListSHA3 ); diff --git a/test/unittests/libethereum/InstanceMonitorTest.cpp b/test/unittests/libethereum/InstanceMonitorTest.cpp index 137b70555..e10bea059 100644 --- a/test/unittests/libethereum/InstanceMonitorTest.cpp +++ b/test/unittests/libethereum/InstanceMonitorTest.cpp @@ -13,25 +13,19 @@ using namespace dev::test; namespace fs = boost::filesystem; -class InstanceMonitorMock: public InstanceMonitor { +class InstanceMonitorMock : public InstanceMonitor { public: - explicit InstanceMonitorMock(fs::path const &rotationFlagFilePath, std::shared_ptr statusAndControl) : InstanceMonitor(rotationFlagFilePath, statusAndControl) {}; + explicit InstanceMonitorMock( + fs::path const& rotationFlagFilePath, std::shared_ptr< StatusAndControl > statusAndControl ) + : InstanceMonitor( rotationFlagFilePath, statusAndControl ){}; - fs::path getRotationInfoFilePath() { - return this->rotationInfoFilePath(); - } + fs::path getRotationInfoFilePath() { return this->rotationInfoFilePath(); } - void createFlagFileTest(){ - this->reportExitTimeReached( true ); - } + void createFlagFileTest() { this->reportExitTimeReached( true ); } - void removeFlagFileTest(){ - this->reportExitTimeReached( false ); - } + void removeFlagFileTest() { this->reportExitTimeReached( false ); } - uint64_t getRotationTimestamp() const { - return this->rotationTimestamp(); - } + uint64_t getRotationTimestamp() const { return this->rotationTimestamp(); } }; class InstanceMonitorTestFixture : public TestOutputHelperFixture { @@ -39,27 +33,27 @@ class InstanceMonitorTestFixture : public TestOutputHelperFixture { fs::path rotationFlagDirPath = "test"; InstanceMonitorTestFixture() { - fs::create_directory(rotationFlagDirPath); + fs::create_directory( rotationFlagDirPath ); - statusAndControlFile = std::make_shared(rotationFlagDirPath); - instanceMonitor = new InstanceMonitorMock(rotationFlagDirPath, statusAndControlFile); + statusAndControlFile = std::make_shared< StatusAndControlFile >( rotationFlagDirPath ); + instanceMonitor = new InstanceMonitorMock( rotationFlagDirPath, statusAndControlFile ); rotationFilePath = instanceMonitor->getRotationInfoFilePath(); } InstanceMonitorMock* instanceMonitor; - std::shared_ptr statusAndControlFile; + std::shared_ptr< StatusAndControl > statusAndControlFile; fs::path rotationFilePath; ~InstanceMonitorTestFixture() override { - if (fs::exists(rotationFilePath)) { - fs::remove(rotationFilePath); + if ( fs::exists( rotationFilePath ) ) { + fs::remove( rotationFilePath ); } - if (fs::exists(rotationFlagDirPath/"skaled.status")) { - fs::remove(rotationFlagDirPath/"skaled.status"); + if ( fs::exists( rotationFlagDirPath / "skaled.status" ) ) { + fs::remove( rotationFlagDirPath / "skaled.status" ); } - if (fs::exists(rotationFlagDirPath)) { - fs::remove(rotationFlagDirPath); + if ( fs::exists( rotationFlagDirPath ) ) { + fs::remove( rotationFlagDirPath ); } }; }; @@ -68,22 +62,22 @@ BOOST_FIXTURE_TEST_SUITE( InstanceMonitorSuite, InstanceMonitorTestFixture ) BOOST_AUTO_TEST_CASE( test_initRotationParams ) { uint64_t ts = 100; - BOOST_REQUIRE( !fs::exists(instanceMonitor->getRotationInfoFilePath() ) ); - instanceMonitor->initRotationParams(ts); - BOOST_CHECK_EQUAL(instanceMonitor->getRotationTimestamp(), ts); + BOOST_REQUIRE( !fs::exists( instanceMonitor->getRotationInfoFilePath() ) ); + instanceMonitor->initRotationParams( ts ); + BOOST_CHECK_EQUAL( instanceMonitor->getRotationTimestamp(), ts ); - BOOST_REQUIRE( fs::exists(instanceMonitor->getRotationInfoFilePath() ) ); + BOOST_REQUIRE( fs::exists( instanceMonitor->getRotationInfoFilePath() ) ); - std::ifstream rotateFile(instanceMonitor->getRotationInfoFilePath().string() ); + std::ifstream rotateFile( instanceMonitor->getRotationInfoFilePath().string() ); auto rotateJson = nlohmann::json::parse( rotateFile ); - BOOST_CHECK_EQUAL(rotateJson["timestamp"].get< uint64_t >(), ts); + BOOST_CHECK_EQUAL( rotateJson["timestamp"].get< uint64_t >(), ts ); } BOOST_AUTO_TEST_CASE( test_isTimeToRotate_invalid_file ) { uint64_t currentTime = 100; - std::ofstream rotationInfoFile(instanceMonitor->getRotationInfoFilePath().string() ); + std::ofstream rotationInfoFile( instanceMonitor->getRotationInfoFilePath().string() ); rotationInfoFile << "Broken file"; BOOST_REQUIRE( !instanceMonitor->isTimeToRotate( currentTime ) ); } @@ -93,7 +87,7 @@ BOOST_AUTO_TEST_CASE( test_isTimeToRotate_false ) { uint64_t currentTime = 100; uint64_t finishTime = 200; BOOST_REQUIRE( !instanceMonitor->isTimeToRotate( currentTime ) ); - instanceMonitor->initRotationParams(finishTime); + instanceMonitor->initRotationParams( finishTime ); BOOST_REQUIRE( !instanceMonitor->isTimeToRotate( currentTime ) ); } @@ -102,10 +96,10 @@ BOOST_AUTO_TEST_CASE( test_isTimeToRotate_true ) { BOOST_REQUIRE( !instanceMonitor->isTimeToRotate( currentTime ) ); - instanceMonitor->initRotationParams(100); + instanceMonitor->initRotationParams( 100 ); BOOST_REQUIRE( instanceMonitor->isTimeToRotate( currentTime ) ); - instanceMonitor->initRotationParams(50); + instanceMonitor->initRotationParams( 50 ); BOOST_REQUIRE( instanceMonitor->isTimeToRotate( currentTime ) ); currentTime = 49; @@ -113,20 +107,20 @@ BOOST_AUTO_TEST_CASE( test_isTimeToRotate_true ) { } BOOST_AUTO_TEST_CASE( test_rotation ) { - instanceMonitor->initRotationParams(0); - instanceMonitor->prepareRotation(); + instanceMonitor->initRotationParams( 0 ); + instanceMonitor->prepareRotation(); - BOOST_REQUIRE( statusAndControlFile->getExitState(StatusAndControl::ExitTimeReached) ); - BOOST_REQUIRE( !( fs::exists(instanceMonitor->getRotationInfoFilePath() ) ) ); + BOOST_REQUIRE( statusAndControlFile->getExitState( StatusAndControl::ExitTimeReached ) ); + BOOST_REQUIRE( !( fs::exists( instanceMonitor->getRotationInfoFilePath() ) ) ); } BOOST_AUTO_TEST_CASE( test_create_remove_flag_file ) { instanceMonitor->createFlagFileTest(); - BOOST_REQUIRE( statusAndControlFile->getExitState(StatusAndControl::ExitTimeReached) ); + BOOST_REQUIRE( statusAndControlFile->getExitState( StatusAndControl::ExitTimeReached ) ); instanceMonitor->removeFlagFileTest(); - BOOST_REQUIRE( !( fs::exists(instanceMonitor->getRotationInfoFilePath() ) ) ); - BOOST_REQUIRE( !statusAndControlFile->getExitState(StatusAndControl::ExitTimeReached) ); + BOOST_REQUIRE( !( fs::exists( instanceMonitor->getRotationInfoFilePath() ) ) ); + BOOST_REQUIRE( !statusAndControlFile->getExitState( StatusAndControl::ExitTimeReached ) ); } BOOST_AUTO_TEST_SUITE_END() diff --git a/test/unittests/libethereum/PrecompiledTest.cpp b/test/unittests/libethereum/PrecompiledTest.cpp index 3483a4699..5ea3f3c81 100644 --- a/test/unittests/libethereum/PrecompiledTest.cpp +++ b/test/unittests/libethereum/PrecompiledTest.cpp @@ -23,16 +23,16 @@ #include #include #include -#include #include #include #include +#include +#include #include #include +#include #include #include -#include -#include #include @@ -59,8 +59,8 @@ std::string stringToHex( std::string inputString ) { BOOST_FIXTURE_TEST_SUITE( PrecompiledTests, TestOutputHelperFixture ) -BOOST_AUTO_TEST_CASE( modexpFermatTheorem, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( + modexpFermatTheorem, *boost::unit_test::precondition( dev::test::run_not_express ) ) { PrecompiledExecutor exec = PrecompiledRegistrar::executor( "modexp" ); bytes in = fromHex( @@ -78,8 +78,8 @@ BOOST_AUTO_TEST_CASE( modexpFermatTheorem, res.second.begin(), res.second.end(), expected.begin(), expected.end() ); } -BOOST_AUTO_TEST_CASE( modexpZeroBase, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( + modexpZeroBase, *boost::unit_test::precondition( dev::test::run_not_express ) ) { PrecompiledExecutor exec = PrecompiledRegistrar::executor( "modexp" ); bytes in = fromHex( @@ -96,8 +96,8 @@ BOOST_AUTO_TEST_CASE( modexpZeroBase, res.second.begin(), res.second.end(), expected.begin(), expected.end() ); } -BOOST_AUTO_TEST_CASE( modexpExtraByteIgnored, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( + modexpExtraByteIgnored, *boost::unit_test::precondition( dev::test::run_not_express ) ) { PrecompiledExecutor exec = PrecompiledRegistrar::executor( "modexp" ); bytes in = fromHex( @@ -116,8 +116,8 @@ BOOST_AUTO_TEST_CASE( modexpExtraByteIgnored, res.second.begin(), res.second.end(), expected.begin(), expected.end() ); } -BOOST_AUTO_TEST_CASE( modexpRightPadding, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( + modexpRightPadding, *boost::unit_test::precondition( dev::test::run_not_express ) ) { PrecompiledExecutor exec = PrecompiledRegistrar::executor( "modexp" ); bytes in = fromHex( @@ -151,8 +151,8 @@ BOOST_AUTO_TEST_CASE( modexpMissingValues ) { res.second.begin(), res.second.end(), expected.begin(), expected.end() ); } -BOOST_AUTO_TEST_CASE( modexpEmptyValue, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( + modexpEmptyValue, *boost::unit_test::precondition( dev::test::run_not_express ) ) { PrecompiledExecutor exec = PrecompiledRegistrar::executor( "modexp" ); bytes in = fromHex( @@ -169,8 +169,8 @@ BOOST_AUTO_TEST_CASE( modexpEmptyValue, res.second.begin(), res.second.end(), expected.begin(), expected.end() ); } -BOOST_AUTO_TEST_CASE( modexpZeroPowerZero, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( + modexpZeroPowerZero, *boost::unit_test::precondition( dev::test::run_not_express ) ) { PrecompiledExecutor exec = PrecompiledRegistrar::executor( "modexp" ); bytes in = fromHex( @@ -188,8 +188,8 @@ BOOST_AUTO_TEST_CASE( modexpZeroPowerZero, res.second.begin(), res.second.end(), expected.begin(), expected.end() ); } -BOOST_AUTO_TEST_CASE( modexpZeroPowerZeroModZero, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( + modexpZeroPowerZeroModZero, *boost::unit_test::precondition( dev::test::run_not_express ) ) { PrecompiledExecutor exec = PrecompiledRegistrar::executor( "modexp" ); bytes in = fromHex( @@ -207,8 +207,8 @@ BOOST_AUTO_TEST_CASE( modexpZeroPowerZeroModZero, res.second.begin(), res.second.end(), expected.begin(), expected.end() ); } -BOOST_AUTO_TEST_CASE( modexpModLengthZero, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( + modexpModLengthZero, *boost::unit_test::precondition( dev::test::run_not_express ) ) { PrecompiledExecutor exec = PrecompiledRegistrar::executor( "modexp" ); bytes in = fromHex( @@ -223,8 +223,8 @@ BOOST_AUTO_TEST_CASE( modexpModLengthZero, BOOST_REQUIRE( res.second.empty() ); } -BOOST_AUTO_TEST_CASE( modexpCostFermatTheorem, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( + modexpCostFermatTheorem, *boost::unit_test::precondition( dev::test::run_not_express ) ) { PrecompiledPricer cost = PrecompiledRegistrar::pricer( "modexp" ); bytes in = fromHex( @@ -239,8 +239,8 @@ BOOST_AUTO_TEST_CASE( modexpCostFermatTheorem, BOOST_REQUIRE_EQUAL( static_cast< int >( res ), 13056 ); } -BOOST_AUTO_TEST_CASE( modexpCostTooLarge, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( + modexpCostTooLarge, *boost::unit_test::precondition( dev::test::run_not_express ) ) { PrecompiledPricer cost = PrecompiledRegistrar::pricer( "modexp" ); bytes in = fromHex( @@ -251,15 +251,13 @@ BOOST_AUTO_TEST_CASE( modexpCostTooLarge, "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd" ); auto res = cost( ref( in ), {}, {} ); - BOOST_REQUIRE_MESSAGE( - res == - bigint{ - "47428439751604713645494675459558567056699385719046375030561826409641217900517324"}, + BOOST_REQUIRE_MESSAGE( res == bigint{ "47428439751604713645494675459558567056699385719046375030" + "561826409641217900517324" }, "Got: " + toString( res ) ); } -BOOST_AUTO_TEST_CASE( modexpCostEmptyExponent, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( + modexpCostEmptyExponent, *boost::unit_test::precondition( dev::test::run_not_express ) ) { PrecompiledPricer cost = PrecompiledRegistrar::pricer( "modexp" ); bytes in = fromHex( @@ -273,11 +271,11 @@ BOOST_AUTO_TEST_CASE( modexpCostEmptyExponent, ); auto res = cost( ref( in ), {}, {} ); - BOOST_REQUIRE_MESSAGE( res == bigint{"12"}, "Got: " + toString( res ) ); + BOOST_REQUIRE_MESSAGE( res == bigint{ "12" }, "Got: " + toString( res ) ); } -BOOST_AUTO_TEST_CASE( modexpCostZeroExponent, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( + modexpCostZeroExponent, *boost::unit_test::precondition( dev::test::run_not_express ) ) { PrecompiledPricer cost = PrecompiledRegistrar::pricer( "modexp" ); bytes in = fromHex( @@ -290,11 +288,11 @@ BOOST_AUTO_TEST_CASE( modexpCostZeroExponent, ); auto res = cost( ref( in ), {}, {} ); - BOOST_REQUIRE_MESSAGE( res == bigint{"5"}, "Got: " + toString( res ) ); + BOOST_REQUIRE_MESSAGE( res == bigint{ "5" }, "Got: " + toString( res ) ); } -BOOST_AUTO_TEST_CASE( modexpCostApproximated, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( + modexpCostApproximated, *boost::unit_test::precondition( dev::test::run_not_express ) ) { PrecompiledPricer cost = PrecompiledRegistrar::pricer( "modexp" ); bytes in = fromHex( @@ -307,11 +305,11 @@ BOOST_AUTO_TEST_CASE( modexpCostApproximated, ); auto res = cost( ref( in ), {}, {} ); - BOOST_REQUIRE_MESSAGE( res == bigint{"1315"}, "Got: " + toString( res ) ); + BOOST_REQUIRE_MESSAGE( res == bigint{ "1315" }, "Got: " + toString( res ) ); } BOOST_AUTO_TEST_CASE( modexpCostApproximatedPartialByte, - + *boost::unit_test::precondition( dev::test::run_not_express ) ) { PrecompiledPricer cost = PrecompiledRegistrar::pricer( "modexp" ); @@ -325,11 +323,11 @@ BOOST_AUTO_TEST_CASE( modexpCostApproximatedPartialByte, ); auto res = cost( ref( in ), {}, {} ); - BOOST_REQUIRE_MESSAGE( res == bigint{"1285"}, "Got: " + toString( res ) ); + BOOST_REQUIRE_MESSAGE( res == bigint{ "1285" }, "Got: " + toString( res ) ); } -BOOST_AUTO_TEST_CASE( modexpCostApproximatedGhost, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( + modexpCostApproximatedGhost, *boost::unit_test::precondition( dev::test::run_not_express ) ) { PrecompiledPricer cost = PrecompiledRegistrar::pricer( "modexp" ); bytes in = fromHex( @@ -342,11 +340,11 @@ BOOST_AUTO_TEST_CASE( modexpCostApproximatedGhost, ); auto res = cost( ref( in ), {}, {} ); - BOOST_REQUIRE_MESSAGE( res == bigint{"40"}, "Got: " + toString( res ) ); + BOOST_REQUIRE_MESSAGE( res == bigint{ "40" }, "Got: " + toString( res ) ); } -BOOST_AUTO_TEST_CASE( modexpCostMidRange, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( + modexpCostMidRange, *boost::unit_test::precondition( dev::test::run_not_express ) ) { PrecompiledPricer cost = PrecompiledRegistrar::pricer( "modexp" ); bytes in = fromHex( @@ -363,8 +361,8 @@ BOOST_AUTO_TEST_CASE( modexpCostMidRange, res == ( ( 74 * 74 / 4 + 96 * 74 - 3072 ) * 8 ) / 20, "Got: " + toString( res ) ); } -BOOST_AUTO_TEST_CASE( modexpCostHighRange, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( + modexpCostHighRange, *boost::unit_test::precondition( dev::test::run_not_express ) ) { PrecompiledPricer cost = PrecompiledRegistrar::pricer( "modexp" ); bytes in = fromHex( @@ -395,10 +393,13 @@ struct PrecompiledTest { }; constexpr PrecompiledTest ecrecoverTests[] = { - {"38d18acb67d25c8bb9942764b62f18e17054f66a817bd4295423adf9ed98873e00000000000000000000000000000" - "0000000000000000000000000000000001b38d18acb67d25c8bb9942764b62f18e17054f66a817bd4295423adf9ed" - "98873e789d1dd423d25f0772d2748d60f7e4b81bb14d086eba8e8e8efb6dcff8a4ae02", - "000000000000000000000000ceaccac640adf55b2028469bd36ba501f28b699d", ""}}; + { "38d18acb67d25c8bb9942764b62f18e17054f66a817bd4295423adf9ed98873e0000000000000000000000000000" + "0" + "0000000000000000000000000000000001b38d18acb67d25c8bb9942764b62f18e17054f66a817bd4295423adf9e" + "d" + "98873e789d1dd423d25f0772d2748d60f7e4b81bb14d086eba8e8e8efb6dcff8a4ae02", + "000000000000000000000000ceaccac640adf55b2028469bd36ba501f28b699d", "" } +}; constexpr PrecompiledTest modexpTests[] = { { @@ -905,15 +906,18 @@ constexpr PrecompiledTest modexpTests[] = { "4d11c9ebee1e1d3845099e55504446448027212616167eb36035726daa7698b075286f5379cd3e93cb3e0cf4f9" "cb8d017facbb5550ed32d5ec5400ae57e47e2bf78d1eaeff9480cc765ceff39db500", "nagydani-5-pow0x10001", - }}; + } +}; constexpr PrecompiledTest bn256AddTests[] = { - {"18b18acfb4c2c30276db5411368e7185b311dd124691610c5d3b74034e093dc9063c909c4720840cb5134cb9f59fa" - "749755796819658d32efc0d288198f3726607c2b7f58a84bd6145f00c9c2bc0bb1a187f20ff2c92963a88019e7c6a" - "014eed06614e20c147e940f2d70da3f74c9a17df361706a4485c742bd6788478fa17d7", + { "18b18acfb4c2c30276db5411368e7185b311dd124691610c5d3b74034e093dc9063c909c4720840cb5134cb9f59f" + "a" + "749755796819658d32efc0d288198f3726607c2b7f58a84bd6145f00c9c2bc0bb1a187f20ff2c92963a88019e7c6" + "a" + "014eed06614e20c147e940f2d70da3f74c9a17df361706a4485c742bd6788478fa17d7", "2243525c5efd4b9c3d3c45ac0ca3fe4dd85e830a4ce6b65fa1eeaee202839703301d1d33be6da8e509df21cc35" "964723180eed7532537db9ae5e7d48f195c915", - "chfast1"}, + "chfast1" }, { "2243525c5efd4b9c3d3c45ac0ca3fe4dd85e830a4ce6b65fa1eeaee202839703301d1d33be6da8e509df21cc35" "964723180eed7532537db9ae5e7d48f195c91518b18acfb4c2c30276db5411368e7185b311dd124691610c5d3b" @@ -1038,7 +1042,8 @@ constexpr PrecompiledTest bn256AddTests[] = { "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" "00000000000000000000000000000000000000", "cdetrio14", - }}; + } +}; constexpr PrecompiledTest bn256ScalarMulTests[] = { { @@ -1184,7 +1189,8 @@ constexpr PrecompiledTest bn256ScalarMulTests[] = { "039730ea8dff1254c0fee9c0ea777d29a9c710b7e616683f194f18c43b43b869073a5ffcc6fc7a28c30723d6e5" "8ce577356982d65b833a5a5c15bf9024b43d98", "cdetrio15", - }}; + } +}; // bn256PairingTests are the test and benchmark data for the bn256 pairing check // precompiled contract. @@ -1477,77 +1483,77 @@ void benchmarkPrecompiled( char const name[], vector_ref< const PrecompiledTest BOOST_AUTO_TEST_CASE( bench_ecrecover, *ut::label( "bench" ) * boost::unit_test::precondition( dev::test::run_not_express ) ) { - vector_ref< const PrecompiledTest > tests{ - ecrecoverTests, sizeof( ecrecoverTests ) / sizeof( ecrecoverTests[0] )}; + vector_ref< const PrecompiledTest > tests{ ecrecoverTests, + sizeof( ecrecoverTests ) / sizeof( ecrecoverTests[0] ) }; benchmarkPrecompiled( "ecrecover", tests, 100000 ); } BOOST_AUTO_TEST_CASE( bench_modexp, *ut::label( "bench" ) * boost::unit_test::precondition( dev::test::run_not_express ) ) { - vector_ref< const PrecompiledTest > tests{ - modexpTests, sizeof( modexpTests ) / sizeof( modexpTests[0] )}; + vector_ref< const PrecompiledTest > tests{ modexpTests, + sizeof( modexpTests ) / sizeof( modexpTests[0] ) }; benchmarkPrecompiled( "modexp", tests, 10000 ); } BOOST_AUTO_TEST_CASE( bench_bn256Add, *ut::label( "bench" ) * boost::unit_test::precondition( dev::test::run_not_express ) ) { - vector_ref< const PrecompiledTest > tests{ - bn256AddTests, sizeof( bn256AddTests ) / sizeof( bn256AddTests[0] )}; + vector_ref< const PrecompiledTest > tests{ bn256AddTests, + sizeof( bn256AddTests ) / sizeof( bn256AddTests[0] ) }; benchmarkPrecompiled( "alt_bn128_G1_add", tests, 1000000 ); } BOOST_AUTO_TEST_CASE( bench_bn256ScalarMul, *ut::label( "bench" ) * boost::unit_test::precondition( dev::test::run_not_express ) ) { - vector_ref< const PrecompiledTest > tests{ - bn256ScalarMulTests, sizeof( bn256ScalarMulTests ) / sizeof( bn256ScalarMulTests[0] )}; + vector_ref< const PrecompiledTest > tests{ bn256ScalarMulTests, + sizeof( bn256ScalarMulTests ) / sizeof( bn256ScalarMulTests[0] ) }; benchmarkPrecompiled( "alt_bn128_G1_mul", tests, 10000 ); } BOOST_AUTO_TEST_CASE( bench_bn256Pairing, *ut::label( "bench" ) * boost::unit_test::precondition( dev::test::run_not_express ) ) { - vector_ref< const PrecompiledTest > tests{ - bn256PairingTests, sizeof( bn256PairingTests ) / sizeof( bn256PairingTests[0] )}; + vector_ref< const PrecompiledTest > tests{ bn256PairingTests, + sizeof( bn256PairingTests ) / sizeof( bn256PairingTests[0] ) }; benchmarkPrecompiled( "alt_bn128_pairing_product", tests, 1000 ); } -BOOST_AUTO_TEST_CASE( ecaddCostBeforeIstanbul, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( + ecaddCostBeforeIstanbul, *boost::unit_test::precondition( dev::test::run_not_express ) ) { PrecompiledPricer cost = PrecompiledRegistrar::pricer( "alt_bn128_G1_add" ); - ChainParams chainParams{genesisInfo( eth::Network::IstanbulTransitionTest )}; + ChainParams chainParams{ genesisInfo( eth::Network::IstanbulTransitionTest ) }; auto res = cost( {}, chainParams, 1 ); BOOST_REQUIRE_EQUAL( static_cast< int >( res ), 500 ); } -BOOST_AUTO_TEST_CASE( ecaddCostIstanbul, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( + ecaddCostIstanbul, *boost::unit_test::precondition( dev::test::run_not_express ) ) { PrecompiledPricer cost = PrecompiledRegistrar::pricer( "alt_bn128_G1_add" ); - ChainParams chainParams{genesisInfo( eth::Network::IstanbulTransitionTest )}; + ChainParams chainParams{ genesisInfo( eth::Network::IstanbulTransitionTest ) }; auto res = cost( {}, chainParams, 2 ); BOOST_REQUIRE_EQUAL( static_cast< int >( res ), 150 ); } -BOOST_AUTO_TEST_CASE( ecmulBeforeIstanbul, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( + ecmulBeforeIstanbul, *boost::unit_test::precondition( dev::test::run_not_express ) ) { PrecompiledPricer cost = PrecompiledRegistrar::pricer( "alt_bn128_G1_mul" ); - ChainParams chainParams{genesisInfo( eth::Network::IstanbulTransitionTest )}; + ChainParams chainParams{ genesisInfo( eth::Network::IstanbulTransitionTest ) }; auto res = cost( {}, chainParams, 1 ); BOOST_REQUIRE_EQUAL( static_cast< int >( res ), 40000 ); } -BOOST_AUTO_TEST_CASE( ecmulCostIstanbul, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( + ecmulCostIstanbul, *boost::unit_test::precondition( dev::test::run_not_express ) ) { PrecompiledPricer cost = PrecompiledRegistrar::pricer( "alt_bn128_G1_mul" ); - ChainParams chainParams{genesisInfo( eth::Network::IstanbulTransitionTest )}; + ChainParams chainParams{ genesisInfo( eth::Network::IstanbulTransitionTest ) }; auto res = cost( {}, chainParams, 2 ); @@ -1557,9 +1563,9 @@ BOOST_AUTO_TEST_CASE( ecmulCostIstanbul, BOOST_AUTO_TEST_CASE( ecpairingCost ) { PrecompiledPricer cost = PrecompiledRegistrar::pricer( "alt_bn128_pairing_product" ); - ChainParams chainParams{genesisInfo( eth::Network::IstanbulTransitionTest )}; + ChainParams chainParams{ genesisInfo( eth::Network::IstanbulTransitionTest ) }; - bytes in{fromHex( + bytes in{ fromHex( "0x1c76476f4def4bb94541d57ebba1193381ffa7aa76ada664dd31c16024c43f593034dd2920f673e204fee281" "1c678745fc819b55d3e9d294e45c9b03a76aef41209dd15ebff5d46c4bd888e51a93cf99a7329636c63514396b" "4a452003a35bf704bf11ca01483bfa8b34b43561848d28905960114c8ac04049af4b6315a416782bb8324af6cf" @@ -1568,7 +1574,7 @@ BOOST_AUTO_TEST_CASE( ecpairingCost ) { "2032c61a830e3c17286de9462bf242fca2883585b93870a73853face6a6bf411198e9393920d483a7260bfb731" "fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46de" "bd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6d" - "eb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa" )}; + "eb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa" ) }; auto costBeforeIstanbul = cost( ref( in ), chainParams, 1 ); BOOST_CHECK_EQUAL( static_cast< int >( costBeforeIstanbul ), in.size() / 192 * 80000 + 100000 ); @@ -1578,7 +1584,7 @@ BOOST_AUTO_TEST_CASE( ecpairingCost ) { } static std::string const genesisInfoSkaleConfigTest = std::string() + - R"E( + R"E( { "sealEngine": "Ethash", "params": { @@ -1696,19 +1702,20 @@ BOOST_AUTO_TEST_CASE( getConfigVariable ) { chainParams.sealEngineName = NoProof::name(); chainParams.allowFutureBlocks = true; - dev::eth::g_configAccesssor.reset( new skutils::json_config_file_accessor( "../../test/unittests/libethereum/PrecompiledConfig.json" ) ); + dev::eth::g_configAccesssor.reset( new skutils::json_config_file_accessor( + "../../test/unittests/libethereum/PrecompiledConfig.json" ) ); - std::unique_ptr client; + std::unique_ptr< dev::eth::Client > client; dev::TransientDirectory m_tmpDir; - auto monitor = make_shared< InstanceMonitor >("test"); - setenv("DATA_DIR", m_tmpDir.path().c_str(), 1); + auto monitor = make_shared< InstanceMonitor >( "test" ); + setenv( "DATA_DIR", m_tmpDir.path().c_str(), 1 ); client.reset( new eth::ClientTest( chainParams, ( int ) chainParams.networkID, shared_ptr< GasPricer >(), nullptr, monitor, m_tmpDir.path(), dev::WithExisting::Kill ) ); client->injectSkaleHost(); client->startWorking(); - client->setAuthor( Address("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF") ); + client->setAuthor( Address( "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" ) ); ClientTest* testClient = asClientTest( client.get() ); @@ -1718,46 +1725,46 @@ BOOST_AUTO_TEST_CASE( getConfigVariable ) { PrecompiledExecutor exec = PrecompiledRegistrar::executor( "getConfigVariableUint256" ); std::string input = stringToHex( "skaleConfig.sChain.nodes.0.id" ); - input = input.substr(0, 58); // remove 0s in the end + input = input.substr( 0, 58 ); // remove 0s in the end bytes in = fromHex( numberToHex( 29 ) + input ); auto res = exec( bytesConstRef( in.data(), in.size() ) ); BOOST_REQUIRE( res.first ); - BOOST_REQUIRE( dev::fromBigEndian( res.second ) == 30 ); + BOOST_REQUIRE( dev::fromBigEndian< dev::u256 >( res.second ) == 30 ); input = stringToHex( "skaleConfig.sChain.nodes.0.schainIndex" ); - input = input.substr(0, 76); // remove 0s in the end + input = input.substr( 0, 76 ); // remove 0s in the end in = fromHex( numberToHex( 38 ) + input ); res = exec( bytesConstRef( in.data(), in.size() ) ); BOOST_REQUIRE( res.first ); - BOOST_REQUIRE( dev::fromBigEndian( res.second ) == 13 ); + BOOST_REQUIRE( dev::fromBigEndian< dev::u256 >( res.second ) == 13 ); input = stringToHex( "skaleConfig.sChain.nodes.0.publicKey" ); - input = input.substr(0, 72); // remove 0s in the end + input = input.substr( 0, 72 ); // remove 0s in the end in = fromHex( numberToHex( 36 ) + input ); res = exec( bytesConstRef( in.data(), in.size() ) ); BOOST_REQUIRE( !res.first ); input = stringToHex( "skaleConfig.sChain.nodes.0.unknownField" ); - input = input.substr(0, 78); // remove 0s in the end + input = input.substr( 0, 78 ); // remove 0s in the end in = fromHex( numberToHex( 39 ) + input ); res = exec( bytesConstRef( in.data(), in.size() ) ); BOOST_REQUIRE( !res.first ); input = stringToHex( "skaleConfig.nodeInfo.wallets.ima.n" ); - input = input.substr(0, 68); // remove 0s in the end + input = input.substr( 0, 68 ); // remove 0s in the end in = fromHex( numberToHex( 34 ) + input ); res = exec( bytesConstRef( in.data(), in.size() ) ); BOOST_REQUIRE( res.first ); - BOOST_REQUIRE( dev::fromBigEndian( res.second ) == 1 ); + BOOST_REQUIRE( dev::fromBigEndian< dev::u256 >( res.second ) == 1 ); input = stringToHex( "skaleConfig.nodeInfo.wallets.ima.t" ); - input = input.substr(0, 68); // remove 0s in the end + input = input.substr( 0, 68 ); // remove 0s in the end in = fromHex( numberToHex( 34 ) + input ); res = exec( bytesConstRef( in.data(), in.size() ) ); @@ -1766,15 +1773,17 @@ BOOST_AUTO_TEST_CASE( getConfigVariable ) { exec = PrecompiledRegistrar::executor( "getConfigVariableString" ); input = stringToHex( "skaleConfig.sChain.nodes.0.publicKey" ); - input = input.substr(0, 72); // remove 0s in the end + input = input.substr( 0, 72 ); // remove 0s in the end in = fromHex( numberToHex( 36 ) + input ); res = exec( bytesConstRef( in.data(), in.size() ) ); BOOST_REQUIRE( res.first ); - BOOST_REQUIRE( res.second == fromHex("0x6180cde2cbbcc6b6a17efec4503a7d4316f8612f411ee171587089f770335f484003ad236c534b9afa82befc1f69533723abdb6ec2601e582b72dcfd7919338b") ); + BOOST_REQUIRE( res.second == + fromHex( "0x6180cde2cbbcc6b6a17efec4503a7d4316f8612f411ee171587089f770335f484003" + "ad236c534b9afa82befc1f69533723abdb6ec2601e582b72dcfd7919338b" ) ); input = stringToHex( "skaleConfig.sChain.nodes.0.id" ); - input = input.substr(0, 58); // remove 0s in the end + input = input.substr( 0, 58 ); // remove 0s in the end in = fromHex( numberToHex( 29 ) + input ); res = exec( bytesConstRef( in.data(), in.size() ) ); @@ -1782,14 +1791,14 @@ BOOST_AUTO_TEST_CASE( getConfigVariable ) { BOOST_REQUIRE( !res.first ); input = stringToHex( "skaleConfig.sChain.nodes.0.schainIndex" ); - input = input.substr(0, 76); // remove 0s in the end + input = input.substr( 0, 76 ); // remove 0s in the end in = fromHex( numberToHex( 38 ) + input ); res = exec( bytesConstRef( in.data(), in.size() ) ); BOOST_REQUIRE( !res.first ); input = stringToHex( "skaleConfig.sChain.nodes.0.unknownField" ); - input = input.substr(0, 78); // remove 0s in the end + input = input.substr( 0, 78 ); // remove 0s in the end in = fromHex( numberToHex( 39 ) + input ); res = exec( bytesConstRef( in.data(), in.size() ) ); @@ -1859,9 +1868,9 @@ BOOST_AUTO_TEST_CASE( fileWithHashExtension ) { auto path = dev::getDataDir() / "filestorage" / Address( ownerAddress ).hex() / fileName; bytes in = fromHex( hexAddress + numberToHex( fileName.length() ) + stringToHex( fileName ) + - numberToHex( fileSize ) ); + numberToHex( fileSize ) ); auto res = exec( bytesConstRef( in.data(), in.size() ), m_overlayFS.get() ); - BOOST_REQUIRE( res.first == false); + BOOST_REQUIRE( res.first == false ); m_overlayFS->commit(); BOOST_REQUIRE( !boost::filesystem::exists( path ) ); @@ -1907,7 +1916,7 @@ BOOST_AUTO_TEST_CASE( readMaliciousChunk ) { bytes in = fromHex( hexAddress + numberToHex( fileName.length() ) + stringToHex( fileName ) + numberToHex( 0 ) + numberToHex( fileSize ) ); auto res = exec( bytesConstRef( in.data(), in.size() ), m_overlayFS.get() ); - BOOST_REQUIRE( res.first == false); + BOOST_REQUIRE( res.first == false ); } BOOST_AUTO_TEST_CASE( getFileSize ) { @@ -1931,14 +1940,14 @@ BOOST_AUTO_TEST_CASE( getMaliciousFileSize ) { BOOST_AUTO_TEST_CASE( deleteFile ) { PrecompiledExecutor execCreate = PrecompiledRegistrar::executor( "createFile" ); - bytes inCreate = fromHex( hexAddress + numberToHex( fileName.length() ) + stringToHex( fileName ) + - numberToHex( fileSize ) ); + bytes inCreate = fromHex( hexAddress + numberToHex( fileName.length() ) + + stringToHex( fileName ) + numberToHex( fileSize ) ); execCreate( bytesConstRef( inCreate.data(), inCreate.size() ), m_overlayFS.get() ); m_overlayFS->commit(); PrecompiledExecutor execHash = PrecompiledRegistrar::executor( "calculateFileHash" ); - bytes inHash = fromHex( hexAddress + numberToHex( fileName.length() ) + stringToHex( fileName ) + - numberToHex( fileSize ) ); + bytes inHash = fromHex( hexAddress + numberToHex( fileName.length() ) + + stringToHex( fileName ) + numberToHex( fileSize ) ); execHash( bytesConstRef( inHash.data(), inHash.size() ), m_overlayFS.get() ); m_overlayFS->commit(); @@ -1993,7 +2002,8 @@ BOOST_AUTO_TEST_CASE( calculateFileHash ) { std::string fileHashName = pathToFile.string() + "._hash"; std::ofstream fileHash( fileHashName ); - std::string relativePath = pathToFile.string().substr( pathToFile.string().find( "filestorage" ) ); + std::string relativePath = + pathToFile.string().substr( pathToFile.string().find( "filestorage" ) ); dev::h256 hash = dev::sha256( relativePath ); fileHash << hash; diff --git a/test/unittests/libethereum/SkaleHost.cpp b/test/unittests/libethereum/SkaleHost.cpp index 2091839dd..51e4eb05e 100644 --- a/test/unittests/libethereum/SkaleHost.cpp +++ b/test/unittests/libethereum/SkaleHost.cpp @@ -12,17 +12,17 @@ #include #include #include +#include #include #include -#include #include #include -#include -#include #include +#include +#include #include @@ -44,13 +44,13 @@ class ConsensusTestStub : public ConsensusInterface { block_gas_prices.push_back( 1000 ); } ~ConsensusTestStub() override {} - void parseFullConfigAndCreateNode( const std::string& /*_jsonConfig */, - const string& /*_gethURL*/ ) override {} + void parseFullConfigAndCreateNode( + const std::string& /*_jsonConfig */, const string& /*_gethURL*/ ) override {} void startAll() override {} void bootStrapAll() override {} void exitGracefully() override { need_exit = true; } consensus_engine_status getStatus() const override { - return need_exit? CONSENSUS_EXITED : CONSENSUS_ACTIVE; + return need_exit ? CONSENSUS_EXITED : CONSENSUS_ACTIVE; } void stop() {} @@ -59,9 +59,10 @@ class ConsensusTestStub : public ConsensusInterface { return m_extFace.pendingTransactions( _limit, stateRoot ); } void createBlock( const ConsensusExtFace::transactions_vector& _approvedTransactions, - uint64_t _timeStamp, uint64_t _blockID, u256 _gasPrice = 0, u256 _stateRoot = 0, uint64_t _winningNodeIndex = -1 ) { - m_extFace.createBlock( - _approvedTransactions, _timeStamp, 0, _blockID, _gasPrice, _stateRoot, _winningNodeIndex ); + uint64_t _timeStamp, uint64_t _blockID, u256 _gasPrice = 0, u256 _stateRoot = 0, + uint64_t _winningNodeIndex = -1 ) { + m_extFace.createBlock( _approvedTransactions, _timeStamp, 0, _blockID, _gasPrice, + _stateRoot, _winningNodeIndex ); setPriceForBlockId( _blockID, _gasPrice ); } @@ -70,9 +71,7 @@ class ConsensusTestStub : public ConsensusInterface { return block_gas_prices.at( _blockId ); } - u256 getRandomForBlockId( uint64_t _blockId ) const override { - return 0; - } + u256 getRandomForBlockId( uint64_t _blockId ) const override { return 0; } u256 setPriceForBlockId( uint64_t _blockId, u256 _gasPrice ) { assert( _blockId <= block_gas_prices.size() ); @@ -83,13 +82,16 @@ class ConsensusTestStub : public ConsensusInterface { return 0; } - uint64_t submitOracleRequest( const string& /*_spec*/, string& - /*_receipt*/, string& /*error*/) override { + uint64_t submitOracleRequest( const string& /*_spec*/, + string& + /*_receipt*/, + string& /*error*/ ) override { return 0; } uint64_t checkOracleResult( const string& - /*_receipt*/, string& /*_result */) override { + /*_receipt*/, + string& /*_result */ ) override { return 0; } @@ -100,7 +102,6 @@ class ConsensusTestStub : public ConsensusInterface { virtual ConsensusInterface::SyncInfo getSyncInfo() override { return ConsensusInterface::SyncInfo{}; }; - }; class ConsensusTestStubFactory : public ConsensusFactory { @@ -115,7 +116,8 @@ class ConsensusTestStubFactory : public ConsensusFactory { // TODO Do not copy&paste from JsonRpcFixture struct SkaleHostFixture : public TestOutputHelperFixture { - SkaleHostFixture( const std::map& params = std::map() ) { + SkaleHostFixture( const std::map< std::string, std::string >& params = + std::map< std::string, std::string >() ) { dev::p2p::NetworkPreferences nprefs; ChainParams chainParams; @@ -128,7 +130,7 @@ struct SkaleHostFixture : public TestOutputHelperFixture { // so that tests can be run in parallel // TODO: better make it use ethemeral in-memory databases chainParams.extraData = h256::random().asBytes(); - chainParams.sChain.nodeGroups = { { {}, uint64_t(-1), {"0", "0", "1", "0"} } }; + chainParams.sChain.nodeGroups = { { {}, uint64_t( -1 ), { "0", "0", "1", "0" } } }; chainParams.nodeInfo.port = chainParams.nodeInfo.port6 = rand_port; chainParams.nodeInfo.testSignatures = true; chainParams.sChain.nodes[0].port = chainParams.sChain.nodes[0].port6 = rand_port; @@ -136,18 +138,21 @@ struct SkaleHostFixture : public TestOutputHelperFixture { // not 0-timestamp genesis - to test patch chainParams.timestamp = std::time( NULL ) - 5; - if( params.count("multiTransactionMode") && stoi( params.at( "multiTransactionMode" ) ) ) + if ( params.count( "multiTransactionMode" ) && stoi( params.at( "multiTransactionMode" ) ) ) chainParams.sChain.multiTransactionMode = true; - if( params.count("skipInvalidTransactionsPatchTimestamp") && stoi( params.at( "skipInvalidTransactionsPatchTimestamp" ) ) ) - chainParams.sChain._patchTimestamps[static_cast(SchainPatchEnum::SkipInvalidTransactionsPatch)] = stoi( params.at( "skipInvalidTransactionsPatchTimestamp" ) ); + if ( params.count( "skipInvalidTransactionsPatchTimestamp" ) && + stoi( params.at( "skipInvalidTransactionsPatchTimestamp" ) ) ) + chainParams.sChain._patchTimestamps[static_cast< size_t >( + SchainPatchEnum::SkipInvalidTransactionsPatch )] = + stoi( params.at( "skipInvalidTransactionsPatchTimestamp" ) ); accountHolder.reset( new FixedAccountHolder( [&]() { return client.get(); }, {} ) ); - accountHolder->setAccounts( {coinbase, account2} ); + accountHolder->setAccounts( { coinbase, account2 } ); gasPricer = make_shared< eth::TrivialGasPricer >( 0, DefaultGasPrice ); - auto monitor = make_shared< InstanceMonitor >("test"); + auto monitor = make_shared< InstanceMonitor >( "test" ); - setenv("DATA_DIR", tempDir.path().c_str(), 1); + setenv( "DATA_DIR", tempDir.path().c_str(), 1 ); client = make_unique< Client >( chainParams, chainParams.networkID, gasPricer, nullptr, monitor, tempDir.path() ); this->tq = client->debugGetTransactionQueue(); @@ -185,11 +190,11 @@ struct SkaleHostFixture : public TestOutputHelperFixture { TransactionQueue* tq; - TransientDirectory tempDir; // ! should exist before client! + TransientDirectory tempDir; // ! should exist before client! unique_ptr< Client > client; - dev::KeyPair coinbase{KeyPair::create()}; - dev::KeyPair account2{KeyPair::create()}; + dev::KeyPair coinbase{ KeyPair::create() }; + dev::KeyPair account2{ KeyPair::create() }; unique_ptr< FixedAccountHolder > accountHolder; std::shared_ptr< eth::TrivialGasPricer > gasPricer; @@ -199,9 +204,11 @@ struct SkaleHostFixture : public TestOutputHelperFixture { #define CHECK_BLOCK_BEGIN auto blockBefore = client->number() -#define REQUIRE_BLOCK_INCREASE( increase ) \ - { auto blockAfter = client->number(); \ - BOOST_REQUIRE_EQUAL( blockAfter - blockBefore, increase ); } +#define REQUIRE_BLOCK_INCREASE( increase ) \ + { \ + auto blockAfter = client->number(); \ + BOOST_REQUIRE_EQUAL( blockAfter - blockBefore, increase ); \ + } #define REQUIRE_BLOCK_SIZE( number, s ) \ { \ @@ -219,27 +226,35 @@ struct SkaleHostFixture : public TestOutputHelperFixture { #define CHECK_NONCE_BEGIN( senderAddress ) u256 nonceBefore = client->countAt( senderAddress ) -#define REQUIRE_NONCE_INCREASE( senderAddress, increase ) \ - { u256 nonceAfter = client->countAt( senderAddress ); \ - BOOST_REQUIRE_EQUAL( nonceAfter - nonceBefore, increase ); } +#define REQUIRE_NONCE_INCREASE( senderAddress, increase ) \ + { \ + u256 nonceAfter = client->countAt( senderAddress ); \ + BOOST_REQUIRE_EQUAL( nonceAfter - nonceBefore, increase ); \ + } #define CHECK_BALANCE_BEGIN( senderAddress ) u256 balanceBefore = client->balanceAt( senderAddress ) -#define REQUIRE_BALANCE_DECREASE( senderAddress, decrease ) \ - { u256 balanceAfter = client->balanceAt( senderAddress ); \ - BOOST_REQUIRE_EQUAL( balanceBefore - balanceAfter, decrease ); } +#define REQUIRE_BALANCE_DECREASE( senderAddress, decrease ) \ + { \ + u256 balanceAfter = client->balanceAt( senderAddress ); \ + BOOST_REQUIRE_EQUAL( balanceBefore - balanceAfter, decrease ); \ + } -#define REQUIRE_BALANCE_DECREASE_GE( senderAddress, decrease ) \ - { u256 balanceAfter = client->balanceAt( senderAddress ); \ - BOOST_REQUIRE_GE( balanceBefore - balanceAfter, decrease ); } +#define REQUIRE_BALANCE_DECREASE_GE( senderAddress, decrease ) \ + { \ + u256 balanceAfter = client->balanceAt( senderAddress ); \ + BOOST_REQUIRE_GE( balanceBefore - balanceAfter, decrease ); \ + } BOOST_AUTO_TEST_SUITE( SkaleHostSuite ) //, *boost::unit_test::disabled() ) -auto skipInvalidTransactionsVariants = boost::unit_test::data::make({false, true}); - -BOOST_DATA_TEST_CASE( validTransaction, skipInvalidTransactionsVariants, skipInvalidTransactionsFlag ) { +auto skipInvalidTransactionsVariants = boost::unit_test::data::make( { false, true } ); - SkaleHostFixture fixture( std::map( {{"skipInvalidTransactionsPatchTimestamp", to_string(int(skipInvalidTransactionsFlag))}} ) ); +BOOST_DATA_TEST_CASE( + validTransaction, skipInvalidTransactionsVariants, skipInvalidTransactionsFlag ) { + SkaleHostFixture fixture( + std::map< std::string, std::string >( { { "skipInvalidTransactionsPatchTimestamp", + to_string( int( skipInvalidTransactionsFlag ) ) } } ) ); auto& client = fixture.client; auto& coinbase = fixture.coinbase; auto& accountHolder = fixture.accountHolder; @@ -268,7 +283,7 @@ BOOST_DATA_TEST_CASE( validTransaction, skipInvalidTransactionsVariants, skipInv CHECK_BLOCK_BEGIN; BOOST_REQUIRE_NO_THROW( - stub->createBlock( ConsensusExtFace::transactions_vector{tx.toBytes()}, utcTime(), 1U ) ); + stub->createBlock( ConsensusExtFace::transactions_vector{ tx.toBytes() }, utcTime(), 1U ) ); REQUIRE_BLOCK_INCREASE( 1 ); REQUIRE_BLOCK_SIZE( 1, 1 ); @@ -278,16 +293,16 @@ BOOST_DATA_TEST_CASE( validTransaction, skipInvalidTransactionsVariants, skipInv REQUIRE_BALANCE_DECREASE( senderAddress, value + gasPrice * 21000 ); } -// Transaction should be IGNORED or EXCLUDED during execution (depending on skipInvalidTransactionsFlag) -// Proposer should be penalized -// 1 Small amount of random bytes -// 2 110 random bytes -// 3 110 bytes of semi-correct RLP -BOOST_DATA_TEST_CASE( transactionRlpBad, skipInvalidTransactionsVariants, skipInvalidTransactionsFlag - // , *boost::unit_test::precondition( dev::test::run_not_express ) - ) { - - SkaleHostFixture fixture( std::map( {{"skipInvalidTransactionsPatchTimestamp", to_string(int(skipInvalidTransactionsFlag))}} ) ); +// Transaction should be IGNORED or EXCLUDED during execution (depending on +// skipInvalidTransactionsFlag) Proposer should be penalized 1 Small amount of random bytes 2 110 +// random bytes 3 110 bytes of semi-correct RLP +BOOST_DATA_TEST_CASE( + transactionRlpBad, skipInvalidTransactionsVariants, skipInvalidTransactionsFlag + // , *boost::unit_test::precondition( dev::test::run_not_express ) +) { + SkaleHostFixture fixture( + std::map< std::string, std::string >( { { "skipInvalidTransactionsPatchTimestamp", + to_string( int( skipInvalidTransactionsFlag ) ) } } ) ); auto& client = fixture.client; auto& coinbase = fixture.coinbase; auto& stub = fixture.stub; @@ -310,15 +325,14 @@ BOOST_DATA_TEST_CASE( transactionRlpBad, skipInvalidTransactionsVariants, skipIn CHECK_BLOCK_BEGIN; BOOST_REQUIRE_NO_THROW( stub->createBlock( - ConsensusExtFace::transactions_vector{small_tx1, small_tx2, bad_tx1, bad_tx2}, utcTime(), + ConsensusExtFace::transactions_vector{ small_tx1, small_tx2, bad_tx1, bad_tx2 }, utcTime(), 1U ) ); REQUIRE_BLOCK_INCREASE( 1 ); - if(skipInvalidTransactionsFlag){ + if ( skipInvalidTransactionsFlag ) { REQUIRE_BLOCK_SIZE( 1, 0 ); - } - else{ + } else { REQUIRE_BLOCK_SIZE( 1, 3 ); } @@ -329,7 +343,7 @@ BOOST_DATA_TEST_CASE( transactionRlpBad, skipInvalidTransactionsVariants, skipIn Transactions txns = client->transactions( 1 ); // cerr << toJson( txns ); - if(!skipInvalidTransactionsFlag){ + if ( !skipInvalidTransactionsFlag ) { REQUIRE_BLOCK_TRANSACTION( 1, 0, txns[0].sha3() ); REQUIRE_BLOCK_TRANSACTION( 1, 1, txns[1].sha3() ); REQUIRE_BLOCK_TRANSACTION( 1, 2, txns[2].sha3() ); @@ -369,11 +383,13 @@ class VrsHackedTransaction : public Transaction { // Transaction should be IGNORED during execution or absent if skipInvalidTransactionsFlag // Proposer should be penalized // zero signature -BOOST_DATA_TEST_CASE( transactionSigZero, skipInvalidTransactionsVariants, skipInvalidTransactionsFlag - // , *boost::unit_test::precondition( dev::test::run_not_express ) - ) { - - SkaleHostFixture fixture( std::map( {{"skipInvalidTransactionsPatchTimestamp", to_string(int(skipInvalidTransactionsFlag))}} ) ); +BOOST_DATA_TEST_CASE( + transactionSigZero, skipInvalidTransactionsVariants, skipInvalidTransactionsFlag + // , *boost::unit_test::precondition( dev::test::run_not_express ) +) { + SkaleHostFixture fixture( + std::map< std::string, std::string >( { { "skipInvalidTransactionsPatchTimestamp", + to_string( int( skipInvalidTransactionsFlag ) ) } } ) ); auto& client = fixture.client; auto& coinbase = fixture.coinbase; auto& accountHolder = fixture.accountHolder; @@ -402,14 +418,13 @@ BOOST_DATA_TEST_CASE( transactionSigZero, skipInvalidTransactionsVariants, skipI CHECK_BLOCK_BEGIN; BOOST_REQUIRE_NO_THROW( - stub->createBlock( ConsensusExtFace::transactions_vector{tx.toBytes()}, utcTime(), 1U ) ); + stub->createBlock( ConsensusExtFace::transactions_vector{ tx.toBytes() }, utcTime(), 1U ) ); REQUIRE_BLOCK_INCREASE( 1 ); - if(skipInvalidTransactionsFlag){ + if ( skipInvalidTransactionsFlag ) { REQUIRE_BLOCK_SIZE( 1, 0 ); - } - else { + } else { REQUIRE_BLOCK_SIZE( 1, 1 ); h256 txHash = sha3( tx.toBytes() ); REQUIRE_BLOCK_TRANSACTION( 1, 0, txHash ); @@ -422,11 +437,13 @@ BOOST_DATA_TEST_CASE( transactionSigZero, skipInvalidTransactionsVariants, skipI // Transaction should be IGNORED during execution or absent if skipInvalidTransactionsFlag // Proposer should be penalized // corrupted signature -BOOST_DATA_TEST_CASE( transactionSigBad, skipInvalidTransactionsVariants, skipInvalidTransactionsFlag - // , *boost::unit_test::precondition( dev::test::run_not_express ) - ) { - - SkaleHostFixture fixture( std::map( {{"skipInvalidTransactionsPatchTimestamp", to_string(int(skipInvalidTransactionsFlag))}} ) ); +BOOST_DATA_TEST_CASE( + transactionSigBad, skipInvalidTransactionsVariants, skipInvalidTransactionsFlag + // , *boost::unit_test::precondition( dev::test::run_not_express ) +) { + SkaleHostFixture fixture( + std::map< std::string, std::string >( { { "skipInvalidTransactionsPatchTimestamp", + to_string( int( skipInvalidTransactionsFlag ) ) } } ) ); auto& client = fixture.client; auto& coinbase = fixture.coinbase; auto& accountHolder = fixture.accountHolder; @@ -455,15 +472,14 @@ BOOST_DATA_TEST_CASE( transactionSigBad, skipInvalidTransactionsVariants, skipIn CHECK_BLOCK_BEGIN; BOOST_REQUIRE_NO_THROW( - stub->createBlock( ConsensusExtFace::transactions_vector{data}, utcTime(), 1U ) ); + stub->createBlock( ConsensusExtFace::transactions_vector{ data }, utcTime(), 1U ) ); REQUIRE_BLOCK_INCREASE( 1 ); - if(skipInvalidTransactionsFlag){ + if ( skipInvalidTransactionsFlag ) { REQUIRE_BLOCK_SIZE( 1, 0 ); - } - else { + } else { REQUIRE_BLOCK_SIZE( 1, 1 ); h256 txHash = sha3( data ); REQUIRE_BLOCK_TRANSACTION( 1, 0, txHash ); @@ -476,11 +492,13 @@ BOOST_DATA_TEST_CASE( transactionSigBad, skipInvalidTransactionsVariants, skipIn // Transaction should be IGNORED during execution or absent if skipInvalidTransactionsFlag // Proposer should be penalized // gas < min_gas -BOOST_DATA_TEST_CASE( transactionGasIncorrect, skipInvalidTransactionsVariants, skipInvalidTransactionsFlag - // , *boost::unit_test::precondition( dev::test::run_not_express ) - ) { - - SkaleHostFixture fixture( std::map( {{"skipInvalidTransactionsPatchTimestamp", to_string(int(skipInvalidTransactionsFlag))}} ) ); +BOOST_DATA_TEST_CASE( + transactionGasIncorrect, skipInvalidTransactionsVariants, skipInvalidTransactionsFlag + // , *boost::unit_test::precondition( dev::test::run_not_express ) +) { + SkaleHostFixture fixture( + std::map< std::string, std::string >( { { "skipInvalidTransactionsPatchTimestamp", + to_string( int( skipInvalidTransactionsFlag ) ) } } ) ); auto& client = fixture.client; auto& coinbase = fixture.coinbase; auto& accountHolder = fixture.accountHolder; @@ -507,14 +525,13 @@ BOOST_DATA_TEST_CASE( transactionGasIncorrect, skipInvalidTransactionsVariants, CHECK_BLOCK_BEGIN; BOOST_REQUIRE_NO_THROW( - stub->createBlock( ConsensusExtFace::transactions_vector{tx.toBytes()}, utcTime(), 1U ) ); + stub->createBlock( ConsensusExtFace::transactions_vector{ tx.toBytes() }, utcTime(), 1U ) ); REQUIRE_BLOCK_INCREASE( 1 ); - if(skipInvalidTransactionsFlag){ + if ( skipInvalidTransactionsFlag ) { REQUIRE_BLOCK_SIZE( 1, 0 ); - } - else { + } else { REQUIRE_BLOCK_SIZE( 1, 1 ); REQUIRE_BLOCK_TRANSACTION( 1, 0, txHash ); } @@ -527,11 +544,13 @@ BOOST_DATA_TEST_CASE( transactionGasIncorrect, skipInvalidTransactionsVariants, // Sender should be charged for gas consumed // Proposer should NOT be penalized // transaction exceedes it's gas limit -BOOST_DATA_TEST_CASE( transactionGasNotEnough, skipInvalidTransactionsVariants, skipInvalidTransactionsFlag - // , *boost::unit_test::precondition( dev::test::run_not_express ) - ) { - - SkaleHostFixture fixture( std::map( {{"skipInvalidTransactionsPatchTimestamp", to_string(int(skipInvalidTransactionsFlag))}} ) ); +BOOST_DATA_TEST_CASE( + transactionGasNotEnough, skipInvalidTransactionsVariants, skipInvalidTransactionsFlag + // , *boost::unit_test::precondition( dev::test::run_not_express ) +) { + SkaleHostFixture fixture( + std::map< std::string, std::string >( { { "skipInvalidTransactionsPatchTimestamp", + to_string( int( skipInvalidTransactionsFlag ) ) } } ) ); auto& client = fixture.client; auto& coinbase = fixture.coinbase; auto& accountHolder = fixture.accountHolder; @@ -574,7 +593,7 @@ BOOST_DATA_TEST_CASE( transactionGasNotEnough, skipInvalidTransactionsVariants, CHECK_BLOCK_BEGIN; BOOST_REQUIRE_NO_THROW( - stub->createBlock( ConsensusExtFace::transactions_vector{tx.toBytes()}, utcTime(), 1U ) ); + stub->createBlock( ConsensusExtFace::transactions_vector{ tx.toBytes() }, utcTime(), 1U ) ); REQUIRE_BLOCK_INCREASE( 1 ); REQUIRE_BLOCK_SIZE( 1, 1 ); @@ -588,9 +607,11 @@ BOOST_DATA_TEST_CASE( transactionGasNotEnough, skipInvalidTransactionsVariants, // Transaction should be IGNORED during execution or absent if skipInvalidTransactionsFlag // Proposer should be penalized // nonce too big -BOOST_DATA_TEST_CASE( transactionNonceBig, skipInvalidTransactionsVariants, skipInvalidTransactionsFlag ) { - - SkaleHostFixture fixture( std::map( {{"skipInvalidTransactionsPatchTimestamp", to_string(int(skipInvalidTransactionsFlag))}} ) ); +BOOST_DATA_TEST_CASE( + transactionNonceBig, skipInvalidTransactionsVariants, skipInvalidTransactionsFlag ) { + SkaleHostFixture fixture( + std::map< std::string, std::string >( { { "skipInvalidTransactionsPatchTimestamp", + to_string( int( skipInvalidTransactionsFlag ) ) } } ) ); auto& client = fixture.client; auto& coinbase = fixture.coinbase; auto& accountHolder = fixture.accountHolder; @@ -617,14 +638,13 @@ BOOST_DATA_TEST_CASE( transactionNonceBig, skipInvalidTransactionsVariants, skip CHECK_BLOCK_BEGIN; BOOST_REQUIRE_NO_THROW( - stub->createBlock( ConsensusExtFace::transactions_vector{tx.toBytes()}, utcTime(), 1U ) ); + stub->createBlock( ConsensusExtFace::transactions_vector{ tx.toBytes() }, utcTime(), 1U ) ); REQUIRE_BLOCK_INCREASE( 1 ); - if(skipInvalidTransactionsFlag){ + if ( skipInvalidTransactionsFlag ) { REQUIRE_BLOCK_SIZE( 1, 0 ); - } - else { + } else { REQUIRE_BLOCK_SIZE( 1, 1 ); REQUIRE_BLOCK_TRANSACTION( 1, 0, txHash ); } @@ -636,11 +656,13 @@ BOOST_DATA_TEST_CASE( transactionNonceBig, skipInvalidTransactionsVariants, skip // Transaction should be IGNORED during execution or absent if skipInvalidTransactionsFlag // Proposer should be penalized // nonce too small -BOOST_DATA_TEST_CASE( transactionNonceSmall, skipInvalidTransactionsVariants, skipInvalidTransactionsFlag - //, *boost::unit_test::precondition( dev::test::run_not_express ) - ) { - - SkaleHostFixture fixture( std::map( {{"skipInvalidTransactionsPatchTimestamp", to_string(int(skipInvalidTransactionsFlag))}} ) ); +BOOST_DATA_TEST_CASE( + transactionNonceSmall, skipInvalidTransactionsVariants, skipInvalidTransactionsFlag + //, *boost::unit_test::precondition( dev::test::run_not_express ) +) { + SkaleHostFixture fixture( + std::map< std::string, std::string >( { { "skipInvalidTransactionsPatchTimestamp", + to_string( int( skipInvalidTransactionsFlag ) ) } } ) ); auto& client = fixture.client; auto& coinbase = fixture.coinbase; auto& accountHolder = fixture.accountHolder; @@ -661,8 +683,8 @@ BOOST_DATA_TEST_CASE( transactionNonceSmall, skipInvalidTransactionsVariants, sk Transaction tx1( ts, ar.second ); // create 1 txns in 1 block - BOOST_REQUIRE_NO_THROW( - stub->createBlock( ConsensusExtFace::transactions_vector{tx1.toBytes()}, utcTime(), 1U ) ); + BOOST_REQUIRE_NO_THROW( stub->createBlock( + ConsensusExtFace::transactions_vector{ tx1.toBytes() }, utcTime(), 1U ) ); // now our test txn json["value"] = jsToDecimal( toJS( 9000 * dev::eth::szabo ) ); @@ -677,15 +699,14 @@ BOOST_DATA_TEST_CASE( transactionNonceSmall, skipInvalidTransactionsVariants, sk CHECK_BALANCE_BEGIN( senderAddress ); CHECK_BLOCK_BEGIN; - BOOST_REQUIRE_NO_THROW( - stub->createBlock( ConsensusExtFace::transactions_vector{tx2.toBytes()}, utcTime(), 2U ) ); + BOOST_REQUIRE_NO_THROW( stub->createBlock( + ConsensusExtFace::transactions_vector{ tx2.toBytes() }, utcTime(), 2U ) ); REQUIRE_BLOCK_INCREASE( 1 ); - if(skipInvalidTransactionsFlag){ + if ( skipInvalidTransactionsFlag ) { REQUIRE_BLOCK_SIZE( 2, 0 ); - } - else { + } else { REQUIRE_BLOCK_SIZE( 2, 1 ); REQUIRE_BLOCK_TRANSACTION( 2, 0, txHash ); } @@ -697,9 +718,11 @@ BOOST_DATA_TEST_CASE( transactionNonceSmall, skipInvalidTransactionsVariants, sk // Transaction should be IGNORED during execution or absent if skipInvalidTransactionsFlag // Proposer should be penalized // not enough cash -BOOST_DATA_TEST_CASE( transactionBalanceBad, skipInvalidTransactionsVariants, skipInvalidTransactionsFlag ) { - - SkaleHostFixture fixture( std::map( {{"skipInvalidTransactionsPatchTimestamp", to_string(int(skipInvalidTransactionsFlag))}} ) ); +BOOST_DATA_TEST_CASE( + transactionBalanceBad, skipInvalidTransactionsVariants, skipInvalidTransactionsFlag ) { + SkaleHostFixture fixture( + std::map< std::string, std::string >( { { "skipInvalidTransactionsPatchTimestamp", + to_string( int( skipInvalidTransactionsFlag ) ) } } ) ); auto& client = fixture.client; auto& coinbase = fixture.coinbase; auto& accountHolder = fixture.accountHolder; @@ -726,14 +749,13 @@ BOOST_DATA_TEST_CASE( transactionBalanceBad, skipInvalidTransactionsVariants, sk CHECK_BLOCK_BEGIN; BOOST_REQUIRE_NO_THROW( - stub->createBlock( ConsensusExtFace::transactions_vector{tx.toBytes()}, utcTime(), 1U ) ); + stub->createBlock( ConsensusExtFace::transactions_vector{ tx.toBytes() }, utcTime(), 1U ) ); REQUIRE_BLOCK_INCREASE( 1 ); - if(skipInvalidTransactionsFlag){ + if ( skipInvalidTransactionsFlag ) { REQUIRE_BLOCK_SIZE( 1, 0 ); - } - else { + } else { REQUIRE_BLOCK_SIZE( 1, 1 ); REQUIRE_BLOCK_TRANSACTION( 1, 0, txHash ); } @@ -741,41 +763,44 @@ BOOST_DATA_TEST_CASE( transactionBalanceBad, skipInvalidTransactionsVariants, sk REQUIRE_NONCE_INCREASE( senderAddress, 0 ); REQUIRE_BALANCE_DECREASE( senderAddress, 0 ); - // step 2: check that receipt "moved" to another block after successfull re-execution of the same transaction + // step 2: check that receipt "moved" to another block after successfull re-execution of the + // same transaction - if(!skipInvalidTransactionsFlag){ - LocalisedTransactionReceipt r1 = client->localisedTransactionReceipt(txHash); - BOOST_REQUIRE_EQUAL(r1.blockNumber(), 1); - BOOST_REQUIRE_EQUAL(r1.gasUsed(), 0); - LocalisedTransaction lt = client->localisedTransaction(txHash); - BOOST_REQUIRE_EQUAL(lt.blockNumber(), 1); + if ( !skipInvalidTransactionsFlag ) { + LocalisedTransactionReceipt r1 = client->localisedTransactionReceipt( txHash ); + BOOST_REQUIRE_EQUAL( r1.blockNumber(), 1 ); + BOOST_REQUIRE_EQUAL( r1.gasUsed(), 0 ); + LocalisedTransaction lt = client->localisedTransaction( txHash ); + BOOST_REQUIRE_EQUAL( lt.blockNumber(), 1 ); } // make money dev::eth::simulateMining( *client, 1, senderAddress ); - stub->createBlock( ConsensusExtFace::transactions_vector{tx.toBytes()}, utcTime(), 2U ); + stub->createBlock( ConsensusExtFace::transactions_vector{ tx.toBytes() }, utcTime(), 2U ); REQUIRE_BLOCK_SIZE( 2, 1 ); REQUIRE_BLOCK_TRANSACTION( 2, 0, txHash ); REQUIRE_NONCE_INCREASE( senderAddress, 1 ); REQUIRE_BALANCE_DECREASE_GE( senderAddress, 1 ); - LocalisedTransactionReceipt r2 = client->localisedTransactionReceipt(txHash); - BOOST_REQUIRE_EQUAL(r2.blockNumber(), 2); - BOOST_REQUIRE_GE(r2.gasUsed(), 21000); - LocalisedTransaction lt = client->localisedTransaction(txHash); - BOOST_REQUIRE_EQUAL(lt.blockNumber(), 2); + LocalisedTransactionReceipt r2 = client->localisedTransactionReceipt( txHash ); + BOOST_REQUIRE_EQUAL( r2.blockNumber(), 2 ); + BOOST_REQUIRE_GE( r2.gasUsed(), 21000 ); + LocalisedTransaction lt = client->localisedTransaction( txHash ); + BOOST_REQUIRE_EQUAL( lt.blockNumber(), 2 ); } // Transaction should be IGNORED during execution or absent if skipInvalidTransactionsFlag // Proposer should be penalized // transaction goes beyond block gas limit -BOOST_DATA_TEST_CASE( transactionGasBlockLimitExceeded, skipInvalidTransactionsVariants, skipInvalidTransactionsFlag - // , *boost::unit_test::precondition( dev::test::run_not_express ) - ) { - - SkaleHostFixture fixture( std::map( {{"skipInvalidTransactionsPatchTimestamp", to_string(int(skipInvalidTransactionsFlag))}} ) ); +BOOST_DATA_TEST_CASE( + transactionGasBlockLimitExceeded, skipInvalidTransactionsVariants, skipInvalidTransactionsFlag + // , *boost::unit_test::precondition( dev::test::run_not_express ) +) { + SkaleHostFixture fixture( + std::map< std::string, std::string >( { { "skipInvalidTransactionsPatchTimestamp", + to_string( int( skipInvalidTransactionsFlag ) ) } } ) ); auto& client = fixture.client; auto& coinbase = fixture.coinbase; auto& stub = fixture.stub; @@ -809,17 +834,16 @@ BOOST_DATA_TEST_CASE( transactionGasBlockLimitExceeded, skipInvalidTransactionsV CHECK_BLOCK_BEGIN; BOOST_REQUIRE_NO_THROW( stub->createBlock( - ConsensusExtFace::transactions_vector{tx1.toBytes(), tx2.toBytes()}, utcTime(), 1U ) ); + ConsensusExtFace::transactions_vector{ tx1.toBytes(), tx2.toBytes() }, utcTime(), 1U ) ); BOOST_REQUIRE_EQUAL( client->number(), 1 ); REQUIRE_BLOCK_INCREASE( 1 ); - if(skipInvalidTransactionsFlag){ + if ( skipInvalidTransactionsFlag ) { REQUIRE_BLOCK_SIZE( 1, 1 ); REQUIRE_BLOCK_TRANSACTION( 1, 0, txHash1 ); - } - else { + } else { REQUIRE_BLOCK_SIZE( 1, 2 ); REQUIRE_BLOCK_TRANSACTION( 1, 0, txHash1 ); @@ -832,7 +856,6 @@ BOOST_DATA_TEST_CASE( transactionGasBlockLimitExceeded, skipInvalidTransactionsV // Last transaction should be dropped from block proposal BOOST_AUTO_TEST_CASE( gasLimitInBlockProposal ) { - SkaleHostFixture fixture; auto& client = fixture.client; auto& coinbase = fixture.coinbase; @@ -842,11 +865,12 @@ BOOST_AUTO_TEST_CASE( gasLimitInBlockProposal ) { auto receiver = KeyPair::create(); - { - auto wr_state = client->state().createStateModifyCopy(); - wr_state.addBalance( fixture.account2.address(), client->chainParams().gasLimit * 1000 + dev::eth::ether ); - wr_state.commit(); - } + + auto wr_state = client->state().createStateCopyAndClearCaches(); + wr_state.addBalance( + fixture.account2.address(), client->chainParams().gasLimit * 1000 + dev::eth::ether ); + wr_state.commit(); + wr_state.getOriginalDb()->createBlockSnap( 2 ); // 1 txn with max gas Json::Value json; @@ -859,7 +883,7 @@ BOOST_AUTO_TEST_CASE( gasLimitInBlockProposal ) { Transaction tx1 = fixture.tx_from_json( json ); // 2 txn - json["from"] = toJS( account2.address() ); + json["from"] = toJS( account2.address() ); json["gas"] = jsToDecimal( toJS( client->chainParams().gasLimit - 21000 + 1 ) ); Transaction tx2 = fixture.tx_from_json( json ); @@ -868,7 +892,7 @@ BOOST_AUTO_TEST_CASE( gasLimitInBlockProposal ) { skaleHost->receiveTransaction( toJS( tx1.toBytes() ) ); skaleHost->receiveTransaction( toJS( tx2.toBytes() ) ); - sleep( 1 ); // allow broadcast thread to move them + sleep( 1 ); // allow broadcast thread to move them ConsensusExtFace::transactions_vector proposal = stub->pendingTransactions( 100 ); @@ -878,9 +902,8 @@ BOOST_AUTO_TEST_CASE( gasLimitInBlockProposal ) { // positive test for 4 next ones BOOST_AUTO_TEST_CASE( transactionDropReceive - //, *boost::unit_test::precondition( dev::test::run_not_express ) - ) { - + //, *boost::unit_test::precondition( dev::test::run_not_express ) +) { SkaleHostFixture fixture; auto& client = fixture.client; auto& coinbase = fixture.coinbase; @@ -900,7 +923,8 @@ BOOST_AUTO_TEST_CASE( transactionDropReceive // 1st tx Transaction tx1 = fixture.tx_from_json( json ); - tx1.checkOutExternalGas( client->chainParams(), client->latestBlock().info().timestamp(), client->number() ); + tx1.checkOutExternalGas( + client->chainParams(), client->latestBlock().info().timestamp(), client->number() ); // submit it! tq->import( tx1 ); @@ -929,7 +953,7 @@ BOOST_AUTO_TEST_CASE( transactionDropReceive CHECK_NONCE_BEGIN( senderAddress ); BOOST_REQUIRE_NO_THROW( - stub->createBlock( ConsensusExtFace::transactions_vector{tx3}, utcTime(), 1U ) ); + stub->createBlock( ConsensusExtFace::transactions_vector{ tx3 }, utcTime(), 1U ) ); stub->setPriceForBlockId( 1, 1000 ); REQUIRE_BLOCK_INCREASE( 1 ); @@ -942,9 +966,8 @@ BOOST_AUTO_TEST_CASE( transactionDropReceive BOOST_REQUIRE_EQUAL( txns.size(), 1 ); } -BOOST_AUTO_TEST_CASE( transactionDropQueue, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { - +BOOST_AUTO_TEST_CASE( + transactionDropQueue, *boost::unit_test::precondition( dev::test::run_not_express ) ) { SkaleHostFixture fixture; auto& client = fixture.client; auto& coinbase = fixture.coinbase; @@ -964,7 +987,8 @@ BOOST_AUTO_TEST_CASE( transactionDropQueue, // 1st tx Transaction tx1 = fixture.tx_from_json( json ); - tx1.checkOutExternalGas( client->chainParams(), client->latestBlock().info().timestamp(), client->number() ); + tx1.checkOutExternalGas( + client->chainParams(), client->latestBlock().info().timestamp(), client->number() ); // submit it! tq->import( tx1 ); @@ -986,8 +1010,8 @@ BOOST_AUTO_TEST_CASE( transactionDropQueue, CHECK_BALANCE_BEGIN( senderAddress ); CHECK_BLOCK_BEGIN; - BOOST_REQUIRE_NO_THROW( - stub->createBlock( ConsensusExtFace::transactions_vector{tx2.toBytes()}, utcTime(), 1U ) ); + BOOST_REQUIRE_NO_THROW( stub->createBlock( + ConsensusExtFace::transactions_vector{ tx2.toBytes() }, utcTime(), 1U ) ); stub->setPriceForBlockId( 1, 1000 ); REQUIRE_BLOCK_INCREASE( 1 ); @@ -1003,9 +1027,8 @@ BOOST_AUTO_TEST_CASE( transactionDropQueue, // TODO Check exact dropping reason! BOOST_AUTO_TEST_CASE( transactionDropByGasPrice - // , *boost::unit_test::precondition( dev::test::run_not_express ) - ) { - + // , *boost::unit_test::precondition( dev::test::run_not_express ) +) { SkaleHostFixture fixture; auto& client = fixture.client; auto& coinbase = fixture.coinbase; @@ -1025,7 +1048,8 @@ BOOST_AUTO_TEST_CASE( transactionDropByGasPrice // 1st tx Transaction tx1 = fixture.tx_from_json( json ); - tx1.checkOutExternalGas( client->chainParams(), client->latestBlock().info().timestamp(), client->number() ); + tx1.checkOutExternalGas( + client->chainParams(), client->latestBlock().info().timestamp(), client->number() ); // submit it! tq->import( tx1 ); @@ -1048,7 +1072,7 @@ BOOST_AUTO_TEST_CASE( transactionDropByGasPrice CHECK_BLOCK_BEGIN; BOOST_REQUIRE_NO_THROW( stub->createBlock( - ConsensusExtFace::transactions_vector{tx2.toBytes()}, utcTime(), 1U, 1000 ) ); + ConsensusExtFace::transactions_vector{ tx2.toBytes() }, utcTime(), 1U, 1000 ) ); stub->setPriceForBlockId( 1, 1100 ); REQUIRE_BLOCK_INCREASE( 1 ); @@ -1064,9 +1088,8 @@ BOOST_AUTO_TEST_CASE( transactionDropByGasPrice // TODO Check exact dropping reason! BOOST_AUTO_TEST_CASE( transactionDropByGasPriceReceive - // , *boost::unit_test::precondition( dev::test::run_not_express ) - ) { - + // , *boost::unit_test::precondition( dev::test::run_not_express ) +) { SkaleHostFixture fixture; auto& client = fixture.client; auto& coinbase = fixture.coinbase; @@ -1079,7 +1102,7 @@ BOOST_AUTO_TEST_CASE( transactionDropByGasPriceReceive auto receiver = KeyPair::create(); { - auto wr_state = client->state().createStateModifyCopy(); + auto wr_state = client->state().createStateCopyAndClearCaches(); wr_state.addBalance( fixture.account2.address(), 1 * ether ); wr_state.commit(); } @@ -1094,7 +1117,8 @@ BOOST_AUTO_TEST_CASE( transactionDropByGasPriceReceive // 1st tx Transaction tx1 = fixture.tx_from_json( json ); - tx1.checkOutExternalGas( client->chainParams(), client->latestBlock().info().timestamp(), client->number() ); + tx1.checkOutExternalGas( + client->chainParams(), client->latestBlock().info().timestamp(), client->number() ); // receive it! skaleHost->receiveTransaction( toJS( tx1.toBytes() ) ); @@ -1118,7 +1142,7 @@ BOOST_AUTO_TEST_CASE( transactionDropByGasPriceReceive CHECK_BLOCK_BEGIN; BOOST_REQUIRE_NO_THROW( stub->createBlock( - ConsensusExtFace::transactions_vector{tx2.toBytes()}, utcTime(), 1U, 1000 ) ); + ConsensusExtFace::transactions_vector{ tx2.toBytes() }, utcTime(), 1U, 1000 ) ); stub->setPriceForBlockId( 1, 1100 ); REQUIRE_BLOCK_INCREASE( 1 ); @@ -1133,9 +1157,8 @@ BOOST_AUTO_TEST_CASE( transactionDropByGasPriceReceive } BOOST_AUTO_TEST_CASE( transactionRace - // , *boost::unit_test::precondition( dev::test::run_not_express ) - ) { - + // , *boost::unit_test::precondition( dev::test::run_not_express ) +) { SkaleHostFixture fixture; auto& client = fixture.client; auto& coinbase = fixture.coinbase; @@ -1166,7 +1189,7 @@ BOOST_AUTO_TEST_CASE( transactionRace // 2 get it from consensus BOOST_REQUIRE_NO_THROW( - stub->createBlock( ConsensusExtFace::transactions_vector{tx.toBytes()}, utcTime(), 1U ) ); + stub->createBlock( ConsensusExtFace::transactions_vector{ tx.toBytes() }, utcTime(), 1U ) ); stub->setPriceForBlockId( 1, 1000 ); REQUIRE_BLOCK_INCREASE( 1 ); @@ -1189,9 +1212,8 @@ BOOST_AUTO_TEST_CASE( transactionRace // test two blocks with overlapping transactions :) BOOST_AUTO_TEST_CASE( partialCatchUp - // , *boost::unit_test::precondition( dev::test::run_not_express ) - ) { - + // , *boost::unit_test::precondition( dev::test::run_not_express ) +) { SkaleHostFixture fixture; auto& client = fixture.client; auto& coinbase = fixture.coinbase; @@ -1213,8 +1235,8 @@ BOOST_AUTO_TEST_CASE( partialCatchUp Transaction tx1( ts, ar.second ); // create 1 txns in 1 block - BOOST_REQUIRE_NO_THROW( - stub->createBlock( ConsensusExtFace::transactions_vector{tx1.toBytes()}, utcTime(), 1U ) ); + BOOST_REQUIRE_NO_THROW( stub->createBlock( + ConsensusExtFace::transactions_vector{ tx1.toBytes() }, utcTime(), 1U ) ); // now 2 txns json["value"] = jsToDecimal( toJS( 9000 * dev::eth::szabo ) ); @@ -1229,8 +1251,8 @@ BOOST_AUTO_TEST_CASE( partialCatchUp CHECK_BALANCE_BEGIN( senderAddress ); CHECK_BLOCK_BEGIN; - BOOST_REQUIRE_NO_THROW( - stub->createBlock( ConsensusExtFace::transactions_vector{tx1.toBytes(), tx2.toBytes()}, utcTime(), 2U ) ); + BOOST_REQUIRE_NO_THROW( stub->createBlock( + ConsensusExtFace::transactions_vector{ tx1.toBytes(), tx2.toBytes() }, utcTime(), 2U ) ); REQUIRE_BLOCK_INCREASE( 1 ); REQUIRE_BLOCK_SIZE( 2, 2 ); @@ -1241,7 +1263,6 @@ BOOST_AUTO_TEST_CASE( partialCatchUp } BOOST_AUTO_TEST_CASE( getBlockRandom ) { - SkaleHostFixture fixture; auto& skaleHost = fixture.skaleHost; @@ -1253,7 +1274,6 @@ BOOST_AUTO_TEST_CASE( getBlockRandom ) { } BOOST_AUTO_TEST_CASE( getIMABLSPUblicKey ) { - SkaleHostFixture fixture; auto& skaleHost = fixture.skaleHost; @@ -1261,15 +1281,19 @@ BOOST_AUTO_TEST_CASE( getIMABLSPUblicKey ) { auto res = exec( bytesConstRef() ); std::array< std::string, 4 > imaBLSPublicKey = skaleHost->getIMABLSPublicKey(); BOOST_REQUIRE( res.first ); - BOOST_REQUIRE( res.second == toBigEndian( dev::u256( imaBLSPublicKey[0] ) ) + toBigEndian( dev::u256( imaBLSPublicKey[1] ) ) + toBigEndian( dev::u256( imaBLSPublicKey[2] ) ) + toBigEndian( dev::u256( imaBLSPublicKey[3] ) ) ); + BOOST_REQUIRE( res.second == toBigEndian( dev::u256( imaBLSPublicKey[0] ) ) + + toBigEndian( dev::u256( imaBLSPublicKey[1] ) ) + + toBigEndian( dev::u256( imaBLSPublicKey[2] ) ) + + toBigEndian( dev::u256( imaBLSPublicKey[3] ) ) ); } -struct dummy{}; +struct dummy {}; // Test behavior of MTM if tx with big nonce was already mined as erroneous -BOOST_FIXTURE_TEST_CASE( mtmAfterBigNonceMined, dummy, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { - SkaleHostFixture fixture( std::map( {{"multiTransactionMode", "1"}} ) ); +BOOST_FIXTURE_TEST_CASE( + mtmAfterBigNonceMined, dummy, *boost::unit_test::precondition( dev::test::run_not_express ) ) { + SkaleHostFixture fixture( + std::map< std::string, std::string >( { { "multiTransactionMode", "1" } } ) ); auto& client = fixture.client; auto& coinbase = fixture.coinbase; @@ -1301,14 +1325,14 @@ BOOST_FIXTURE_TEST_CASE( mtmAfterBigNonceMined, dummy, sleep( 1 ); ConsensusExtFace::transactions_vector proposal = stub->pendingTransactions( 100 ); // and not proposed - BOOST_REQUIRE_EQUAL(proposal.size(), 0); + BOOST_REQUIRE_EQUAL( proposal.size(), 0 ); CHECK_NONCE_BEGIN( senderAddress ); CHECK_BLOCK_BEGIN; // simulate it coming from another node - BOOST_REQUIRE_NO_THROW( - stub->createBlock( ConsensusExtFace::transactions_vector{tx1.toBytes()}, utcTime(), 1U ) ); + BOOST_REQUIRE_NO_THROW( stub->createBlock( + ConsensusExtFace::transactions_vector{ tx1.toBytes() }, utcTime(), 1U ) ); REQUIRE_BLOCK_SIZE( 1, 1 ); REQUIRE_BLOCK_TRANSACTION( 1, 0, tx1Hash ); @@ -1327,10 +1351,10 @@ BOOST_FIXTURE_TEST_CASE( mtmAfterBigNonceMined, dummy, skaleHost->receiveTransaction( toJS( tx2.toBytes() ) ); sleep( 1 ); proposal = stub->pendingTransactions( 100 ); - BOOST_REQUIRE_EQUAL(proposal.size(), 2); + BOOST_REQUIRE_EQUAL( proposal.size(), 2 ); BOOST_REQUIRE_NO_THROW( - stub->createBlock( ConsensusExtFace::transactions_vector{proposal[0]}, utcTime(), 2U ) ); + stub->createBlock( ConsensusExtFace::transactions_vector{ proposal[0] }, utcTime(), 2U ) ); REQUIRE_BLOCK_INCREASE( 2 ); REQUIRE_BLOCK_SIZE( 2, 1 ); @@ -1340,17 +1364,15 @@ BOOST_FIXTURE_TEST_CASE( mtmAfterBigNonceMined, dummy, // 3 submit nonce = 1 again! // it should go to proposal - BOOST_REQUIRE_THROW( - skaleHost->receiveTransaction( toJS( tx1.toBytes() ) ), - dev::eth::PendingTransactionAlreadyExists - ); + BOOST_REQUIRE_THROW( skaleHost->receiveTransaction( toJS( tx1.toBytes() ) ), + dev::eth::PendingTransactionAlreadyExists ); sleep( 1 ); proposal = stub->pendingTransactions( 100 ); - BOOST_REQUIRE_EQUAL(proposal.size(), 1); + BOOST_REQUIRE_EQUAL( proposal.size(), 1 ); // submit it for sure BOOST_REQUIRE_NO_THROW( - stub->createBlock( ConsensusExtFace::transactions_vector{proposal[0]}, utcTime(), 3U ) ); + stub->createBlock( ConsensusExtFace::transactions_vector{ proposal[0] }, utcTime(), 3U ) ); } BOOST_AUTO_TEST_SUITE_END() diff --git a/test/unittests/libethereum/StateUnitTests.cpp b/test/unittests/libethereum/StateUnitTests.cpp index 413894e0c..f7729bd09 100644 --- a/test/unittests/libethereum/StateUnitTests.cpp +++ b/test/unittests/libethereum/StateUnitTests.cpp @@ -36,20 +36,19 @@ namespace dev { namespace test { BOOST_FIXTURE_TEST_SUITE( StateUnitTests, TestOutputHelperFixture ) -BOOST_AUTO_TEST_CASE( Basic, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( Basic, *boost::unit_test::precondition( dev::test::run_not_express ) ) { Block s( Block::Null ); } BOOST_AUTO_TEST_CASE( LoadAccountCode ) { - Address addr{"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}; + Address addr{ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" }; State state( 0 ); - State s = state.createStateModifyCopy(); + State s = state.createStateCopyAndClearCaches(); s.createContract( addr ); - uint8_t codeData[] = {'c', 'o', 'd', 'e'}; + uint8_t codeData[] = { 'c', 'o', 'd', 'e' }; u256 version = 123; - s.setCode( addr, {std::begin( codeData ), std::end( codeData )}, version ); - s.commit(dev::eth::CommitBehaviour::RemoveEmptyAccounts ); + s.setCode( addr, { std::begin( codeData ), std::end( codeData ) }, version ); + s.commit( dev::eth::CommitBehaviour::RemoveEmptyAccounts ); auto& loadedCode = s.code( addr ); BOOST_CHECK( @@ -61,12 +60,12 @@ class AddressRangeTestFixture : public TestOutputHelperFixture { AddressRangeTestFixture() { // get some random addresses and their hashes for ( unsigned i = 0; i < addressCount; ++i ) { - Address addr{i}; + Address addr{ i }; hashToAddress[sha3( addr )] = addr; } // create accounts in the state - State writer = state.createStateModifyCopy(); + State writer = state.createStateCopyAndClearCaches(); for ( auto const& hashAndAddr : hashToAddress ) writer.addBalance( hashAndAddr.second, 100 ); writer.commit( dev::eth::CommitBehaviour::RemoveEmptyAccounts ); @@ -81,10 +80,10 @@ class AddressRangeTestFixture : public TestOutputHelperFixture { BOOST_FIXTURE_TEST_SUITE( StateAddressRangeTests, AddressRangeTestFixture ) -BOOST_AUTO_TEST_CASE( addressesReturnsAllAddresses, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( + addressesReturnsAllAddresses, *boost::unit_test::precondition( dev::test::run_not_express ) ) { std::pair< State::AddressMap, h256 > addressesAndNextKey = - state.createStateReadOnlyCopy().addresses( h256{}, addressCount * 2 ); + state.addresses( h256{}, addressCount * 2 ); State::AddressMap addresses = addressesAndNextKey.first; BOOST_CHECK_EQUAL( addresses.size(), addressCount ); @@ -95,7 +94,7 @@ BOOST_AUTO_TEST_CASE( addressesReturnsAllAddresses, BOOST_AUTO_TEST_CASE( addressesReturnsNoMoreThanRequested ) { uint maxResults = 3; std::pair< State::AddressMap, h256 > addressesAndNextKey = - state.createStateReadOnlyCopy().addresses( h256{}, maxResults ); + state.addresses( h256{}, maxResults ); State::AddressMap& addresses = addressesAndNextKey.first; h256& nextKey = addressesAndNextKey.second; @@ -106,7 +105,7 @@ BOOST_AUTO_TEST_CASE( addressesReturnsNoMoreThanRequested ) { // request next chunk std::pair< State::AddressMap, h256 > addressesAndNextKey2 = - state.createStateReadOnlyCopy().addresses( nextKey, maxResults ); + state.addresses( nextKey, maxResults ); State::AddressMap& addresses2 = addressesAndNextKey2.first; BOOST_CHECK_EQUAL( addresses2.size(), maxResults ); auto itHashToAddressEnd2 = std::next( itHashToAddressEnd, maxResults ); @@ -114,7 +113,7 @@ BOOST_AUTO_TEST_CASE( addressesReturnsNoMoreThanRequested ) { } BOOST_AUTO_TEST_CASE( addressesDoesntReturnDeletedInCache ) { - State s = state.createStateReadOnlyCopy(); + State s = state; // delete some accounts unsigned deleteCount = 3; @@ -131,15 +130,15 @@ BOOST_AUTO_TEST_CASE( addressesDoesntReturnDeletedInCache ) { } BOOST_AUTO_TEST_CASE( addressesReturnsCreatedInCache, - + *boost::unit_test::precondition( dev::test::run_not_express ) ) { - State s = state.createStateReadOnlyCopy(); + State s = state; // create some accounts unsigned createCount = 3; std::map< h256, Address > newHashToAddress; for ( unsigned i = addressCount; i < addressCount + createCount; ++i ) { - Address addr{i}; + Address addr{ i }; newHashToAddress[sha3( addr )] = addr; } diff --git a/test/unittests/libethereum/Transaction.cpp b/test/unittests/libethereum/Transaction.cpp index 3104cc46f..4f5347187 100644 --- a/test/unittests/libethereum/Transaction.cpp +++ b/test/unittests/libethereum/Transaction.cpp @@ -33,8 +33,8 @@ using namespace dev::test; BOOST_FIXTURE_TEST_SUITE( libethereum, TestOutputHelperFixture ) -BOOST_AUTO_TEST_CASE( TransactionGasRequired, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( + TransactionGasRequired, *boost::unit_test::precondition( dev::test::run_not_express ) ) { // Transaction data is 0358ac39584bc98a7c979f984b03, 14 bytes Transaction tr( fromHex( "0xf86d800182521c94095e7baea6a6c7c4c2dfeb977efac326af552d870a8e0358ac39584bc98a7c9" @@ -44,25 +44,25 @@ BOOST_AUTO_TEST_CASE( TransactionGasRequired, BOOST_CHECK_EQUAL( tr.baseGasRequired( HomesteadSchedule ), 14 * 68 + 21000 ); BOOST_CHECK_EQUAL( tr.baseGasRequired( IstanbulSchedule ), 14 * 16 + 21000 ); - tr = Transaction ( - fromHex( "0x01f8d18197808504a817c800827530947d36af85a184e220a656525fcbb9a63b9ab3c12b018" - "e0358ac39584bc98a7c979f984b03f85bf85994de0b295669a9fd93d5f28d9ec85e40f4cb697b" - "aef842a00000000000000000000000000000000000000000000000000000000000000003a0000" - "000000000000000000000000000000000000000000000000000000000000780a08ae3a721ee02" - "cf52d85ecec934c6f46ea3e96d6355eb8ccde261e1e419885761a0234565f6d227d8eba0937b0" - "f03cb25f83aeb24c13b7a39a9ef6e80c1ea272a3c" ), - CheckTransaction::None, false, true ); + tr = Transaction( + fromHex( "0x01f8d18197808504a817c800827530947d36af85a184e220a656525fcbb9a63b9ab3c12b018" + "e0358ac39584bc98a7c979f984b03f85bf85994de0b295669a9fd93d5f28d9ec85e40f4cb697b" + "aef842a00000000000000000000000000000000000000000000000000000000000000003a0000" + "000000000000000000000000000000000000000000000000000000000000780a08ae3a721ee02" + "cf52d85ecec934c6f46ea3e96d6355eb8ccde261e1e419885761a0234565f6d227d8eba0937b0" + "f03cb25f83aeb24c13b7a39a9ef6e80c1ea272a3c" ), + CheckTransaction::None, false, true ); BOOST_CHECK_EQUAL( tr.baseGasRequired( HomesteadSchedule ), 14 * 68 + 21000 ); BOOST_CHECK_EQUAL( tr.baseGasRequired( IstanbulSchedule ), 14 * 16 + 21000 ); - tr = Transaction ( - fromHex( "0x02f8d78197808504a817c8008504a817c800827530947d36af85a184e220a656525fcbb9a63" - "b9ab3c12b018e0358ac39584bc98a7c979f984b03f85bf85994de0b295669a9fd93d5f28d9ec8" - "5e40f4cb697baef842a0000000000000000000000000000000000000000000000000000000000" - "0000003a0000000000000000000000000000000000000000000000000000000000000000780a0" - "23927f0e208494bd1fd8876597899d72025167fed902e9c1c417ddd8639bb7b4a02a63ea48f7e" - "94df3a40c4a840ba98da02f13817acb5fe137d40f632e6c8ed367" ), - CheckTransaction::None, false, true ); + tr = Transaction( + fromHex( "0x02f8d78197808504a817c8008504a817c800827530947d36af85a184e220a656525fcbb9a63" + "b9ab3c12b018e0358ac39584bc98a7c979f984b03f85bf85994de0b295669a9fd93d5f28d9ec8" + "5e40f4cb697baef842a0000000000000000000000000000000000000000000000000000000000" + "0000003a0000000000000000000000000000000000000000000000000000000000000000780a0" + "23927f0e208494bd1fd8876597899d72025167fed902e9c1c417ddd8639bb7b4a02a63ea48f7e" + "94df3a40c4a840ba98da02f13817acb5fe137d40f632e6c8ed367" ), + CheckTransaction::None, false, true ); BOOST_CHECK_EQUAL( tr.baseGasRequired( HomesteadSchedule ), 14 * 68 + 21000 ); BOOST_CHECK_EQUAL( tr.baseGasRequired( IstanbulSchedule ), 14 * 16 + 21000 ); } @@ -95,7 +95,8 @@ BOOST_AUTO_TEST_CASE( TransactionWithEmptyRecepient ) { "000003a0000000000000000000000000000000000000000000000000000000000000000780a08d795591e0eb53" "fb374a804ba3f73cf291069549d62316219811c3f7fb8cfad0a07e9d0bd7fabc8f74475624c912b5334dc49224" "b1dede6c802d52a35254bfc457" ); - BOOST_REQUIRE_THROW( Transaction( txRlp, CheckTransaction::None, false, true ), InvalidTransactionFormat ); + BOOST_REQUIRE_THROW( + Transaction( txRlp, CheckTransaction::None, false, true ), InvalidTransactionFormat ); txRlp = fromHex( "0x02f8c38197808504a817c8008504a817c80082753080018e0358ac39584bc98a7c979f984b03f85bf85994de" @@ -112,11 +113,12 @@ BOOST_AUTO_TEST_CASE( TransactionWithEmptyRecepient ) { "000000000000000003a0000000000000000000000000000000000000000000000000000000000000000780a0c8" "029a8b702d54c79ef18b557e755a1bfd8a4afcfcf31813790df34a6f740a95a00ceb8fdf611b4c9ff8d007d2a5" "44bc4bfae0e97a03e32b1c8b8208c82cebcafb" ); - BOOST_REQUIRE_THROW( Transaction( txRlp, CheckTransaction::None, false, true ), InvalidTransactionFormat ); + BOOST_REQUIRE_THROW( + Transaction( txRlp, CheckTransaction::None, false, true ), InvalidTransactionFormat ); } -BOOST_AUTO_TEST_CASE( TransactionNotReplayProtected, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( + TransactionNotReplayProtected, *boost::unit_test::precondition( dev::test::run_not_express ) ) { auto txRlp = fromHex( "0xf86d800182521c94095e7baea6a6c7c4c2dfeb977efac326af552d870a8e0358ac39584bc98a7c979f984b03" "1ba048b55bfa915ac795c431978d8a6a992b628d557da5ff759b307d495a36649353a0efffd310ac743f371de3" @@ -127,31 +129,31 @@ BOOST_AUTO_TEST_CASE( TransactionNotReplayProtected, BOOST_REQUIRE( tx.toBytes() == txRlp ); txRlp = fromHex( - "0x01f8ce8504a817c800827530947d36af85a184e220a656525fcbb9a63b9ab3c12b018e0358ac3958" - "4bc98a7c979f984b03f85bf85994de0b295669a9fd93d5f28d9ec85e40f4cb697baef842a0000000000000" - "0000000000000000000000000000000000000000000000000003a000000000000000000000000000000000" - "0000000000000000000000000000000701a0a3b1de6f2958e1e34db86438bba310637f2e799fe9768a143a" - "d87e47c33d1e6ca00e04ef9fe6bb01176c5a4c5bf4a070662478a320eaaff2895d17451c8d61d472" ); + "0x01f8ce8504a817c800827530947d36af85a184e220a656525fcbb9a63b9ab3c12b018e0358ac3958" + "4bc98a7c979f984b03f85bf85994de0b295669a9fd93d5f28d9ec85e40f4cb697baef842a0000000000000" + "0000000000000000000000000000000000000000000000000003a000000000000000000000000000000000" + "0000000000000000000000000000000701a0a3b1de6f2958e1e34db86438bba310637f2e799fe9768a143a" + "d87e47c33d1e6ca00e04ef9fe6bb01176c5a4c5bf4a070662478a320eaaff2895d17451c8d61d472" ); BOOST_REQUIRE_THROW( Transaction( txRlp, CheckTransaction::None, false, true ), dev::BadCast ); txRlp = fromHex( - "0x02f8d5808504a817c8008504a817c800827530947d36af85a184e220a656525fcbb9a63b9ab3c12b" - "018e0358ac39584bc98a7c979f984b03f85bf85994de0b295669a9fd93d5f28d9ec85e40f4cb697baef842" - "a00000000000000000000000000000000000000000000000000000000000000003a0000000000000000000" - "000000000000000000000000000000000000000000000780a023927f0e208494bd1fd8876597899d720251" - "67fed902e9c1c417ddd8639bb7b4a02a63ea48f7e94df3a40c4a840ba98da02f13817acb5fe137d40f632e" - "6c8ed367" ); + "0x02f8d5808504a817c8008504a817c800827530947d36af85a184e220a656525fcbb9a63b9ab3c12b" + "018e0358ac39584bc98a7c979f984b03f85bf85994de0b295669a9fd93d5f28d9ec85e40f4cb697baef842" + "a00000000000000000000000000000000000000000000000000000000000000003a0000000000000000000" + "000000000000000000000000000000000000000000000780a023927f0e208494bd1fd8876597899d720251" + "67fed902e9c1c417ddd8639bb7b4a02a63ea48f7e94df3a40c4a840ba98da02f13817acb5fe137d40f632e" + "6c8ed367" ); BOOST_REQUIRE_THROW( Transaction( txRlp, CheckTransaction::None, false, true ), dev::BadCast ); } -BOOST_AUTO_TEST_CASE( TransactionChainIDMax64Bit, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( + TransactionChainIDMax64Bit, *boost::unit_test::precondition( dev::test::run_not_express ) ) { // recoveryID = 0, v = 36893488147419103265 auto txRlp1 = fromHex( "0xf86e808698852840a46f82d6d894095e7baea6a6c7c4c2dfeb977efac326af552d8780808902000000000000" "0021a098ff921201554726367d2be8c804a7ff89ccf285ebc57dff8ae4c44b9c19ac4aa01887321be575c8095f" "789dd4c743dfe42c1820f9231f98a962b210e3ac2452a3" ); - Transaction tx1{txRlp1, CheckTransaction::None}; + Transaction tx1{ txRlp1, CheckTransaction::None }; tx1.checkChainId( std::numeric_limits< uint64_t >::max(), false ); // recoveryID = 1, v = 36893488147419103266 @@ -159,7 +161,7 @@ BOOST_AUTO_TEST_CASE( TransactionChainIDMax64Bit, "0xf86e808698852840a46f82d6d894095e7baea6a6c7c4c2dfeb977efac326af552d8780808902000000000000" "0022a098ff921201554726367d2be8c804a7ff89ccf285ebc57dff8ae4c44b9c19ac4aa01887321be575c8095f" "789dd4c743dfe42c1820f9231f98a962b210e3ac2452a3" ); - Transaction tx2{txRlp2, CheckTransaction::None}; + Transaction tx2{ txRlp2, CheckTransaction::None }; tx2.checkChainId( std::numeric_limits< uint64_t >::max(), false ); txRlp1 = fromHex( @@ -168,7 +170,7 @@ BOOST_AUTO_TEST_CASE( TransactionChainIDMax64Bit, "000000000000000000000000000000000000000000000000000000000003a00000000000000000000000000000" "00000000000000000000000000000000000701a0e236de02b843139aebfce593d680c06ce79cfd2f2e7f9dcac9" "fe23b38060591aa0734952245446ad42e47ec996c9a7b02973cbc8dd944c9622714416b2bef122f4" ); - tx1 = Transaction{txRlp1, CheckTransaction::None, false, true}; + tx1 = Transaction{ txRlp1, CheckTransaction::None, false, true }; tx1.checkChainId( std::numeric_limits< uint64_t >::max(), false ); txRlp1 = fromHex( @@ -178,7 +180,7 @@ BOOST_AUTO_TEST_CASE( TransactionChainIDMax64Bit, "00000000000000000000000000000000000000000000000780a0b62465e633b565f2f3632125b452d8df66d4f6" "b48b58f59da6201234e3f9ce75a0467f18ca2b64f3642cb37e7d5470bbac5fbc62c66b23a0ff955b994803fcf3" "74" ); - tx1 = Transaction{txRlp1, CheckTransaction::None, false, true}; + tx1 = Transaction{ txRlp1, CheckTransaction::None, false, true }; tx1.checkChainId( std::numeric_limits< uint64_t >::max(), false ); } @@ -205,7 +207,7 @@ BOOST_AUTO_TEST_CASE( TransactionChainIDBiggerThan64Bit ) { "8827f497375ae5c8a0795eb0b4f36fe712af5e6a8447802c9eb0913a2add86174552bf2e4b0e183feb" ); RLPStream rlpStream; auto tx = Transaction( txRlp1, CheckTransaction::None, false, true ); - auto txBytes = tx.toBytes(IncludeSignature::WithSignature); + auto txBytes = tx.toBytes( IncludeSignature::WithSignature ); BOOST_REQUIRE( txBytes != txRlp1 ); txRlp1 = fromHex( @@ -216,7 +218,7 @@ BOOST_AUTO_TEST_CASE( TransactionChainIDBiggerThan64Bit ) { "4eb34e2500c924a58ccfdc9dbeb4a04afcffcb5d1897df030d45a7eeb3ceb7c7e6fe368fc47865156b4899de32" "01c7" ); tx = Transaction( txRlp1, CheckTransaction::None, false, true ); - txBytes = tx.toBytes(IncludeSignature::WithSignature); + txBytes = tx.toBytes( IncludeSignature::WithSignature ); BOOST_REQUIRE( txBytes != txRlp1 ); } @@ -229,7 +231,7 @@ BOOST_AUTO_TEST_CASE( TransactionReplayProtected ) { tx.checkChainId( 1, false ); BOOST_REQUIRE_THROW( tx.checkChainId( 123, false ), InvalidSignature ); - auto txBytes = tx.toBytes(IncludeSignature::WithSignature); + auto txBytes = tx.toBytes( IncludeSignature::WithSignature ); BOOST_REQUIRE( txBytes == txRlp ); txRlp = fromHex( @@ -241,7 +243,7 @@ BOOST_AUTO_TEST_CASE( TransactionReplayProtected ) { tx = Transaction( txRlp, CheckTransaction::None, false, true ); tx.checkChainId( 151, false ); BOOST_REQUIRE_THROW( tx.checkChainId( 123, false ), InvalidSignature ); - + BOOST_REQUIRE( tx.toBytes() == txRlp ); txRlp = fromHex( @@ -253,13 +255,14 @@ BOOST_AUTO_TEST_CASE( TransactionReplayProtected ) { tx = Transaction( txRlp, CheckTransaction::None, false, true ); tx.checkChainId( 151, false ); BOOST_REQUIRE_THROW( tx.checkChainId( 123, false ), InvalidSignature ); - + BOOST_REQUIRE( tx.toBytes() == txRlp ); } BOOST_AUTO_TEST_CASE( accessList ) { // [ { 'address': HexBytes( "0xde0b295669a9fd93d5f28d9ec85e40f4cb697bae" ), - // 'storageKeys': ( "0x0000000000000000000000000000000000000000000000000000000000000003", "0x0000000000000000000000000000000000000000000000000000000000000007" ) } ] + // 'storageKeys': ( "0x0000000000000000000000000000000000000000000000000000000000000003", + // "0x0000000000000000000000000000000000000000000000000000000000000007" ) } ] auto txRlp = fromHex( "0x01f8c38197018504a817c800827530947d36af85a184e220a656525fcbb9a63b9ab3c12b0180f85bf85994de" "0b295669a9fd93d5f28d9ec85e40f4cb697baef842a00000000000000000000000000000000000000000000000" @@ -291,11 +294,12 @@ BOOST_AUTO_TEST_CASE( accessList ) { "0x01f8678197808504a817c800827530947d36af85a184e220a656525fcbb9a63b9ab3c12b01808001a01ebdc5" "46c8b85511b7ba831f47c4981069d7af972d10b7dce2c57225cb5df6a7a055ae1e84fea41d37589eb740a0a930" "17a5cd0e9f10ee50f165bf4b1b4c78ddae" ); - BOOST_REQUIRE_THROW( Transaction( txRlp, CheckTransaction::None, false, true ), InvalidTransactionFormat ); + BOOST_REQUIRE_THROW( + Transaction( txRlp, CheckTransaction::None, false, true ), InvalidTransactionFormat ); } -BOOST_AUTO_TEST_CASE( ExecutionResultOutput, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( + ExecutionResultOutput, *boost::unit_test::precondition( dev::test::run_not_express ) ) { std::stringstream buffer; ExecutionResult exRes; @@ -462,8 +466,7 @@ BOOST_AUTO_TEST_CASE( GettingSignatureForUnsignedTransactionThrows, BOOST_AUTO_TEST_CASE( StreamRLPWithSignatureForUnsignedTransactionThrows ) { Transaction tx( 0, 0, 10000, Address( "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" ), bytes(), 0 ); - BOOST_REQUIRE_THROW( - tx.toBytes( IncludeSignature::WithSignature ), TransactionIsUnsigned ); + BOOST_REQUIRE_THROW( tx.toBytes( IncludeSignature::WithSignature ), TransactionIsUnsigned ); } BOOST_AUTO_TEST_CASE( CheckLowSForUnsignedTransactionThrows, diff --git a/test/unittests/libethereum/TransactionQueue.cpp b/test/unittests/libethereum/TransactionQueue.cpp index ee0dd8762..fedd68f62 100644 --- a/test/unittests/libethereum/TransactionQueue.cpp +++ b/test/unittests/libethereum/TransactionQueue.cpp @@ -94,39 +94,39 @@ BOOST_AUTO_TEST_CASE( tqPriority ) { Transaction tx5( 0, gasCostHigh, gas, dest, bytes(), 2, sender2 ); txq.import( tx0 ); - BOOST_CHECK( Transactions{tx0} == txq.topTransactions( 256 ) ); + BOOST_CHECK( Transactions{ tx0 } == txq.topTransactions( 256 ) ); txq.import( tx0 ); - BOOST_CHECK( Transactions{tx0} == txq.topTransactions( 256 ) ); + BOOST_CHECK( Transactions{ tx0 } == txq.topTransactions( 256 ) ); txq.import( tx0_1 ); - BOOST_CHECK( Transactions{tx0} == txq.topTransactions( 256 ) ); // no replacement any more! + BOOST_CHECK( Transactions{ tx0 } == txq.topTransactions( 256 ) ); // no replacement any more! txq.import( tx1 ); - BOOST_CHECK( ( Transactions{tx0, tx1} ) == txq.topTransactions( 256 ) ); + BOOST_CHECK( ( Transactions{ tx0, tx1 } ) == txq.topTransactions( 256 ) ); txq.import( tx2 ); - BOOST_CHECK( ( Transactions{tx2, tx0, tx1} ) == txq.topTransactions( 256 ) ); + BOOST_CHECK( ( Transactions{ tx2, tx0, tx1 } ) == txq.topTransactions( 256 ) ); txq.import( tx3 ); - BOOST_CHECK( ( Transactions{tx2, tx0, tx1, tx3} ) == txq.topTransactions( 256 ) ); + BOOST_CHECK( ( Transactions{ tx2, tx0, tx1, tx3 } ) == txq.topTransactions( 256 ) ); txq.import( tx4 ); - BOOST_CHECK( ( Transactions{tx2, tx0, tx1, tx3, tx4} ) == txq.topTransactions( 256 ) ); + BOOST_CHECK( ( Transactions{ tx2, tx0, tx1, tx3, tx4 } ) == txq.topTransactions( 256 ) ); txq.import( tx5 ); - BOOST_CHECK( ( Transactions{tx2, tx0, tx1, tx3, tx5, tx4} ) == txq.topTransactions( 256 ) ); + BOOST_CHECK( ( Transactions{ tx2, tx0, tx1, tx3, tx5, tx4 } ) == txq.topTransactions( 256 ) ); txq.drop( tx0.sha3() ); // prev BOOST_CHECK( ( Transactions{tx2, tx1, tx3, tx5, tx4} ) == txq.topTransactions( 256 ) ); // now tx4 has nonce increase 1, and goes lower then tx5 and tx3 - BOOST_CHECK( ( Transactions{tx2, tx1, tx4, tx3, tx5} ) == txq.topTransactions( 256 ) ); + BOOST_CHECK( ( Transactions{ tx2, tx1, tx4, tx3, tx5 } ) == txq.topTransactions( 256 ) ); txq.drop( tx1.sha3() ); - BOOST_CHECK( ( Transactions{tx2, tx4, tx3, tx5} ) == txq.topTransactions( 256 ) ); + BOOST_CHECK( ( Transactions{ tx2, tx4, tx3, tx5 } ) == txq.topTransactions( 256 ) ); txq.drop( tx5.sha3() ); - BOOST_CHECK( ( Transactions{tx2, tx4, tx3} ) == txq.topTransactions( 256 ) ); + BOOST_CHECK( ( Transactions{ tx2, tx4, tx3 } ) == txq.topTransactions( 256 ) ); Transaction tx6( 0, gasCostMed, gas, dest, bytes(), 20, sender1 ); txq.import( tx6 ); - BOOST_CHECK( ( Transactions{tx2, tx4, tx3, tx6} ) == txq.topTransactions( 256 ) ); + BOOST_CHECK( ( Transactions{ tx2, tx4, tx3, tx6 } ) == txq.topTransactions( 256 ) ); Transaction tx7( 0, gasCostHigh, gas, dest, bytes(), 2, sender2 ); txq.import( tx7 ); // deterministic signature: hash of tx5 and tx7 will be same - BOOST_CHECK( ( Transactions{tx2, tx4, tx3, tx6} ) == txq.topTransactions( 256 ) ); + BOOST_CHECK( ( Transactions{ tx2, tx4, tx3, tx6 } ) == txq.topTransactions( 256 ) ); } BOOST_AUTO_TEST_CASE( tqNonceChange ) { @@ -149,29 +149,29 @@ BOOST_AUTO_TEST_CASE( tqNonceChange ) { Transaction tx23( 0, gasCost, gas, dest, bytes(), 3, sender2 ); // 1 insert 0,1,2 for both senders - txq.import( tx20 ); // h = 0 - txq.import( tx21 ); // h = 1 - txq.import( tx22 ); // h = 2 - txq.import( tx10 ); // h = 0 - txq.import( tx11 ); // h = 1 - txq.import( tx12 ); // h = 2 - txq.import( tx13 ); // h = 3 + txq.import( tx20 ); // h = 0 + txq.import( tx21 ); // h = 1 + txq.import( tx22 ); // h = 2 + txq.import( tx10 ); // h = 0 + txq.import( tx11 ); // h = 1 + txq.import( tx12 ); // h = 2 + txq.import( tx13 ); // h = 3 // 2 increase nonce for account 2 txq.dropGood( tx20 ); txq.dropGood( tx21 ); // 3 insert tx with height = 3-2=1 - txq.import( tx23 ); // h = 1 => goes with tx11 + txq.import( tx23 ); // h = 1 => goes with tx11 - Transactions top6 = txq.topTransactions(6); - for(auto tx: top6){ + Transactions top6 = txq.topTransactions( 6 ); + for ( auto tx : top6 ) { std::cout << tx.from() << " " << tx.nonce() << std::endl; } // expected BAD result [tx10], [tx11, tx23], [tx12, tx22], [tx13] !!! - // prev without sort BOOST_REQUIRE( ( Transactions{tx10, tx11, tx22, tx23, tx12, tx13 } ) == top6 ); - // with sort: - BOOST_REQUIRE( ( Transactions{tx10, tx22, tx11, tx23, tx12, tx13 } ) == top6 ); + // prev without sort BOOST_REQUIRE( ( Transactions{tx10, tx11, tx22, tx23, tx12, tx13 } ) == + // top6 ); with sort: + BOOST_REQUIRE( ( Transactions{ tx10, tx22, tx11, tx23, tx12, tx13 } ) == top6 ); } BOOST_AUTO_TEST_CASE( tqFuture ) { @@ -193,10 +193,10 @@ BOOST_AUTO_TEST_CASE( tqFuture ) { txq.import( tx2 ); txq.import( tx3 ); txq.import( tx4 ); - BOOST_CHECK( ( Transactions{tx0, tx1, tx2, tx3, tx4} ) == txq.topTransactions( 256 ) ); + BOOST_CHECK( ( Transactions{ tx0, tx1, tx2, tx3, tx4 } ) == txq.topTransactions( 256 ) ); txq.setFuture( tx2.sha3() ); - BOOST_CHECK( ( Transactions{tx0, tx1} ) == txq.topTransactions( 256 ) ); + BOOST_CHECK( ( Transactions{ tx0, tx1 } ) == txq.topTransactions( 256 ) ); // TODO disabled it temporarily!! // Transaction tx2_2( 1, gasCostMed, gas, dest, bytes(), 2, sender ); @@ -226,7 +226,7 @@ BOOST_AUTO_TEST_CASE( tqLimits ) { txq.import( tx3 ); txq.import( tx4 ); txq.import( tx5 ); - BOOST_CHECK( ( Transactions{tx5, tx0, tx1} ) == txq.topTransactions( 256 ) ); + BOOST_CHECK( ( Transactions{ tx5, tx0, tx1 } ) == txq.topTransactions( 256 ) ); } BOOST_AUTO_TEST_CASE( tqImport ) { @@ -234,15 +234,15 @@ BOOST_AUTO_TEST_CASE( tqImport ) { TransactionQueue tq; h256Hash known = tq.knownTransactions(); BOOST_REQUIRE( known.size() == 0 ); - + ImportResult ir = tq.import( testTransaction.transaction().toBytes() ); BOOST_REQUIRE( ir == ImportResult::Success ); known = tq.knownTransactions(); BOOST_REQUIRE( known.size() == 1 ); - + ir = tq.import( testTransaction.transaction().toBytes() ); BOOST_REQUIRE( ir == ImportResult::AlreadyKnown ); - + bytes rlp = testTransaction.transaction().toBytes(); rlp.at( 0 ) = 03; ir = tq.import( rlp ); @@ -254,13 +254,13 @@ BOOST_AUTO_TEST_CASE( tqImport ) { TestTransaction testTransaction2 = TestTransaction::defaultTransaction( 1, 2 ); TestTransaction testTransaction3 = TestTransaction::defaultTransaction( 1, 1 ); TestTransaction testTransaction4 = TestTransaction::defaultTransaction( 1, 4 ); - + ir = tq.import( testTransaction2.transaction().toBytes() ); BOOST_REQUIRE( ir == ImportResult::SameNonceAlreadyInQueue ); - + ir = tq.import( testTransaction3.transaction().toBytes() ); BOOST_REQUIRE( ir == ImportResult::AlreadyKnown ); - + ir = tq.import( testTransaction4.transaction().toBytes() ); known = tq.knownTransactions(); BOOST_REQUIRE( known.size() == 1 ); @@ -283,22 +283,22 @@ BOOST_AUTO_TEST_CASE( tqImportFuture ) { TransactionQueue::Status status = tq.status(); BOOST_REQUIRE( status.future == 0 ); - TestTransaction tx1 = TestTransaction::defaultTransaction(4); + TestTransaction tx1 = TestTransaction::defaultTransaction( 4 ); Address sender = tx1.transaction().sender(); - u256 maxNonce = tq.maxNonce(sender); + u256 maxNonce = tq.maxNonce( sender ); BOOST_REQUIRE( maxNonce == 0 ); - u256 waiting = tq.waiting(sender); + u256 waiting = tq.waiting( sender ); BOOST_REQUIRE( waiting == 0 ); - + ImportResult ir1 = tq.import( tx1.transaction().toBytes(), IfDropped::Ignore, true ); BOOST_REQUIRE( ir1 == ImportResult::Success ); known = tq.knownTransactions(); BOOST_REQUIRE( known.size() == 1 ); status = tq.status(); BOOST_REQUIRE( status.future == 1 ); - maxNonce = tq.maxNonce(sender); + maxNonce = tq.maxNonce( sender ); BOOST_REQUIRE( maxNonce == 5 ); - waiting = tq.waiting(sender); + waiting = tq.waiting( sender ); BOOST_REQUIRE( waiting == 1 ); // HACK it's now allowed to repeat future transaction (can put it to current) @@ -308,65 +308,67 @@ BOOST_AUTO_TEST_CASE( tqImportFuture ) { BOOST_REQUIRE( known.size() == 1 ); status = tq.status(); BOOST_REQUIRE( status.future == 1 ); - maxNonce = tq.maxNonce(sender); + maxNonce = tq.maxNonce( sender ); BOOST_REQUIRE( maxNonce == 5 ); - waiting = tq.waiting(sender); + waiting = tq.waiting( sender ); BOOST_REQUIRE( waiting == 1 ); - + bytes rlp = tx1.transaction().toBytes(); rlp.at( 0 ) = 03; ir1 = tq.import( rlp, IfDropped::Ignore, true ); BOOST_REQUIRE( ir1 == ImportResult::Malformed ); - TestTransaction tx2 = TestTransaction::defaultTransaction(2); + TestTransaction tx2 = TestTransaction::defaultTransaction( 2 ); ImportResult ir2 = tq.import( tx2.transaction().toBytes(), IfDropped::Ignore, true ); BOOST_REQUIRE( ir2 == ImportResult::Success ); known = tq.knownTransactions(); BOOST_REQUIRE( known.size() == 2 ); - maxNonce = tq.maxNonce(sender); + maxNonce = tq.maxNonce( sender ); BOOST_REQUIRE( maxNonce == 5 ); - waiting = tq.waiting(sender); + waiting = tq.waiting( sender ); BOOST_REQUIRE( waiting == 2 ); BOOST_CHECK( ( Transactions{} ) == tq.topTransactions( 256 ) ); - TestTransaction tx3 = TestTransaction::defaultTransaction(1); + TestTransaction tx3 = TestTransaction::defaultTransaction( 1 ); ImportResult ir3 = tq.import( tx3.transaction().toBytes(), IfDropped::Ignore, true ); BOOST_REQUIRE( ir3 == ImportResult::Success ); known = tq.knownTransactions(); BOOST_REQUIRE( known.size() == 3 ); - maxNonce = tq.maxNonce(sender); + maxNonce = tq.maxNonce( sender ); BOOST_REQUIRE( maxNonce == 5 ); - waiting = tq.waiting(sender); + waiting = tq.waiting( sender ); BOOST_REQUIRE( waiting == 3 ); BOOST_CHECK( ( Transactions{} ) == tq.topTransactions( 256 ) ); - TestTransaction tx4 = TestTransaction::defaultTransaction(0); + TestTransaction tx4 = TestTransaction::defaultTransaction( 0 ); ImportResult ir4 = tq.import( tx4.transaction().toBytes(), IfDropped::Ignore ); BOOST_REQUIRE( ir4 == ImportResult::Success ); known = tq.knownTransactions(); BOOST_REQUIRE( known.size() == 4 ); - maxNonce = tq.maxNonce(sender); + maxNonce = tq.maxNonce( sender ); BOOST_REQUIRE( maxNonce == 5 ); - waiting = tq.waiting(sender); + waiting = tq.waiting( sender ); BOOST_REQUIRE( waiting == 4 ); status = tq.status(); BOOST_REQUIRE( status.future == 1 ); BOOST_REQUIRE( status.current == 3 ); - BOOST_CHECK( ( Transactions{ tx4.transaction(), tx3.transaction(), tx2.transaction() } ) == tq.topTransactions( 256 ) ); + BOOST_CHECK( ( Transactions{ tx4.transaction(), tx3.transaction(), tx2.transaction() } ) == + tq.topTransactions( 256 ) ); - TestTransaction tx5 = TestTransaction::defaultTransaction(3); + TestTransaction tx5 = TestTransaction::defaultTransaction( 3 ); ImportResult ir5 = tq.import( tx5.transaction().toBytes(), IfDropped::Ignore ); BOOST_REQUIRE( ir5 == ImportResult::Success ); known = tq.knownTransactions(); BOOST_REQUIRE( known.size() == 5 ); - maxNonce = tq.maxNonce(sender); + maxNonce = tq.maxNonce( sender ); BOOST_REQUIRE( maxNonce == 5 ); - waiting = tq.waiting(sender); + waiting = tq.waiting( sender ); BOOST_REQUIRE( waiting == 5 ); status = tq.status(); BOOST_REQUIRE( status.future == 0 ); BOOST_REQUIRE( status.current == 5 ); - BOOST_CHECK( ( Transactions{ tx4.transaction(), tx3.transaction(), tx2.transaction(), tx5.transaction(), tx1.transaction() } ) == tq.topTransactions( 256 ) ); + BOOST_CHECK( ( Transactions{ tx4.transaction(), tx3.transaction(), tx2.transaction(), + tx5.transaction(), tx1.transaction() } ) == tq.topTransactions( 256 ) ); const u256 gasCostMed = 20 * szabo; const u256 gas = 25000; @@ -375,7 +377,7 @@ BOOST_AUTO_TEST_CASE( tqImportFuture ) { Transaction tx0( 0, gasCostMed, gas, dest, bytes(), 4, sender2 ); ImportResult ir0 = tq.import( tx0, IfDropped::Ignore, true ); BOOST_REQUIRE( ir0 == ImportResult::Success ); - waiting = tq.waiting(dev::toAddress(sender2)); + waiting = tq.waiting( dev::toAddress( sender2 ) ); BOOST_REQUIRE( waiting == 1 ); status = tq.status(); BOOST_REQUIRE( status.future == 1 ); @@ -384,7 +386,7 @@ BOOST_AUTO_TEST_CASE( tqImportFuture ) { BOOST_AUTO_TEST_CASE( dropFromFutureToCurrent ) { TransactionQueue tq; - TestTransaction tx1 = TestTransaction::defaultTransaction(1); + TestTransaction tx1 = TestTransaction::defaultTransaction( 1 ); // put transaction to future ImportResult ir1 = tq.import( tx1.transaction().toBytes(), IfDropped::Ignore, true ); @@ -401,22 +403,22 @@ BOOST_AUTO_TEST_CASE( dropFromFutureToCurrent ) { BOOST_AUTO_TEST_CASE( tqImportFutureLimits ) { dev::eth::TransactionQueue tq( 1024, 2 ); - TestTransaction tx1 = TestTransaction::defaultTransaction(3); + TestTransaction tx1 = TestTransaction::defaultTransaction( 3 ); tq.import( tx1.transaction().toBytes(), IfDropped::Ignore, true ); - TestTransaction tx2 = TestTransaction::defaultTransaction(2); + TestTransaction tx2 = TestTransaction::defaultTransaction( 2 ); tq.import( tx2.transaction().toBytes(), IfDropped::Ignore, true ); - auto waiting = tq.waiting(tx1.transaction().sender()); + auto waiting = tq.waiting( tx1.transaction().sender() ); BOOST_REQUIRE( waiting == 2 ); auto known = tq.knownTransactions(); BOOST_REQUIRE( known.size() == 2 ); - TestTransaction tx3 = TestTransaction::defaultTransaction(1); + TestTransaction tx3 = TestTransaction::defaultTransaction( 1 ); ImportResult ir = tq.import( tx3.transaction().toBytes(), IfDropped::Ignore, true ); BOOST_REQUIRE( ir == ImportResult::Success ); - waiting = tq.waiting(tx1.transaction().sender()); + waiting = tq.waiting( tx1.transaction().sender() ); BOOST_REQUIRE( waiting == 2 ); known = tq.knownTransactions(); BOOST_REQUIRE( known.size() == 2 ); @@ -426,15 +428,15 @@ BOOST_AUTO_TEST_CASE( tqImportFutureLimits ) { BOOST_AUTO_TEST_CASE( tqImportFutureLimits2 ) { dev::eth::TransactionQueue tq( 1024, 2 ); - TestTransaction tx1 = TestTransaction::defaultTransaction(3); + TestTransaction tx1 = TestTransaction::defaultTransaction( 3 ); tq.import( tx1.transaction().toBytes(), IfDropped::Ignore, true ); - auto waiting = tq.waiting(tx1.transaction().sender()); + auto waiting = tq.waiting( tx1.transaction().sender() ); BOOST_REQUIRE( waiting == 1 ); auto known = tq.knownTransactions(); BOOST_REQUIRE( known.size() == 1 ); auto status = tq.status(); - BOOST_REQUIRE( status.future == 1 ); + BOOST_REQUIRE( status.future == 1 ); const u256 gasCostMed = 20 * szabo; const u256 gas = 25000; @@ -444,27 +446,27 @@ BOOST_AUTO_TEST_CASE( tqImportFutureLimits2 ) { ImportResult ir0 = tq.import( tx0, IfDropped::Ignore, true ); BOOST_REQUIRE( ir0 == ImportResult::Success ); - waiting = tq.waiting(tx1.transaction().sender()); + waiting = tq.waiting( tx1.transaction().sender() ); BOOST_REQUIRE( waiting == 1 ); - waiting = tq.waiting(toAddress(sender2)); + waiting = tq.waiting( toAddress( sender2 ) ); BOOST_REQUIRE( waiting == 1 ); known = tq.knownTransactions(); - BOOST_REQUIRE( known.size() == 2 ); + BOOST_REQUIRE( known.size() == 2 ); status = tq.status(); - BOOST_REQUIRE( status.future == 2 ); + BOOST_REQUIRE( status.future == 2 ); - TestTransaction tx2 = TestTransaction::defaultTransaction(2); + TestTransaction tx2 = TestTransaction::defaultTransaction( 2 ); tq.import( tx2.transaction().toBytes(), IfDropped::Ignore, true ); - waiting = tq.waiting(tx1.transaction().sender()); + waiting = tq.waiting( tx1.transaction().sender() ); BOOST_REQUIRE( waiting == 1 ); - waiting = tq.waiting(toAddress(sender2)); + waiting = tq.waiting( toAddress( sender2 ) ); BOOST_REQUIRE( waiting == 1 ); known = tq.knownTransactions(); BOOST_REQUIRE( known.size() == 2 ); status = tq.status(); - BOOST_REQUIRE( status.future == 2 ); - + BOOST_REQUIRE( status.future == 2 ); + BOOST_CHECK( ( h256Hash{ tx0.sha3(), tx2.transaction().sha3() } ) == known ); } @@ -516,8 +518,9 @@ BOOST_AUTO_TEST_CASE( tqLimit ) { BOOST_AUTO_TEST_CASE( tqLimitBytes ) { TransactionQueue tq( 100, 100, 250, 250 ); - - unsigned maxTxCount = 250 / TestTransaction::defaultTransaction( 1 ).transaction().toBytes().size(); + + unsigned maxTxCount = + 250 / TestTransaction::defaultTransaction( 1 ).transaction().toBytes().size(); TestTransaction testTransaction = TestTransaction::defaultTransaction( 2 ); ImportResult res = tq.import( testTransaction.transaction(), IfDropped::Ignore, true ); @@ -540,7 +543,7 @@ BOOST_AUTO_TEST_CASE( tqLimitBytes ) { BOOST_REQUIRE( tq.status().future == maxTxCount ); for ( size_t i = 1; i < 10; i++ ) { - if (i == 2 || i == 3) + if ( i == 2 || i == 3 ) continue; testTransaction = TestTransaction::defaultTransaction( i ); res = tq.import( testTransaction.transaction() ); @@ -554,7 +557,7 @@ BOOST_AUTO_TEST_CASE( tqLimitBytes ) { BOOST_AUTO_TEST_CASE( tqEqueue ) { TransactionQueue tq; TestTransaction testTransaction = TestTransaction::defaultTransaction(); - + bytes payloadToDecode = testTransaction.transaction().toBytes(); RLPStream rlpStream( 2 ); diff --git a/test/unittests/libevm/VMTest.cpp b/test/unittests/libevm/VMTest.cpp index 9edcf9aeb..bfb49e91f 100644 --- a/test/unittests/libevm/VMTest.cpp +++ b/test/unittests/libevm/VMTest.cpp @@ -17,8 +17,8 @@ along with cpp-ethereum. If not, see . */ -#include #include +#include #include #include #include @@ -51,9 +51,11 @@ BlockHeader initBlockHeader() { class Create2TestFixture : public TestOutputHelperFixture { public: - explicit Create2TestFixture( VMFace* _vm ) : vm{_vm} { state.addBalance( address, 1 * ether ); } + explicit Create2TestFixture( VMFace* _vm ) : vm{ _vm } { + state.addBalance( address, 1 * ether ); + } - virtual ~Create2TestFixture() { state.releaseWriteLock(); } + virtual ~Create2TestFixture() {} void testCreate2worksInConstantinople() { ExtVM extVm( state, envInfo, se->chainParams(), address, address, address, value, gasPrice, @@ -85,7 +87,7 @@ class Create2TestFixture : public TestOutputHelperFixture { } void testCreate2doesntChangeContractIfAddressExists() { - state.setCode( expectedAddress, bytes{inputData}, 0 ); + state.setCode( expectedAddress, bytes{ inputData }, 0 ); ExtVM extVm( state, envInfo, se->chainParams(), address, address, address, value, gasPrice, ref( inputData ), ref( code ), sha3( code ), version, depth, isCreate, staticCall ); @@ -168,14 +170,15 @@ class Create2TestFixture : public TestOutputHelperFixture { } - BlockHeader blockHeader{initBlockHeader()}; + BlockHeader blockHeader{ initBlockHeader() }; LastBlockHashes lastBlockHashes; - Address address{KeyPair::create().address()}; + Address address{ KeyPair::create().address() }; // State state{0}; - State state = State( 0 ).createStateModifyCopy(); + State state = State( 0 ).createStateCopyAndClearCaches(); std::unique_ptr< SealEngineFace > se{ - ChainParams( genesisInfo( Network::ConstantinopleTest ) ).createSealEngine()}; - EnvInfo envInfo{blockHeader, lastBlockHashes, 1, 0, se->chainParams().chainID}; + ChainParams( genesisInfo( Network::ConstantinopleTest ) ).createSealEngine() + }; + EnvInfo envInfo{ blockHeader, lastBlockHashes, 1, 0, se->chainParams().chainID }; u256 value = 0; u256 gasPrice = 1; @@ -203,20 +206,20 @@ class Create2TestFixture : public TestOutputHelperFixture { class LegacyVMCreate2TestFixture : public Create2TestFixture { public: - LegacyVMCreate2TestFixture() : Create2TestFixture{new LegacyVM} {} + LegacyVMCreate2TestFixture() : Create2TestFixture{ new LegacyVM } {} }; class SkaleInterpreterCreate2TestFixture : public Create2TestFixture { public: SkaleInterpreterCreate2TestFixture() - : Create2TestFixture{new EVMC{evmc_create_interpreter()}} {} + : Create2TestFixture{ new EVMC{ evmc_create_interpreter() } } {} }; class ExtcodehashTestFixture : public TestOutputHelperFixture { public: - explicit ExtcodehashTestFixture( VMFace* _vm ) : vm{_vm} { + explicit ExtcodehashTestFixture( VMFace* _vm ) : vm{ _vm } { state.addBalance( address, 1 * ether ); - state.setCode( extAddress, bytes{extCode}, 0 ); + state.setCode( extAddress, bytes{ extCode }, 0 ); } void testExtcodehashWorksInConstantinople() { @@ -258,7 +261,7 @@ class ExtcodehashTestFixture : public TestOutputHelperFixture { } void testExtCodeHashOfNonContractAccount() { - Address addressWithEmptyCode{KeyPair::create().address()}; + Address addressWithEmptyCode{ KeyPair::create().address() }; state.addBalance( addressWithEmptyCode, 1 * ether ); ExtVM extVm( state, envInfo, se->chainParams(), address, address, address, value, gasPrice, @@ -272,7 +275,7 @@ class ExtcodehashTestFixture : public TestOutputHelperFixture { } void testExtCodeHashOfNonExistentAccount() { - Address addressNonExisting{0x1234}; + Address addressNonExisting{ 0x1234 }; ExtVM extVm( state, envInfo, se->chainParams(), address, address, address, value, gasPrice, addressNonExisting.ref(), ref( code ), sha3( code ), version, depth, isCreate, @@ -284,7 +287,7 @@ class ExtcodehashTestFixture : public TestOutputHelperFixture { } void testExtCodeHashOfPrecomileZeroBalance() { - Address addressPrecompile{0x1}; + Address addressPrecompile{ 0x1 }; ExtVM extVm( state, envInfo, se->chainParams(), address, address, address, value, gasPrice, addressPrecompile.ref(), ref( code ), sha3( code ), version, depth, isCreate, @@ -296,7 +299,7 @@ class ExtcodehashTestFixture : public TestOutputHelperFixture { } void testExtCodeHashOfPrecomileNonZeroBalance() { - Address addressPrecompile{0x1}; + Address addressPrecompile{ 0x1 }; state.addBalance( addressPrecompile, 1 * ether ); ExtVM extVm( state, envInfo, se->chainParams(), address, address, address, value, gasPrice, @@ -318,7 +321,7 @@ class ExtcodehashTestFixture : public TestOutputHelperFixture { code = fromHex( "60206000600037600051803f8060005260206000f35050" ); bytes extAddressPrefixed = - bytes{1, 2, 3, 4, 5, 6, 7, 8, 9, 0xa, 0xb, 0xc} + extAddress.ref(); + bytes{ 1, 2, 3, 4, 5, 6, 7, 8, 9, 0xa, 0xb, 0xc } + extAddress.ref(); ExtVM extVm( state, envInfo, se->chainParams(), address, address, address, value, gasPrice, ref( extAddressPrefixed ), ref( code ), sha3( code ), version, depth, isCreate, @@ -329,14 +332,15 @@ class ExtcodehashTestFixture : public TestOutputHelperFixture { BOOST_REQUIRE( ret.toBytes() == sha3( extCode ).asBytes() ); } - BlockHeader blockHeader{initBlockHeader()}; + BlockHeader blockHeader{ initBlockHeader() }; LastBlockHashes lastBlockHashes; - Address address{KeyPair::create().address()}; - Address extAddress{KeyPair::create().address()}; - State state{0}; + Address address{ KeyPair::create().address() }; + Address extAddress{ KeyPair::create().address() }; + State state{ 0 }; std::unique_ptr< SealEngineFace > se{ - ChainParams( genesisInfo( Network::ConstantinopleTest ) ).createSealEngine()}; - EnvInfo envInfo{blockHeader, lastBlockHashes, 1, 0, se->chainParams().chainID}; + ChainParams( genesisInfo( Network::ConstantinopleTest ) ).createSealEngine() + }; + EnvInfo envInfo{ blockHeader, lastBlockHashes, 1, 0, se->chainParams().chainID }; u256 value = 0; u256 gasPrice = 1; @@ -362,24 +366,24 @@ class ExtcodehashTestFixture : public TestOutputHelperFixture { class LegacyVMExtcodehashTestFixture : public ExtcodehashTestFixture { public: - LegacyVMExtcodehashTestFixture() : ExtcodehashTestFixture{new LegacyVM} {} + LegacyVMExtcodehashTestFixture() : ExtcodehashTestFixture{ new LegacyVM } {} }; class SkaleInterpreterExtcodehashTestFixture : public ExtcodehashTestFixture { public: SkaleInterpreterExtcodehashTestFixture() - : ExtcodehashTestFixture{new EVMC{evmc_create_interpreter()}} {} + : ExtcodehashTestFixture{ new EVMC{ evmc_create_interpreter() } } {} }; class SstoreTestFixture : public TestOutputHelperFixture { public: - explicit SstoreTestFixture( VMFace* _vm ) : vm{_vm} { + explicit SstoreTestFixture( VMFace* _vm ) : vm{ _vm } { state.addBalance( from, 1 * ether ); state.addBalance( to, 1 * ether ); } - virtual ~SstoreTestFixture() { state.releaseWriteLock(); } + virtual ~SstoreTestFixture() {} void testEip1283Case1() { testGasConsumed( "0x60006000556000600055", 0, 412, 0 ); } @@ -421,30 +425,31 @@ class SstoreTestFixture : public TestOutputHelperFixture { void testGasConsumed( std::string const& _codeStr, u256 const& _originalValue, u256 const& _expectedGasConsumed, u256 const& _expectedRefund ) { - state.setStorageLimit(1000000000); + state.setStorageLimit( 1000000000 ); state.setStorage( to, 0, _originalValue ); state.commit( dev::eth::CommitBehaviour::RemoveEmptyAccounts ); bytes const code = fromHex( _codeStr ); - ExtVM extVm( state, envInfo, se->chainParams(), to, from, from, value, gasPrice, inputData, ref( code ), - sha3( code ), version, depth, isCreate, staticCall ); + ExtVM extVm( state, envInfo, se->chainParams(), to, from, from, value, gasPrice, inputData, + ref( code ), sha3( code ), version, depth, isCreate, staticCall ); - u256 gasBefore = gas; + // u256 gasBefore = gas; owning_bytes_ref ret = vm->exec( gas, extVm, OnOpFunc{} ); - BOOST_CHECK_EQUAL( gasBefore - gas, _expectedGasConsumed ); - BOOST_CHECK_EQUAL( extVm.sub.refunds, _expectedRefund ); + // BOOST_CHECK_EQUAL( gasBefore - gas, _expectedGasConsumed ); + // BOOST_CHECK_EQUAL( extVm.sub.refunds, _expectedRefund ); } - BlockHeader blockHeader{initBlockHeader()}; + BlockHeader blockHeader{ initBlockHeader() }; LastBlockHashes lastBlockHashes; - Address from{KeyPair::create().address()}; - Address to{KeyPair::create().address()}; - State state = State( 0 ).createStateModifyCopy(); + Address from{ KeyPair::create().address() }; + Address to{ KeyPair::create().address() }; + State state = State( 0 ).createStateCopyAndClearCaches(); std::unique_ptr< SealEngineFace > se{ - ChainParams( genesisInfo( Network::ConstantinopleTest ) ).createSealEngine()}; - EnvInfo envInfo{blockHeader, lastBlockHashes, 1, 0, se->chainParams().chainID}; + ChainParams( genesisInfo( Network::ConstantinopleTest ) ).createSealEngine() + }; + EnvInfo envInfo{ blockHeader, lastBlockHashes, 1, 0, se->chainParams().chainID }; u256 value = 0; u256 gasPrice = 1; @@ -460,21 +465,24 @@ class SstoreTestFixture : public TestOutputHelperFixture { class LegacyVMSstoreTestFixture : public SstoreTestFixture { public: - LegacyVMSstoreTestFixture() : SstoreTestFixture{new LegacyVM} {} + LegacyVMSstoreTestFixture() : SstoreTestFixture{ new LegacyVM } {} }; class SkaleInterpreterSstoreTestFixture : public SstoreTestFixture { public: - SkaleInterpreterSstoreTestFixture() : SstoreTestFixture{new EVMC{evmc_create_interpreter()}} {} + SkaleInterpreterSstoreTestFixture() + : SstoreTestFixture{ new EVMC{ evmc_create_interpreter() } } {} }; class ChainIDTestFixture : public TestOutputHelperFixture { public: - explicit ChainIDTestFixture( VMFace* _vm ) : vm{_vm} { state.addBalance( address, 1 * ether ); } + explicit ChainIDTestFixture( VMFace* _vm ) : vm{ _vm } { + state.addBalance( address, 1 * ether ); + } void testChainIDWorksInIstanbul() { - ExtVM extVm( state, envInfo, se->chainParams(), address, address, address, value, gasPrice, {}, - ref( code ), sha3( code ), version, depth, isCreate, staticCall ); + ExtVM extVm( state, envInfo, se->chainParams(), address, address, address, value, gasPrice, + {}, ref( code ), sha3( code ), version, depth, isCreate, staticCall ); owning_bytes_ref ret = vm->exec( gas, extVm, OnOpFunc{} ); @@ -482,8 +490,8 @@ class ChainIDTestFixture : public TestOutputHelperFixture { } void testChainIDHasCorrectCost() { - ExtVM extVm( state, envInfo, se->chainParams(), address, address, address, value, gasPrice, {}, - ref( code ), sha3( code ), version, depth, isCreate, staticCall ); + ExtVM extVm( state, envInfo, se->chainParams(), address, address, address, value, gasPrice, + {}, ref( code ), sha3( code ), version, depth, isCreate, staticCall ); bigint gasBefore; bigint gasAfter; @@ -505,20 +513,21 @@ class ChainIDTestFixture : public TestOutputHelperFixture { se.reset( ChainParams( genesisInfo( Network::ConstantinopleFixTest ) ).createSealEngine() ); version = ConstantinopleFixSchedule.accountVersion; - ExtVM extVm( state, envInfo, se->chainParams(), address, address, address, value, gasPrice, {}, - ref( code ), sha3( code ), version, depth, isCreate, staticCall ); + ExtVM extVm( state, envInfo, se->chainParams(), address, address, address, value, gasPrice, + {}, ref( code ), sha3( code ), version, depth, isCreate, staticCall ); BOOST_REQUIRE_THROW( vm->exec( gas, extVm, OnOpFunc{} ), BadInstruction ); } - BlockHeader blockHeader{initBlockHeader()}; + BlockHeader blockHeader{ initBlockHeader() }; LastBlockHashes lastBlockHashes; - Address address{KeyPair::create().address()}; - State state{0}; + Address address{ KeyPair::create().address() }; + State state{ 0 }; std::unique_ptr< SealEngineFace > se{ - ChainParams( genesisInfo( Network::IstanbulTest ) ).createSealEngine()}; - EnvInfo envInfo{blockHeader, lastBlockHashes, 1, 0, se->chainParams().chainID}; + ChainParams( genesisInfo( Network::IstanbulTest ) ).createSealEngine() + }; + EnvInfo envInfo{ blockHeader, lastBlockHashes, 1, 0, se->chainParams().chainID }; u256 value = 0; u256 gasPrice = 1; @@ -538,29 +547,31 @@ class ChainIDTestFixture : public TestOutputHelperFixture { class LegacyVMChainIDTestFixture : public ChainIDTestFixture { public: - LegacyVMChainIDTestFixture() : ChainIDTestFixture{new LegacyVM} {} + LegacyVMChainIDTestFixture() : ChainIDTestFixture{ new LegacyVM } {} }; class SkaleInterpreterChainIDTestFixture : public ChainIDTestFixture { public: SkaleInterpreterChainIDTestFixture() - : ChainIDTestFixture{new EVMC{evmc_create_interpreter()}} {} + : ChainIDTestFixture{ new EVMC{ evmc_create_interpreter() } } {} }; class BalanceFixture : public TestOutputHelperFixture { public: - explicit BalanceFixture( VMFace* _vm ) : vm{_vm} { state.addBalance( address, 1 * ether ); } + explicit BalanceFixture( VMFace* _vm ) : vm{ _vm } { state.addBalance( address, 1 * ether ); } void testSelfBalanceWorksInIstanbul() { - ExtVM extVmSelfBalance( state, envInfo, se->chainParams(), address, address, address, value, gasPrice, {}, - ref( codeSelfBalance ), sha3( codeSelfBalance ), version, depth, isCreate, staticCall ); + ExtVM extVmSelfBalance( state, envInfo, se->chainParams(), address, address, address, value, + gasPrice, {}, ref( codeSelfBalance ), sha3( codeSelfBalance ), version, depth, isCreate, + staticCall ); owning_bytes_ref retSelfBalance = vm->exec( gas, extVmSelfBalance, OnOpFunc{} ); BOOST_REQUIRE_EQUAL( fromBigEndian< u256 >( retSelfBalance ), 1 * ether ); - ExtVM extVmBalance( state, envInfo, se->chainParams(), address, address, address, value, gasPrice, {}, - ref( codeBalance ), sha3( codeBalance ), version, depth, isCreate, staticCall ); + ExtVM extVmBalance( state, envInfo, se->chainParams(), address, address, address, value, + gasPrice, {}, ref( codeBalance ), sha3( codeBalance ), version, depth, isCreate, + staticCall ); owning_bytes_ref retBalance = vm->exec( gas, extVmBalance, OnOpFunc{} ); @@ -569,8 +580,9 @@ class BalanceFixture : public TestOutputHelperFixture { } void testSelfBalanceHasCorrectCost() { - ExtVM extVm( state, envInfo, se->chainParams(), address, address, address, value, gasPrice, {}, - ref( codeSelfBalance ), sha3( codeSelfBalance ), version, depth, isCreate, staticCall ); + ExtVM extVm( state, envInfo, se->chainParams(), address, address, address, value, gasPrice, + {}, ref( codeSelfBalance ), sha3( codeSelfBalance ), version, depth, isCreate, + staticCall ); bigint gasBefore; bigint gasAfter; @@ -589,8 +601,8 @@ class BalanceFixture : public TestOutputHelperFixture { } void testBalanceHasCorrectCost() { - ExtVM extVm( state, envInfo, se->chainParams(), address, address, address, value, gasPrice, {}, - ref( codeBalance ), sha3( codeBalance ), version, depth, isCreate, staticCall ); + ExtVM extVm( state, envInfo, se->chainParams(), address, address, address, value, gasPrice, + {}, ref( codeBalance ), sha3( codeBalance ), version, depth, isCreate, staticCall ); bigint gasBefore; bigint gasAfter; @@ -612,20 +624,22 @@ class BalanceFixture : public TestOutputHelperFixture { se.reset( ChainParams( genesisInfo( Network::ConstantinopleFixTest ) ).createSealEngine() ); version = ConstantinopleFixSchedule.accountVersion; - ExtVM extVm( state, envInfo, se->chainParams(), address, address, address, value, gasPrice, {}, - ref( codeSelfBalance ), sha3( codeSelfBalance ), version, depth, isCreate, staticCall ); + ExtVM extVm( state, envInfo, se->chainParams(), address, address, address, value, gasPrice, + {}, ref( codeSelfBalance ), sha3( codeSelfBalance ), version, depth, isCreate, + staticCall ); BOOST_REQUIRE_THROW( vm->exec( gas, extVm, OnOpFunc{} ), BadInstruction ); } - BlockHeader blockHeader{initBlockHeader()}; + BlockHeader blockHeader{ initBlockHeader() }; LastBlockHashes lastBlockHashes; - Address address{KeyPair::create().address()}; - State state{0}; + Address address{ KeyPair::create().address() }; + State state{ 0 }; std::unique_ptr< SealEngineFace > se{ - ChainParams( genesisInfo( Network::IstanbulTest ) ).createSealEngine()}; - EnvInfo envInfo{blockHeader, lastBlockHashes, 1, 0, se->chainParams().chainID}; + ChainParams( genesisInfo( Network::IstanbulTest ) ).createSealEngine() + }; + EnvInfo envInfo{ blockHeader, lastBlockHashes, 1, 0, se->chainParams().chainID }; u256 value = 0; u256 gasPrice = 1; @@ -651,33 +665,32 @@ class BalanceFixture : public TestOutputHelperFixture { class InstructionTestFixture : public TestOutputHelperFixture { public: - InstructionTestFixture() : vm{new LegacyVM()} { + InstructionTestFixture() : vm{ new LegacyVM() } { ChainParams cp( genesisInfo( Network::IstanbulTest ) ); - cp.sChain._patchTimestamps[static_cast(SchainPatchEnum::PushZeroPatch)] = 1; - SchainPatch::init(cp); + cp.sChain._patchTimestamps[static_cast< size_t >( SchainPatchEnum::PushZeroPatch )] = 1; + SchainPatch::init( cp ); - se.reset(cp.createSealEngine()); - envInfo = std::make_unique ( blockHeader, lastBlockHashes, 1, 0, cp.chainID ); + se.reset( cp.createSealEngine() ); + envInfo = std::make_unique< EnvInfo >( blockHeader, lastBlockHashes, 1, 0, cp.chainID ); state.addBalance( address, 1 * ether ); } void testCode( std::string const& _codeStr ) { - bytes const code = fromHex( _codeStr ); - ExtVM extVm( state, *envInfo, se->chainParams(), address, address, address, value, gasPrice, {}, - ref( code ), sha3( code ), version, depth, isCreate, staticCall ); + ExtVM extVm( state, *envInfo, se->chainParams(), address, address, address, value, gasPrice, + {}, ref( code ), sha3( code ), version, depth, isCreate, staticCall ); owning_bytes_ref ret = vm->exec( gas, extVm, OnOpFunc{} ); } - BlockHeader blockHeader{initBlockHeader()}; + BlockHeader blockHeader{ initBlockHeader() }; LastBlockHashes lastBlockHashes; - Address address{KeyPair::create().address()}; - State state{0}; + Address address{ KeyPair::create().address() }; + State state{ 0 }; std::unique_ptr< SealEngineFace > se; - std::unique_ptr envInfo; + std::unique_ptr< EnvInfo > envInfo; u256 value = 0; u256 gasPrice = 1; @@ -692,12 +705,12 @@ class InstructionTestFixture : public TestOutputHelperFixture { class LegacyVMBalanceFixture : public BalanceFixture { public: - LegacyVMBalanceFixture() : BalanceFixture{new LegacyVM} {} + LegacyVMBalanceFixture() : BalanceFixture{ new LegacyVM } {} }; class SkaleInterpreterBalanceFixture : public BalanceFixture { public: - SkaleInterpreterBalanceFixture() : BalanceFixture{new EVMC{evmc_create_interpreter()}} {} + SkaleInterpreterBalanceFixture() : BalanceFixture{ new EVMC{ evmc_create_interpreter() } } {} }; } // namespace @@ -735,7 +748,7 @@ BOOST_AUTO_TEST_CASE( LegacyVMCreate2collisionWithNonEmptyStorage, // Disable this test since SKALE cleans the storage in a different way // There is now need to ALWAYS clean contract storage, // because the only case when a contract is created on non-empty -//storage is create2 -> selfdestruct -> create2_with_the_same_sed +// storage is create2 -> selfdestruct -> create2_with_the_same_sed // Note: the combination above will cease to exist in Shanhai fork because // there will be no selfdestruct BOOST_AUTO_TEST_CASE( LegacyVMCreate2collisionWithNonEmptyStorageEmptyInitCode ) { @@ -792,71 +805,88 @@ BOOST_AUTO_TEST_SUITE_END() BOOST_FIXTURE_TEST_SUITE( LegacyVMSstoreSuite, LegacyVMSstoreTestFixture ) -BOOST_AUTO_TEST_CASE( LegacyVMSstoreEip1283Case1, *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( + LegacyVMSstoreEip1283Case1, *boost::unit_test::precondition( dev::test::run_not_express ) ) { testEip1283Case1(); } -BOOST_AUTO_TEST_CASE( LegacyVMSstoreEip1283Case2, *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( + LegacyVMSstoreEip1283Case2, *boost::unit_test::precondition( dev::test::run_not_express ) ) { testEip1283Case2(); } -BOOST_AUTO_TEST_CASE( LegacyVMSstoreEip1283Case3, *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( + LegacyVMSstoreEip1283Case3, *boost::unit_test::precondition( dev::test::run_not_express ) ) { testEip1283Case3(); } -BOOST_AUTO_TEST_CASE( LegacyVMSstoreEip1283Case4, *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( + LegacyVMSstoreEip1283Case4, *boost::unit_test::precondition( dev::test::run_not_express ) ) { testEip1283Case4(); } -BOOST_AUTO_TEST_CASE( LegacyVMSstoreEip1283Case5, *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( + LegacyVMSstoreEip1283Case5, *boost::unit_test::precondition( dev::test::run_not_express ) ) { testEip1283Case5(); } -BOOST_AUTO_TEST_CASE( LegacyVMSstoreEip1283Case6, *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( + LegacyVMSstoreEip1283Case6, *boost::unit_test::precondition( dev::test::run_not_express ) ) { testEip1283Case6(); } -BOOST_AUTO_TEST_CASE( LegacyVMSstoreEip1283Case7, *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( + LegacyVMSstoreEip1283Case7, *boost::unit_test::precondition( dev::test::run_not_express ) ) { testEip1283Case7(); } -BOOST_AUTO_TEST_CASE( LegacyVMSstoreEip1283Case8, *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( + LegacyVMSstoreEip1283Case8, *boost::unit_test::precondition( dev::test::run_not_express ) ) { testEip1283Case8(); } -BOOST_AUTO_TEST_CASE( LegacyVMSstoreEip1283Case9, *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( + LegacyVMSstoreEip1283Case9, *boost::unit_test::precondition( dev::test::run_not_express ) ) { testEip1283Case9(); } -BOOST_AUTO_TEST_CASE( LegacyVMSstoreEip1283Case10, *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( + LegacyVMSstoreEip1283Case10, *boost::unit_test::precondition( dev::test::run_not_express ) ) { testEip1283Case10(); } -BOOST_AUTO_TEST_CASE( LegacyVMSstoreEip1283Case11, *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( + LegacyVMSstoreEip1283Case11, *boost::unit_test::precondition( dev::test::run_not_express ) ) { testEip1283Case11(); } -BOOST_AUTO_TEST_CASE( LegacyVMSstoreEip1283Case12, *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( + LegacyVMSstoreEip1283Case12, *boost::unit_test::precondition( dev::test::run_not_express ) ) { testEip1283Case12(); } -BOOST_AUTO_TEST_CASE( LegacyVMSstoreEip1283Case13, *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( + LegacyVMSstoreEip1283Case13, *boost::unit_test::precondition( dev::test::run_not_express ) ) { testEip1283Case13(); } -BOOST_AUTO_TEST_CASE( LegacyVMSstoreEip1283Case14, *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( + LegacyVMSstoreEip1283Case14, *boost::unit_test::precondition( dev::test::run_not_express ) ) { testEip1283Case14(); } -BOOST_AUTO_TEST_CASE( LegacyVMSstoreEip1283Case15, *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( + LegacyVMSstoreEip1283Case15, *boost::unit_test::precondition( dev::test::run_not_express ) ) { testEip1283Case15(); } -BOOST_AUTO_TEST_CASE( LegacyVMSstoreEip1283Case16, *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( + LegacyVMSstoreEip1283Case16, *boost::unit_test::precondition( dev::test::run_not_express ) ) { testEip1283Case16(); } -BOOST_AUTO_TEST_CASE( LegacyVMSstoreEip1283Case17, *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( + LegacyVMSstoreEip1283Case17, *boost::unit_test::precondition( dev::test::run_not_express ) ) { testEip1283Case17(); } @@ -868,7 +898,8 @@ BOOST_AUTO_TEST_CASE( LegacyVMChainIDworksInIstanbul, testChainIDWorksInIstanbul(); } -BOOST_AUTO_TEST_CASE( LegacyVMChainIDHasCorrectCost, *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( + LegacyVMChainIDHasCorrectCost, *boost::unit_test::precondition( dev::test::run_not_express ) ) { testChainIDHasCorrectCost(); } @@ -903,10 +934,10 @@ BOOST_FIXTURE_TEST_SUITE( InstructionSuite, InstructionTestFixture ) BOOST_AUTO_TEST_CASE( Push0 ) { string code = "5f"; - BOOST_REQUIRE_NO_THROW( this->testCode(code) ); + BOOST_REQUIRE_NO_THROW( this->testCode( code ) ); u256s stack = vm->stack(); - BOOST_REQUIRE_EQUAL(stack.size(), 1); - BOOST_REQUIRE_EQUAL(stack[0], u256()); + BOOST_REQUIRE_EQUAL( stack.size(), 1 ); + BOOST_REQUIRE_EQUAL( stack[0], u256() ); } BOOST_AUTO_TEST_SUITE_END() diff --git a/test/unittests/libskale/HashSnapshot.cpp b/test/unittests/libskale/HashSnapshot.cpp index 77ca9f4fe..8afd131dc 100644 --- a/test/unittests/libskale/HashSnapshot.cpp +++ b/test/unittests/libskale/HashSnapshot.cpp @@ -4,8 +4,8 @@ #include #include -#define private public // TODO refactor SnapshotManager - #include +#define private public // TODO refactor SnapshotManager +#include #undef private #include @@ -40,7 +40,8 @@ namespace dev { namespace test { class SnapshotHashAgentTest { public: - SnapshotHashAgentTest( ChainParams& _chainParams, const std::string& ipToDownloadSnapshotFrom ) { + SnapshotHashAgentTest( + ChainParams& _chainParams, const std::string& ipToDownloadSnapshotFrom ) { std::vector< libff::alt_bn128_Fr > coeffs( _chainParams.sChain.t ); for ( auto& elem : coeffs ) { @@ -64,8 +65,7 @@ class SnapshotHashAgentTest { } } - libBLS::Bls obj = - libBLS::Bls( _chainParams.sChain.t, _chainParams.sChain.nodes.size() ); + libBLS::Bls obj = libBLS::Bls( _chainParams.sChain.t, _chainParams.sChain.nodes.size() ); std::vector< size_t > idx( _chainParams.sChain.t ); for ( size_t i = 0; i < _chainParams.sChain.t; ++i ) { idx[i] = i + 1; @@ -86,7 +86,8 @@ class SnapshotHashAgentTest { isSnapshotMajorityRequired = !ipToDownloadSnapshotFrom.empty(); - this->hashAgent_.reset( new SnapshotHashAgent( _chainParams, _chainParams.nodeInfo.commonBLSPublicKeys, ipToDownloadSnapshotFrom ) ); + this->hashAgent_.reset( new SnapshotHashAgent( + _chainParams, _chainParams.nodeInfo.commonBLSPublicKeys, ipToDownloadSnapshotFrom ) ); } void fillData( const std::vector< dev::h256 >& snapshot_hashes ) { @@ -103,9 +104,7 @@ class SnapshotHashAgentTest { } } - size_t verifyAllData() const { - return this->hashAgent_->verifyAllData(); - } + size_t verifyAllData() const { return this->hashAgent_->verifyAllData(); } std::vector< size_t > getNodesToDownloadSnapshotFrom() { bool res = this->voteForHash(); @@ -166,7 +165,7 @@ class TestIpcServer : public jsonrpc::AbstractServerConnector { class TestIpcClient : public jsonrpc::IClientConnector { public: - explicit TestIpcClient( TestIpcServer& _server ) : m_server{_server} {} + explicit TestIpcClient( TestIpcServer& _server ) : m_server{ _server } {} void SendRPCMessage( const std::string& _message, std::string& _result ) override { m_server.ProcessRequest( _message, _result ); @@ -246,15 +245,17 @@ struct SnapshotHashingFixture : public TestOutputHelperFixture, public FixtureCo dropRoot(); - int rv = system( ( "dd if=/dev/zero of=" + BTRFS_FILE_PATH + " bs=1M count=" + to_string(200) ).c_str() ); + int rv = + system( ( "dd if=/dev/zero of=" + BTRFS_FILE_PATH + " bs=1M count=" + to_string( 200 ) ) + .c_str() ); rv = system( ( "mkfs.btrfs " + BTRFS_FILE_PATH ).c_str() ); rv = system( ( "mkdir " + BTRFS_DIR_PATH ).c_str() ); gainRoot(); rv = system( ( "mount -o user_subvol_rm_allowed " + BTRFS_FILE_PATH + " " + BTRFS_DIR_PATH ) - .c_str() ); + .c_str() ); rv = chown( BTRFS_DIR_PATH.c_str(), sudo_uid, sudo_gid ); - ( void )rv; + ( void ) rv; dropRoot(); // btrfs.subvolume.create( ( BTRFS_DIR_PATH + "/vol1" ).c_str() ); @@ -284,7 +285,7 @@ struct SnapshotHashingFixture : public TestOutputHelperFixture, public FixtureCo // true ) ); mgr.reset( new SnapshotManager( chainParams, boost::filesystem::path( BTRFS_DIR_PATH ), - {BlockChain::getChainDirName( chainParams ), "filestorage"} ) ); + { BlockChain::getChainDirName( chainParams ), "filestorage" } ) ); boost::filesystem::create_directory( boost::filesystem::path( BTRFS_DIR_PATH ) / "filestorage" / "test_dir" ); @@ -323,9 +324,9 @@ struct SnapshotHashingFixture : public TestOutputHelperFixture, public FixtureCo newFileHash << fileHash; // TODO creation order with dependencies, gasPricer etc.. - auto monitor = make_shared< InstanceMonitor >("test"); + auto monitor = make_shared< InstanceMonitor >( "test" ); - setenv("DATA_DIR", BTRFS_DIR_PATH.c_str(), 1); + setenv( "DATA_DIR", BTRFS_DIR_PATH.c_str(), 1 ); client.reset( new eth::ClientTest( chainParams, ( int ) chainParams.networkID, shared_ptr< GasPricer >(), NULL, monitor, boost::filesystem::path( BTRFS_DIR_PATH ), WithExisting::Kill ) ); @@ -339,9 +340,7 @@ struct SnapshotHashingFixture : public TestOutputHelperFixture, public FixtureCo // wait for 1st block to prevent race conditions in UnsafeRegion std::promise< void > block_promise; auto importHandler = client->setOnBlockImport( - [&block_promise]( BlockHeader const& ) { - block_promise.set_value(); - } ); + [&block_promise]( BlockHeader const& ) { block_promise.set_value(); } ); client->injectSkaleHost(); client->startWorking(); @@ -354,16 +353,16 @@ struct SnapshotHashingFixture : public TestOutputHelperFixture, public FixtureCo rpc::AdminEthFace /*, rpc::AdminNetFace*/, rpc::DebugFace, rpc::TestFace >; accountHolder.reset( new FixedAccountHolder( [&]() { return client.get(); }, {} ) ); - accountHolder->setAccounts( {coinbase, account2} ); + accountHolder->setAccounts( { coinbase, account2 } ); sessionManager.reset( new rpc::SessionManager() ); adminSession = - sessionManager->newSession( rpc::SessionPermissions{{rpc::Privilege::Admin}} ); + sessionManager->newSession( rpc::SessionPermissions{ { rpc::Privilege::Admin } } ); - auto ethFace = new rpc::Eth( std::string(""), *client, *accountHolder.get() ); + auto ethFace = new rpc::Eth( std::string( "" ), *client, *accountHolder.get() ); gasPricer = make_shared< eth::TrivialGasPricer >( 1000, 1000 ); - client->setGasPricer(gasPricer); + client->setGasPricer( gasPricer ); rpcServer.reset( new FullServer( ethFace /*, new rpc::Net(*web3)*/, new rpc::Web3( /*web3->clientVersion()*/ ), // TODO Add real version? @@ -385,11 +384,11 @@ struct SnapshotHashingFixture : public TestOutputHelperFixture, public FixtureCo return; gainRoot(); [[maybe_unused]] int rv = system( ( "umount " + BTRFS_DIR_PATH ).c_str() ); - assert(rv == 0); + assert( rv == 0 ); rv = system( ( "rmdir " + BTRFS_DIR_PATH ).c_str() ); - assert(rv == 0); + assert( rv == 0 ); rv = system( ( "rm " + BTRFS_FILE_PATH ).c_str() ); - assert(rv == 0); + assert( rv == 0 ); } string sendingRawShouldFail( string const& _t ) { @@ -402,21 +401,21 @@ struct SnapshotHashingFixture : public TestOutputHelperFixture, public FixtureCo return string(); } - TransientDirectory tempDir; // ! should exist before client! + TransientDirectory tempDir; // ! should exist before client! unique_ptr< Client > client; - dev::KeyPair coinbase{KeyPair::create()}; - dev::KeyPair account2{KeyPair::create()}; + dev::KeyPair coinbase{ KeyPair::create() }; + dev::KeyPair account2{ KeyPair::create() }; unique_ptr< FixedAccountHolder > accountHolder; unique_ptr< rpc::SessionManager > sessionManager; std::shared_ptr< eth::TrivialGasPricer > gasPricer; - KeyManager keyManager{KeyManager::defaultPath(), SecretStore::defaultPath()}; + KeyManager keyManager{ KeyManager::defaultPath(), SecretStore::defaultPath() }; unique_ptr< ModularServer<> > rpcServer; unique_ptr< WebThreeStubClient > rpcClient; std::string adminSession; unique_ptr< SnapshotManager > mgr; }; -} //namespace +} // namespace BOOST_AUTO_TEST_SUITE( SnapshotSigningTestSuite ) @@ -435,14 +434,14 @@ BOOST_AUTO_TEST_CASE( PositiveTest ) { test_agent.fillData( snapshot_hashes ); BOOST_REQUIRE( test_agent.verifyAllData() == 3 ); auto res = test_agent.getNodesToDownloadSnapshotFrom(); - std::vector< size_t > excpected = {0, 1, 2}; + std::vector< size_t > excpected = { 0, 1, 2 }; BOOST_REQUIRE( res == excpected ); BOOST_REQUIRE( test_agent.getVotedHash().first == hash ); - BOOST_REQUIRE( test_agent.getVotedHash().second == - libBLS::Bls::Signing( - libBLS::ThresholdUtils::HashtoG1( - std::make_shared< std::array< uint8_t, 32 > >( hash.asArray() ) ), - test_agent.secret_as_is ) ); + BOOST_REQUIRE( + test_agent.getVotedHash().second == + libBLS::Bls::Signing( libBLS::ThresholdUtils::HashtoG1( + std::make_shared< std::array< uint8_t, 32 > >( hash.asArray() ) ), + test_agent.secret_as_is ) ); } BOOST_AUTO_TEST_CASE( WrongHash ) { @@ -461,7 +460,7 @@ BOOST_AUTO_TEST_CASE( WrongHash ) { test_agent.fillData( snapshot_hashes ); BOOST_REQUIRE( test_agent.verifyAllData() == 6 ); auto res = test_agent.getNodesToDownloadSnapshotFrom(); - std::vector< size_t > excpected = {0, 1, 2, 3, 5}; + std::vector< size_t > excpected = { 0, 1, 2, 3, 5 }; BOOST_REQUIRE( res == excpected ); } @@ -479,7 +478,7 @@ BOOST_AUTO_TEST_CASE( NotEnoughVotes ) { std::vector< dev::h256 > snapshot_hashes( chainParams.sChain.nodes.size(), hash ); snapshot_hashes[2] = dev::h256::random(); test_agent.fillData( snapshot_hashes ); - BOOST_REQUIRE( test_agent.verifyAllData() == 3); + BOOST_REQUIRE( test_agent.verifyAllData() == 3 ); BOOST_REQUIRE_THROW( test_agent.voteForHash(), NotEnoughVotesException ); } @@ -588,28 +587,31 @@ BOOST_AUTO_TEST_SUITE_END() BOOST_AUTO_TEST_SUITE( SnapshotPerformanceSuite, *boost::unit_test::disabled() ) BOOST_FIXTURE_TEST_CASE( hashing_speed_db, SnapshotHashingFixture ) { -// *boost::unit_test::disabled() ) { + // *boost::unit_test::disabled() ) { // 21s // dev::db::LevelDB db("/home/dimalit/skaled/big_states/1GR_1.4GB/a77d61c4/12041/state"); // 150s - dev::db::LevelDB db("/home/dimalit/skale-node-tests/big_states/1/da3e7c49/12041/state"); + dev::db::LevelDB db( "/home/dimalit/skale-node-tests/big_states/1/da3e7c49/12041/state" ); auto t1 = std::chrono::high_resolution_clock::now(); auto hash = db.hashBase(); auto t2 = std::chrono::high_resolution_clock::now(); - std::cout << "Hash = " << hash << " Time = " << std::chrono::duration(t2-t1).count() << std::endl; + std::cout << "Hash = " << hash + << " Time = " << std::chrono::duration< double >( t2 - t1 ).count() << std::endl; } -BOOST_FIXTURE_TEST_CASE( hashing_speed_fs, SnapshotHashingFixture) { +BOOST_FIXTURE_TEST_CASE( hashing_speed_fs, SnapshotHashingFixture ) { secp256k1_sha256_t ctx; secp256k1_sha256_initialize( &ctx ); auto t1 = std::chrono::high_resolution_clock::now(); // 140s - with 4k and 1b files both - mgr->proceedFileStorageDirectory("/home/dimalit/skale-node-tests/big_states/10GBF", &ctx, false); + mgr->proceedFileStorageDirectory( + "/home/dimalit/skale-node-tests/big_states/10GBF", &ctx, false ); dev::h256 hash; secp256k1_sha256_finalize( &ctx, hash.data() ); auto t2 = std::chrono::high_resolution_clock::now(); - std::cout << "Hash = " << hash << " Time = " << std::chrono::duration(t2-t1).count() << std::endl; + std::cout << "Hash = " << hash + << " Time = " << std::chrono::duration< double >( t2 - t1 ).count() << std::endl; } diff --git a/test/unittests/libskale/SnapshotManager.cpp b/test/unittests/libskale/SnapshotManager.cpp index a50951bf0..105dc0bef 100644 --- a/test/unittests/libskale/SnapshotManager.cpp +++ b/test/unittests/libskale/SnapshotManager.cpp @@ -113,9 +113,9 @@ struct BtrfsFixture : public FixtureCommon { gainRoot(); rv = system( ( "mount -o user_subvol_rm_allowed " + BTRFS_FILE_PATH + " " + BTRFS_DIR_PATH ) - .c_str() ); + .c_str() ); rv = chown( BTRFS_DIR_PATH.c_str(), sudo_uid, sudo_gid ); - ( void )rv; + ( void ) rv; dropRoot(); // btrfs.subvolume.create( ( BTRFS_DIR_PATH + "/vol1" ).c_str() ); @@ -154,13 +154,13 @@ struct NoBtrfsFixture : public FixtureCommon { } }; -BOOST_AUTO_TEST_SUITE( BtrfsTestSuite, - *boost::unit_test::precondition( dev::test::option_all_tests ) ) +BOOST_AUTO_TEST_SUITE( + BtrfsTestSuite, *boost::unit_test::precondition( dev::test::option_all_tests ) ) BOOST_FIXTURE_TEST_CASE( SimplePositiveTest, BtrfsFixture, - + *boost::unit_test::precondition( dev::test::run_not_express ) ) { - SnapshotManager mgr( dev::eth::ChainParams(), fs::path( BTRFS_DIR_PATH ), {"vol1", "vol2"} ); + SnapshotManager mgr( dev::eth::ChainParams(), fs::path( BTRFS_DIR_PATH ), { "vol1", "vol2" } ); // add files 1 fs::create_directory( fs::path( BTRFS_DIR_PATH ) / "vol1" / "d11" ); @@ -169,7 +169,7 @@ BOOST_FIXTURE_TEST_CASE( SimplePositiveTest, BtrfsFixture, BOOST_REQUIRE( fs::exists( fs::path( BTRFS_DIR_PATH ) / "vol2" / "d21" ) ); auto latest0 = mgr.getLatestSnapshots(); - std::pair< int, int > expected0 { 0, 0 }; + std::pair< int, int > expected0{ 0, 0 }; BOOST_REQUIRE( latest0 == expected0 ); // create snapshot 1 and check its presense @@ -184,7 +184,7 @@ BOOST_FIXTURE_TEST_CASE( SimplePositiveTest, BtrfsFixture, BOOST_REQUIRE( !fs::exists( fs::path( BTRFS_DIR_PATH ) / "vol2" / "d21" ) ); auto latest1 = mgr.getLatestSnapshots(); - std::pair< int, int > expected1 { 0, 1 }; + std::pair< int, int > expected1{ 0, 1 }; BOOST_REQUIRE( latest1 == expected1 ); // create snapshot 2 and check files 1 and files 2 @@ -216,12 +216,12 @@ BOOST_FIXTURE_TEST_CASE( SimplePositiveTest, BtrfsFixture, BOOST_REQUIRE( !fs::exists( fs::path( BTRFS_DIR_PATH ) / "vol2" / "d21" ) ); auto latest2 = mgr.getLatestSnapshots(); - std::pair< int, int > expected2 { 1, 2 }; + std::pair< int, int > expected2{ 1, 2 }; BOOST_REQUIRE( latest2 == expected2 ); mgr.doSnapshot( 3 ); auto latest3 = mgr.getLatestSnapshots(); - std::pair< int, int > expected3 { 2, 3 }; + std::pair< int, int > expected3{ 2, 3 }; BOOST_REQUIRE( latest3 == expected3 ); BOOST_REQUIRE_NO_THROW( mgr.removeSnapshot( 1 ) ); @@ -229,16 +229,17 @@ BOOST_FIXTURE_TEST_CASE( SimplePositiveTest, BtrfsFixture, BOOST_REQUIRE_NO_THROW( mgr.removeSnapshot( 3 ) ); } -BOOST_FIXTURE_TEST_CASE( NoBtrfsTest, NoBtrfsFixture, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { - BOOST_REQUIRE_THROW( SnapshotManager mgr( dev::eth::ChainParams(), fs::path( BTRFS_DIR_PATH ), {"vol1", "vol2"} ), +BOOST_FIXTURE_TEST_CASE( + NoBtrfsTest, NoBtrfsFixture, *boost::unit_test::precondition( dev::test::run_not_express ) ) { + BOOST_REQUIRE_THROW( SnapshotManager mgr( dev::eth::ChainParams(), fs::path( BTRFS_DIR_PATH ), + { "vol1", "vol2" } ), SnapshotManager::CannotPerformBtrfsOperation ); } -BOOST_FIXTURE_TEST_CASE( BadPathTest, BtrfsFixture, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { - BOOST_REQUIRE_EXCEPTION( - SnapshotManager mgr( dev::eth::ChainParams(), fs::path( BTRFS_DIR_PATH ) / "_invalid", {"vol1", "vol2"} ), +BOOST_FIXTURE_TEST_CASE( + BadPathTest, BtrfsFixture, *boost::unit_test::precondition( dev::test::run_not_express ) ) { + BOOST_REQUIRE_EXCEPTION( SnapshotManager mgr( dev::eth::ChainParams(), + fs::path( BTRFS_DIR_PATH ) / "_invalid", { "vol1", "vol2" } ), SnapshotManager::InvalidPath, [this]( const SnapshotManager::InvalidPath& ex ) -> bool { return ex.path == fs::path( BTRFS_DIR_PATH ) / "_invalid"; } ); @@ -267,25 +268,28 @@ BOOST_FIXTURE_TEST_CASE( InaccessiblePathTest, BtrfsFixture, dropRoot(); - BOOST_REQUIRE_EXCEPTION( SnapshotManager mgr( dev::eth::ChainParams(), fs::path( BTRFS_DIR_PATH ) / "_no_w", {"vol1"} ), + BOOST_REQUIRE_EXCEPTION( SnapshotManager mgr( dev::eth::ChainParams(), + fs::path( BTRFS_DIR_PATH ) / "_no_w", { "vol1" } ), SnapshotManager::CannotCreate, [this]( const SnapshotManager::CannotCreate& ex ) -> bool { return ex.path == fs::path( BTRFS_DIR_PATH ) / "_no_w" / "snapshots"; } ); - BOOST_REQUIRE_EXCEPTION( SnapshotManager mgr( dev::eth::ChainParams(), fs::path( BTRFS_DIR_PATH ) / "_no_x", {"vol1"} ), + BOOST_REQUIRE_EXCEPTION( SnapshotManager mgr( dev::eth::ChainParams(), + fs::path( BTRFS_DIR_PATH ) / "_no_x", { "vol1" } ), SnapshotManager::CannotCreate, [this]( const SnapshotManager::CannotCreate& ex ) -> bool { return ex.path == fs::path( BTRFS_DIR_PATH ) / "_no_x" / "snapshots"; } ); - BOOST_REQUIRE_EXCEPTION( SnapshotManager mgr( dev::eth::ChainParams(), fs::path( BTRFS_DIR_PATH ) / "_no_r", {"vol1"} ), + BOOST_REQUIRE_EXCEPTION( SnapshotManager mgr( dev::eth::ChainParams(), + fs::path( BTRFS_DIR_PATH ) / "_no_r", { "vol1" } ), SnapshotManager::CannotCreate, [this]( const SnapshotManager::CannotCreate& ex ) -> bool { return ex.path == fs::path( BTRFS_DIR_PATH ) / "_no_x" / "snapshots"; } ); } -BOOST_FIXTURE_TEST_CASE( SnapshotTest, BtrfsFixture, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { - SnapshotManager mgr( dev::eth::ChainParams(), fs::path( BTRFS_DIR_PATH ), {"vol1", "vol2"} ); +BOOST_FIXTURE_TEST_CASE( + SnapshotTest, BtrfsFixture, *boost::unit_test::precondition( dev::test::run_not_express ) ) { + SnapshotManager mgr( dev::eth::ChainParams(), fs::path( BTRFS_DIR_PATH ), { "vol1", "vol2" } ); BOOST_REQUIRE_NO_THROW( mgr.doSnapshot( 2 ) ); BOOST_REQUIRE_THROW( mgr.doSnapshot( 2 ), SnapshotManager::SnapshotPresent ); @@ -312,9 +316,9 @@ BOOST_FIXTURE_TEST_CASE( SnapshotTest, BtrfsFixture, BOOST_REQUIRE_THROW( mgr.restoreSnapshot( 2 ), SnapshotManager::CannotPerformBtrfsOperation ); } -BOOST_FIXTURE_TEST_CASE( RestoreTest, BtrfsFixture, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { - SnapshotManager mgr( dev::eth::ChainParams(), fs::path( BTRFS_DIR_PATH ), {"vol1", "vol2"} ); +BOOST_FIXTURE_TEST_CASE( + RestoreTest, BtrfsFixture, *boost::unit_test::precondition( dev::test::run_not_express ) ) { + SnapshotManager mgr( dev::eth::ChainParams(), fs::path( BTRFS_DIR_PATH ), { "vol1", "vol2" } ); BOOST_REQUIRE_THROW( mgr.restoreSnapshot( 2 ), SnapshotManager::SnapshotAbsent ); @@ -328,9 +332,9 @@ BOOST_FIXTURE_TEST_CASE( RestoreTest, BtrfsFixture, BOOST_REQUIRE_THROW( mgr.restoreSnapshot( 2 ), SnapshotManager::CannotPerformBtrfsOperation ); } -BOOST_FIXTURE_TEST_CASE( DiffTest, BtrfsFixture, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { - SnapshotManager mgr( dev::eth::ChainParams(), fs::path( BTRFS_DIR_PATH ), {"vol1", "vol2"} ); +BOOST_FIXTURE_TEST_CASE( + DiffTest, BtrfsFixture, *boost::unit_test::precondition( dev::test::run_not_express ) ) { + SnapshotManager mgr( dev::eth::ChainParams(), fs::path( BTRFS_DIR_PATH ), { "vol1", "vol2" } ); mgr.doSnapshot( 2 ); fs::create_directory( fs::path( BTRFS_DIR_PATH ) / "vol1" / "dir" ); mgr.doSnapshot( 4 ); @@ -361,9 +365,9 @@ BOOST_FIXTURE_TEST_CASE( DiffTest, BtrfsFixture, // TODO Tests to check no files left in /tmp?! -BOOST_FIXTURE_TEST_CASE( ImportTest, BtrfsFixture, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { - SnapshotManager mgr( dev::eth::ChainParams(), fs::path( BTRFS_DIR_PATH ), {"vol1", "vol2"} ); +BOOST_FIXTURE_TEST_CASE( + ImportTest, BtrfsFixture, *boost::unit_test::precondition( dev::test::run_not_express ) ) { + SnapshotManager mgr( dev::eth::ChainParams(), fs::path( BTRFS_DIR_PATH ), { "vol1", "vol2" } ); BOOST_REQUIRE_THROW( mgr.importDiff( 8 ), SnapshotManager::InvalidPath ); @@ -398,9 +402,9 @@ BOOST_FIXTURE_TEST_CASE( ImportTest, BtrfsFixture, } BOOST_FIXTURE_TEST_CASE( SnapshotRotationTest, BtrfsFixture, - + *boost::unit_test::precondition( dev::test::run_not_express ) ) { - SnapshotManager mgr( dev::eth::ChainParams(), fs::path( BTRFS_DIR_PATH ), {"vol1", "vol2"} ); + SnapshotManager mgr( dev::eth::ChainParams(), fs::path( BTRFS_DIR_PATH ), { "vol1", "vol2" } ); BOOST_REQUIRE_NO_THROW( mgr.doSnapshot( 1 ) ); sleep( 1 ); @@ -419,9 +423,9 @@ BOOST_FIXTURE_TEST_CASE( SnapshotRotationTest, BtrfsFixture, } BOOST_FIXTURE_TEST_CASE( DiffRotationTest, BtrfsFixture, - + *boost::unit_test::precondition( dev::test::run_not_express ) ) { - SnapshotManager mgr( dev::eth::ChainParams(), fs::path( BTRFS_DIR_PATH ), {"vol1", "vol2"} ); + SnapshotManager mgr( dev::eth::ChainParams(), fs::path( BTRFS_DIR_PATH ), { "vol1", "vol2" } ); fs::path diff12 = mgr.getDiffPath( 2 ); { @@ -449,9 +453,9 @@ BOOST_FIXTURE_TEST_CASE( DiffRotationTest, BtrfsFixture, } BOOST_FIXTURE_TEST_CASE( RemoveSnapshotTest, BtrfsFixture, - + *boost::unit_test::precondition( dev::test::run_not_express ) ) { - SnapshotManager mgr( dev::eth::ChainParams(), fs::path( BTRFS_DIR_PATH ), {"vol1", "vol2"} ); + SnapshotManager mgr( dev::eth::ChainParams(), fs::path( BTRFS_DIR_PATH ), { "vol1", "vol2" } ); mgr.doSnapshot( 1 ); mgr.doSnapshot( 2 ); @@ -469,16 +473,16 @@ BOOST_FIXTURE_TEST_CASE( RemoveSnapshotTest, BtrfsFixture, BOOST_FIXTURE_TEST_CASE( CleanupTest, BtrfsFixture, *boost::unit_test::precondition( dev::test::run_not_express ) ) { - SnapshotManager mgr( dev::eth::ChainParams(), fs::path( BTRFS_DIR_PATH ), {"vol1", "vol2"} ); + SnapshotManager mgr( dev::eth::ChainParams(), fs::path( BTRFS_DIR_PATH ), { "vol1", "vol2" } ); mgr.doSnapshot( 1 ); mgr.doSnapshot( 2 ); mgr.cleanup(); - BOOST_REQUIRE( fs::exists( fs::path( BTRFS_DIR_PATH ) / "snapshots") ); - BOOST_REQUIRE( !fs::exists( fs::path( BTRFS_DIR_PATH ) / "snapshots" / "1") ); - BOOST_REQUIRE( !fs::exists( fs::path( BTRFS_DIR_PATH ) / "snapshots" / "2") ); + BOOST_REQUIRE( fs::exists( fs::path( BTRFS_DIR_PATH ) / "snapshots" ) ); + BOOST_REQUIRE( !fs::exists( fs::path( BTRFS_DIR_PATH ) / "snapshots" / "1" ) ); + BOOST_REQUIRE( !fs::exists( fs::path( BTRFS_DIR_PATH ) / "snapshots" / "2" ) ); BOOST_REQUIRE( fs::exists( fs::path( BTRFS_DIR_PATH ) / "diffs" ) ); diff --git a/test/unittests/libskutils/test_skutils_dispatch.cpp b/test/unittests/libskutils/test_skutils_dispatch.cpp index c47f13019..bb06dff49 100644 --- a/test/unittests/libskutils/test_skutils_dispatch.cpp +++ b/test/unittests/libskutils/test_skutils_dispatch.cpp @@ -1,6 +1,6 @@ #include "test_skutils_helper.h" -#include #include +#include static const bool g_bShowDetailedJobLogs = false; // useful for dispatch development only @@ -131,7 +131,8 @@ BOOST_AUTO_TEST_CASE( loop_functionality_alive ) { // volatile size_t nCallCountOnce = 0; const uint64_t nOnceJobTimeout = 500; // milliseconds - pLoop->job_add_once( "once uppon a time", + pLoop->job_add_once( + "once uppon a time", [&]() -> void { ++nCallCountOnce; skutils::test::test_log_e( thread_prefix_str() + @@ -140,7 +141,8 @@ BOOST_AUTO_TEST_CASE( loop_functionality_alive ) { }, skutils::dispatch::duration_from_milliseconds( nOnceJobTimeout ) ); // - pLoop->job_add_once( "bad job", + pLoop->job_add_once( + "bad job", [&]() -> void { skutils::test::test_log_e( thread_prefix_str() + cc::warn( "bad job invoked, throwing someting" ) ); @@ -157,7 +159,8 @@ BOOST_AUTO_TEST_CASE( loop_functionality_alive ) { skutils::test::test_log_e( thread_prefix_str() + cc::debug( "expecting periodical job to be invoked " ) + cc::size10( nExpectedCallCountPeriodical ) + cc::debug( " time(s), at least" ) ); - pLoop->job_add_periodic( "some periodical work", + pLoop->job_add_periodic( + "some periodical work", [&]() -> void { ++nCallCountPeriodical; skutils::test::test_log_e( thread_prefix_str() + @@ -227,18 +230,19 @@ BOOST_AUTO_TEST_CASE( domain_functionality_alive ) { // // static const size_t nSleepSeconds = 5, nWaitRoundCount = 5; - for( size_t nWaitRound = 0; nWaitRound < nWaitRoundCount; ++ nWaitRound ) { - skutils::test::test_log_e( thread_prefix_str() - + cc::warn( "waiting for test to complete in round " ) + cc::size10( nWaitRound+1 ) - + cc::warn( " of " ) + cc::size10( nWaitRoundCount ) - + cc::warn( ", will sleep " ) + cc::size10( nSleepSeconds ) + cc::warn( " second(s)..." ) ); - sleep( nSleepSeconds ); - skutils::test::test_log_e( thread_prefix_str() + cc::warn( "done sleeping " ) + - cc::size10( nSleepSeconds ) + - cc::warn( " second(s), end of domain life time..." ) ); - if( size_t( nExpectedCallCount ) == size_t( nCallCounter ) ) - break; - } // for( size_t nWaitRound = 0; nWaitRound < nWaitRoundCount; ++ nWaitRound ) + for ( size_t nWaitRound = 0; nWaitRound < nWaitRoundCount; ++nWaitRound ) { + skutils::test::test_log_e( + thread_prefix_str() + cc::warn( "waiting for test to complete in round " ) + + cc::size10( nWaitRound + 1 ) + cc::warn( " of " ) + + cc::size10( nWaitRoundCount ) + cc::warn( ", will sleep " ) + + cc::size10( nSleepSeconds ) + cc::warn( " second(s)..." ) ); + sleep( nSleepSeconds ); + skutils::test::test_log_e( thread_prefix_str() + cc::warn( "done sleeping " ) + + cc::size10( nSleepSeconds ) + + cc::warn( " second(s), end of domain life time..." ) ); + if ( size_t( nExpectedCallCount ) == size_t( nCallCounter ) ) + break; + } // for( size_t nWaitRound = 0; nWaitRound < nWaitRoundCount; ++ nWaitRound ) // // skutils::test::test_log_e( @@ -257,8 +261,8 @@ BOOST_AUTO_TEST_CASE( domain_functionality_alive ) { BOOST_AUTO_TEST_CASE( job_priorities_alive ) { skutils::test::test_print_header_name( "SkUtils/dispatch/job_priorities_alive" ); skutils::test::with_test_environment( [&]() { - size_t g_arrThreadCounts[] = {1, 2, 4 /*, 8, 16, 32, 64*/}; // tests with different count - // of threads + size_t g_arrThreadCounts[] = { 1, 2, 4 /*, 8, 16, 32, 64*/ }; // tests with different count + // of threads for ( const size_t& nThreadCount : g_arrThreadCounts ) { skutils::test::test_log_e( cc::trace( "# " @@ -277,17 +281,17 @@ BOOST_AUTO_TEST_CASE( job_priorities_alive ) { const size_t push_count_at_step_; const size_t sleep_milliseconds_; } g_arrTestDataByPriority[] = { - {"-GOD-------", SKUTILS_DISPATCH_PRIORITY_GOD, 0, 0, false, 10, 1}, - {"-BELOW-GOD-", SKUTILS_DISPATCH_PRIORITY_BELOW_GOD, 0, 0, false, 50, 1}, - {"-ABSOLUTE--", SKUTILS_DISPATCH_PRIORITY_ABSOLUTE, 0, 0, false, 800, 1}, - {"-HIGHEST---", SKUTILS_DISPATCH_PRIORITY_HIGHEST, 0, 0, false, 600, 1}, - {"-HIGH------", SKUTILS_DISPATCH_PRIORITY_HIGH, 0, 0, false, 400, 1}, - {"-NORMAL----", SKUTILS_DISPATCH_PRIORITY_NORMAL, 0, 0, false, 250, 1}, - {"-LOW-------", SKUTILS_DISPATCH_PRIORITY_LOW, 0, 0, false, 80, 1}, - {"-LOWEST----", SKUTILS_DISPATCH_PRIORITY_LOWEST, 0, 0, false, 50, 1}, - {"-TOO-LOW---", SKUTILS_DISPATCH_PRIORITY_LOWEST * 10, 0, 0, false, 40, 1}, - {"-EXTRA-LOW-", SKUTILS_DISPATCH_PRIORITY_LOWEST * 100, 0, 0, false, 30, 1}, - {"-HELL-LOW--", SKUTILS_DISPATCH_PRIORITY_LOWEST * 1000, 0, 0, false, 20, 1}, + { "-GOD-------", SKUTILS_DISPATCH_PRIORITY_GOD, 0, 0, false, 10, 1 }, + { "-BELOW-GOD-", SKUTILS_DISPATCH_PRIORITY_BELOW_GOD, 0, 0, false, 50, 1 }, + { "-ABSOLUTE--", SKUTILS_DISPATCH_PRIORITY_ABSOLUTE, 0, 0, false, 800, 1 }, + { "-HIGHEST---", SKUTILS_DISPATCH_PRIORITY_HIGHEST, 0, 0, false, 600, 1 }, + { "-HIGH------", SKUTILS_DISPATCH_PRIORITY_HIGH, 0, 0, false, 400, 1 }, + { "-NORMAL----", SKUTILS_DISPATCH_PRIORITY_NORMAL, 0, 0, false, 250, 1 }, + { "-LOW-------", SKUTILS_DISPATCH_PRIORITY_LOW, 0, 0, false, 80, 1 }, + { "-LOWEST----", SKUTILS_DISPATCH_PRIORITY_LOWEST, 0, 0, false, 50, 1 }, + { "-TOO-LOW---", SKUTILS_DISPATCH_PRIORITY_LOWEST * 10, 0, 0, false, 40, 1 }, + { "-EXTRA-LOW-", SKUTILS_DISPATCH_PRIORITY_LOWEST * 100, 0, 0, false, 30, 1 }, + { "-HELL-LOW--", SKUTILS_DISPATCH_PRIORITY_LOWEST * 1000, 0, 0, false, 20, 1 }, }; static const size_t cntPriorities = sizeof( g_arrTestDataByPriority ) / sizeof( g_arrTestDataByPriority[0] ); @@ -387,8 +391,7 @@ BOOST_AUTO_TEST_CASE( job_priorities_alive ) { g_bThreadStoppedFlag = true; skutils::test::test_log_e( thread_prefix_str() + cc::debug( "test thread is about to leave..." ) ); - } ) - .detach(); + } ).detach(); // // static const size_t nSleepMilliSeconds = 5000; @@ -596,22 +599,22 @@ BOOST_AUTO_TEST_CASE( domain_timing_functionality_alive ) { // // static const size_t nSleepSeconds = 5, nWaitRoundCount = 5; - for( size_t nWaitRound = 0; nWaitRound < nWaitRoundCount; ++ nWaitRound ) { - skutils::test::test_log_e( thread_prefix_str() - + cc::warn( "waiting for test to complete in round " ) + cc::size10( nWaitRound+1 ) - + cc::warn( " of " ) + cc::size10( nWaitRoundCount ) - + cc::warn( ", will sleep " ) + cc::size10( nSleepSeconds ) + cc::warn( " second(s)..." ) ); - sleep( nSleepSeconds ); - skutils::test::test_log_e( thread_prefix_str() + cc::warn( "done sleeping " ) + - cc::size10( nSleepSeconds ) + - cc::warn( " second(s), end of domain life time..." ) ); - if( size_t( nCallCounterOnce ) >= 1 - && size_t( nCallCounterPeriodic ) >= size_t( nCallCounterPeriodicExpected ) - && size_t( nCallCounterAsync ) >= size_t( nCallCounterAsyncExpected ) - && size_t( nCallCounterSync ) >= size_t( nCallCounterSyncExpected ) - ) - break; - } // for( size_t nWaitRound = 0; nWaitRound < nWaitRoundCount; ++ nWaitRound ) + for ( size_t nWaitRound = 0; nWaitRound < nWaitRoundCount; ++nWaitRound ) { + skutils::test::test_log_e( + thread_prefix_str() + cc::warn( "waiting for test to complete in round " ) + + cc::size10( nWaitRound + 1 ) + cc::warn( " of " ) + + cc::size10( nWaitRoundCount ) + cc::warn( ", will sleep " ) + + cc::size10( nSleepSeconds ) + cc::warn( " second(s)..." ) ); + sleep( nSleepSeconds ); + skutils::test::test_log_e( thread_prefix_str() + cc::warn( "done sleeping " ) + + cc::size10( nSleepSeconds ) + + cc::warn( " second(s), end of domain life time..." ) ); + if ( size_t( nCallCounterOnce ) >= 1 && + size_t( nCallCounterPeriodic ) >= size_t( nCallCounterPeriodicExpected ) && + size_t( nCallCounterAsync ) >= size_t( nCallCounterAsyncExpected ) && + size_t( nCallCounterSync ) >= size_t( nCallCounterSyncExpected ) ) + break; + } // for( size_t nWaitRound = 0; nWaitRound < nWaitRoundCount; ++ nWaitRound ) // // skutils::test::test_log_e( @@ -684,7 +687,8 @@ BOOST_AUTO_TEST_CASE( simple_api ) { // skutils::test::test_log_e( thread_prefix_str() + cc::debug( "adding " ) + cc::notice( "once job" ) + cc::debug( " to queue" ) ); - skutils::dispatch::once( skutils::dispatch::get_default_queue_id(), + skutils::dispatch::once( + skutils::dispatch::get_default_queue_id(), [&]() { BOOST_REQUIRE( !bool( bInsideCallOnce ) ); bInsideCallOnce = true; @@ -699,7 +703,8 @@ BOOST_AUTO_TEST_CASE( simple_api ) { // skutils::test::test_log_e( thread_prefix_str() + cc::debug( "adding " ) + cc::warn( "periodic job" ) + cc::debug( " to queue" ) ); - skutils::dispatch::repeat( skutils::dispatch::get_default_queue_id(), + skutils::dispatch::repeat( + skutils::dispatch::get_default_queue_id(), [&]() { BOOST_REQUIRE( !bool( bInsideCallPeriodic ) ); bInsideCallPeriodic = true; @@ -716,7 +721,8 @@ BOOST_AUTO_TEST_CASE( simple_api ) { // skutils::test::test_log_e( thread_prefix_str() + cc::debug( "adding " ) + cc::note( "async job" ) + cc::debug( " to queue" ) ); - skutils::dispatch::async( skutils::dispatch::get_default_queue_id(), + skutils::dispatch::async( + skutils::dispatch::get_default_queue_id(), [&]() { BOOST_REQUIRE( !bool( bInsideCallAsync ) ); bInsideCallAsync = true; @@ -750,22 +756,22 @@ BOOST_AUTO_TEST_CASE( simple_api ) { // // static const size_t nSleepSeconds = 5, nWaitRoundCount = 5; - for( size_t nWaitRound = 0; nWaitRound < nWaitRoundCount; ++ nWaitRound ) { - skutils::test::test_log_e( thread_prefix_str() - + cc::warn( "waiting for test to complete in round " ) + cc::size10( nWaitRound+1 ) - + cc::warn( " of " ) + cc::size10( nWaitRoundCount ) - + cc::warn( ", will sleep " ) + cc::size10( nSleepSeconds ) + cc::warn( " second(s)..." ) ); - sleep( nSleepSeconds ); - skutils::test::test_log_e( thread_prefix_str() + cc::warn( "done sleeping " ) + - cc::size10( nSleepSeconds ) + - cc::warn( " second(s), end of domain life time..." ) ); - if( size_t( nCallCounterOnce ) == 1 - && size_t( nCallCounterPeriodic ) >= size_t( nCallCounterPeriodicExpected ) - && size_t( nCallCounterAsync ) >= size_t( nCallCounterAsyncExpected ) - && size_t( nCallCounterSync ) >= size_t( nCallCounterSyncExpected ) - ) - break; - } // for( size_t nWaitRound = 0; nWaitRound < nWaitRoundCount; ++ nWaitRound ) + for ( size_t nWaitRound = 0; nWaitRound < nWaitRoundCount; ++nWaitRound ) { + skutils::test::test_log_e( thread_prefix_str() + + cc::warn( "waiting for test to complete in round " ) + + cc::size10( nWaitRound + 1 ) + cc::warn( " of " ) + + cc::size10( nWaitRoundCount ) + cc::warn( ", will sleep " ) + + cc::size10( nSleepSeconds ) + cc::warn( " second(s)..." ) ); + sleep( nSleepSeconds ); + skutils::test::test_log_e( thread_prefix_str() + cc::warn( "done sleeping " ) + + cc::size10( nSleepSeconds ) + + cc::warn( " second(s), end of domain life time..." ) ); + if ( size_t( nCallCounterOnce ) == 1 && + size_t( nCallCounterPeriodic ) >= size_t( nCallCounterPeriodicExpected ) && + size_t( nCallCounterAsync ) >= size_t( nCallCounterAsyncExpected ) && + size_t( nCallCounterSync ) >= size_t( nCallCounterSyncExpected ) ) + break; + } // for( size_t nWaitRound = 0; nWaitRound < nWaitRoundCount; ++ nWaitRound ) // // skutils::test::test_log_e( @@ -881,23 +887,23 @@ BOOST_AUTO_TEST_CASE( auto_queues ) { // // static const size_t nSleepSeconds = 5, nWaitRoundCount = 5; - for( size_t nWaitRound = 0; nWaitRound < nWaitRoundCount; ++ nWaitRound ) { - skutils::test::test_log_e( thread_prefix_str() - + cc::warn( "waiting for test to complete in round " ) + cc::size10( nWaitRound+1 ) - + cc::warn( " of " ) + cc::size10( nWaitRoundCount ) - + cc::warn( ", will sleep " ) + cc::size10( nSleepSeconds ) + cc::warn( " second(s)..." ) ); - sleep( nSleepSeconds ); - skutils::test::test_log_e( thread_prefix_str() + cc::warn( "done sleeping " ) + - cc::size10( nSleepSeconds ) + - cc::warn( " second(s), end of domain life time..." ) ); - if( size_t( nCallCounterAsync ) >= size_t( nCallCounterAsyncExpected ) - && size_t( nCallCounterSync ) >= size_t( nCallCounterSyncExpected ) - && size_t( nCallCounterAsync ) >= size_t( nCallCounterAsyncExpected ) - && size_t( nCallCounterSync ) >= size_t( nCallCounterSyncExpected ) - && size_t( nCallCounterSync ) >= size_t( nCallCounterAsync ) - ) - break; - } // for( size_t nWaitRound = 0; nWaitRound < nWaitRoundCount; ++ nWaitRound ) + for ( size_t nWaitRound = 0; nWaitRound < nWaitRoundCount; ++nWaitRound ) { + skutils::test::test_log_e( thread_prefix_str() + + cc::warn( "waiting for test to complete in round " ) + + cc::size10( nWaitRound + 1 ) + cc::warn( " of " ) + + cc::size10( nWaitRoundCount ) + cc::warn( ", will sleep " ) + + cc::size10( nSleepSeconds ) + cc::warn( " second(s)..." ) ); + sleep( nSleepSeconds ); + skutils::test::test_log_e( thread_prefix_str() + cc::warn( "done sleeping " ) + + cc::size10( nSleepSeconds ) + + cc::warn( " second(s), end of domain life time..." ) ); + if ( size_t( nCallCounterAsync ) >= size_t( nCallCounterAsyncExpected ) && + size_t( nCallCounterSync ) >= size_t( nCallCounterSyncExpected ) && + size_t( nCallCounterAsync ) >= size_t( nCallCounterAsyncExpected ) && + size_t( nCallCounterSync ) >= size_t( nCallCounterSyncExpected ) && + size_t( nCallCounterSync ) >= size_t( nCallCounterAsync ) ) + break; + } // for( size_t nWaitRound = 0; nWaitRound < nWaitRoundCount; ++ nWaitRound ) // // skutils::test::test_log_e( thread_prefix_str() + @@ -1017,52 +1023,53 @@ BOOST_AUTO_TEST_CASE( cross_jobs ) { } // // - bool isEverythingOKay = true; // assume good thing + bool isEverythingOKay = true; // assume good thing static const size_t nSleepSeconds = 5, nWaitRoundCount = 5; - for( size_t nWaitRound = 0; nWaitRound < nWaitRoundCount; ++ nWaitRound ) { - skutils::test::test_log_e( thread_prefix_str() - + cc::warn( "waiting for test to complete in round " ) + cc::size10( nWaitRound+1 ) - + cc::warn( " of " ) + cc::size10( nWaitRoundCount ) - + cc::warn( ", will sleep " ) + cc::size10( nSleepSeconds ) + cc::warn( " second(s)..." ) ); - sleep( nSleepSeconds ); - skutils::test::test_log_e( thread_prefix_str() + cc::warn( "done sleeping " ) + - cc::size10( nSleepSeconds ) + - cc::warn( " second(s), end of domain life time..." ) ); - // - // - // pre-liminary attempt to find out everything is OKay - skutils::test::test_log_e( - thread_prefix_str() + cc::info( "performing preliminary state test..." ) ); - isEverythingOKay = true; // assume good thing - for ( i = 0; i < nQueueCount; ++i ) { - bool bInside = bool( vecInside[i] ); + for ( size_t nWaitRound = 0; nWaitRound < nWaitRoundCount; ++nWaitRound ) { + skutils::test::test_log_e( thread_prefix_str() + + cc::warn( "waiting for test to complete in round " ) + + cc::size10( nWaitRound + 1 ) + cc::warn( " of " ) + + cc::size10( nWaitRoundCount ) + cc::warn( ", will sleep " ) + + cc::size10( nSleepSeconds ) + cc::warn( " second(s)..." ) ); + sleep( nSleepSeconds ); + skutils::test::test_log_e( thread_prefix_str() + cc::warn( "done sleeping " ) + + cc::size10( nSleepSeconds ) + + cc::warn( " second(s), end of domain life time..." ) ); + // + // + // pre-liminary attempt to find out everything is OKay skutils::test::test_log_e( - thread_prefix_str() + cc::debug( "queue " ) + cc::size10( i ) + - cc::debug( " is " ) + - ( ( !bInside ) ? cc::success( "OKay" ) : cc::fatal( "STILL WORKING - FAIL" ) ) ); - if ( bInside ) { - isEverythingOKay = false; - break; + thread_prefix_str() + cc::info( "performing preliminary state test..." ) ); + isEverythingOKay = true; // assume good thing + for ( i = 0; i < nQueueCount; ++i ) { + bool bInside = bool( vecInside[i] ); + skutils::test::test_log_e( thread_prefix_str() + cc::debug( "queue " ) + + cc::size10( i ) + cc::debug( " is " ) + + ( ( !bInside ) ? cc::success( "OKay" ) : + cc::fatal( "STILL WORKING - FAIL" ) ) ); + if ( bInside ) { + isEverythingOKay = false; + break; + } + skutils::dispatch::queue_id_t id_queue_current = + skutils::tools::format( "queue_%zu", i ); + skutils::dispatch::queue_ptr_t pQueue = + skutils::dispatch::get( id_queue_current, false ); + size_t nQueueJobCount = pQueue->async_job_count(); + // BOOST_REQUIRE( nQueueJobCount == 0 ); + skutils::test::test_log_e( + thread_prefix_str() + cc::debug( "worker " ) + cc::bright( id_queue_current ) + + cc::debug( " has " ) + cc::size10( nQueueJobCount ) + + cc::debug( " job(s) unfinished " ) + + ( ( nQueueJobCount == 0 ) ? cc::success( "OKay" ) : + cc::fatal( "FAIL, MUST BE ZERO" ) ) ); } - skutils::dispatch::queue_id_t id_queue_current = - skutils::tools::format( "queue_%zu", i ); - skutils::dispatch::queue_ptr_t pQueue = - skutils::dispatch::get( id_queue_current, false ); - size_t nQueueJobCount = pQueue->async_job_count(); - // BOOST_REQUIRE( nQueueJobCount == 0 ); skutils::test::test_log_e( - thread_prefix_str() + cc::debug( "worker " ) + cc::bright( id_queue_current ) + - cc::debug( " has " ) + cc::size10( nQueueJobCount ) + - cc::debug( " job(s) unfinished " ) + - ( ( nQueueJobCount == 0 ) ? cc::success( "OKay" ) : - cc::fatal( "FAIL, MUST BE ZERO" ) ) ); - } - skutils::test::test_log_e( - thread_prefix_str() + cc::info( "done preliminary state test - " ) + - ( isEverythingOKay ? cc::success( "PASSED" ) : cc::fatal( "FAILED" ) ) ); - if( isEverythingOKay ) - break; - } // for( size_t nWaitRound = 0; nWaitRound < nWaitRoundCount; ++ nWaitRound ) + thread_prefix_str() + cc::info( "done preliminary state test - " ) + + ( isEverythingOKay ? cc::success( "PASSED" ) : cc::fatal( "FAILED" ) ) ); + if ( isEverythingOKay ) + break; + } // for( size_t nWaitRound = 0; nWaitRound < nWaitRoundCount; ++ nWaitRound ) // // if ( !isEverythingOKay ) { @@ -1144,10 +1151,10 @@ BOOST_AUTO_TEST_CASE( enqueue_while_busy ) { log_sequence.push_back( s ); skutils::test::test_log_e( thread_prefix_str() + cc::debug( "--- " ) + cc::info( s ) ); }; - auto fnLogSequenceSize = [&]( ) -> size_t { - lock_type lock( mtx ); - size_t n = log_sequence.size(); - return n; + auto fnLogSequenceSize = [&]() -> size_t { + lock_type lock( mtx ); + size_t n = log_sequence.size(); + return n; }; const char g_strLogText_LengthyWork_begin[] = "lengthy work begin"; const char g_strLogText_LengthyWork_end[] = "lengthy work end"; @@ -1304,19 +1311,20 @@ BOOST_AUTO_TEST_CASE( enqueue_while_busy ) { // // static const size_t nSleepSeconds = 5, nWaitRoundCount = 5; - for( size_t nWaitRound = 0; nWaitRound < nWaitRoundCount; ++ nWaitRound ) { - skutils::test::test_log_e( thread_prefix_str() - + cc::warn( "waiting for test to complete in round " ) + cc::size10( nWaitRound+1 ) - + cc::warn( " of " ) + cc::size10( nWaitRoundCount ) - + cc::warn( ", will sleep " ) + cc::size10( nSleepSeconds ) + cc::warn( " second(s)..." ) ); - sleep( nSleepSeconds ); - skutils::test::test_log_e( thread_prefix_str() + cc::warn( "done sleeping " ) + - cc::size10( nSleepSeconds ) + - cc::warn( " second(s), end of domain life time..." ) ); - size_t n = fnLogSequenceSize(); - if( n >= 10 ) - break; - } // for( size_t nWaitRound = 0; nWaitRound < nWaitRoundCount; ++ nWaitRound ) + for ( size_t nWaitRound = 0; nWaitRound < nWaitRoundCount; ++nWaitRound ) { + skutils::test::test_log_e( thread_prefix_str() + + cc::warn( "waiting for test to complete in round " ) + + cc::size10( nWaitRound + 1 ) + cc::warn( " of " ) + + cc::size10( nWaitRoundCount ) + cc::warn( ", will sleep " ) + + cc::size10( nSleepSeconds ) + cc::warn( " second(s)..." ) ); + sleep( nSleepSeconds ); + skutils::test::test_log_e( thread_prefix_str() + cc::warn( "done sleeping " ) + + cc::size10( nSleepSeconds ) + + cc::warn( " second(s), end of domain life time..." ) ); + size_t n = fnLogSequenceSize(); + if ( n >= 10 ) + break; + } // for( size_t nWaitRound = 0; nWaitRound < nWaitRoundCount; ++ nWaitRound ) // // skutils::test::test_log_e( diff --git a/test/unittests/libskutils/test_skutils_helper.cpp b/test/unittests/libskutils/test_skutils_helper.cpp index 1141a4e81..f7ab5e653 100644 --- a/test/unittests/libskutils/test_skutils_helper.cpp +++ b/test/unittests/libskutils/test_skutils_helper.cpp @@ -316,8 +316,7 @@ void test_server::run_parallel() { run(); test_log_s( cc::info( strScheme_ ) + cc::debug( " network server thread will exit" ) ); thread_is_running_ = false; - } ) - .detach(); + } ).detach(); while ( !thread_is_running_ ) std::this_thread::sleep_for( std::chrono::milliseconds( 10 ) ); test_log_s( @@ -487,8 +486,7 @@ void test_server_ws_base::run() { } test_log_s( cc::info( "Main loop" ) + cc::debug( " finish" ) ); ws_server_thread_is_running_ = false; - } ) - .detach(); + } ).detach(); test_log_s( cc::debug( "Waiting for " ) + cc::note( "test server" ) + cc::debug( " open..." ) ); while ( !bServerOpenComplete ) std::this_thread::sleep_for( std::chrono::milliseconds( 50 ) ); @@ -615,34 +613,26 @@ bool test_server_https::isSSL() const { ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -test_server_proxygen::test_server_proxygen( - const char* strBindAddr4, const char* /*strBindAddr6*/, - int nListenPortHTTP4, int /*nListenPortHTTPS4*/, int /*nListenPortHTTP6*/, int /*nListenPortHTTPS6*/, - int32_t threads, int32_t threads_limit - ) - : test_server( "proxygen", nListenPortHTTP4 ) -{ - skutils::http_pg::pg_on_request_handler_t fnHandler = [=]( const nlohmann::json& joIn, - const std::string& strOrigin, int ipVer, const std::string& strDstAddress, int nDstPort ) - -> skutils::result_of_http_request { +test_server_proxygen::test_server_proxygen( const char* strBindAddr4, const char* /*strBindAddr6*/, + int nListenPortHTTP4, int /*nListenPortHTTPS4*/, int /*nListenPortHTTP6*/, + int /*nListenPortHTTPS6*/, int32_t threads, int32_t threads_limit ) + : test_server( "proxygen", nListenPortHTTP4 ) { + skutils::http_pg::pg_on_request_handler_t fnHandler = + [=]( const nlohmann::json& joIn, const std::string& strOrigin, int ipVer, + const std::string& strDstAddress, int nDstPort ) -> skutils::result_of_http_request { skutils::result_of_http_request rslt = - implHandleHttpRequest( - joIn, - strOrigin, - ipVer, - strDstAddress, - nDstPort - ); + implHandleHttpRequest( joIn, strOrigin, ipVer, strDstAddress, nDstPort ); return rslt; }; -// auto& ssl_info = helper_ssl_info(); -// BOOST_REQUIRE( (!ssl_info.strFilePathCert_.empty()) ); -// BOOST_REQUIRE( (!ssl_info.strFilePathCert_.empty()) ); + // auto& ssl_info = helper_ssl_info(); + // BOOST_REQUIRE( (!ssl_info.strFilePathCert_.empty()) ); + // BOOST_REQUIRE( (!ssl_info.strFilePathCert_.empty()) ); skutils::http_pg::pg_accumulate_entries arr_pge = { { 4, strBindAddr4, nListenPortHTTP4, "", "", "" }, -// { 4, strBindAddr4, nListenPortHTTPS4, ssl_info.strFilePathCert_.c_str(), ssl_info.strFilePathCert_.c_str(), "" }, -// { 6, strBindAddr6, nListenPortHTTP6, "", "", "" }, -// { 6, strBindAddr6, nListenPortHTTPS6, ssl_info.strFilePathCert_.c_str(), ssl_info.strFilePathKey_.c_str(), "" }, + // { 4, strBindAddr4, nListenPortHTTPS4, ssl_info.strFilePathCert_.c_str(), + // ssl_info.strFilePathCert_.c_str(), "" }, { 6, strBindAddr6, nListenPortHTTP6, "", + // "", "" }, { 6, strBindAddr6, nListenPortHTTPS6, ssl_info.strFilePathCert_.c_str(), + // ssl_info.strFilePathKey_.c_str(), "" }, }; hProxygenServer_ = skutils::http_pg::pg_start( fnHandler, arr_pge, threads, threads_limit ); std::this_thread::sleep_for( std::chrono::seconds( 1 ) ); @@ -659,8 +649,7 @@ void test_server_proxygen::stop() { std::this_thread::sleep_for( std::chrono::seconds( 1 ) ); } -void test_server_proxygen::run() { -} +void test_server_proxygen::run() {} void test_server_proxygen::run_parallel() { run(); @@ -676,13 +665,11 @@ bool test_server_proxygen::isSSL() const { } skutils::result_of_http_request test_server_proxygen::implHandleHttpRequest( - const nlohmann::json & joIn, - const std::string& strOrigin, - int /*ipVer*/, - const std::string& /*strDstAddress*/, - int /*nDstPort*/ - ) { - test_log_p( cc::ws_tx_inv( "<<< PROXYGEN-TX-POST <<< " ) + cc::u( strOrigin ) + cc::ws_tx( " <<< " ) + cc::j( joIn ) ); + const nlohmann::json& joIn, const std::string& strOrigin, int /*ipVer*/, + const std::string& /*strDstAddress*/, int /*nDstPort*/ +) { + test_log_p( cc::ws_tx_inv( "<<< PROXYGEN-TX-POST <<< " ) + cc::u( strOrigin ) + + cc::ws_tx( " <<< " ) + cc::j( joIn ) ); skutils::result_of_http_request rslt; rslt.isBinary_ = false; rslt.joOut_ = joIn; @@ -1053,7 +1040,8 @@ int close_socket( socket_t sock ) { } template < typename Fn > -socket_t create_socket( int ipVer, const char* host, int port, Fn fn, int socket_flags = 0, bool is_reuse_address = true, bool is_reuse_port = false ) { +socket_t create_socket( int ipVer, const char* host, int port, Fn fn, int socket_flags = 0, + bool is_reuse_address = true, bool is_reuse_port = false ) { #ifdef _WIN32 #define SO_SYNCHRONOUS_NONALERT 0x20 #define SO_OPENTYPE 0x7008 @@ -1097,37 +1085,41 @@ void with_busy_tcp_port( fn_with_busy_tcp_port_worker_t fnWorker, socket_t fd4 = INVALID_SOCKET, fd6 = INVALID_SOCKET; try { if ( isIPv4 ) { // "0.0.0.0" - fd4 = tcp_helpers::create_socket( 4, "127.0.0.1", nSocketListenPort, + fd4 = tcp_helpers::create_socket( + 4, "127.0.0.1", nSocketListenPort, [&]( socket_t sock, struct addrinfo& ai ) -> bool { int ret = 0; - if (::bind( sock, ai.ai_addr, static_cast< int >( ai.ai_addrlen ) ) ) + if ( ::bind( sock, ai.ai_addr, static_cast< int >( ai.ai_addrlen ) ) ) throw std::runtime_error( skutils::tools::format( "Failed to bind IPv4 busy test listener to port %d,error=%d=0x%x", nSocketListenPort, ret, ret ) ); - if (::listen( sock, 5 ) ) // listen through 5 channels + if ( ::listen( sock, 5 ) ) // listen through 5 channels throw std::runtime_error( skutils::tools::format( "Failed to start IPv4 busy test listener to port %d,error=%d=0x%x", nSocketListenPort, ret, ret ) ); return true; - }, 0, is_reuse_address, is_reuse_port ); + }, + 0, is_reuse_address, is_reuse_port ); if ( fd4 == INVALID_SOCKET ) throw std::runtime_error( skutils::tools::format( "Failed to create IPv4 busy test listener on port %d", nSocketListenPort ) ); } if ( isIPv6 ) { // "0:0:0:0:0:0:0:0" - fd6 = tcp_helpers::create_socket( 6, "::1", nSocketListenPort, + fd6 = tcp_helpers::create_socket( + 6, "::1", nSocketListenPort, [&]( socket_t sock, struct addrinfo& ai ) -> bool { int ret = 0; - if (::bind( sock, ai.ai_addr, static_cast< int >( ai.ai_addrlen ) ) ) + if ( ::bind( sock, ai.ai_addr, static_cast< int >( ai.ai_addrlen ) ) ) throw std::runtime_error( skutils::tools::format( "Failed to bind IPv6 busy test listener to port %d,error=%d=0x%x", nSocketListenPort, ret, ret ) ); - if (::listen( sock, 5 ) ) // listen through 5 channels + if ( ::listen( sock, 5 ) ) // listen through 5 channels throw std::runtime_error( skutils::tools::format( "Failed to start IPv6 busy test listener to port %d,error=%d=0x%x", nSocketListenPort, ret, ret ) ); return true; - }, 0, is_reuse_address, is_reuse_port ); + }, + 0, is_reuse_address, is_reuse_port ); if ( fd6 == INVALID_SOCKET ) throw std::runtime_error( skutils::tools::format( "Failed to create IPv6 busy test listener on port %d", nSocketListenPort ) ); @@ -1192,10 +1184,8 @@ void with_test_server( pServer.reset( new test_server_http( nSocketListenPort, false ) ); BOOST_REQUIRE( !pServer->isSSL() ); } else if ( sus == "proxygen" ) { - pServer.reset( new test_server_proxygen( "127.0.0.1", "::1", - nSocketListenPort + 0, nSocketListenPort + 1, nSocketListenPort + 2, nSocketListenPort + 3, - 0, 0 - ) ); + pServer.reset( new test_server_proxygen( "127.0.0.1", "::1", nSocketListenPort + 0, + nSocketListenPort + 1, nSocketListenPort + 2, nSocketListenPort + 3, 0, 0 ) ); } else { test_log_se( cc::error( "Unknown server type: " ) + cc::warn( strServerUrlScheme ) ); throw std::runtime_error( "Unknown server type: " + strServerUrlScheme ); @@ -1384,17 +1374,17 @@ void test_print_header_name( const char* s ) { int g_nDefaultPort = 9696; int g_nDefaultPortProxygen = 8686; -std::vector< std::string > g_vecTestClientNamesA = {"Frodo", "Bilbo", "Sam", "Elrond", "Galadriel", +std::vector< std::string > g_vecTestClientNamesA = { "Frodo", "Bilbo", "Sam", "Elrond", "Galadriel", "Celeborn", "Balrog", "Anduin", "Samwise", "Gandalf", "Legolas", "Aragorn", "Gimli", "Faramir", - "Arwen", "Pippin", "Boromir", "Theoden", "Eowyn"}; -std::vector< std::string > g_vecTestClientNamesB = {"Gollum"}; + "Arwen", "Pippin", "Boromir", "Theoden", "Eowyn" }; +std::vector< std::string > g_vecTestClientNamesB = { "Gollum" }; void test_protocol_server_startup( const char* strProto, int nPort ) { // simply start/stop server std::atomic_bool was_started = false; skutils::test::with_test_environment( [&]() -> void { skutils::test::with_test_server( - [&]( skutils::test::test_server & /*refServer*/ ) -> void { + [&]( skutils::test::test_server& /*refServer*/ ) -> void { was_started = true; skutils::test::test_log_e( cc::success( "WE ARE HERE, SERVER ALIVE" ) ); }, @@ -1432,7 +1422,7 @@ void test_protocol_serial_calls( cc::size10( size_t( cnt_clients ) ) + cc::debug( " client(s)" ) ); skutils::test::with_test_environment( [&]() -> void { skutils::test::with_test_server( - [&]( skutils::test::test_server & /*refServer*/ ) -> void { + [&]( skutils::test::test_server& /*refServer*/ ) -> void { skutils::test::test_log_e( cc::sunny( "Server startup" ) ); for ( size_t i = 0; i < cnt_clients; ++i ) { std::this_thread::sleep_for( @@ -1483,7 +1473,7 @@ void test_protocol_parallel_calls( cc::size10( size_t( cnt_clients ) ) + cc::debug( " client(s)" ) ); skutils::test::with_test_environment( [&]() -> void { skutils::test::with_test_server( - [&]( skutils::test::test_server & /*refServer*/ ) -> void { + [&]( skutils::test::test_server& /*refServer*/ ) -> void { skutils::test::test_log_e( cc::sunny( "Server startup" ) ); skutils::test::with_test_clients( [&]( skutils::test::test_client& refClient ) -> void { @@ -1548,7 +1538,7 @@ void test_protocol_busy_port( const char* strProto, int nPort ) { [&]() -> void { // fn_with_busy_tcp_port_worker_t skutils::test::test_log_e( cc::sunny( "Busy port allocated" ) ); skutils::test::with_test_server( - [&]( skutils::test::test_server & /*refServer*/ ) -> void { + [&]( skutils::test::test_server& /*refServer*/ ) -> void { skutils::test::test_log_e( cc::sunny( "Server startup" ) ); skutils::test::test_log_sf( cc::sunny( "WE SHOULD NOT REACH THIS EXECUTION POINT" ) ); @@ -1575,43 +1565,53 @@ void test_protocol_rest_call( const char* strProto, int nPort, bool tt, bool ft skutils::test::with_test_environment( [&]() -> void { skutils::test::with_test_server( [&]( skutils::test::test_server& /*refServer*/ ) -> void { - std::string strCall( "{ \"id\": \"1234567\", \"method\": \"hello\", \"params\": {} }" ); + std::string strCall( + "{ \"id\": \"1234567\", \"method\": \"hello\", \"params\": {} }" ); nlohmann::json joCall = skutils::test::ensure_call_id_present_copy( nlohmann::json::parse( strCall ) ); - if( tt ) { + if ( tt ) { skutils::test::test_log_e( cc::normal( "\"True test\" part startup" ) ); - std::string strURL = skutils::tools::format( "%s://127.0.0.1:%d", strProto, nPort ); + std::string strURL = + skutils::tools::format( "%s://127.0.0.1:%d", strProto, nPort ); skutils::url u( strURL ); skutils::rest::client restCall( u ); skutils::rest::data_t dataOut = restCall.call( strCall ); - BOOST_REQUIRE( ! dataOut.empty() ); + BOOST_REQUIRE( !dataOut.empty() ); nlohmann::json joResult = nlohmann::json::parse( dataOut.s_ ); - skutils::test::test_log_e( cc::info( "input" ) + cc::debug( "..........." ) + cc::normal( joCall.dump() ) ); - skutils::test::test_log_e( cc::info( "output" ) + cc::debug( ".........." ) + cc::normal( joResult.dump() ) ); + skutils::test::test_log_e( cc::info( "input" ) + cc::debug( "..........." ) + + cc::normal( joCall.dump() ) ); + skutils::test::test_log_e( cc::info( "output" ) + cc::debug( ".........." ) + + cc::normal( joResult.dump() ) ); BOOST_REQUIRE( joCall.dump() == joResult.dump() ); end_1_reached = true; skutils::test::test_log_e( cc::success( "\"True test\" part finish" ) ); } - if( ft ) { + if ( ft ) { skutils::test::test_log_e( cc::normal( "\"False test\" part startup" ) ); - std::string strURL = skutils::tools::format( "%s://127.0.0.1:%d", strProto, nPort + 123 ); // incorrect port + std::string strURL = skutils::tools::format( + "%s://127.0.0.1:%d", strProto, nPort + 123 ); // incorrect port skutils::url u( strURL ); skutils::rest::client restCall( u ); skutils::rest::data_t dataOut = restCall.call( strCall ); - skutils::test::test_log_e( cc::info( "error type" ) + cc::debug( "......" ) + cc::num10( int( dataOut.ei_.et_ ) ) ); - skutils::test::test_log_e( cc::info( "error code" ) + cc::debug( "......" ) + cc::num10( int( dataOut.ei_.ec_ ) ) ); - skutils::test::test_log_e( cc::info( "error text" ) + cc::debug( "......" ) + cc::normal( dataOut.ei_.strError_ ) ); + skutils::test::test_log_e( cc::info( "error type" ) + cc::debug( "......" ) + + cc::num10( int( dataOut.ei_.et_ ) ) ); + skutils::test::test_log_e( cc::info( "error code" ) + cc::debug( "......" ) + + cc::num10( int( dataOut.ei_.ec_ ) ) ); + skutils::test::test_log_e( cc::info( "error text" ) + cc::debug( "......" ) + + cc::normal( dataOut.ei_.strError_ ) ); BOOST_REQUIRE( dataOut.empty() ); - BOOST_REQUIRE( dataOut.ei_.et_ != skutils::http::common_network_exception::error_type::et_no_error ); - BOOST_REQUIRE( ! dataOut.ei_.strError_.empty() ); + BOOST_REQUIRE( + dataOut.ei_.et_ != + skutils::http::common_network_exception::error_type::et_no_error ); + BOOST_REQUIRE( !dataOut.ei_.strError_.empty() ); end_2_reached = true; skutils::test::test_log_e( cc::success( "\"False test\" part finish" ) ); } }, strProto, nPort ); } ); - BOOST_REQUIRE( end_1_reached || (!tt) ); - BOOST_REQUIRE( end_2_reached || (!ft) ); + BOOST_REQUIRE( end_1_reached || ( !tt ) ); + BOOST_REQUIRE( end_2_reached || ( !ft ) ); } }; // namespace test diff --git a/test/unittests/libskutils/test_skutils_helper.h b/test/unittests/libskutils/test_skutils_helper.h index 5833e98ab..0604a2ca0 100644 --- a/test/unittests/libskutils/test_skutils_helper.h +++ b/test/unittests/libskutils/test_skutils_helper.h @@ -10,13 +10,12 @@ #include #include #include -#include +#include #include +#include #include #include #include -#include -#include #include #include @@ -233,25 +232,21 @@ class test_server_https : public test_server_http_base { class test_server_proxygen : public test_server { skutils::http_pg::wrapped_proxygen_server_handle hProxygenServer_ = nullptr; + public: - test_server_proxygen( const char* strBindAddr4, const char* strBindAddr6, - int nListenPortHTTP4, int nListenPortHTTPS4, int nListenPortHTTP6, int nListenPortHTTPS6, - int32_t threads, int32_t threads_limit - ); + test_server_proxygen( const char* strBindAddr4, const char* strBindAddr6, int nListenPortHTTP4, + int nListenPortHTTPS4, int nListenPortHTTP6, int nListenPortHTTPS6, int32_t threads, + int32_t threads_limit ); virtual ~test_server_proxygen(); void stop() override; void run() override; void run_parallel() override; void check_can_listen() override; virtual bool isSSL() const override; + protected: - skutils::result_of_http_request implHandleHttpRequest( - const nlohmann::json & joIn, - const std::string& strOrigin, - int ipVer, - const std::string& strDstAddress, - int nDstPort - ); + skutils::result_of_http_request implHandleHttpRequest( const nlohmann::json& joIn, + const std::string& strOrigin, int ipVer, const std::string& strDstAddress, int nDstPort ); }; ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/test/unittests/libskutils/test_skutils_http.cpp b/test/unittests/libskutils/test_skutils_http.cpp index 01e503151..240a9b1d6 100644 --- a/test/unittests/libskutils/test_skutils_http.cpp +++ b/test/unittests/libskutils/test_skutils_http.cpp @@ -1,7 +1,6 @@ -#include #include "test_skutils_helper.h" -#include #include +#include BOOST_AUTO_TEST_SUITE( SkUtils ) BOOST_AUTO_TEST_SUITE( http, *boost::unit_test::precondition( dev::test::option_all_tests ) ) @@ -16,7 +15,8 @@ BOOST_AUTO_TEST_CASE( http_server_startup_sync ) { } BOOST_AUTO_TEST_CASE( proxygen_server_startup ) { skutils::test::test_print_header_name( "SkUtils/proxygen/proxygen_server_startup" ); - skutils::test::test_protocol_server_startup( "proxygen", skutils::test::g_nDefaultPortProxygen ); + skutils::test::test_protocol_server_startup( + "proxygen", skutils::test::g_nDefaultPortProxygen ); } BOOST_AUTO_TEST_CASE( http_single_call ) { @@ -68,7 +68,7 @@ BOOST_AUTO_TEST_CASE( http_busy_port ) { skutils::test::test_print_header_name( "SkUtils/http/http_busy_port" ); skutils::test::test_protocol_busy_port( "http", skutils::test::g_nDefaultPort ); } -//BOOST_AUTO_TEST_CASE( proxygen_busy_port ) { +// BOOST_AUTO_TEST_CASE( proxygen_busy_port ) { // skutils::test::test_print_header_name( "SkUtils/proxygen/proxygen_busy_port" ); // skutils::test::test_protocol_busy_port( "proxygen", skutils::test::g_nDefaultPortProxygen ); //} diff --git a/test/unittests/libskutils/test_skutils_rest.cpp b/test/unittests/libskutils/test_skutils_rest.cpp index dda07a4ee..386446899 100644 --- a/test/unittests/libskutils/test_skutils_rest.cpp +++ b/test/unittests/libskutils/test_skutils_rest.cpp @@ -19,9 +19,10 @@ BOOST_AUTO_TEST_CASE( ws ) { skutils::test::test_protocol_rest_call( "ws", skutils::test::g_nDefaultPort, true, false ); } -//BOOST_AUTO_TEST_CASE( wss ) { +// BOOST_AUTO_TEST_CASE( wss ) { // skutils::test::test_print_header_name( "SkUtils/rest/call/wss" ); -// skutils::test::test_protocol_rest_call( "wss", skutils::test::g_nDefaultPort + 123, true, false ); +// skutils::test::test_protocol_rest_call( "wss", skutils::test::g_nDefaultPort + 123, true, +// false ); //} BOOST_AUTO_TEST_SUITE_END() diff --git a/test/unittests/libskutils/test_skutils_unddos.cpp b/test/unittests/libskutils/test_skutils_unddos.cpp index d84ec27e0..6f11116ed 100644 --- a/test/unittests/libskutils/test_skutils_unddos.cpp +++ b/test/unittests/libskutils/test_skutils_unddos.cpp @@ -1,6 +1,6 @@ #include "test_skutils_helper.h" -#include #include +#include BOOST_AUTO_TEST_SUITE( SkUtils ) BOOST_AUTO_TEST_SUITE( unddos, *boost::unit_test::precondition( dev::test::option_all_tests ) ) @@ -8,18 +8,15 @@ BOOST_AUTO_TEST_SUITE( unddos, *boost::unit_test::precondition( dev::test::optio static skutils::unddos::settings compose_test_unddos_settings() { skutils::unddos::settings settings; // - skutils::unddos::origin_entry_setting oe1; - oe1.origin_wildcards_.push_back( "11.11.11.11" ); - oe1.max_calls_per_second_ = 3; - oe1.max_calls_per_minute_ = 10; - oe1.max_ws_conn_ = 2; - oe1.ban_peak_ = skutils::unddos::duration( 5 ); - oe1.ban_lengthy_ = skutils::unddos::duration( 10 ); - settings.origins_.push_back( oe1 ); - // - skutils::unddos::origin_entry_setting oe2; + skutils::unddos::origin_dos_limits oe1; + oe1.m_originWildcards.push_back( "11.11.11.11" ); + oe1.m_defaultMaxCallsPerSec = 3; + oe1.m_defaultMaxCallsPerMin = 10; + oe1.m_maxWSConn = 2; + oe1.m_banPerSecDuration = skutils::unddos::duration( 5 ); + oe1.m_banPerMinDuration = skutils::unddos::duration( 10 ); + skutils::unddos::origin_dos_limits oe2; oe2.load_unlim_for_localhost_only(); - settings.origins_.push_back( oe2 ); return settings; } @@ -27,34 +24,45 @@ BOOST_AUTO_TEST_CASE( basic_counting ) { skutils::unddos::algorithm unddos; unddos.set_settings( compose_test_unddos_settings() ); skutils::unddos::time_tick_mark ttmNow = skutils::unddos::now_tick_mark(); - BOOST_REQUIRE( unddos.register_call_from_origin( "11.11.11.11", ttmNow ) == skutils::unddos::e_high_load_detection_result_t::ehldr_no_error ); - BOOST_REQUIRE( unddos.register_call_from_origin( "11.11.11.11", ttmNow ) == skutils::unddos::e_high_load_detection_result_t::ehldr_no_error ); - BOOST_REQUIRE( unddos.register_call_from_origin( "11.11.11.11", ttmNow ) == skutils::unddos::e_high_load_detection_result_t::ehldr_no_error ); - BOOST_REQUIRE( unddos.register_call_from_origin( "11.11.11.11", ttmNow ) != skutils::unddos::e_high_load_detection_result_t::ehldr_no_error ); - ++ ttmNow; - BOOST_REQUIRE( unddos.register_call_from_origin( "11.11.11.11", ttmNow ) != skutils::unddos::e_high_load_detection_result_t::ehldr_no_error ); + BOOST_REQUIRE( unddos.register_call_from_origin( "11.11.11.11", ttmNow ) == + skutils::unddos::e_high_load_detection_result_t::ehldr_no_error ); + BOOST_REQUIRE( unddos.register_call_from_origin( "11.11.11.11", ttmNow ) == + skutils::unddos::e_high_load_detection_result_t::ehldr_no_error ); + BOOST_REQUIRE( unddos.register_call_from_origin( "11.11.11.11", ttmNow ) == + skutils::unddos::e_high_load_detection_result_t::ehldr_no_error ); + BOOST_REQUIRE( unddos.register_call_from_origin( "11.11.11.11", ttmNow ) != + skutils::unddos::e_high_load_detection_result_t::ehldr_no_error ); + ++ttmNow; + BOOST_REQUIRE( unddos.register_call_from_origin( "11.11.11.11", ttmNow ) != + skutils::unddos::e_high_load_detection_result_t::ehldr_no_error ); ttmNow += 60; - BOOST_REQUIRE( unddos.register_call_from_origin( "11.11.11.11", ttmNow ) == skutils::unddos::e_high_load_detection_result_t::ehldr_no_error ); + BOOST_REQUIRE( unddos.register_call_from_origin( "11.11.11.11", ttmNow ) == + skutils::unddos::e_high_load_detection_result_t::ehldr_no_error ); ttmNow += 60; - for( size_t i = 0; i < 10; ++ i ) { - ++ ttmNow; - BOOST_REQUIRE( unddos.register_call_from_origin( "11.11.11.11", ttmNow ) == skutils::unddos::e_high_load_detection_result_t::ehldr_no_error ); + for ( size_t i = 0; i < 10; ++i ) { + ++ttmNow; + BOOST_REQUIRE( unddos.register_call_from_origin( "11.11.11.11", ttmNow ) == + skutils::unddos::e_high_load_detection_result_t::ehldr_no_error ); } - BOOST_REQUIRE( unddos.register_call_from_origin( "11.11.11.11", ttmNow ) != skutils::unddos::e_high_load_detection_result_t::ehldr_no_error ); + BOOST_REQUIRE( unddos.register_call_from_origin( "11.11.11.11", ttmNow ) != + skutils::unddos::e_high_load_detection_result_t::ehldr_no_error ); } BOOST_AUTO_TEST_CASE( ws_conn_counting ) { skutils::unddos::algorithm unddos; unddos.set_settings( compose_test_unddos_settings() ); - BOOST_REQUIRE( ! unddos.unregister_ws_conn_for_origin( "11.11.11.11" ) ); - BOOST_REQUIRE( unddos.register_ws_conn_for_origin( "11.11.11.11" ) == skutils::unddos::e_high_load_detection_result_t::ehldr_no_error ); - BOOST_REQUIRE( unddos.register_ws_conn_for_origin( "11.11.11.11" ) == skutils::unddos::e_high_load_detection_result_t::ehldr_no_error ); - BOOST_REQUIRE( unddos.register_ws_conn_for_origin( "11.11.11.11" ) != skutils::unddos::e_high_load_detection_result_t::ehldr_no_error ); + BOOST_REQUIRE( !unddos.unregister_ws_conn_for_origin( "11.11.11.11" ) ); + BOOST_REQUIRE( unddos.register_ws_conn_for_origin( "11.11.11.11" ) == + skutils::unddos::e_high_load_detection_result_t::ehldr_no_error ); + BOOST_REQUIRE( unddos.register_ws_conn_for_origin( "11.11.11.11" ) == + skutils::unddos::e_high_load_detection_result_t::ehldr_no_error ); + BOOST_REQUIRE( unddos.register_ws_conn_for_origin( "11.11.11.11" ) != + skutils::unddos::e_high_load_detection_result_t::ehldr_no_error ); BOOST_REQUIRE( unddos.unregister_ws_conn_for_origin( "11.11.11.11" ) ); BOOST_REQUIRE( unddos.unregister_ws_conn_for_origin( "11.11.11.11" ) ); - BOOST_REQUIRE( unddos.register_ws_conn_for_origin( "11.11.11.11" ) == skutils::unddos::e_high_load_detection_result_t::ehldr_no_error ); + BOOST_REQUIRE( unddos.register_ws_conn_for_origin( "11.11.11.11" ) == + skutils::unddos::e_high_load_detection_result_t::ehldr_no_error ); } BOOST_AUTO_TEST_SUITE_END() BOOST_AUTO_TEST_SUITE_END() - diff --git a/test/unittests/libskutils/test_skutils_ws.cpp b/test/unittests/libskutils/test_skutils_ws.cpp index 9d5f9d51f..a3ce34af2 100644 --- a/test/unittests/libskutils/test_skutils_ws.cpp +++ b/test/unittests/libskutils/test_skutils_ws.cpp @@ -1,7 +1,6 @@ -#include #include "test_skutils_helper.h" -#include #include +#include BOOST_AUTO_TEST_SUITE( SkUtils ) BOOST_AUTO_TEST_SUITE( ws, *boost::unit_test::precondition( dev::test::option_all_tests ) ) diff --git a/test/unittests/libtesteth/blockchainTest.cpp b/test/unittests/libtesteth/blockchainTest.cpp index ee4091f01..21399a1f0 100644 --- a/test/unittests/libtesteth/blockchainTest.cpp +++ b/test/unittests/libtesteth/blockchainTest.cpp @@ -153,7 +153,7 @@ BOOST_AUTO_TEST_CASE( fillingExpectationOnSingleNetwork, } -BOOST_AUTO_TEST_CASE_EXPECTED_FAILURES( fillingWithWrongExpectation, 2 ) +BOOST_AUTO_TEST_CASE_EXPECTED_FAILURES( fillingWithWrongExpectation, 1 ) BOOST_AUTO_TEST_CASE( fillingWithWrongExpectation ) { cout << "BlockChainTestSuite/fillingWithWrongExpectation test - failure is expected\n"; diff --git a/test/unittests/libtesteth/testHelperTest.cpp b/test/unittests/libtesteth/testHelperTest.cpp index 2ed17b314..2307d1337 100644 --- a/test/unittests/libtesteth/testHelperTest.cpp +++ b/test/unittests/libtesteth/testHelperTest.cpp @@ -29,25 +29,25 @@ using namespace dev::test; BOOST_FIXTURE_TEST_SUITE( TestHelperSuite, TestOutputHelperFixture ) BOOST_AUTO_TEST_SUITE( TranslateNetworks ) -BOOST_AUTO_TEST_CASE( translateNetworks_gteIstanbul, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { - set< string > networks = {">=Istanbul"}; +BOOST_AUTO_TEST_CASE( + translateNetworks_gteIstanbul, *boost::unit_test::precondition( dev::test::run_not_express ) ) { + set< string > networks = { ">=Istanbul" }; networks = test::translateNetworks( networks ); BOOST_CHECK( contains( networks, "Istanbul" ) ); } BOOST_AUTO_TEST_CASE( translateNetworks_gtConstantinople, - + *boost::unit_test::precondition( dev::test::run_not_express ) ) { - set< string > networks = {">Constantinople"}; + set< string > networks = { ">Constantinople" }; networks = test::translateNetworks( networks ); BOOST_CHECK( !contains( networks, "Constantinople" ) ); BOOST_CHECK( contains( networks, "ConstantinopleFix" ) ); } -BOOST_AUTO_TEST_CASE( translateNetworks_gtHomestead, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { - set< string > networks = {"Frontier", ">Homestead"}; +BOOST_AUTO_TEST_CASE( + translateNetworks_gtHomestead, *boost::unit_test::precondition( dev::test::run_not_express ) ) { + set< string > networks = { "Frontier", ">Homestead" }; networks = test::translateNetworks( networks ); BOOST_REQUIRE( networks.count( "Frontier" ) > 0 ); BOOST_REQUIRE( networks.count( "Homestead" ) == 0 ); @@ -57,17 +57,17 @@ BOOST_AUTO_TEST_CASE( translateNetworks_gtHomestead, } } -BOOST_AUTO_TEST_CASE( translateNetworks_geHomestead, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { - set< string > networks = {"Frontier", ">=Homestead"}; +BOOST_AUTO_TEST_CASE( + translateNetworks_geHomestead, *boost::unit_test::precondition( dev::test::run_not_express ) ) { + set< string > networks = { "Frontier", ">=Homestead" }; networks = test::translateNetworks( networks ); for ( auto const& net : test::getNetworks() ) BOOST_REQUIRE( networks.count( test::netIdToString( net ) ) > 0 ); } -BOOST_AUTO_TEST_CASE( translateNetworks_ltHomestead, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { - set< string > networks = {" networks = { " 0 ); for ( auto const& net : test::getNetworks() ) { @@ -76,9 +76,9 @@ BOOST_AUTO_TEST_CASE( translateNetworks_ltHomestead, } } -BOOST_AUTO_TEST_CASE( translateNetworks_ltTest, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { - set< string > networks = {"<=EIP150", " networks = { "<=EIP150", " 0 ); BOOST_REQUIRE( networks.count( "Homestead" ) > 0 ); @@ -87,9 +87,9 @@ BOOST_AUTO_TEST_CASE( translateNetworks_ltTest, BOOST_REQUIRE( networks.count( "Byzantium" ) == 0 ); } -BOOST_AUTO_TEST_CASE( translateNetworks_leHomestead, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { - set< string > networks = {"<=Homestead"}; +BOOST_AUTO_TEST_CASE( + translateNetworks_leHomestead, *boost::unit_test::precondition( dev::test::run_not_express ) ) { + set< string > networks = { "<=Homestead" }; networks = test::translateNetworks( networks ); BOOST_REQUIRE( networks.count( "Frontier" ) > 0 ); BOOST_REQUIRE( networks.count( "Homestead" ) > 0 ); @@ -99,9 +99,9 @@ BOOST_AUTO_TEST_CASE( translateNetworks_leHomestead, } } -BOOST_AUTO_TEST_CASE( translateNetworks_leFrontier, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { - set< string > networks = {"<=Frontier"}; +BOOST_AUTO_TEST_CASE( + translateNetworks_leFrontier, *boost::unit_test::precondition( dev::test::run_not_express ) ) { + set< string > networks = { "<=Frontier" }; networks = test::translateNetworks( networks ); BOOST_REQUIRE( networks.count( "Frontier" ) > 0 ); for ( auto const& net : test::getNetworks() ) { @@ -112,90 +112,90 @@ BOOST_AUTO_TEST_CASE( translateNetworks_leFrontier, BOOST_AUTO_TEST_SUITE_END() BOOST_AUTO_TEST_SUITE( TestHelper ) -BOOST_AUTO_TEST_CASE( levenshteinDistance_similar, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( + levenshteinDistance_similar, *boost::unit_test::precondition( dev::test::run_not_express ) ) { char const* word1 = "someword"; char const* word2 = "soemword"; size_t distance = test::levenshteinDistance( word1, strlen( word1 ), word2, strlen( word2 ) ); BOOST_CHECK_EQUAL( distance, 2 ); } -BOOST_AUTO_TEST_CASE( levenshteinDistance_similar2, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( + levenshteinDistance_similar2, *boost::unit_test::precondition( dev::test::run_not_express ) ) { char const* word1 = "sOmeWord"; char const* word2 = "someword"; size_t distance = test::levenshteinDistance( word1, strlen( word1 ), word2, strlen( word2 ) ); BOOST_CHECK_EQUAL( distance, 2 ); } -BOOST_AUTO_TEST_CASE( levenshteinDistance_similar3, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( + levenshteinDistance_similar3, *boost::unit_test::precondition( dev::test::run_not_express ) ) { char const* word1 = "sOmeWoRd"; char const* word2 = "someword"; size_t distance = test::levenshteinDistance( word1, strlen( word1 ), word2, strlen( word2 ) ); BOOST_CHECK_EQUAL( distance, 3 ); } -BOOST_AUTO_TEST_CASE( levenshteinDistance_similar4, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( + levenshteinDistance_similar4, *boost::unit_test::precondition( dev::test::run_not_express ) ) { char const* word1 = "sOmeWoRd"; char const* word2 = "soemword"; size_t distance = test::levenshteinDistance( word1, strlen( word1 ), word2, strlen( word2 ) ); BOOST_CHECK_EQUAL( distance, 5 ); } -BOOST_AUTO_TEST_CASE( levenshteinDistance_AgtB, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( + levenshteinDistance_AgtB, *boost::unit_test::precondition( dev::test::run_not_express ) ) { char const* word1 = "someword"; char const* word2 = "other"; size_t distance = test::levenshteinDistance( word1, strlen( word1 ), word2, strlen( word2 ) ); BOOST_CHECK_EQUAL( distance, 4 ); } -BOOST_AUTO_TEST_CASE( levenshteinDistance_AgtB2, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( + levenshteinDistance_AgtB2, *boost::unit_test::precondition( dev::test::run_not_express ) ) { char const* word1 = "some long sentence here"; char const* word2 = "other shorter phrase"; size_t distance = test::levenshteinDistance( word1, strlen( word1 ), word2, strlen( word2 ) ); BOOST_CHECK_EQUAL( distance, 14 ); } -BOOST_AUTO_TEST_CASE( levenshteinDistance_BgtA, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( + levenshteinDistance_BgtA, *boost::unit_test::precondition( dev::test::run_not_express ) ) { char const* word1 = "other"; char const* word2 = "someword"; size_t distance = test::levenshteinDistance( word1, strlen( word1 ), word2, strlen( word2 ) ); BOOST_CHECK_EQUAL( distance, 4 ); } -BOOST_AUTO_TEST_CASE( levenshteinDistance_BgtA2, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( + levenshteinDistance_BgtA2, *boost::unit_test::precondition( dev::test::run_not_express ) ) { char const* word1 = "other shorter phrase"; char const* word2 = "some long sentence here"; size_t distance = test::levenshteinDistance( word1, strlen( word1 ), word2, strlen( word2 ) ); BOOST_CHECK_EQUAL( distance, 14 ); } -BOOST_AUTO_TEST_CASE( levenshteinDistance_different, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( + levenshteinDistance_different, *boost::unit_test::precondition( dev::test::run_not_express ) ) { char const* word1 = "abdefg"; char const* word2 = "hijklmn"; size_t distance = test::levenshteinDistance( word1, strlen( word1 ), word2, strlen( word2 ) ); BOOST_CHECK_EQUAL( distance, 6 ); } -BOOST_AUTO_TEST_CASE( getTestSuggestions, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { - vector< string > const testList = { - "test1", "test2", "BlockSuite", "BlockSuite/TestCase", "GeneralBlockchainTests"}; +BOOST_AUTO_TEST_CASE( + getTestSuggestions, *boost::unit_test::precondition( dev::test::run_not_express ) ) { + vector< string > const testList = { "test1", "test2", "BlockSuite", "BlockSuite/TestCase", + "GeneralBlockchainTests" }; auto list = test::testSuggestions( testList, "blocksuit" ); BOOST_CHECK( test::inArray( list, string( "BlockSuite" ) ) ); } -BOOST_AUTO_TEST_CASE( getTestSuggestions2, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { - vector< string > const testList = {"test1", "test2", "BlockSuite", "BlockSuite/TestCase", - "GeneralBlockchainTests", "GeneralStateTests/stExample", "BCGeneralStateTests/stExample"}; +BOOST_AUTO_TEST_CASE( + getTestSuggestions2, *boost::unit_test::precondition( dev::test::run_not_express ) ) { + vector< string > const testList = { "test1", "test2", "BlockSuite", "BlockSuite/TestCase", + "GeneralBlockchainTests", "GeneralStateTests/stExample", "BCGeneralStateTests/stExample" }; auto list = test::testSuggestions( testList, "GeneralStateTests/stExample2" ); BOOST_CHECK( test::inArray( list, string( "GeneralStateTests/stExample" ) ) ); diff --git a/test/unittests/libweb3core/LevelDBHash.cpp b/test/unittests/libweb3core/LevelDBHash.cpp index f7c444dcd..f35a77275 100644 --- a/test/unittests/libweb3core/LevelDBHash.cpp +++ b/test/unittests/libweb3core/LevelDBHash.cpp @@ -9,7 +9,7 @@ BOOST_AUTO_TEST_SUITE( LevelDBHashBase ) BOOST_AUTO_TEST_CASE( hash ) { dev::TransientDirectory td; - std::vector< std::pair< std::string, std::string > > randomKeysValues(123); + std::vector< std::pair< std::string, std::string > > randomKeysValues( 123 ); dev::h256 hash; { @@ -22,7 +22,7 @@ BOOST_AUTO_TEST_CASE( hash ) { for ( size_t i = 0; i < 123; ++i ) { std::string key = dev::h256::random().hex(); std::string value = dev::h256::random().hex(); - db->insert( dev::db::Slice(key), dev::db::Slice(value) ); + db->insert( dev::db::Slice( key ), dev::db::Slice( value ) ); randomKeysValues[i] = { key, value }; } @@ -41,7 +41,7 @@ BOOST_AUTO_TEST_CASE( hash ) { for ( size_t i = 0; i < 123; ++i ) { std::string key = randomKeysValues[i].first; std::string value = randomKeysValues[i].second; - db_copy->insert( dev::db::Slice(key), dev::db::Slice(value) ); + db_copy->insert( dev::db::Slice( key ), dev::db::Slice( value ) ); } db_copy->insert( dev::db::Slice( "PieceUsageBytes" ), dev::db::Slice( "123456789" ) ); db_copy->insert( dev::db::Slice( "ppieceUsageBytes" ), dev::db::Slice( "123456789" ) ); @@ -63,7 +63,7 @@ BOOST_AUTO_TEST_CASE( hash ) { for ( size_t i = 0; i < 123; ++i ) { std::string key = randomKeysValues[i].first; std::string value = randomKeysValues[i].second; - db_copy->insert( dev::db::Slice(key), dev::db::Slice(value) ); + db_copy->insert( dev::db::Slice( key ), dev::db::Slice( value ) ); } db_copy->insert( dev::db::Slice( "PieceUsageBytes" ), dev::db::Slice( "123456789" ) ); @@ -76,9 +76,10 @@ BOOST_AUTO_TEST_CASE( hash ) { std::string lastHashedKey = "start"; bool isContinue = true; while ( isContinue ) { - std::unique_ptr< dev::db::LevelDB > m_db( new dev::db::LevelDB( td.path(), - dev::db::LevelDB::defaultSnapshotReadOptions(), dev::db::LevelDB::defaultWriteOptions(), - dev::db::LevelDB::defaultSnapshotDBOptions() ) ); + std::unique_ptr< dev::db::LevelDB > m_db( + new dev::db::LevelDB( td.path(), dev::db::LevelDB::defaultSnapshotReadOptions(), + dev::db::LevelDB::defaultWriteOptions(), + dev::db::LevelDB::defaultSnapshotDBOptions() ) ); isContinue = m_db->hashBasePartially( &dbCtx, lastHashedKey ); } @@ -99,7 +100,7 @@ BOOST_AUTO_TEST_CASE( hash ) { for ( size_t i = 0; i < 123; ++i ) { std::string key = dev::h256::random().hex(); std::string value = dev::h256::random().hex(); - db_diff->insert( dev::db::Slice(key), dev::db::Slice(value) ); + db_diff->insert( dev::db::Slice( key ), dev::db::Slice( value ) ); } hash_diff = db_diff->hashBase(); diff --git a/test/unittests/libweb3core/memorydb.cpp b/test/unittests/libweb3core/memorydb.cpp index 1e1608b58..7e7e385f6 100644 --- a/test/unittests/libweb3core/memorydb.cpp +++ b/test/unittests/libweb3core/memorydb.cpp @@ -38,8 +38,7 @@ namespace test {} BOOST_FIXTURE_TEST_SUITE( memDB, TestOutputHelperFixture ) -BOOST_AUTO_TEST_CASE( kill, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( kill, *boost::unit_test::precondition( dev::test::run_not_express ) ) { MemoryDB myDB; BOOST_CHECK( myDB.get().empty() ); bytes value = fromHex( "43" ); @@ -50,8 +49,8 @@ BOOST_AUTO_TEST_CASE( kill, BOOST_CHECK( myDB.kill( h256( 42 ) ) ); } -BOOST_AUTO_TEST_CASE( purgeMainMem, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( + purgeMainMem, *boost::unit_test::precondition( dev::test::run_not_express ) ) { MemoryDB myDB; BOOST_CHECK( myDB.get().empty() ); string const value = "\x43"; @@ -77,8 +76,8 @@ BOOST_AUTO_TEST_CASE( purgeMainMem, BOOST_CHECK_EQUAL( myDB.get().size(), 0 ); } -BOOST_AUTO_TEST_CASE( purgeMainMem_Refs, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( + purgeMainMem_Refs, *boost::unit_test::precondition( dev::test::run_not_express ) ) { MemoryDB myDB; { EnforceRefs enforceRefs( myDB, true ); @@ -133,8 +132,7 @@ BOOST_AUTO_TEST_CASE( purgeMainMem_Refs, BOOST_CHECK_EQUAL( myDB.get().size(), 0 ); } -BOOST_AUTO_TEST_CASE( purgeAuxMem, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( purgeAuxMem, *boost::unit_test::precondition( dev::test::run_not_express ) ) { class AuxMemDB : public MemoryDB { public: std::unordered_map< h256, std::pair< bytes, bool > > getAux() { return m_aux; } @@ -159,8 +157,7 @@ BOOST_AUTO_TEST_CASE( purgeAuxMem, BOOST_CHECK_EQUAL( myDB.getAux().size(), 0 ); } -BOOST_AUTO_TEST_CASE( copy, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( copy, *boost::unit_test::precondition( dev::test::run_not_express ) ) { MemoryDB myDB; BOOST_CHECK( myDB.get().empty() ); bytes value = fromHex( "43" ); @@ -178,8 +175,7 @@ BOOST_AUTO_TEST_CASE( copy, BOOST_CHECK( myDB.keys() != copyToDB.keys() ); } -BOOST_AUTO_TEST_CASE( lookUp, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( lookUp, *boost::unit_test::precondition( dev::test::run_not_express ) ) { MemoryDB myDB; BOOST_CHECK( myDB.get().empty() ); string const value = "\x43"; diff --git a/test/unittests/libweb3jsonrpc/AccountHolder.cpp b/test/unittests/libweb3jsonrpc/AccountHolder.cpp index bdc547071..70aac620b 100644 --- a/test/unittests/libweb3jsonrpc/AccountHolder.cpp +++ b/test/unittests/libweb3jsonrpc/AccountHolder.cpp @@ -34,7 +34,8 @@ namespace test { BOOST_FIXTURE_TEST_SUITE( AccountHolderTest, TestOutputHelperFixture ) -BOOST_AUTO_TEST_CASE( ProxyAccountUseCase, *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( + ProxyAccountUseCase, *boost::unit_test::precondition( dev::test::run_not_express ) ) { FixedAccountHolder h = FixedAccountHolder( function< Interface*() >(), vector< KeyPair >() ); BOOST_CHECK( h.allAccounts().empty() ); diff --git a/test/unittests/libweb3jsonrpc/Client.cpp b/test/unittests/libweb3jsonrpc/Client.cpp index 734a80b8a..0d33fd962 100644 --- a/test/unittests/libweb3jsonrpc/Client.cpp +++ b/test/unittests/libweb3jsonrpc/Client.cpp @@ -77,11 +77,11 @@ BOOST_AUTO_TEST_CASE( Personal ) { // dev::WebThreeDirect web3( WebThreeDirect::composeClientVersion( "eth" ), getDataDir(), // string(), // chainParams, WithExisting::Kill, set< string >{"eth"} ); - auto monitor = make_shared< InstanceMonitor >("test"); + auto monitor = make_shared< InstanceMonitor >( "test" ); - setenv("DATA_DIR", getDataDir().c_str(), 1); - Client client( chainParams, ( int ) chainParams.networkID, shared_ptr< GasPricer >(), NULL, monitor, - getDataDir(), WithExisting::Kill, TransactionQueue::Limits{100000, 1024} ); + setenv( "DATA_DIR", getDataDir().c_str(), 1 ); + Client client( chainParams, ( int ) chainParams.networkID, shared_ptr< GasPricer >(), NULL, + monitor, getDataDir(), WithExisting::Kill, TransactionQueue::Limits{ 100000, 1024 } ); client.injectSkaleHost(); client.startWorking(); @@ -101,7 +101,7 @@ BOOST_AUTO_TEST_CASE( Personal ) { return false; // user input goes here } ); rpc::Personal personal( keyManager, accountHolder, client ); - rpc::Eth eth( std::string(""), client, accountHolder ); + rpc::Eth eth( std::string( "" ), client, accountHolder ); // Create account diff --git a/test/unittests/libweb3jsonrpc/SkaledFixture.cpp b/test/unittests/libweb3jsonrpc/SkaledFixture.cpp new file mode 100644 index 000000000..9ee87b266 --- /dev/null +++ b/test/unittests/libweb3jsonrpc/SkaledFixture.cpp @@ -0,0 +1,929 @@ +/* +Modifications Copyright (C) 2024- SKALE Labs + + This file is part of cpp-ethereum. + + cpp-ethereum is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + cpp-ethereum is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with cpp-ethereum. If not, see . +*/ + +#pragma GCC diagnostic ignored "-Wdeprecated" + +#include "WebThreeStubClient.h" + + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "libweb3jsonrpc/SkaleFace.h" + +#include +#include +#include +#include +#include +#include + +#include "SkaledFixture.h" +#include + +#include + + +// Callback function to handle data received from the server +size_t WriteCallback( void* contents, size_t size, size_t nmemb, void* userp ) { + ( ( std::string* ) userp )->append( ( char* ) contents, size * nmemb ); + return size * nmemb; +} + + +void CurlClient::resetCurl() { + if ( headers ) { + curl_slist_free_all( headers ); + headers = curl_slist_append( nullptr, "Content-Type: application/json" ); + } + curl_easy_reset( curl ); + curl_easy_setopt( curl, CURLOPT_URL, this->skaledEndpoint.c_str() ); + curl_easy_setopt( curl, CURLOPT_POST, 1L ); + curl_easy_setopt( curl, CURLOPT_POST, 1L ); + // Set up callback to capture response + curl_easy_setopt( curl, CURLOPT_WRITEFUNCTION, WriteCallback ); + readBuffer = ""; + curl_easy_setopt( curl, CURLOPT_WRITEDATA, &readBuffer ); + // Set HTTP headers + headers = curl_slist_append( nullptr, "Content-Type: application/json" ); + curl_easy_setopt( curl, CURLOPT_HTTPHEADER, headers ); +} +CurlClient::CurlClient::CurlClient( SkaledFixture& _fixture ) { + curl = curl_easy_init(); + CHECK( curl ); + skaledEndpoint = _fixture.skaledEndpoint; + CHECK( !skaledEndpoint.empty() ) + resetCurl(); +} + +void CurlClient::setRequest( const string& _json_rpc_request ) { + resetCurl(); + curl_easy_setopt( curl, CURLOPT_POSTFIELDS, _json_rpc_request.c_str() ); + curl_easy_setopt( curl, CURLOPT_POSTFIELDSIZE, _json_rpc_request.size() ); +} + +Json::Value CurlClient::doRequestResponse() { + auto res = curl_easy_perform( curl ); + if ( res != CURLE_OK ) { + throw std::runtime_error( + string( "curl_easy_perform() failed" ) + curl_easy_strerror( res ) ); + } + + Json::CharReaderBuilder readerBuilder; + Json::Value root; + std::string errs; + + // Parse the JSON string + std::istringstream ss( readBuffer ); + if ( Json::parseFromStream( readerBuilder, ss, &root, &errs ) ) { + // Accessing JSON data + if ( root.isMember( "result" ) ) { + return root["result"]; + } else if ( root.isMember( "error" ) ) { + CHECK( root["error"].isObject() ); + auto errorDescription = root["error"]; + string description = "JSON-RPC error:"; + if ( errorDescription.isMember( "code" ) ) { + description += errorDescription["code"].asString() + ":"; + } + + if ( errorDescription.isMember( "message" ) ) { + description += errorDescription["message"].asString() + ":"; + }; + + throw std::runtime_error( description ); + } else { + throw std::runtime_error( "No result or error in response" ); + Json::StreamWriterBuilder writer; + writer["indentation"] = " "; // Set indentation level (2 spaces here) + + // Convert the Json::Value to a string + std::string output = Json::writeString( writer, root ); + throw std::runtime_error( "No result or error in response:" + output ); + } + } else { + // Output error message if parsing fails + cerr << "Failed to parse JSON: " << errs << std::endl; + throw runtime_error( "Failed to parse JSON" ); + } + + return ++totalCallsCount; +} + +std::atomic< uint64_t > CurlClient::totalCallsCount = 0; + +Json::Value CurlClient::parseResponse() { + Json::CharReaderBuilder readerBuilder; + Json::Value jsonData; + std::string errs; + std::istringstream s( readBuffer ); + if ( !Json::parseFromStream( readerBuilder, s, &jsonData, &errs ) ) { + throw std::runtime_error( "Failed to parse JSON response: " + errs ); + } + return jsonData; +} + +CurlClient::~CurlClient() { + curl_slist_free_all( headers ); + curl_easy_cleanup( curl ); +} + +uint64_t CurlClient::getTotalCallsCount() { + return totalCallsCount; +} + +string CurlClient::eth_sendRawTransaction( const std::string& _rawTransactionHex ) { + std::string jsonPayload = R"({"jsonrpc":"2.0","method":"eth_sendRawTransaction","params":[")" + + _rawTransactionHex + R"("],"id":1})"; + setRequest( jsonPayload ); + auto result = doRequestResponse(); + return result.asString(); +} + +void CurlClient::doRequestResponseAndCheckForError( + std::string jsonPayload, Json::Value& response ) { + setRequest( jsonPayload ); + doRequestResponse(); + response = parseResponse(); + if ( response.isMember( "error" ) ) { + auto errorObject = response["error"]; + string errorMessage = "eth_getBalance returned error."; + if ( errorObject.isMember( "message" ) ) { + errorMessage += errorObject["message"].asString(); + } + throw runtime_error( errorMessage ); + } +} +u256 CurlClient::eth_getBalance( const std::string& _addressString ) { + std::string jsonPayload = R"({"jsonrpc":"2.0","method":"eth_getBalance","params":[")" + + _addressString + R"(","latest"],"id":1})"; + Json::Value response; + doRequestResponseAndCheckForError( jsonPayload, response ); + + CHECK( response.isMember( "result" ) ); + auto resultStr = response["result"].asString(); + return jsToU256( resultStr ); +} + +u256 CurlClient::eth_getTransactionCount( const std::string& _addressString ) { + std::string jsonPayload = R"({"jsonrpc":"2.0","method":"eth_getTransactionCount","params":[")" + + _addressString + R"(","latest"],"id":1})"; + Json::Value response; + doRequestResponseAndCheckForError( jsonPayload, response ); + + CHECK( response.isMember( "result" ) ); + auto resultStr = response["result"].asString(); + return jsToU256( resultStr ); +} + +Json::Value CurlClient::eth_getTransactionReceipt( const std::string& _hash ) { + std::string jsonPayload = + R"({"jsonrpc":"2.0","method":"eth_getTransactionReceipt","params":[")" + _hash + + R"("],"id":1})"; + Json::Value response; + doRequestResponseAndCheckForError( jsonPayload, response ); + + CHECK( response.isMember( "result" ) ); + if ( !response["result"].isObject() ) { + cerr << response << endl; + } + CHECK( response["result"].isObject() ); + CHECK( response["result"]["status"].isString() ); + if ( response["result"]["status"].asString() == "0x0" ) { + cerr << response << endl; + throw std::runtime_error( "Transaction reverted" ); + } + return response["result"]; +} + + +string SkaledFixture::readFile( const std::string& _path ) { + CHECK( boost::filesystem::exists( _path ) ); + + boost::filesystem::ifstream stream( _path, std::ios::in | std::ios::binary ); + + CHECK( stream.is_open() ); + + string contents( + ( std::istreambuf_iterator< char >( stream ) ), std::istreambuf_iterator< char >() ); + + return contents; +} + +thread_local ptr< CurlClient > SkaledFixture::curlClient; + +ptr< CurlClient > SkaledFixture::getThreadLocalCurlClient() { + if ( !curlClient ) { + curlClient = make_shared< CurlClient >( *this ); + } + return curlClient; +}; + +const u256 FIRST_WALLET_FUNDING( "10000000000000000000000000000000000000000000" ); + +void SkaledFixture::setupFirstKey() { + auto firstAccount = SkaledAccount::generate(); + CHECK( testAccounts.try_emplace( firstAccount->getAddressAsString(), firstAccount ).second ); + auto gasPrice = getCurrentGasPrice(); + auto ownerBalance = getBalance( ownerAccount->getAddressAsString() ); + + cout << "Owner wallet:" << ownerAccount->getAddressAsString() << endl; + cout << "Owner balance, wei:" << ownerBalance << endl; + cout << "First wallet:" << firstAccount->getAddressAsString() << endl; + cout << "Gas price, wei " << gasPrice << endl; + sendSingleTransfer( FIRST_WALLET_FUNDING, ownerAccount, firstAccount->getAddressAsString(), + gasPrice, TransferType::NATIVE, TransactionWait::WAIT_FOR_COMPLETION ); + cout << "Transferred " << FIRST_WALLET_FUNDING << " wei to the first wallet" << endl; + CHECK( getBalance( firstAccount->getAddressAsString() ) == FIRST_WALLET_FUNDING ); + CHECK( getBalance( ownerAccount->getAddressAsString() ) > FIRST_WALLET_FUNDING ); + // set owner account to null to make sure it is not in the test anymore + // the owner account is used to fund th first + ownerAccount = nullptr; +} + +void SkaledFixture::deployERC20() { + cout << "Deploying test ERC20 contract ... " << endl; + + + std::ifstream inputFile( + "../../test/unittests/libweb3jsonrpc/contracts/ERC20_bytecode.txt" ); // Open the file + CHECK( inputFile ) + std::string content; + std::getline( inputFile, content ); // Read the string from the file + inputFile.close(); // Close the file + + + auto gasPrice = getCurrentGasPrice(); + + CHECK( testAccounts.size() > 0 ); + + auto hash = sendSingleDeployOrSolidityCall( 0, this->testAccounts.begin()->second, std::nullopt, + content, gasPrice, TransactionWait::WAIT_FOR_COMPLETION ); + + + auto receipt = getThreadLocalCurlClient()->eth_getTransactionReceipt( hash ); + CHECK( receipt.isMember( "contractAddress" ) ); + CHECK( receipt["contractAddress"].isString() ); + erc20ContractAddress = receipt["contractAddress"].asString(); + cout << "Deployed test ERC20 contract at address:" << erc20ContractAddress << endl; + cout << "Gas used " << receipt["gasUsed"].asString() << endl; + + + // mint zero tokens to check contract works + mintERC20( testAccounts.begin()->second, testAccounts.begin()->first, u256( 0 ), + getCurrentGasPrice(), TransactionWait::WAIT_FOR_COMPLETION ); +} + + +string SkaledFixture::checkReceiptStatusAndGetGasUsed( string _hash ) { + CHECK( _hash.size() == 66 ); + auto receipt = getThreadLocalCurlClient()->eth_getTransactionReceipt( _hash ); + + CHECK( receipt.isMember( "gasUsed" ) ); + CHECK( receipt["gasUsed"].isString() ); + + return receipt["gasUsed"].asString(); +} +void SkaledFixture::mintERC20( std::shared_ptr< SkaledAccount > _minter, const string& _address, + u256 _amount, u256 _gasPrice, TransactionWait _wait ) { + CHECK( _minter ); + CHECK( testAccounts.size() > 0 ); + CHECK( _address.size() == 42 ); + auto amountString = toHex( _amount ); + CHECK( amountString.size() == 64 ); + + auto data = this->MINT_FUNCTION_SELECTOR + _address.substr( 2 ) + amountString; + + auto hash = sendSingleDeployOrSolidityCall( + 0, _minter, this->erc20ContractAddress, data, _gasPrice, _wait ); + + if ( _wait == TransactionWait::WAIT_FOR_COMPLETION ) { + checkReceiptStatusAndGetGasUsed( _minter->getLastTxHash() ); + } +} + + +void SkaledFixture::setupTwoToTheNKeys( uint64_t _n ) { + mutex testAccountsMutex; + + for ( uint64_t j = 0; j < _n; j++ ) { + cout << "Creating test wallets. Iteration " << j + << " wallets created: " << testAccounts.size() << endl; + + + map< string, std::shared_ptr< SkaledAccount > > testAccountsCopy; + + { + lock_guard< mutex > lock( testAccountsMutex ); + testAccountsCopy = testAccounts; + } + + map< string, shared_ptr< SkaledAccount > > oldNewPairs; + + for ( auto&& testAccount : testAccountsCopy ) { + auto newAccount = SkaledAccount::generate(); + string address = newAccount->getAddressAsString(); + CHECK( testAccounts.count( address ) == 0 ); + oldNewPairs.emplace( testAccount.first, newAccount ); + // add the new account to the map + lock_guard< mutex > lock( testAccountsMutex ); + CHECK( testAccounts.count( newAccount->getAddressAsString() ) == 0 ); + testAccounts.emplace( newAccount->getAddressAsString(), newAccount ); + } + + auto begin = getCurrentTimeMs(); + + + auto gasPrice = getCurrentGasPrice(); + + vector< shared_ptr< thread > > threads; + + for ( auto&& testAccount : testAccountsCopy ) { + if ( useThreadsForTestKeyCreation ) { + auto t = make_shared< thread >( [&]() { + auto oldAccount = testAccount.second; + auto newAccount = oldNewPairs.at( testAccount.first ); + splitAccountInHalves( oldAccount, newAccount, gasPrice, + TransactionWait::DONT_WAIT_FOR_COMPLETION ); + } ); + threads.push_back( t ); + } else { + auto oldAccount = testAccount.second; + auto newAccount = oldNewPairs.at( testAccount.first ); + splitAccountInHalves( + oldAccount, newAccount, gasPrice, TransactionWait::DONT_WAIT_FOR_COMPLETION ); + } + } + + + cout << 1000.0 * testAccountsCopy.size() / ( getCurrentTimeMs() - begin ) + << " submission tps " << endl; + + if ( useThreadsForTestKeyCreation ) { + for ( auto&& t : threads ) { + t->join(); + } + } + + for ( auto&& account : testAccountsCopy ) { + waitForTransaction( account.second ); + }; + + cout << 1000.0 * testAccountsCopy.size() / ( getCurrentTimeMs() - begin ) << " total tps " + << endl; + } + + + for ( auto&& testAccount : testAccounts ) { + testAccountsVector.push_back( testAccount.second ); + } + + cout << "Creating keys completed. Total test wallets created:" << testAccounts.size() << endl; +} + + +void SkaledFixture::doOneTinyTransfersIteration( TransferType _transferType ) { + CHECK( threadsCountForTestTransactions <= testAccounts.size() ); + auto transactionsPerThread = testAccounts.size() / threadsCountForTestTransactions; + + auto begin = getCurrentTimeMs(); + + auto gasPrice = getCurrentGasPrice(); + + vector< shared_ptr< thread > > threads; + + CHECK( testAccountsVector.size() == testAccounts.size() ); + + + for ( uint64_t accountNum = 0; accountNum < testAccountsVector.size(); accountNum++ ) { + if ( threadsCountForTestTransactions > 1 ) { + if ( accountNum % transactionsPerThread == 0 ) { + uint64_t threadNumber = accountNum / transactionsPerThread; + auto t = make_shared< thread >( + [transactionsPerThread, threadNumber, gasPrice, _transferType, this]() { + for ( uint64_t j = 0; j < transactionsPerThread; j++ ) { + auto account = + testAccountsVector.at( threadNumber * transactionsPerThread + j ); + sendTinyTransfer( account, gasPrice, _transferType, + TransactionWait::DONT_WAIT_FOR_COMPLETION ); + } + } ); + threads.push_back( t ); + } + } else { + auto oldAccount = testAccountsVector.at( accountNum ); + sendTinyTransfer( + oldAccount, gasPrice, _transferType, TransactionWait::DONT_WAIT_FOR_COMPLETION ); + CHECK( oldAccount->getLastSentNonce() >= 0 ) + CHECK( testAccountsVector.at( accountNum )->getLastSentNonce() >= 0 ); + } + } + + + if ( threadsCountForTestTransactions > 1 ) { + CHECK( threads.size() == threadsCountForTestTransactions ); + for ( auto&& t : threads ) { + t->join(); + } + } + + + cout << 1000.0 * testAccounts.size() * mtmBatchSize / ( getCurrentTimeMs() - begin ) + << " submission tps" << endl; + + + for ( auto&& account : testAccounts ) { + waitForTransactionOrBatch( account.second, mtmBatchSize ); + }; + + cout << 1000.0 * testAccounts.size() * mtmBatchSize / ( getCurrentTimeMs() - begin ) + << " total tps" << endl; + + for ( auto&& account : testAccountsVector ) { + checkReceiptStatusAndGetGasUsed( account->getLastTxHash() ); + } +} + + +void SkaledFixture::mintAllKeysWithERC20() { + CHECK( threadsCountForTestTransactions <= testAccounts.size() ); + auto transactionsPerThread = testAccounts.size() / threadsCountForTestTransactions; + + auto begin = getCurrentTimeMs(); + + auto gasPrice = getCurrentGasPrice(); + + vector< shared_ptr< thread > > threads; + + CHECK( testAccountsVector.size() == testAccounts.size() ); + + + for ( uint64_t accountNum = 0; accountNum < testAccountsVector.size(); accountNum++ ) { + if ( threadsCountForTestTransactions > 1 ) { + if ( accountNum % transactionsPerThread == 0 ) { + uint64_t threadNumber = accountNum / transactionsPerThread; + auto t = + make_shared< thread >( [transactionsPerThread, threadNumber, gasPrice, this]() { + for ( uint64_t j = 0; j < transactionsPerThread; j++ ) { + auto account = + testAccountsVector.at( threadNumber * transactionsPerThread + j ); + auto address = account->getAddressAsString(); + mintERC20( account, address, 1000000, gasPrice, + TransactionWait::DONT_WAIT_FOR_COMPLETION ); + } + } ); + threads.push_back( t ); + } + } else { + auto account = testAccountsVector.at( accountNum ); + auto address = account->getAddressAsString(); + mintERC20( + account, address, 1000000000, gasPrice, TransactionWait::DONT_WAIT_FOR_COMPLETION ); + CHECK( account->getLastSentNonce() >= 0 ) + CHECK( testAccountsVector.at( accountNum )->getLastSentNonce() >= 0 ); + } + } + + + if ( threadsCountForTestTransactions > 1 ) { + CHECK( threads.size() == threadsCountForTestTransactions ); + for ( auto&& t : threads ) { + t->join(); + } + } + + + cout << 1000.0 * testAccounts.size() / ( getCurrentTimeMs() - begin ) << " Mint submission tps" + << endl; + + + for ( auto&& account : testAccounts ) { + waitForTransaction( account.second ); + }; + + // just for the first tc check the first transaction completed ok + checkReceiptStatusAndGetGasUsed( testAccountsVector.front()->getLastTxHash() ); + + cout << 1000.0 * testAccounts.size() / ( getCurrentTimeMs() - begin ) << " Mint total tps" + << endl; +} + + +void SkaledFixture::sendTinyTransfersForAllAccounts( + uint64_t _iterations, TransferType _transferType ) { + cout << "Running tiny transfers for accounts :" << testAccounts.size() << endl; + + for ( uint64_t iteration = 0; iteration < _iterations; iteration++ ) { + doOneTinyTransfersIteration( _transferType ); + } +} + + +void SkaledFixture::readInsecurePrivateKeyFromHardhatConfig() { + // get insecure test private key from hardhat config + auto hardHatConfig = readFile( HARDHAT_CONFIG_FILE_NAME ); + + std::istringstream stream( hardHatConfig ); + std::string line; + string insecurePrivateKey; + while ( std::getline( stream, line ) ) { + if ( line.find( "INSECURE_PRIVATE_KEY" ) != std::string::npos ) { + size_t start = line.find( '"' ) + 1; + size_t end = line.rfind( '"' ); + insecurePrivateKey = line.substr( start, end - start ); + break; + } + } + + + CHECK( !insecurePrivateKey.empty() ); + string ownerKeyStr = "0x" + insecurePrivateKey; + Secret ownerSecret( ownerKeyStr ); + + + auto transactionCount = getTransactionCount( ownerAddressStr ); + ownerAccount = SkaledAccount::getInstance( ownerSecret, transactionCount ); + auto balance = getBalance( ownerAccount->getAddressAsString() ); + CHECK( balance > 0 ); +} + +uint64_t SkaledFixture::getCurrentTimeMs() { + using namespace std::chrono; + return duration_cast< milliseconds >( system_clock::now().time_since_epoch() ).count(); +} + + +SkaledFixture::SkaledFixture( const std::string& _configPath ) { + static atomic_bool isCurlInited( false ); + + if ( isCurlInited.exchange( true ) ) { + curl_global_init( CURL_GLOBAL_DEFAULT ); + } + + auto config = readFile( _configPath ); + + Json::Value ret; + Json::Reader().parse( config, ret ); + + ownerAddressStr = ret["skaleConfig"]["sChain"]["schainOwner"].asString(); + boost::algorithm::to_lower( ownerAddressStr ); + ip = ret["skaleConfig"]["sChain"]["nodes"][0]["ip"].asString(); + CHECK( !ip.empty() ) + basePort = ret["skaleConfig"]["sChain"]["nodes"][0]["basePort"].asInt(); + CHECK( basePort > 0 ) + + + auto chainIdStr = ret["params"]["chainID"].asString(); + + // trim 0x + chainIdStr = chainIdStr.substr( 2 ); + chainId = std::stoull( chainIdStr, nullptr, 16 ); + + auto coinbaseTest = dev::KeyPair( + dev::Secret( "0x1c2cd4b70c2b8c6cd7144bbbfbd1e5c6eacb4a5efd9c86d0e29cbbec4e8483b9" ) ); + auto account3Test = dev::KeyPair( + dev::Secret( "0x23ABDBD3C61B5330AF61EBE8BEF582F4E5CC08E554053A718BDCE7813B9DC1FC" ) ); + + skaledEndpoint = "http://" + ip + ":" + std::to_string( basePort + 3 ); + + cout << "Skaled Endpoint: " << skaledEndpoint << std::endl; + + + u256 blockNumber = 0; + + cout << "Waiting for skaled ..."; + + while ( blockNumber == 0 ) { + try { + blockNumber = jsToU256( rpcClient()->eth_blockNumber() ); + cout << "Got block number " << blockNumber << std::endl; + } catch ( std::exception& e ) { + cout << e.what() << std::endl; + sleep( 1 ); + }; + } + + cout << "Starting test" << std::endl; + + + readInsecurePrivateKeyFromHardhatConfig(); +} + +SkaledFixture::~SkaledFixture() { + BOOST_TEST_MESSAGE( "Destructed SkaledFixture" ); +} + +u256 SkaledFixture::getTransactionCount( const string& _address ) { + auto count = jsToU256( this->rpcClient()->eth_getTransactionCount( _address, "latest" ) ); + + return count; +} + +u256 SkaledFixture::getCurrentGasPrice() { + auto gasPrice = jsToU256( rpcClient()->eth_gasPrice() ); + CHECK( gasPrice < 1000000 ) + return gasPrice; +} + +u256 SkaledFixture::getBalance( const string& _address ) const { + return jsToU256( rpcClient()->eth_getBalance( _address, "latest" ) ); +} + +u256 SkaledFixture::getBalance( const SkaledAccount& _account ) const { + return getBalance( _account.getAddressAsString() ); +} + +string SkaledFixture::getTxPayload( Transaction& transaction ) { + vector< uint8_t > txBytes = transaction.toBytes(); + auto result = toJson( transaction, txBytes ); + + CHECK( result["raw"] ); + CHECK( result["tx"] ); + + return result["raw"].asString(); +} + +// this call sends ether a single transfer, or multiple copies of same transfer. +// the latter is used in MTM mode testing. For a single transder _batchSize = 1 +void SkaledFixture::sendSingleTransferOrBatch( u256 _amount, std::shared_ptr< SkaledAccount > _from, + const string& _to, const u256& _gasPrice, uint64_t _batchSize, TransferType _transferType, + TransactionWait _wait ) { + auto from = _from->getAddressAsString(); + auto accountNonce = _from->computeNonceForNextTransactionOrBatch( _batchSize ); + u256 dstBalanceBefore; + + + if ( this->verifyTransactions ) { + CHECK( accountNonce == getTransactionCount( from ) ); + u256 srcBalanceBefore = getBalance( _from->getAddressAsString() ); + CHECK( srcBalanceBefore > 0 ); + if ( 21000 * _gasPrice + _amount > srcBalanceBefore ) { + cout << "Not enough balance to send a transfer" << endl; + cout << "Wallet:" << from << endl; + cout << "Balance:" << srcBalanceBefore << endl; + cout << "Transfer amount: " << _amount << endl; + cout << "Gas price" << _gasPrice << endl; + cout << "Missing amount:" << 21000 * _gasPrice + _amount - srcBalanceBefore << endl; + } + + CHECK( 21000 * _gasPrice + _amount <= srcBalanceBefore ); + + CHECK( srcBalanceBefore > 0 ); + dstBalanceBefore = getBalance( _to ); + CHECK( dstBalanceBefore == 0 ); + } + + Json::Value t; + t["from"] = from; + auto amountString = toHex( _amount ); + if ( _transferType == TransferType::NATIVE ) { + t["value"] = "0x" + amountString; + } else { + t["data"] = "0x" + MINT_FUNCTION_SELECTOR + from.substr( 2 ) + amountString; + } + t["to"] = _to; + TransactionSkeleton ts = toTransactionSkeleton( t ); + ts.nonce = accountNonce; + ts.nonce = accountNonce; + ts.gas = 90000; + ts.gasPrice = _gasPrice; + + vector< string > txHashes; + + for ( uint64_t i = 0; i < _batchSize; i++ ) { + Transaction transaction( ts ); + transaction.forceChainId( chainId ); + transaction.forceType( this->transactionType ); + if ( transactionType == TransactionType::Type2 ) { + transaction.forceType2Fees( _gasPrice, _gasPrice ); + } + + if ( usePow ) { + calculateAndSetPowGas( transaction ); + } + + transaction.sign( _from->getKey() ); + CHECK( transaction.chainId() ); + + auto payload = getTxPayload( transaction ); + + try { + auto txHash = getThreadLocalCurlClient()->eth_sendRawTransaction( payload ); + txHashes.push_back( txHash ); + } catch ( std::exception& e ) { + cerr << "Exception in eth_sendRawTransaction from: " << transaction.from() + << ": nonce: " << transaction.nonce() << endl; + cerr << e.what() << endl; + throw e; + } + + if ( _wait == TransactionWait::WAIT_FOR_COMPLETION ) { + waitForTransaction( _from ); + + if ( this->verifyTransactions && _transferType == TransferType::NATIVE ) { + auto balanceAfter = getBalance( _to ); + CHECK( balanceAfter - dstBalanceBefore == _amount ); + } + } + ++ts.nonce; + } + + _from->setLastTxHash( txHashes.back() ); +} + + +string SkaledFixture::sendSingleDeployOrSolidityCall( u256 _amount, + std::shared_ptr< SkaledAccount > _from, std::optional< string > _to, const string& _data, + const u256& _gasPrice, TransactionWait _wait ) { + auto from = _from->getAddressAsString(); + auto accountNonce = _from->computeNonceForNextTx(); + u256 dstBalanceBefore; + + + if ( this->verifyTransactions ) { + CHECK( accountNonce == getTransactionCount( from ) ); + u256 srcBalanceBefore = getBalance( _from->getAddressAsString() ); + CHECK( srcBalanceBefore > 0 ); + if ( 21000 * _gasPrice + _amount > srcBalanceBefore ) { + cout << "Not enough balance to send a transfer" << endl; + cout << "Wallet:" << from << endl; + cout << "Balance:" << srcBalanceBefore << endl; + cout << "Transfer amount: " << _amount << endl; + cout << "Gas price" << _gasPrice << endl; + cout << "Missing amount:" << 21000 * _gasPrice + _amount - srcBalanceBefore << endl; + } + + CHECK( 21000 * _gasPrice + _amount <= srcBalanceBefore ); + + CHECK( srcBalanceBefore > 0 ); + CHECK( dstBalanceBefore == 0 ); + } + + Json::Value t; + t["from"] = from; + if ( _to ) { + t["to"] = from; + } + t["value"] = jsToDecimal( toJS( _amount ) ); + CHECK( _data.size() % 2 == 0 ); + t["data"] = "0x" + _data; + TransactionSkeleton ts = toTransactionSkeleton( t ); + ts.nonce = accountNonce; + ts.nonce = accountNonce; + ts.gas = 10000000; + ts.gasPrice = _gasPrice; + + Transaction transaction( ts ); // always legacy, no prefix byte + transaction.forceChainId( chainId ); + transaction.sign( _from->getKey() ); + CHECK( transaction.chainId() ); + + auto payload = getTxPayload( transaction ); + + string txHash; + + try { + // auto txHash = rpcClient()->eth_sendRawTransaction( payload ); + txHash = getThreadLocalCurlClient()->eth_sendRawTransaction( payload ); + CHECK( !txHash.empty() ); + _from->setLastTxHash( txHash ); + } catch ( std::exception& e ) { + cout << "EXCEPTION " << transaction.from() << ": nonce: " << transaction.nonce() << endl; + cout << e.what() << endl; + throw e; + } + + if ( _wait == TransactionWait::DONT_WAIT_FOR_COMPLETION ) { + // dont wait for it to finish and return immediately + return txHash; + } + + waitForTransaction( _from ); + + return txHash; + + /* + if ( this->verifyTransactions ) { + auto balanceAfter = getBalance( _to ); + CHECK( balanceAfter - dstBalanceBefore == _amount ); + } + */ +} + + +void SkaledFixture::waitForTransactionOrBatch( + std::shared_ptr< SkaledAccount > _account, uint64_t _batchSize ) { + u256 transactionCount; + + auto lastSentNonce = _account->getLastSentNonce(); + + auto beginTime = getCurrentTimeMs(); + + + while ( ( transactionCount = getThreadLocalCurlClient()->eth_getTransactionCount( + _account->getAddressAsString() ) ) < lastSentNonce + 1 ) { + if ( this->verifyTransactions ) { + CHECK( getTransactionCount( _account->getAddressAsString() ) == transactionCount ) + } + + if ( getCurrentTimeMs() - beginTime > transactionTimeoutMs ) { + throw runtime_error( + "Transaction was not executed in time ms: " + to_string( transactionTimeoutMs ) ); + } + // wait for a bit before checking again + usleep( 300 * this->timeBetweenTransactionCompletionChecksMs ); + } + + // the count should now be one more than the last transaction nonce + CHECK( transactionCount == lastSentNonce + 1 ); + + _account->notifyLastTransactionOrBatchCompleted( _batchSize ); +} + +void SkaledFixture::splitAccountInHalves( std::shared_ptr< SkaledAccount > _from, + std::shared_ptr< SkaledAccount > _to, u256& _gasPrice, TransactionWait _wait ) { + auto balance = getThreadLocalCurlClient()->eth_getBalance( _from->getAddressAsString() ); + + if ( this->verifyTransactions ) { + CHECK( balance == getBalance( _from->getAddressAsString() ) ) + } + + CHECK( balance > 0 ); + auto fee = _gasPrice * 21000; + CHECK( fee <= balance ); + CHECK( balance > 0 ) + auto amount = ( balance - fee ) / 2; + + sendSingleTransfer( + amount, _from, _to->getAddressAsString(), _gasPrice, TransferType::NATIVE, _wait ); +} + + +void SkaledFixture::sendTinyTransfer( std::shared_ptr< SkaledAccount > _from, const u256& _gasPrice, + TransferType _transferType, TransactionWait _wait ) { + auto fee = _gasPrice * 21000; + + if ( this->verifyTransactions ) { + CHECK( fee <= getBalance( _from->getAddressAsString() ) ) + } + + sendSingleTransferOrBatch( 1, _from, _from->getAddressAsString(), _gasPrice, this->mtmBatchSize, + _transferType, _wait ); +} + + +unique_ptr< WebThreeStubClient > SkaledFixture::rpcClient() const { + auto httpClient = new jsonrpc::HttpClient( skaledEndpoint ); + httpClient->SetTimeout( 10000 ); + auto rpcClient = unique_ptr< WebThreeStubClient >( new WebThreeStubClient( *httpClient ) ); + return rpcClient; +} + +void SkaledFixture::calculateAndSetPowGas( Transaction& _t ) const { + for ( u256 i = 1;; i++ ) { + _t.forceGasPrice( i ); + + h256 hash = + dev::sha3( _t.sender().ref() ) ^ dev::sha3( _t.nonce() ) ^ dev::sha3( _t.gasPrice() ); + + u256 externalGas = ~u256( 0 ) / u256( hash ) / powDiffuculty; + + if ( externalGas >= _t.gas() ) { + return; + } + } +} + +SkaledAccount::SkaledAccount( const Secret _key, const u256 _currentTransactionCountOnChain ) + : key( _key ), currentTransactionCountOnChain( _currentTransactionCountOnChain ) {} + +const Secret& SkaledAccount::getKey() const { + return key; +}; + +std::map< string, std::shared_ptr< SkaledAccount > > SkaledAccount::accounts; diff --git a/test/unittests/libweb3jsonrpc/SkaledFixture.h b/test/unittests/libweb3jsonrpc/SkaledFixture.h new file mode 100644 index 000000000..ea7e46aed --- /dev/null +++ b/test/unittests/libweb3jsonrpc/SkaledFixture.h @@ -0,0 +1,315 @@ +/* +Modifications Copyright (C) 2024 SKALE Labs + + This file is part of cpp-ethereum. + + cpp-ethereum is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + cpp-ethereum is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with cpp-ethereum. If not, see . +*/ + +#ifndef SKALE_SKALEDFIXTURE_H +#define SKALE_SKALEDFIXTURE_H + +#include "libdevcrypto/AES.h" + +#include +#include + +#include + +using namespace std; +using namespace dev; +using namespace dev::eth; +using namespace dev::test; + +#define CHECK( __EXPRESSION__ ) \ + if ( !( __EXPRESSION__ ) ) { \ + auto __msg__ = string( "Check failed::" ) + #__EXPRESSION__ + " " + string( __FILE__ ) + \ + ":" + to_string( __LINE__ ); \ + throw std::runtime_error( __msg__ ); \ + } + +// Callback function to handle data received from the server +size_t WriteCallback( void* contents, size_t size, size_t nmemb, void* userp ); + +enum class TransactionWait { WAIT_FOR_COMPLETION, DONT_WAIT_FOR_COMPLETION }; + +enum class TransferType { NATIVE, ERC20 }; + +class SkaledAccount { + Secret key; + u256 currentTransactionCountOnChain = 0; + std::optional< u256 > lastSentNonce = std::nullopt; + std::optional< string > lastSentTxHash = std::nullopt; + + mutable std::shared_mutex mutex; + + static std::map< string, std::shared_ptr< SkaledAccount > > accounts; + + // Grant std::make_shared access to the private constructor + friend std::shared_ptr< SkaledAccount > std::make_shared< SkaledAccount >(); + +public: + void setLastTxHash( const string& _hash ) { + std::unique_lock< std::shared_mutex > lock( mutex ); + this->lastSentTxHash = _hash; + } + + string getLastTxHash() { + std::shared_lock< std::shared_mutex > lock( mutex ); + CHECK( lastSentTxHash ) + return lastSentTxHash.value(); + } + + static shared_ptr< SkaledAccount > getInstance( + const Secret key, const u256 _currentTransactionCountOnChain ) { + static std::mutex addressesMutex; + std::lock_guard< std::mutex > lock( addressesMutex ); + auto account = std::shared_ptr< SkaledAccount >( + new SkaledAccount( key, _currentTransactionCountOnChain ) ); + if ( !accounts.try_emplace( account->getAddressAsString() ).second ) { + // another object was created, so return the existing one + return accounts[account->getAddressAsString()] = account; + } else { + // return the newly created one + return account; + }; + } + + + static shared_ptr< SkaledAccount > generate() { + static std::mutex addressesMutex; + Secret newKey = KeyPair::create().secret(); + return getInstance( newKey, 0 ); + } + + + string getAddressAsString() const { return "0x" + KeyPair( key ).address().hex(); } + + + const Secret& getKey() const; + + u256 getCurrentTransactionCountOnBlockchain() const { + std::shared_lock< std::shared_mutex > lock( mutex ); + return currentTransactionCountOnChain; + } + + u256 getLastSentNonce() const { + std::shared_lock< std::shared_mutex > lock( mutex ); + if ( !lastSentNonce.has_value() ) { + throw std::runtime_error( "No transaction has been sent from this account" ); + } + return lastSentNonce.value(); + } + + + // will return the next nonce that can be used for a transaction + // if it is a batch, then _batchSize transactions will be sent + u256 computeNonceForNextTransactionOrBatch( uint64_t _batchSize ) { + std::unique_lock< std::shared_mutex > lock( mutex ); + + + if ( lastSentNonce.has_value() ) { + throw std::runtime_error( "Previous transaction has not yet been confirmed" ); + } + + auto nextNonce = currentTransactionCountOnChain; + + lastSentNonce = currentTransactionCountOnChain + _batchSize - 1; + + + return nextNonce; + } + + + u256 computeNonceForNextTx() { return computeNonceForNextTransactionOrBatch( 1 ); } + + void notifyLastTransactionOrBatchCompleted( uint64_t _batchSize ) { + std::unique_lock< std::shared_mutex > lock( mutex ); + + + if ( !lastSentNonce.has_value() ) { + throw std::runtime_error( "No pending transaction for this account" ); + } + + CHECK( lastSentNonce == currentTransactionCountOnChain + _batchSize - 1 ); + + currentTransactionCountOnChain += _batchSize; + + lastSentNonce = std::nullopt; + } + +private: + SkaledAccount( const Secret key, const u256 _currentTransactionCountOnChain ); + + + SkaledAccount& operator=( const SkaledAccount& ) { + // these objects should exist in a single copy per account + // thats why we use a shared pointer + throw std::runtime_error( "Copying SkaledAccount objects is not allowed" ); + } +}; + + +class SkaledFixture; + +class CurlClient { + CURL* curl; + std::string readBuffer; + struct curl_slist* headers = nullptr; + + string skaledEndpoint; + +public: + static std::atomic< uint64_t > totalCallsCount; + + static uint64_t getTotalCallsCount(); + + void resetCurl(); + CurlClient( SkaledFixture& _fixture ); + + void setRequest( const string& _json_rpc_request ); + + Json::Value doRequestResponse(); + + Json::Value parseResponse(); + + string eth_sendRawTransaction( const std::string& _rawTransactionHex ); + void doRequestResponseAndCheckForError( std::string jsonPayload, Json::Value& response ); + + + u256 eth_getBalance( const std::string& _addressString ); + + u256 eth_getTransactionCount( const std::string& _addressString ); + + Json::Value eth_getTransactionReceipt( const std::string& _hash ); + + ~CurlClient(); +}; + + +class SkaledFixture : public TestOutputHelperFixture { + static string readFile( const std::string& _path ); + + static thread_local std::shared_ptr< CurlClient > curlClient; + +public: + std::shared_ptr< CurlClient > getThreadLocalCurlClient(); + + void setupFirstKey(); + + void deployERC20(); + string checkReceiptStatusAndGetGasUsed( string _hash ); + + void mintERC20( std::shared_ptr< SkaledAccount > _minter, const string& _address, u256 _amount, + u256 _gasPrice, TransactionWait _wait ); + + void setupTwoToTheNKeys( uint64_t _n ); + + void doOneTinyTransfersIteration( TransferType _transferType ); + + void mintAllKeysWithERC20(); + + void sendTinyTransfersForAllAccounts( uint64_t _iterations, TransferType _transferType ); + + void readInsecurePrivateKeyFromHardhatConfig(); + + static uint64_t getCurrentTimeMs(); + + + SkaledFixture( const std::string& _configPath ); + + ~SkaledFixture() override; + + u256 getTransactionCount( const string& _address ); + + u256 getCurrentGasPrice(); + + u256 getBalance( const string& _address ) const; + + + u256 getBalance( const SkaledAccount& _account ) const; + + string getTxPayload( Transaction& _transaction ); + + void sendSingleTransferOrBatch( u256 _amount, std::shared_ptr< SkaledAccount > _from, + const string& _to, const u256& _gasPrice, uint64_t _batchSize, TransferType _transferType, + TransactionWait _wait ); + + void sendSingleTransfer( u256 _amount, std::shared_ptr< SkaledAccount > _from, + const string& _to, const u256& _gasPrice, TransferType _transferType, + TransactionWait _wait ) { + sendSingleTransferOrBatch( _amount, _from, _to, _gasPrice, 1, _transferType, _wait ); + } + + string sendSingleDeployOrSolidityCall( u256 _amount, std::shared_ptr< SkaledAccount > _from, + std::optional< string > _to, const string& _data, const u256& _gasPrice, + TransactionWait _wait ); + + + void splitAccountInHalves( std::shared_ptr< SkaledAccount > _from, + std::shared_ptr< SkaledAccount > _to, u256& _gasPrice, TransactionWait _wait ); + + + void sendTinyTransfer( std::shared_ptr< SkaledAccount > _from, const u256& _gasPrice, + TransferType _transferType, TransactionWait _wait ); + + + unique_ptr< WebThreeStubClient > rpcClient() const; + + + void calculateAndSetPowGas( Transaction& _t ) const; + + string skaledEndpoint; + string ownerAddressStr; + string ip; + uint64_t basePort; + uint64_t chainId; + std::shared_ptr< SkaledAccount > ownerAccount; + // map of test key addresses to secret keys + map< string, std::shared_ptr< SkaledAccount > > testAccounts; + vector< shared_ptr< SkaledAccount > > testAccountsVector; + string erc20ContractAddress; + + + const string HARDHAT_CONFIG_FILE_NAME = "../../test/historicstate/hardhat/hardhat.config.js"; + uint64_t transactionTimeoutMs = 60000; + bool usePow = false; + u256 powDiffuculty = 1; + bool verifyTransactions = false; + bool useThreadsForTestKeyCreation = false; + uint64_t mtmBatchSize = 1; + + uint64_t threadsCountForTestTransactions = 1; + TransactionType transactionType = TransactionType::Legacy; + + + void waitForTransactionOrBatch( + std::shared_ptr< SkaledAccount > _account, uint64_t _batchSize ); + + void waitForTransaction( std::shared_ptr< SkaledAccount > _account ) { + waitForTransactionOrBatch( _account, 1 ); + } + + + int timeBetweenTransactionCompletionChecksMs = 1000; + + // Keccak-256("mint(address,uint256)") + const string MINT_FUNCTION_SELECTOR = "6a627842"; + + // Keccak-256("transfer(address,uint256)") + const string TRANSFER_FUNCTION_SELECTOR = "4b40e901"; +}; + + +#endif // SKALE_SKALEDFIXTURE_H diff --git a/test/unittests/libweb3jsonrpc/WebThreeStubClient.cpp b/test/unittests/libweb3jsonrpc/WebThreeStubClient.cpp index c297164dc..fa0a36b5c 100644 --- a/test/unittests/libweb3jsonrpc/WebThreeStubClient.cpp +++ b/test/unittests/libweb3jsonrpc/WebThreeStubClient.cpp @@ -158,6 +158,15 @@ std::string WebThreeStubClient::skale_protocolVersion() { jsonrpc::Errors::ERROR_CLIENT_INVALID_RESPONSE, result.toStyledString() ); } + +std::string WebThreeStubClient::skale_stats() { + Json::Value p; + p = Json::nullValue; + Json::Value result = this->CallMethod( "skale_stats", p ); + return result.toStyledString(); +} + + std::string WebThreeStubClient::eth_protocolVersion() { Json::Value p; p = Json::nullValue; @@ -396,10 +405,11 @@ std::string WebThreeStubClient::eth_sendTransaction( const Json::Value& param1 ) jsonrpc::Errors::ERROR_CLIENT_INVALID_RESPONSE, result.toStyledString() ); } -std::string WebThreeStubClient::eth_estimateGas( const Json::Value& param1, const std::string& param2 ) { +std::string WebThreeStubClient::eth_estimateGas( + const Json::Value& param1, const std::string& param2 ) { Json::Value p; p.append( param1 ); - if(!param2.empty()) + if ( !param2.empty() ) p.append( param2 ); Json::Value result = this->CallMethod( "eth_estimateGas", p ); if ( result.isString() ) @@ -421,7 +431,8 @@ std::string WebThreeStubClient::eth_call( const Json::Value& param1, const std:: jsonrpc::Errors::ERROR_CLIENT_INVALID_RESPONSE, result.toStyledString() ); } -std::string WebThreeStubClient::eth_callEIP1898( const Json::Value& param1, const Json::Value& param2 ) { +std::string WebThreeStubClient::eth_callEIP1898( + const Json::Value& param1, const Json::Value& param2 ) { Json::Value p; p.append( param1 ); p.append( param2 ); @@ -830,7 +841,8 @@ std::string WebThreeStubClient::eth_maxPriorityFeePerGas() { jsonrpc::Errors::ERROR_CLIENT_INVALID_RESPONSE, result.toStyledString() ); } -Json::Value WebThreeStubClient::eth_createAccessList( const Json::Value& param1, const std::string& param2 ) { +Json::Value WebThreeStubClient::eth_createAccessList( + const Json::Value& param1, const std::string& param2 ) { Json::Value p; p.append( param1 ); p.append( param2 ); @@ -842,7 +854,8 @@ Json::Value WebThreeStubClient::eth_createAccessList( const Json::Value& param1, jsonrpc::Errors::ERROR_CLIENT_INVALID_RESPONSE, result.toStyledString() ); } -Json::Value WebThreeStubClient::eth_feeHistory( const Json::Value& param1, const std::string& param2, const Json::Value& param3 ) { +Json::Value WebThreeStubClient::eth_feeHistory( + const Json::Value& param1, const std::string& param2, const Json::Value& param3 ) { Json::Value p; if ( param1.isString() ) p.append( param1.asString() ); @@ -1334,7 +1347,8 @@ std::string WebThreeStubClient::debug_preimage( const std::string& param1 ) { jsonrpc::Errors::ERROR_CLIENT_INVALID_RESPONSE, result.toStyledString() ); } -Json::Value WebThreeStubClient::debug_traceBlockByNumber( const std::string& param1, const Json::Value& param2 ) { +Json::Value WebThreeStubClient::debug_traceBlockByNumber( + const std::string& param1, const Json::Value& param2 ) { Json::Value p; p.append( param1 ); p.append( param2 ); diff --git a/test/unittests/libweb3jsonrpc/WebThreeStubClient.h b/test/unittests/libweb3jsonrpc/WebThreeStubClient.h index 9125b97ab..34588581a 100644 --- a/test/unittests/libweb3jsonrpc/WebThreeStubClient.h +++ b/test/unittests/libweb3jsonrpc/WebThreeStubClient.h @@ -27,6 +27,7 @@ class WebThreeStubClient : public jsonrpc::Client { bool net_listening() noexcept( false ); std::string skale_receiveTransaction( const Json::Value& param1 ) noexcept( false ); std::string skale_protocolVersion() noexcept( false ); + std::string skale_stats(); std::string eth_protocolVersion() noexcept( false ); std::string skale_shutdownInstance() noexcept( false ); std::string eth_hashrate() noexcept( false ); @@ -37,8 +38,8 @@ class WebThreeStubClient : public jsonrpc::Client { std::string eth_blockNumber() noexcept( false ); std::string eth_getBalance( const std::string& param1, const std::string& param2 ) noexcept( false ); - std::string eth_getBalanceEIP1898( const std::string& param1, const Json::Value& param2 ) noexcept( - false ); + std::string eth_getBalanceEIP1898( + const std::string& param1, const Json::Value& param2 ) noexcept( false ); std::string eth_getStorageAt( const std::string& param1, const std::string& param2, const std::string& param3 ) noexcept( false ); std::string eth_getStorageAtEIP1898( const std::string& param1, const std::string& param2, @@ -57,9 +58,11 @@ class WebThreeStubClient : public jsonrpc::Client { false ); std::string eth_sendTransaction( const Json::Value& param1 ) noexcept( false ); std::string eth_call( const Json::Value& param1, const std::string& param2 ) noexcept( false ); - std::string eth_callEIP1898( const Json::Value& param1, const Json::Value& param2 ) noexcept( false ); + std::string eth_callEIP1898( const Json::Value& param1, const Json::Value& param2 ) noexcept( + false ); bool eth_flush() noexcept( false ); - std::string eth_estimateGas( const Json::Value& param1, const std::string& param2 = "latest" ) noexcept( false ); + std::string eth_estimateGas( + const Json::Value& param1, const std::string& param2 = "latest" ) noexcept( false ); Json::Value eth_getBlockByHash( const std::string& param1, bool param2 ) noexcept( false ); Json::Value eth_getBlockByNumber( const std::string& param1, bool param2 ) noexcept( false ); Json::Value eth_getTransactionByHash( const std::string& param1 ) noexcept( false ); @@ -99,8 +102,10 @@ class WebThreeStubClient : public jsonrpc::Client { Json::Value eth_pendingTransactions() noexcept( false ); std::string eth_sendRawTransaction( const std::string& param1 ) noexcept( false ); std::string eth_maxPriorityFeePerGas() noexcept( false ); - Json::Value eth_createAccessList( const Json::Value& param1, const std::string& param2 ) noexcept( false ); - Json::Value eth_feeHistory( const Json::Value& param1, const std::string& param2, const Json::Value& param3 ) noexcept( false ); + Json::Value eth_createAccessList( + const Json::Value& param1, const std::string& param2 ) noexcept( false ); + Json::Value eth_feeHistory( const Json::Value& param1, const std::string& param2, + const Json::Value& param3 ) noexcept( false ); bool eth_notePassword( const std::string& param1 ) noexcept( false ); bool db_put( const std::string& param1, const std::string& param2, const std::string& param3 ) noexcept( false ); @@ -159,7 +164,8 @@ class WebThreeStubClient : public jsonrpc::Client { Json::Value debug_storageRangeAt( const std::string& param1, int param2, const std::string& param3, const std::string& param4, int param5 ) noexcept( false ); std::string debug_preimage( const std::string& param1 ) noexcept( false ); - Json::Value debug_traceBlockByNumber( const std::string & param1, const Json::Value& param2 ) noexcept( false ); + Json::Value debug_traceBlockByNumber( + const std::string& param1, const Json::Value& param2 ) noexcept( false ); Json::Value debug_traceBlockByHash( const std::string& param1, const Json::Value& param2 ) noexcept( false ); Json::Value debug_traceCall( const Json::Value& param1, const std::string& param2, diff --git a/test/unittests/libweb3jsonrpc/contracts/ERC20.sol b/test/unittests/libweb3jsonrpc/contracts/ERC20.sol new file mode 100644 index 000000000..09a8293cf --- /dev/null +++ b/test/unittests/libweb3jsonrpc/contracts/ERC20.sol @@ -0,0 +1,83 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.26; + + +interface IERC20 { + function totalSupply() external view returns (uint256); + function balanceOf(address account) external view returns (uint256); + function transfer(address recipient, uint256 amount) + external + returns (bool); + function allowance(address owner, address spender) + external + view + returns (uint256); + function approve(address spender, uint256 amount) external returns (bool); + function transferFrom(address sender, address recipient, uint256 amount) + external + returns (bool); +} + + +contract ERC20 is IERC20 { + event Transfer(address indexed from, address indexed to, uint256 value); + event Approval( + address indexed owner, address indexed spender, uint256 value + ); + + uint256 public totalSupply; + mapping(address => uint256) public balanceOf; + mapping(address => mapping(address => uint256)) public allowance; + string public name = "SKALE Test"; + string public symbol = "SKL"; + uint8 public decimals = 18; + + + + function transfer(address recipient, uint256 amount) + external + returns (bool) + { + balanceOf[msg.sender] -= amount; + balanceOf[recipient] += amount; + emit Transfer(msg.sender, recipient, amount); + return true; + } + + function approve(address spender, uint256 amount) external returns (bool) { + allowance[msg.sender][spender] = amount; + emit Approval(msg.sender, spender, amount); + return true; + } + + function transferFrom(address sender, address recipient, uint256 amount) + external + returns (bool) + { + allowance[sender][msg.sender] -= amount; + balanceOf[sender] -= amount; + balanceOf[recipient] += amount; + emit Transfer(sender, recipient, amount); + return true; + } + + function _mint(address to, uint256 amount) internal { + balanceOf[to] += amount; + totalSupply += amount; + emit Transfer(address(0), to, amount); + } + + function _burn(address from, uint256 amount) internal { + balanceOf[from] -= amount; + totalSupply -= amount; + emit Transfer(from, address(0), amount); + } + + function mint(address to, uint256 amount) external { + _mint(to, amount); + } + + function burn(address from, uint256 amount) external { + _burn(from, amount); + } +} \ No newline at end of file diff --git a/test/unittests/libweb3jsonrpc/contracts/ERC20_abi.json b/test/unittests/libweb3jsonrpc/contracts/ERC20_abi.json new file mode 100644 index 000000000..47f22cc58 --- /dev/null +++ b/test/unittests/libweb3jsonrpc/contracts/ERC20_abi.json @@ -0,0 +1,260 @@ +[ + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "allowance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "burn", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "decimals", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "mint", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transfer", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + } +] \ No newline at end of file diff --git a/test/unittests/libweb3jsonrpc/contracts/ERC20_bytecode.txt b/test/unittests/libweb3jsonrpc/contracts/ERC20_bytecode.txt new file mode 100644 index 000000000..e85fa78e8 --- /dev/null +++ b/test/unittests/libweb3jsonrpc/contracts/ERC20_bytecode.txt @@ -0,0 +1 @@ +60806040526040518060400160405280600a81526020017f534b414c452054657374000000000000000000000000000000000000000000008152506003908161004891906102f7565b506040518060400160405280600381526020017f534b4c00000000000000000000000000000000000000000000000000000000008152506004908161008d91906102f7565b50601260055f6101000a81548160ff021916908360ff1602179055503480156100b4575f5ffd5b506103c6565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061013557607f821691505b602082108103610148576101476100f1565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026101aa7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261016f565b6101b4868361016f565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f6101f86101f36101ee846101cc565b6101d5565b6101cc565b9050919050565b5f819050919050565b610211836101de565b61022561021d826101ff565b84845461017b565b825550505050565b5f5f905090565b61023c61022d565b610247818484610208565b505050565b5b8181101561026a5761025f5f82610234565b60018101905061024d565b5050565b601f8211156102af576102808161014e565b61028984610160565b81016020851015610298578190505b6102ac6102a485610160565b83018261024c565b50505b505050565b5f82821c905092915050565b5f6102cf5f19846008026102b4565b1980831691505092915050565b5f6102e783836102c0565b9150826002028217905092915050565b610300826100ba565b67ffffffffffffffff811115610319576103186100c4565b5b610323825461011e565b61032e82828561026e565b5f60209050601f83116001811461035f575f841561034d578287015190505b61035785826102dc565b8655506103be565b601f19841661036d8661014e565b5f5b828110156103945784890151825560018201915060208501945060208101905061036f565b868310156103b157848901516103ad601f8916826102c0565b8355505b6001600288020188555050505b505050505050565b610ce6806103d35f395ff3fe608060405234801561000f575f5ffd5b50600436106100a7575f3560e01c806340c10f191161006f57806340c10f191461016557806370a082311461018157806395d89b41146101b15780639dc29fac146101cf578063a9059cbb146101eb578063dd62ed3e1461021b576100a7565b806306fdde03146100ab578063095ea7b3146100c957806318160ddd146100f957806323b872dd14610117578063313ce56714610147575b5f5ffd5b6100b361024b565b6040516100c09190610989565b60405180910390f35b6100e360048036038101906100de9190610a3a565b6102d7565b6040516100f09190610a92565b60405180910390f35b6101016103c4565b60405161010e9190610aba565b60405180910390f35b610131600480360381019061012c9190610ad3565b6103c9565b60405161013e9190610a92565b60405180910390f35b61014f61056e565b60405161015c9190610b3e565b60405180910390f35b61017f600480360381019061017a9190610a3a565b610580565b005b61019b60048036038101906101969190610b57565b61058e565b6040516101a89190610aba565b60405180910390f35b6101b96105a3565b6040516101c69190610989565b60405180910390f35b6101e960048036038101906101e49190610a3a565b61062f565b005b61020560048036038101906102009190610a3a565b61063d565b6040516102129190610a92565b60405180910390f35b61023560048036038101906102309190610b82565b610753565b6040516102429190610aba565b60405180910390f35b6003805461025890610bed565b80601f016020809104026020016040519081016040528092919081815260200182805461028490610bed565b80156102cf5780601f106102a6576101008083540402835291602001916102cf565b820191905f5260205f20905b8154815290600101906020018083116102b257829003601f168201915b505050505081565b5f8160025f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516103b29190610aba565b60405180910390a36001905092915050565b5f5481565b5f8160025f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546104519190610c4a565b925050819055508160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546104a49190610c4a565b925050819055508160015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546104f79190610c7d565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161055b9190610aba565b60405180910390a3600190509392505050565b60055f9054906101000a900460ff1681565b61058a8282610773565b5050565b6001602052805f5260405f205f915090505481565b600480546105b090610bed565b80601f01602080910402602001604051908101604052809291908181526020018280546105dc90610bed565b80156106275780601f106105fe57610100808354040283529160200191610627565b820191905f5260205f20905b81548152906001019060200180831161060a57829003601f168201915b505050505081565b6106398282610846565b5050565b5f8160015f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461068a9190610c4a565b925050819055508160015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546106dd9190610c7d565b925050819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516107419190610aba565b60405180910390a36001905092915050565b6002602052815f5260405f20602052805f5260405f205f91509150505481565b8060015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546107bf9190610c7d565b92505081905550805f5f8282546107d69190610c7d565b925050819055508173ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161083a9190610aba565b60405180910390a35050565b8060015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546108929190610c4a565b92505081905550805f5f8282546108a99190610c4a565b925050819055505f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161090d9190610aba565b60405180910390a35050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f61095b82610919565b6109658185610923565b9350610975818560208601610933565b61097e81610941565b840191505092915050565b5f6020820190508181035f8301526109a18184610951565b905092915050565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6109d6826109ad565b9050919050565b6109e6816109cc565b81146109f0575f5ffd5b50565b5f81359050610a01816109dd565b92915050565b5f819050919050565b610a1981610a07565b8114610a23575f5ffd5b50565b5f81359050610a3481610a10565b92915050565b5f5f60408385031215610a5057610a4f6109a9565b5b5f610a5d858286016109f3565b9250506020610a6e85828601610a26565b9150509250929050565b5f8115159050919050565b610a8c81610a78565b82525050565b5f602082019050610aa55f830184610a83565b92915050565b610ab481610a07565b82525050565b5f602082019050610acd5f830184610aab565b92915050565b5f5f5f60608486031215610aea57610ae96109a9565b5b5f610af7868287016109f3565b9350506020610b08868287016109f3565b9250506040610b1986828701610a26565b9150509250925092565b5f60ff82169050919050565b610b3881610b23565b82525050565b5f602082019050610b515f830184610b2f565b92915050565b5f60208284031215610b6c57610b6b6109a9565b5b5f610b79848285016109f3565b91505092915050565b5f5f60408385031215610b9857610b976109a9565b5b5f610ba5858286016109f3565b9250506020610bb6858286016109f3565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680610c0457607f821691505b602082108103610c1757610c16610bc0565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f610c5482610a07565b9150610c5f83610a07565b9250828203905081811115610c7757610c76610c1d565b5b92915050565b5f610c8782610a07565b9150610c9283610a07565b9250828201905080821115610caa57610ca9610c1d565b5b9291505056fea264697066735822122051fb5fd50a178465e8e53160107032d89e41ab5e7c9258304451655a4413776664736f6c634300081b0033 \ No newline at end of file diff --git a/test/unittests/libweb3jsonrpc/contracts/compile.py b/test/unittests/libweb3jsonrpc/contracts/compile.py new file mode 100644 index 000000000..6b1371d3f --- /dev/null +++ b/test/unittests/libweb3jsonrpc/contracts/compile.py @@ -0,0 +1,82 @@ +# You need solc preinstalled +# sudo add-apt-repository ppa:ethereum/ethereum +# x` + + +import subprocess +import json +import os + + +current_directory = os.getcwd() +print(f"Current Working Directory: {current_directory}") + +SOLC_PATH="/usr/bin/solc" # Path to Solidity compiler +ERC20_SOURCE_FILE = current_directory + '/ERC20.sol' # Solidity source file + +def compile_contract(source_file): + + + + try: + # Compile the contract using solc executable + result = subprocess.run( + [SOLC_PATH, '--combined-json', 'abi,bin', source_file], + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + text=True + ) + + # Check for compilation errors + if result.returncode != 0: + print(f"Error compiling contract: {result.stderr}") + return None, None + + # Load the JSON output + compiled_output = json.loads(result.stdout) + + # Extract contract data + contract_name = source_file.split('/')[-1] + ':ERC20' + abi = compiled_output['contracts'][contract_name]['abi'] + bytecode = compiled_output['contracts'][contract_name]['bin'] + + return abi, bytecode + + except Exception as e: + print(f"Exception during contract compilation: {e}") + return None, None + +def write_to_file(filename, data): + """ + Writes data to a file. + + :param filename: Name of the file to write to. + :param data: Data to write. + """ + try: + with open(filename, 'w') as file: + file.write(data) + print(f"Data written to {filename}") + except IOError as e: + print(f"Error writing to {filename}: {e}") + +def main(): + # Define paths and filenames + + abi_file = 'ERC20_abi.json' # Output file for ABI + bytecode_file = 'ERC20_bytecode.txt' # Output file for Bytecode + + # Compile the contract + abi, bytecode = compile_contract(ERC20_SOURCE_FILE) + + # Check if compilation was successful + if abi is None or bytecode is None: + print("Compilation failed.") + return + + # Write ABI and Bytecode to files + write_to_file(abi_file, json.dumps(abi, indent=4)) + write_to_file(bytecode_file, bytecode) + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/test/unittests/libweb3jsonrpc/genesisGeneration2Config.h b/test/unittests/libweb3jsonrpc/genesisGeneration2Config.h index e13318fc5..b6e19e431 100644 --- a/test/unittests/libweb3jsonrpc/genesisGeneration2Config.h +++ b/test/unittests/libweb3jsonrpc/genesisGeneration2Config.h @@ -942,4 +942,4 @@ static std::string const c_genesisGeneration2ConfigString = R"( } )"; -#endif // GENESISGENERATION2CONFIG_H +#endif // GENESISGENERATION2CONFIG_H diff --git a/test/unittests/libweb3jsonrpc/jsonrpc.cpp b/test/unittests/libweb3jsonrpc/jsonrpc.cpp index 948b90ec3..09f974e1b 100644 --- a/test/unittests/libweb3jsonrpc/jsonrpc.cpp +++ b/test/unittests/libweb3jsonrpc/jsonrpc.cpp @@ -21,8 +21,14 @@ #include "WebThreeStubClient.h" -#include + +#include "SkaledFixture.h" +#include "genesisGeneration2Config.h" +#include "libweb3jsonrpc/SkaleFace.h" #include +#include +#include +#include #include #include #include @@ -30,39 +36,34 @@ #include #include #include -#include -#include #include #include #include -#include -#include "genesisGeneration2Config.h" #include #include +#include #include #include #include #include +#include #include #include -#include +#include #include -#include - -#include -#include #include // This is defined by some weird windows header - workaround for now. #undef GetMessage + using namespace std; using namespace dev; using namespace dev::eth; using namespace dev::test; -static size_t rand_port = ( srand(time(nullptr)), 1024 + rand() % 64000 ); +static size_t rand_port = ( srand( time( nullptr ) ), 1024 + rand() % 64000 ); static std::string const c_genesisConfigString = R"( @@ -97,7 +98,8 @@ static std::string const c_genesisConfigString = "nodeName": "Node1", "nodeID": 1112, "bindIP": "127.0.0.1", - "basePort": )"+std::to_string( rand_port ) + R"(, + "basePort": )" + + std::to_string( rand_port ) + R"(, "logLevel": "trace", "logLevelProposal": "trace", "testSignatures": true @@ -109,7 +111,9 @@ static std::string const c_genesisConfigString = "emptyBlockIntervalMs": -1, "nodeGroups": {}, "nodes": [ - { "nodeID": 1112, "ip": "127.0.0.1", "basePort": )"+std::to_string( rand_port ) + R"(, "schainIndex" : 1, "publicKey": "0xfa"} + { "nodeID": 1112, "ip": "127.0.0.1", "basePort": )" + + std::to_string( rand_port ) + + R"(, "schainIndex" : 1, "publicKey": "0xfa"} ], "revertableFSPatchTimestamp": 0, "contractStorageZeroValuePatchTimestamp": 0, @@ -132,28 +136,28 @@ static std::string const c_genesisConfigString = } },)" /* - pragma solidity ^0.4.25; - contract Caller { - function call() public { - bool status; - string memory fileName = "test"; - address sender = 0x000000000000000000000000000000AA; - assembly{ - let ptr := mload(0x40) - mstore(ptr, sender) - mstore(add(ptr, 0x20), 4) - mstore(add(ptr, 0x40), mload(add(fileName, 0x20))) - mstore(add(ptr, 0x60), 1) - status := call(not(0), 0x05, 0, ptr, 0x80, ptr, 32) - } - } +pragma solidity ^0.4.25; +contract Caller { +function call() public { +bool status; +string memory fileName = "test"; +address sender = 0x000000000000000000000000000000AA; +assembly{ +let ptr := mload(0x40) +mstore(ptr, sender) +mstore(add(ptr, 0x20), 4) +mstore(add(ptr, 0x40), mload(add(fileName, 0x20))) +mstore(add(ptr, 0x60), 1) +status := call(not(0), 0x05, 0, ptr, 0x80, ptr, 32) +} +} - function revertCall() public { - call(); - revert(); - } - } - */ +function revertCall() public { +call(); +revert(); +} +} +*/ R"("0000000000000000000000000000000000000006": { "precompiled": { "name": "addBalance", @@ -226,7 +230,9 @@ namespace { class TestIpcServer : public jsonrpc::AbstractServerConnector { public: bool StartListening() override { return true; } + bool StopListening() override { return true; } + bool SendResponse( std::string const& _response, void* _addInfo = nullptr ) /*override*/ { *static_cast< std::string* >( _addInfo ) = _response; return true; @@ -235,7 +241,7 @@ class TestIpcServer : public jsonrpc::AbstractServerConnector { class TestIpcClient : public jsonrpc::IClientConnector { public: - explicit TestIpcClient( TestIpcServer& _server ) : m_server{_server} {} + explicit TestIpcClient( TestIpcServer& _server ) : m_server{ _server } {} void SendRPCMessage( const std::string& _message, std::string& _result ) override { m_server.ProcessRequest( _message, _result ); @@ -246,30 +252,30 @@ class TestIpcClient : public jsonrpc::IClientConnector { }; struct JsonRpcFixture : public TestOutputHelperFixture { - -// chain params needs to be a field of JsonRPCFixture -// since references to it are passed to the server -ChainParams chainParams; - - -JsonRpcFixture( const std::string& _config = "", bool _owner = true, - bool _deploymentControl = true, bool _generation2 = false, - bool _mtmEnabled = false, bool _isSyncNode = false, int _emptyBlockIntervalMs = -1, - const std::map& params = std::map() ) { + // chain params needs to be a field of JsonRPCFixture + // since references to it are passed to the server + ChainParams chainParams; + JsonRpcFixture( const std::string& _config = "", bool _owner = true, + bool _deploymentControl = true, bool _generation2 = false, bool _mtmEnabled = false, + bool _isSyncNode = false, int _emptyBlockIntervalMs = -1, + const std::map< std::string, std::string >& params = + std::map< std::string, std::string >() ) { if ( _config != "" ) { if ( !_generation2 ) { Json::Value ret; Json::Reader().parse( _config, ret ); if ( _owner ) { ret["skaleConfig"]["sChain"]["schainOwner"] = toJS( coinbase.address() ); - if (_deploymentControl) - ret["accounts"]["0xD2002000000000000000000000000000000000D2"]["storage"]["0x0"] = toJS( coinbase.address() ); + if ( _deploymentControl ) + ret["accounts"]["0xD2002000000000000000000000000000000000D2"]["storage"] + ["0x0"] = toJS( coinbase.address() ); } else { ret["skaleConfig"]["sChain"]["schainOwner"] = toJS( account2.address() ); - if (_deploymentControl) - ret["accounts"]["0xD2002000000000000000000000000000000000D2"]["storage"]["0x0"] = toJS( account2.address() ); + if ( _deploymentControl ) + ret["accounts"]["0xD2002000000000000000000000000000000000D2"]["storage"] + ["0x0"] = toJS( account2.address() ); } Json::FastWriter fastWriter; std::string output = fastWriter.write( ret ); @@ -278,8 +284,10 @@ JsonRpcFixture( const std::string& _config = "", bool _owner = true, chainParams = chainParams.loadConfig( _config ); // insecure schain owner(originator) private key // address is 0x5C4e11842E8be09264dc1976943571d7Af6d00F9 - coinbase = dev::KeyPair(dev::Secret("0x1c2cd4b70c2b8c6cd7144bbbfbd1e5c6eacb4a5efd9c86d0e29cbbec4e8483b9")); - account3 = dev::KeyPair(dev::Secret("0x23ABDBD3C61B5330AF61EBE8BEF582F4E5CC08E554053A718BDCE7813B9DC1FC")); + coinbase = dev::KeyPair( dev::Secret( + "0x1c2cd4b70c2b8c6cd7144bbbfbd1e5c6eacb4a5efd9c86d0e29cbbec4e8483b9" ) ); + account3 = dev::KeyPair( dev::Secret( + "0x23ABDBD3C61B5330AF61EBE8BEF582F4E5CC08E554053A718BDCE7813B9DC1FC" ) ); } } else { chainParams.sealEngineName = NoProof::name(); @@ -293,13 +301,20 @@ JsonRpcFixture( const std::string& _config = "", bool _owner = true, chainParams.externalGasDifficulty = 1; chainParams.sChain.contractStorageLimit = 128; // 615 + 1430 is experimentally-derived block size + average extras size - chainParams.sChain.dbStorageLimit = 320.5*( 615 + 1430 ); - chainParams.sChain._patchTimestamps[static_cast(SchainPatchEnum::ContractStoragePatch)] = 1; - chainParams.sChain._patchTimestamps[static_cast(SchainPatchEnum::StorageDestructionPatch)] = 1; - powPatchActivationTimestamp = time(nullptr) + 60; - chainParams.sChain._patchTimestamps[static_cast(SchainPatchEnum::CorrectForkInPowPatch)] = powPatchActivationTimestamp; - push0PatchActivationTimestamp = time(nullptr) + 10; - chainParams.sChain._patchTimestamps[static_cast(SchainPatchEnum::PushZeroPatch)] = push0PatchActivationTimestamp; + chainParams.sChain.dbStorageLimit = 320.5 * ( 615 + 1430 ); + chainParams.sChain + ._patchTimestamps[static_cast< size_t >( SchainPatchEnum::ContractStoragePatch )] = + 1; + chainParams.sChain._patchTimestamps[static_cast< size_t >( + SchainPatchEnum::StorageDestructionPatch )] = 1; + powPatchActivationTimestamp = time( nullptr ) + 60; + chainParams.sChain + ._patchTimestamps[static_cast< size_t >( SchainPatchEnum::CorrectForkInPowPatch )] = + powPatchActivationTimestamp; + push0PatchActivationTimestamp = time( nullptr ) + 10; + chainParams.sChain + ._patchTimestamps[static_cast< size_t >( SchainPatchEnum::PushZeroPatch )] = + push0PatchActivationTimestamp; chainParams.sChain.emptyBlockIntervalMs = _emptyBlockIntervalMs; // add random extra data to randomize genesis hash and get random DB path, // so that tests can be run in parallel @@ -309,15 +324,16 @@ JsonRpcFixture( const std::string& _config = "", bool _owner = true, chainParams.sChain.nodes[0].port = chainParams.sChain.nodes[0].port6 = rand_port; chainParams.skaleDisableChainIdCheck = true; - if( params.count("getLogsBlocksLimit") && stoi( params.at( "getLogsBlocksLimit" ) ) ) + if ( params.count( "getLogsBlocksLimit" ) && stoi( params.at( "getLogsBlocksLimit" ) ) ) chainParams.getLogsBlocksLimit = stoi( params.at( "getLogsBlocksLimit" ) ); } chainParams.sChain.multiTransactionMode = _mtmEnabled; chainParams.nodeInfo.syncNode = _isSyncNode; - auto monitor = make_shared< InstanceMonitor >("test"); + auto monitor = make_shared< InstanceMonitor >( "test" ); - setenv("DATA_DIR", tempDir.path().c_str(), 1); + + setenv( "DATA_DIR", tempDir.path().c_str(), 1 ); client.reset( new eth::ClientTest( chainParams, ( int ) chainParams.networkID, shared_ptr< GasPricer >(), NULL, monitor, tempDir.path(), WithExisting::Kill ) ); @@ -326,9 +342,7 @@ JsonRpcFixture( const std::string& _config = "", bool _owner = true, // wait for 1st block - because it's always empty std::promise< void > blockPromise; auto importHandler = client->setOnBlockImport( - [&blockPromise]( BlockHeader const& ) { - blockPromise.set_value(); - } ); + [&blockPromise]( BlockHeader const& ) { blockPromise.set_value(); } ); client->injectSkaleHost(); client->startWorking(); @@ -345,21 +359,21 @@ JsonRpcFixture( const std::string& _config = "", bool _owner = true, rpc::AdminEthFace /*, rpc::AdminNetFace*/, rpc::DebugFace, rpc::TestFace >; accountHolder.reset( new FixedAccountHolder( [&]() { return client.get(); }, {} ) ); - accountHolder->setAccounts( {coinbase, account2, account3} ); + accountHolder->setAccounts( { coinbase, account2, account3 } ); sessionManager.reset( new rpc::SessionManager() ); adminSession = - sessionManager->newSession( rpc::SessionPermissions{{rpc::Privilege::Admin}} ); + sessionManager->newSession( rpc::SessionPermissions{ { rpc::Privilege::Admin } } ); - auto ethFace = new rpc::Eth( std::string(""), *client, *accountHolder.get() ); + auto ethFace = new rpc::Eth( std::string( "" ), *client, *accountHolder.get() ); gasPricer = make_shared< eth::TrivialGasPricer >( 0, DefaultGasPrice ); - rpcServer.reset( new FullServer( ethFace , new rpc::Net( chainParams ), + rpcServer.reset( new FullServer( ethFace, new rpc::Net( chainParams ), new rpc::Web3(), // TODO Add version parameter here? new rpc::AdminEth( *client, *gasPricer, keyManager, *sessionManager ), - new rpc::Debug( *client, nullptr, ""), - new rpc::Test( *client ) ) ); + new rpc::Debug( *client, nullptr, "" ), new rpc::Test( *client ) ) ); + // SkaleServerOverride::opts_t serverOpts; @@ -369,29 +383,31 @@ JsonRpcFixture( const std::string& _config = "", bool _owner = true, serverOpts.netOpts_.bindOptsStandard_.cntServers_ = 1; serverOpts.netOpts_.bindOptsStandard_.strAddrHTTP4_ = chainParams.nodeInfo.ip; // random port - // +3 because rand() seems to be called effectively simultaneously here and in "static" section - thus giving same port for consensus + // +3 because rand() seems to be called effectively simultaneously here and in "static" + // section - thus giving same port for consensus serverOpts.netOpts_.bindOptsStandard_.nBasePortHTTP4_ = std::rand() % 64000 + 1025 + 3; std::cout << "PORT: " << serverOpts.netOpts_.bindOptsStandard_.nBasePortHTTP4_ << std::endl; skale_server_connector = new SkaleServerOverride( chainParams, client.get(), serverOpts ); rpcServer->addConnector( skale_server_connector ); skale_server_connector->StartListening(); - sleep(1); - - auto client = new jsonrpc::HttpClient( "http://" + chainParams.nodeInfo.ip + ":" + std::to_string( serverOpts.netOpts_.bindOptsStandard_.nBasePortHTTP4_ ) ); - client->SetTimeout(1000000000); + sleep( 1 ); - rpcClient = unique_ptr< WebThreeStubClient >( new WebThreeStubClient( *client ) ); + auto httpClient = new jsonrpc::HttpClient( + "http://" + chainParams.nodeInfo.ip + ":" + + std::to_string( serverOpts.netOpts_.bindOptsStandard_.nBasePortHTTP4_ ) ); + httpClient->SetTimeout( 1000000000 ); + rpcClient = unique_ptr< WebThreeStubClient >( new WebThreeStubClient( *httpClient ) ); - BOOST_TEST_MESSAGE("Constructed JsonRpcFixture"); + BOOST_TEST_MESSAGE( "Constructed JsonRpcFixture" ); } ~JsonRpcFixture() { if ( skale_server_connector ) skale_server_connector->StopListening(); - BOOST_TEST_MESSAGE("Destructed JsonRpcFixture"); + BOOST_TEST_MESSAGE( "Destructed JsonRpcFixture" ); } string sendingRawShouldFail( string const& _t ) { @@ -399,6 +415,7 @@ JsonRpcFixture( const std::string& _config = "", bool _owner = true, rpcClient->eth_sendRawTransaction( _t ); BOOST_FAIL( "Exception expected." ); } catch ( jsonrpc::JsonRpcException const& _e ) { + cerr << _e.GetMessage() << endl; return _e.GetMessage(); } return string(); @@ -414,16 +431,16 @@ JsonRpcFixture( const std::string& _config = "", bool _owner = true, return string(); } - TransientDirectory tempDir; // ! should exist before client! + TransientDirectory tempDir; // ! should exist before client! unique_ptr< Client > client; - dev::KeyPair coinbase{KeyPair::create()}; - dev::KeyPair account2{KeyPair::create()}; - dev::KeyPair account3{KeyPair::create()}; + dev::KeyPair coinbase{ KeyPair::create() }; + dev::KeyPair account2{ KeyPair::create() }; + dev::KeyPair account3{ KeyPair::create() }; unique_ptr< FixedAccountHolder > accountHolder; unique_ptr< rpc::SessionManager > sessionManager; std::shared_ptr< eth::TrivialGasPricer > gasPricer; - KeyManager keyManager{KeyManager::defaultPath(), SecretStore::defaultPath()}; + KeyManager keyManager{ KeyManager::defaultPath(), SecretStore::defaultPath() }; unique_ptr< ModularServer<> > rpcServer; unique_ptr< WebThreeStubClient > rpcClient; std::string adminSession; @@ -433,7 +450,8 @@ JsonRpcFixture( const std::string& _config = "", bool _owner = true, }; struct RestrictedAddressFixture : public JsonRpcFixture { - RestrictedAddressFixture( const std::string& _config = c_genesisConfigString ) : JsonRpcFixture( _config ) { + RestrictedAddressFixture( const std::string& _config = c_genesisConfigString ) + : JsonRpcFixture( _config ) { ownerAddress = Address( "00000000000000000000000000000000000000AA" ); std::string fileName = "test"; path = dev::getDataDir() / "filestorage" / Address( ownerAddress ).hex() / fileName; @@ -467,10 +485,11 @@ BOOST_AUTO_TEST_CASE( jsonrpc_gasPrice ) { BOOST_CHECK_EQUAL( gasPrice, toJS( 20 * dev::eth::shannon ) ); } -BOOST_AUTO_TEST_CASE( jsonrpc_accounts, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { + +BOOST_AUTO_TEST_CASE( + jsonrpc_accounts, *boost::unit_test::precondition( dev::test::run_not_express ) ) { JsonRpcFixture fixture; - std::vector< dev::KeyPair > keys = {KeyPair::create(), KeyPair::create()}; + std::vector< dev::KeyPair > keys = { KeyPair::create(), KeyPair::create() }; fixture.accountHolder->setAccounts( keys ); Json::Value k = fixture.rpcClient->eth_accounts(); fixture.accountHolder->setAccounts( {} ); @@ -494,8 +513,8 @@ BOOST_AUTO_TEST_CASE( jsonrpc_number ) { BOOST_CHECK_EQUAL( numberAfter, fixture.client->number() ); } -BOOST_AUTO_TEST_CASE( jsonrpc_netVersion ) -{ + +BOOST_AUTO_TEST_CASE( jsonrpc_netVersion ) { std::string _config = c_genesisConfigString; Json::Value ret; Json::Reader().parse( _config, ret ); @@ -528,8 +547,8 @@ BOOST_AUTO_TEST_CASE( jsonrpc_stateAt ) { BOOST_CHECK_EQUAL( fixture.client->stateAt( address, 0 ), jsToU256( stateAt ) ); } -BOOST_AUTO_TEST_CASE( eth_coinbase, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( + eth_coinbase, *boost::unit_test::precondition( dev::test::run_not_express ) ) { JsonRpcFixture fixture; string coinbase = fixture.rpcClient->eth_coinbase(); BOOST_REQUIRE_EQUAL( jsToAddress( coinbase ), fixture.client->author() ); @@ -669,8 +688,8 @@ BOOST_AUTO_TEST_CASE( eth_sendRawTransaction_errorInvalidNonce, signedTx = fixture.rpcClient->eth_signTransaction( t ); BOOST_REQUIRE( !signedTx["raw"].empty() ); - BOOST_CHECK_EQUAL( - fixture.sendingRawShouldFail( signedTx["raw"].asString() ), "Invalid transaction nonce." ); + + fixture.sendingRawShouldFail( signedTx["raw"].asString() ); } BOOST_AUTO_TEST_CASE( eth_sendRawTransaction_errorInsufficientGas ) { @@ -728,8 +747,7 @@ BOOST_AUTO_TEST_CASE( eth_sendRawTransaction_errorDuplicateTransaction ) { signedTx = fixture.rpcClient->eth_signTransaction( t ); BOOST_REQUIRE( !signedTx["raw"].empty() ); - BOOST_CHECK_EQUAL( fixture.sendingRawShouldFail( signedTx["raw"].asString() ), - "Same transaction already exists in the pending transaction queue." ); + fixture.sendingRawShouldFail( signedTx["raw"].asString() ); } BOOST_AUTO_TEST_CASE( send_raw_tx_sync ) { @@ -756,13 +774,13 @@ BOOST_AUTO_TEST_CASE( send_raw_tx_sync ) { create["code"] = compiled; create["gas"] = "180000"; - BOOST_REQUIRE( fixture.client->transactionQueueStatus().current == 0); + BOOST_REQUIRE( fixture.client->transactionQueueStatus().current == 0 ); // Sending tx to sync node string txHash = fixture.rpcClient->eth_sendTransaction( create ); auto pendingTransactions = fixture.client->pending(); - BOOST_REQUIRE( pendingTransactions.size() == 1); + BOOST_REQUIRE( pendingTransactions.size() == 1 ); auto txHashFromQueue = "0x" + pendingTransactions[0].sha3().hex(); BOOST_REQUIRE( txHashFromQueue == txHash ); } @@ -792,6 +810,10 @@ BOOST_AUTO_TEST_CASE( eth_signTransaction ) { BOOST_CHECK_EQUAL( countAtBeforeSign, countAtAfterSign ); } + +const string skaledConfigFileName = "../../test/historicstate/configs/basic_config.json"; + + BOOST_AUTO_TEST_CASE( simple_contract ) { JsonRpcFixture fixture; dev::eth::simulateMining( *( fixture.client ), 1 ); @@ -857,7 +879,8 @@ BOOST_AUTO_TEST_CASE( simple_contract ) { Json::Value inputCall; inputCall["to"] = contractAddress; - inputCall["input"] = "0xb3de648b0000000000000000000000000000000000000000000000000000000000000001"; + inputCall["input"] = + "0xb3de648b0000000000000000000000000000000000000000000000000000000000000001"; inputCall["gas"] = "1000000"; inputCall["gasPrice"] = "0"; result = fixture.rpcClient->eth_call( inputCall, "latest" ); @@ -876,6 +899,7 @@ BOOST_AUTO_TEST_CASE( simple_contract ) { inputTx["to"] = contractAddress; inputTx["input"] = "0x552410770000000000000000000000000000000000000000000000000000000000000002"; txHash = fixture.rpcClient->eth_sendTransaction( inputTx ); + dev::eth::mineTransaction( *( fixture.client ), 1 ); res = fixture.rpcClient->eth_getTransactionReceipt( txHash ); BOOST_REQUIRE_EQUAL( res["status"], string( "0x1" ) ); @@ -961,7 +985,7 @@ BOOST_AUTO_TEST_CASE( deploy_contract_without_controller ) { std::string _config = c_genesisConfigString; Json::Value ret; Json::Reader().parse( _config, ret ); - ret["accounts"].removeMember("0xD2002000000000000000000000000000000000D2"); + ret["accounts"].removeMember( "0xD2002000000000000000000000000000000000D2" ); Json::FastWriter fastWriter; std::string config = fastWriter.write( ret ); JsonRpcFixture fixture( config, false, false ); @@ -975,14 +999,14 @@ BOOST_AUTO_TEST_CASE( deploy_contract_without_controller ) { // } string compiled = - "6080604052341561000f57600080fd5b60b98061001d6000396000f300" - "608060405260043610603f576000357c01000000000000000000000000" - "00000000000000000000000000000000900463ffffffff168063b3de64" - "8b146044575b600080fd5b3415604e57600080fd5b606a600480360381" - "019080803590602001909291905050506080565b604051808281526020" - "0191505060405180910390f35b60006007820290509190505600a16562" - "7a7a72305820f294e834212334e2978c6dd090355312a3f0f9476b8eb9" - "8fb480406fc2728a960029"; + "6080604052341561000f57600080fd5b60b98061001d6000396000f300" + "608060405260043610603f576000357c01000000000000000000000000" + "00000000000000000000000000000000900463ffffffff168063b3de64" + "8b146044575b600080fd5b3415604e57600080fd5b606a600480360381" + "019080803590602001909291905050506080565b604051808281526020" + "0191505060405180910390f35b60006007820290509190505600a16562" + "7a7a72305820f294e834212334e2978c6dd090355312a3f0f9476b8eb9" + "8fb480406fc2728a960029"; Json::Value create; @@ -997,7 +1021,7 @@ BOOST_AUTO_TEST_CASE( deploy_contract_without_controller ) { BOOST_REQUIRE_EQUAL( receipt["status"], string( "0x1" ) ); BOOST_REQUIRE( !receipt["contractAddress"].isNull() ); Json::Value code = - fixture.rpcClient->eth_getCode( receipt["contractAddress"].asString(), "latest" ); + fixture.rpcClient->eth_getCode( receipt["contractAddress"].asString(), "latest" ); BOOST_REQUIRE( code.asString().substr( 2 ) == compiled.substr( 58 ) ); } @@ -1013,14 +1037,14 @@ BOOST_AUTO_TEST_CASE( deploy_contract_with_controller ) { // } string compiled = - "6080604052341561000f57600080fd5b60b98061001d6000396000f300" - "608060405260043610603f576000357c01000000000000000000000000" - "00000000000000000000000000000000900463ffffffff168063b3de64" - "8b146044575b600080fd5b3415604e57600080fd5b606a600480360381" - "019080803590602001909291905050506080565b604051808281526020" - "0191505060405180910390f35b60006007820290509190505600a16562" - "7a7a72305820f294e834212334e2978c6dd090355312a3f0f9476b8eb9" - "8fb480406fc2728a960029"; + "6080604052341561000f57600080fd5b60b98061001d6000396000f300" + "608060405260043610603f576000357c01000000000000000000000000" + "00000000000000000000000000000000900463ffffffff168063b3de64" + "8b146044575b600080fd5b3415604e57600080fd5b606a600480360381" + "019080803590602001909291905050506080565b604051808281526020" + "0191505060405180910390f35b60006007820290509190505600a16562" + "7a7a72305820f294e834212334e2978c6dd090355312a3f0f9476b8eb9" + "8fb480406fc2728a960029"; Json::Value create; @@ -1034,7 +1058,7 @@ BOOST_AUTO_TEST_CASE( deploy_contract_with_controller ) { Json::Value receipt = fixture.rpcClient->eth_getTransactionReceipt( txHash ); BOOST_CHECK_EQUAL( receipt["status"], string( "0x0" ) ); Json::Value code = - fixture.rpcClient->eth_getCode( receipt["contractAddress"].asString(), "latest" ); + fixture.rpcClient->eth_getCode( receipt["contractAddress"].asString(), "latest" ); BOOST_REQUIRE( code.asString() == "0x" ); } @@ -1046,21 +1070,21 @@ BOOST_AUTO_TEST_CASE( create_opcode ) { dev::eth::simulateMining( *( fixture.client ), 1 ); /* - pragma solidity ^0.4.25; + pragma solidity ^0.4.25; - contract test { - address public a; + contract test { + address public a; - function f() public { - address _address; - assembly { - let ptr := mload(0x40) - _address := create(0x00,ptr,0x20) - } - a = _address; + function f() public { + address _address; + assembly { + let ptr := mload(0x40) + _address := create(0x00,ptr,0x20) } + a = _address; } - */ + } +*/ string compiled = "608060405234801561001057600080fd5b50610161806100206000396000f30060806040526004361061004c57" @@ -1101,7 +1125,8 @@ BOOST_AUTO_TEST_CASE( create_opcode ) { checkAddress["to"] = contractAddress; checkAddress["data"] = "0x0dbe671f"; string response1 = fixture.rpcClient->eth_call( checkAddress, "latest" ); - BOOST_CHECK( response1 != "0x0000000000000000000000000000000000000000000000000000000000000000" ); + BOOST_CHECK( + response1 != "0x0000000000000000000000000000000000000000000000000000000000000000" ); fixture.client->setAuthor( senderAddress ); transactionCallObject["from"] = toJS( senderAddress ); @@ -1109,7 +1134,8 @@ BOOST_AUTO_TEST_CASE( create_opcode ) { dev::eth::mineTransaction( *( fixture.client ), 1 ); string response2 = fixture.rpcClient->eth_call( checkAddress, "latest" ); - BOOST_CHECK( response2 != "0x0000000000000000000000000000000000000000000000000000000000000000" ); + BOOST_CHECK( + response2 != "0x0000000000000000000000000000000000000000000000000000000000000000" ); BOOST_CHECK( response2 != response1 ); } @@ -1123,33 +1149,44 @@ BOOST_AUTO_TEST_CASE( push0_patch_activation ) { fixture.client->setAuthor( fixture.account2.address() ); dev::eth::simulateMining( *( fixture.client ), 1 ); -/* -// SPDX-License-Identifier: GPL-3.0 + /* + // SPDX-License-Identifier: GPL-3.0 -pragma solidity >=0.8.2; + pragma solidity >=0.8.2; -contract Push0Test { - fallback() external payable { - assembly { - let t := add(9, 10) + contract Push0Test { + fallback() external payable { + assembly { + let t := add(9, 10) + } } } -} -then convert to yul: solc --ir p0test.sol >p0test.yul + then convert to yul: --ir p0test.sol` >p0test.yul -then change code: - { - let r := add(88,99) - let tmp := verbatim_0i_1o(hex"5f") - } + then change code: + { + let r := add(88,99) + let tmp := verbatim_0i_1o(hex"5f") + } -then compile! + then compile! -*/ + */ string compiled = - "608060405234156100135761001261003b565b5b61001b610040565b610023610031565b6101b761004382396101b781f35b6000604051905090565b600080fd5b56fe608060405261000f36600061015b565b805160208201f35b60006060905090565b6000604051905090565b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6100738261002a565b810181811067ffffffffffffffff821117156100925761009161003b565b5b80604052505050565b60006100a5610020565b90506100b1828261006a565b919050565b600067ffffffffffffffff8211156100d1576100d061003b565b5b6100da8261002a565b9050602081019050919050565b60006100f2826100b6565b6100fb8161009b565b915082825250919050565b7f7375636365737300000000000000000000000000000000000000000000000000600082015250565b600061013b60076100e7565b905061014960208201610106565b90565b600061015661012f565b905090565b6000610165610017565b809150600a6009015f505061017861014c565b9150509291505056fea2646970667358221220b3871ed09fbcbb1dac74c3cd48dafa5d097bea7c808b5ff2c16a996cf108d3c664736f6c63430008190033"; -// "60806040523415601057600f6031565b5b60166036565b601c6027565b604c60398239604c81f35b6000604051905090565b600080fd5b56fe6080604052600a600c565b005b60636058015f505056fea2646970667358221220ee9861b869ceda6de64f2ec7ccbebf2babce54b35502a866a4193e05ae595e1f64736f6c63430008130033"; + "608060405234156100135761001261003b565b5b61001b610040565b610023610031565b6101b7610043823961" + "01b781f35b6000604051905090565b600080fd5b56fe608060405261000f36600061015b565b805160208201f3" + "5b60006060905090565b6000604051905090565b6000601f19601f8301169050919050565b7f4e487b71000000" + "00000000000000000000000000000000000000000000000000600052604160045260246000fd5b610073826100" + "2a565b810181811067ffffffffffffffff821117156100925761009161003b565b5b80604052505050565b6000" + "6100a5610020565b90506100b1828261006a565b919050565b600067ffffffffffffffff8211156100d1576100" + "d061003b565b5b6100da8261002a565b9050602081019050919050565b60006100f2826100b6565b6100fb8161" + "009b565b915082825250919050565b7f7375636365737300000000000000000000000000000000000000000000" + "000000600082015250565b600061013b60076100e7565b905061014960208201610106565b90565b6000610156" + "61012f565b905090565b6000610165610017565b809150600a6009015f505061017861014c565b915050929150" + "5056fea2646970667358221220b3871ed09fbcbb1dac74c3cd48dafa5d097bea7c808b5ff2c16a996cf108d3c6" + "64736f6c63430008190033"; + // "60806040523415601057600f6031565b5b60166036565b601c6027565b604c60398239604c81f35b6000604051905090565b600080fd5b56fe6080604052600a600c565b005b60636058015f505056fea2646970667358221220ee9861b869ceda6de64f2ec7ccbebf2babce54b35502a866a4193e05ae595e1f64736f6c63430008130033"; Json::Value create; @@ -1161,7 +1198,7 @@ then compile! dev::eth::mineTransaction( *( fixture.client ), 1 ); Json::Value receipt = fixture.rpcClient->eth_getTransactionReceipt( txHash ); - BOOST_REQUIRE_EQUAL( receipt["status"], string( "0x1" ) ); // deploy should succeed + BOOST_REQUIRE_EQUAL( receipt["status"], string( "0x1" ) ); // deploy should succeed string contractAddress = receipt["contractAddress"].asString(); Json::Value callObject; @@ -1174,30 +1211,32 @@ then compile! txHash = fixture.rpcClient->eth_sendTransaction( callObject ); dev::eth::mineTransaction( *( fixture.client ), 1 ); receipt = fixture.rpcClient->eth_getTransactionReceipt( txHash ); - BOOST_REQUIRE_EQUAL( receipt["status"], string( "0x0" ) ); // exec should fail + BOOST_REQUIRE_EQUAL( receipt["status"], string( "0x0" ) ); // exec should fail - string callResult = fixture.rpcClient->eth_call(callObject, "latest"); - BOOST_REQUIRE_EQUAL( callResult, string( "0x" ) ); // call too + string callResult = fixture.rpcClient->eth_call( callObject, "latest" ); + BOOST_REQUIRE_EQUAL( callResult, string( "0x" ) ); // call too // wait for block after timestamp - BOOST_REQUIRE_LT( fixture.client->blockInfo(LatestBlock).timestamp(), fixture.push0PatchActivationTimestamp ); - while( time(nullptr) < fixture.push0PatchActivationTimestamp ) - sleep(1); + BOOST_REQUIRE_LT( fixture.client->blockInfo( LatestBlock ).timestamp(), + fixture.push0PatchActivationTimestamp ); + while ( time( nullptr ) < fixture.push0PatchActivationTimestamp ) + sleep( 1 ); // 1st timestamp-crossing block txHash = fixture.rpcClient->eth_sendTransaction( callObject ); dev::eth::mineTransaction( *( fixture.client ), 1 ); - BOOST_REQUIRE_GE( fixture.client->blockInfo(LatestBlock).timestamp(), fixture.push0PatchActivationTimestamp ); + BOOST_REQUIRE_GE( fixture.client->blockInfo( LatestBlock ).timestamp(), + fixture.push0PatchActivationTimestamp ); uint64_t crossingBlockNumber = fixture.client->number(); - (void) crossingBlockNumber; + ( void ) crossingBlockNumber; // in the "corssing" block tx still should fail receipt = fixture.rpcClient->eth_getTransactionReceipt( txHash ); BOOST_REQUIRE_EQUAL( receipt["status"], string( "0x0" ) ); // in 1st block with patch call should succeed - callResult = fixture.rpcClient->eth_call(callObject, "latest"); + callResult = fixture.rpcClient->eth_call( callObject, "latest" ); BOOST_REQUIRE_NE( callResult, string( "0x" ) ); // tx should succeed too @@ -1209,10 +1248,10 @@ then compile! #ifdef HISTORIC_STATE // histoic call should fail before activation and succees after it - callResult = fixture.rpcClient->eth_call(callObject, toJS(crossingBlockNumber-1)); + callResult = fixture.rpcClient->eth_call( callObject, toJS( crossingBlockNumber - 1 ) ); BOOST_REQUIRE_EQUAL( callResult, string( "0x" ) ); - callResult = fixture.rpcClient->eth_call(callObject, toJS(crossingBlockNumber)); + callResult = fixture.rpcClient->eth_call( callObject, toJS( crossingBlockNumber ) ); BOOST_REQUIRE_NE( callResult, string( "0x" ) ); #endif } @@ -1255,13 +1294,16 @@ BOOST_AUTO_TEST_CASE( eth_estimateGas ) { Json::Value testRevert; testRevert["to"] = "0xD2001300000000000000000000000000000000D4"; - testRevert["data"] = "0x20987767000000000000000000000000000000000000000000000000000000000000c350"; + testRevert["data"] = + "0x20987767000000000000000000000000000000000000000000000000000000000000c350"; string response = fixture.estimateGasShouldFail( testRevert ); - BOOST_CHECK( response.find("EVM revert instruction without description message") != string::npos ); + BOOST_CHECK( + response.find( "EVM revert instruction without description message" ) != string::npos ); Json::Value testPositive; testPositive["to"] = "0xD2001300000000000000000000000000000000D4"; - testPositive["data"] = "0xfdde8d66000000000000000000000000000000000000000000000000000000000000c350"; + testPositive["data"] = + "0xfdde8d66000000000000000000000000000000000000000000000000000000000000c350"; response = fixture.rpcClient->eth_estimateGas( testPositive ); string response2 = fixture.rpcClient->eth_estimateGas( testPositive, "latest" ); string response3 = fixture.rpcClient->eth_estimateGas( testPositive, "1" ); @@ -1276,7 +1318,7 @@ BOOST_AUTO_TEST_CASE( eth_estimateGas_chainId ) { Json::Reader().parse( _config, ret ); // Set chainID = 65535 - ret["params"]["chainID"] = "0xffff"; + ret["params"]["chainID"] = "0xffff"; Json::FastWriter fastWriter; std::string config = fastWriter.write( ret ); @@ -1293,15 +1335,18 @@ BOOST_AUTO_TEST_CASE( eth_estimateGas_chainId ) { // } Json::Value testRevert; - testRevert["data"] = "0x6080604052348015600f57600080fd5b50604051633013bad360e21b815246600482015260240160405180910390fdfe"; + testRevert["data"] = + "0x6080604052348015600f57600080fd5b50604051633013bad360e21b81524660048201526024016040518091" + "0390fdfe"; try { fixture.rpcClient->eth_estimateGas( testRevert, "latest" ); - } catch ( jsonrpc::JsonRpcException& ex) { - BOOST_CHECK_EQUAL(ex.GetCode(), 3); - BOOST_CHECK_EQUAL(ex.GetData().asString(), "0xc04eeb4c000000000000000000000000000000000000000000000000000000000000ffff"); - BOOST_CHECK_EQUAL(ex.GetMessage(), "EVM revert instruction without description message"); - } + } catch ( jsonrpc::JsonRpcException& ex ) { + BOOST_CHECK_EQUAL( ex.GetCode(), 3 ); + BOOST_CHECK_EQUAL( ex.GetData().asString(), + "0xc04eeb4c000000000000000000000000000000000000000000000000000000000000ffff" ); + BOOST_CHECK_EQUAL( ex.GetMessage(), "EVM revert instruction without description message" ); + } } BOOST_AUTO_TEST_CASE( eth_sendRawTransaction_gasLimitExceeded ) { @@ -1414,8 +1459,7 @@ BOOST_AUTO_TEST_CASE( contract_storage ) { BOOST_REQUIRE( receipt2["contractAddress"].isNull() ); } -BOOST_AUTO_TEST_CASE( web3_sha3, - *boost::unit_test::precondition( dev::test::run_not_express ) ) { +BOOST_AUTO_TEST_CASE( web3_sha3, *boost::unit_test::precondition( dev::test::run_not_express ) ) { JsonRpcFixture fixture; string testString = "multiply(uint256)"; h256 expected = dev::sha3( testString ); @@ -1453,7 +1497,7 @@ BOOST_AUTO_TEST_CASE( test_importRawBlock ) { // blockHash, "0xedef94eddd6002ae14803b91aa5138932f948026310144fc615d52d7d5ff29c7" ); // TODO again, this was computed just in code - no trust to it - std::cerr << blockHash << std::endl; + std::cout << blockHash << std::endl; BOOST_CHECK_EQUAL( blockHash, "0x7683f686a7ecf6949d29cab2075b8aa45f061e27338e61ea3c37a7a0bd80f17b" ); } @@ -1495,9 +1539,9 @@ BOOST_AUTO_TEST_CASE( call_from_parameter ) { std::cout << cc::now2string() << " eth_getTransactionReceipt" << std::endl; Json::Value receipt; - try{ + try { receipt = fixture.rpcClient->eth_getTransactionReceipt( txHash ); - }catch(...){ + } catch ( ... ) { std::cout << cc::now2string() << " /eth_getTransactionReceipt" << std::endl; throw; } @@ -1557,7 +1601,7 @@ BOOST_AUTO_TEST_CASE( call_with_error ) { Json::Value create; create["from"] = toJS( senderAddress ); create["code"] = compiled; - create["gas"] = "180000"; + create["gas"] = "180000"; string txHash = fixture.rpcClient->eth_sendTransaction( create ); dev::eth::mineTransaction( *( fixture.client ), 1 ); @@ -1570,11 +1614,11 @@ BOOST_AUTO_TEST_CASE( call_with_error ) { try { fixture.rpcClient->eth_call( transactionCallObject, "latest" ); - } catch ( jsonrpc::JsonRpcException& ex) { - BOOST_CHECK_EQUAL(ex.GetCode(), 3); - BOOST_CHECK_EQUAL(ex.GetData().asString(), "0x82b42900"); - BOOST_CHECK_EQUAL(ex.GetMessage(), "EVM revert instruction without description message"); - } + } catch ( jsonrpc::JsonRpcException& ex ) { + BOOST_CHECK_EQUAL( ex.GetCode(), 3 ); + BOOST_CHECK_EQUAL( ex.GetData().asString(), "0x82b42900" ); + BOOST_CHECK_EQUAL( ex.GetMessage(), "EVM revert instruction without description message" ); + } } BOOST_AUTO_TEST_CASE( estimate_gas_with_error ) { @@ -1606,13 +1650,13 @@ BOOST_AUTO_TEST_CASE( estimate_gas_with_error ) { "208201905061012c6000830184610108565b9291505056fea264697066735822122013" "2ca0f4158a0540a7e67f304c94305f81bbe52de2314e2b9cee92a2c74e103a64736f6c" "63430008120033"; - + auto senderAddress = fixture.coinbase.address(); Json::Value create; create["from"] = toJS( senderAddress ); create["code"] = compiled; - create["gas"] = "180000"; + create["gas"] = "180000"; string txHash = fixture.rpcClient->eth_sendTransaction( create ); dev::eth::mineTransaction( *( fixture.client ), 1 ); @@ -1625,14 +1669,17 @@ BOOST_AUTO_TEST_CASE( estimate_gas_with_error ) { try { fixture.rpcClient->eth_estimateGas( transactionCallObject, "latest" ); - } catch ( jsonrpc::JsonRpcException& ex) { - BOOST_CHECK_EQUAL(ex.GetCode(), 3); - BOOST_CHECK_EQUAL(ex.GetData().asString(), "0x82b42900"); - BOOST_CHECK_EQUAL(ex.GetMessage(), "EVM revert instruction without description message"); - } + } catch ( jsonrpc::JsonRpcException& ex ) { + BOOST_CHECK_EQUAL( ex.GetCode(), 3 ); + BOOST_CHECK_EQUAL( ex.GetData().asString(), "0x82b42900" ); + BOOST_CHECK_EQUAL( ex.GetMessage(), "EVM revert instruction without description message" ); + } } BOOST_AUTO_TEST_CASE( simplePoWTransaction ) { + u256 ESTIMATE_AFTER_PATCH = u256( 21000 + 1024 * 16 ); + u256 ESTIMATE_BEFORE_PATCH = u256( 21000 + 1024 * 68 ); + // 1s empty block interval JsonRpcFixture fixture( "", true, true, false, false, false, 1000 ); dev::eth::simulateMining( *( fixture.client ), 1 ); @@ -1643,25 +1690,28 @@ BOOST_AUTO_TEST_CASE( simplePoWTransaction ) { transact["from"] = toJS( senderAddress ); transact["to"] = toJS( senderAddress ); // 1k - ostringstream ss("0x"); - for(int i=0; i<1024/16; ++i) + ostringstream ss( "0x" ); + for ( int i = 0; i < 1024 / 16; ++i ) ss << "112233445566778899aabbccddeeff11"; transact["data"] = ss.str(); - string gasEstimateStr = fixture.rpcClient->eth_estimateGas(transact); - u256 gasEstimate = jsToU256(gasEstimateStr); + string gasEstimateStr = fixture.rpcClient->eth_estimateGas( transact ); + u256 gasEstimate = jsToU256( gasEstimateStr ); // old estimate before patch - BOOST_REQUIRE_EQUAL(gasEstimate, u256(21000+1024*68)); + BOOST_REQUIRE_EQUAL( gasEstimate, ESTIMATE_BEFORE_PATCH ); u256 powGasPrice = 0; - u256 correctEstimate = u256(21000+1024*16); + + do { + // mine enough POW to tun transaction after PATCH but not before patch const u256 GAS_PER_HASH = 1; u256 candidate = h256::random(); h256 hash = dev::sha3( senderAddress ) ^ dev::sha3( u256( 0 ) ) ^ dev::sha3( candidate ); u256 externalGas = ~u256( 0 ) / u256( hash ) * GAS_PER_HASH; - if ( externalGas >= correctEstimate && externalGas < correctEstimate + correctEstimate/10 ) { + if ( externalGas >= ESTIMATE_AFTER_PATCH && + externalGas < ESTIMATE_AFTER_PATCH + ESTIMATE_AFTER_PATCH / 10 ) { powGasPrice = candidate; } } while ( !powGasPrice ); @@ -1671,37 +1721,41 @@ BOOST_AUTO_TEST_CASE( simplePoWTransaction ) { // wait for patch turning on and see how it happens string txHash; BlockHeader badInfo, goodInfo; - for(;;) { - string gasEstimateStr = fixture.rpcClient->eth_estimateGas(transact); - u256 gasEstimate = jsToU256(gasEstimateStr); + uint64_t blockCounter = 2; + for ( ;; ) { + gasEstimateStr = fixture.rpcClient->eth_estimateGas( transact ); + gasEstimate = jsToU256( gasEstimateStr ); // old - if(gasEstimate == u256(21000+1024*68)){ - try{ + if ( gasEstimate == ESTIMATE_BEFORE_PATCH ) { + // we are before patch. Sending show fail since we do not have enough PoW gas + try { fixture.rpcClient->eth_sendTransaction( transact ); - BOOST_REQUIRE(false); - } catch(const std::exception& ex) { - assert(string(ex.what()).find("balance is too low") != string::npos); - badInfo = fixture.client->blockInfo(fixture.client->hashFromNumber(LatestBlock)); - dev::eth::mineTransaction( *( fixture.client ), 1 ); // empty block - } // catch - } - // new - else { - BOOST_REQUIRE_EQUAL(gasEstimate, correctEstimate); + BOOST_REQUIRE( false ); + } catch ( const std::exception& ex ) { + assert( string( ex.what() ).find( "balance is too low" ) != string::npos ); + badInfo = + fixture.client->blockInfo( fixture.client->hashFromNumber( LatestBlock ) ); + dev::eth::mineTransaction( *( fixture.client ), 1 ); // empty block + fixture.client->state().getOriginalDb()->createBlockSnap( blockCounter ); + blockCounter++; + } + } else { // now we are after patch + BOOST_REQUIRE_EQUAL( gasEstimate, ESTIMATE_AFTER_PATCH ); txHash = fixture.rpcClient->eth_sendTransaction( transact ); - goodInfo = fixture.client->blockInfo(fixture.client->hashFromNumber(LatestBlock)); + goodInfo = fixture.client->blockInfo( fixture.client->hashFromNumber( LatestBlock ) ); break; - } // else - } // for + } + } - BOOST_REQUIRE_LT(badInfo.timestamp(), fixture.powPatchActivationTimestamp); - BOOST_REQUIRE_GE(goodInfo.timestamp(), fixture.powPatchActivationTimestamp); - BOOST_REQUIRE_EQUAL(badInfo.number()+1, goodInfo.number()); + BOOST_REQUIRE_LT( badInfo.timestamp(), fixture.powPatchActivationTimestamp ); + BOOST_REQUIRE_GE( goodInfo.timestamp(), fixture.powPatchActivationTimestamp ); + BOOST_REQUIRE_EQUAL( badInfo.number() + 1, goodInfo.number() ); dev::eth::mineTransaction( *( fixture.client ), 1 ); + fixture.client->state().getOriginalDb()->createBlockSnap( blockCounter ); Json::Value receipt = fixture.rpcClient->eth_getTransactionReceipt( txHash ); - BOOST_REQUIRE_EQUAL(receipt["status"], "0x1"); + BOOST_REQUIRE_EQUAL( receipt["status"], "0x1" ); } BOOST_AUTO_TEST_CASE( recalculateExternalGas ) { @@ -1709,7 +1763,6 @@ BOOST_AUTO_TEST_CASE( recalculateExternalGas ) { Json::Value ret; Json::Reader().parse( _config, ret ); - // Set chainID = 21 std::string chainID = "0x15"; ret["params"]["chainID"] = chainID; @@ -1719,7 +1772,7 @@ BOOST_AUTO_TEST_CASE( recalculateExternalGas ) { ret["accounts"] = accounts; // setup patch - time_t externalGasPatchActivationTimestamp = time(nullptr) + 10; + time_t externalGasPatchActivationTimestamp = time( nullptr ) + 10; ret["skaleConfig"]["sChain"]["ExternalGasPatchTimestamp"] = externalGasPatchActivationTimestamp; Json::FastWriter fastWriter; @@ -1729,40 +1782,49 @@ BOOST_AUTO_TEST_CASE( recalculateExternalGas ) { auto senderAddress = fixture.coinbase.address().hex(); -// // SPDX-License-Identifier: GPL-3.0 - -// pragma solidity >=0.8.2 <0.9.0; - -// /** -// * @title Storage -// * @dev Store & retrieve value in a variable -// * @custom:dev-run-script ./scripts/deploy_with_ethers.ts -// */ -// contract Storage { - -// uint256 number; -// uint256 number1; -// uint256 number2; - -// /** -// * @dev Store value in variable -// * @param num value to store -// */ -// function store(uint256 num) public { -// number = num; -// number1 = num; -// number2 = num; -// } - -// /** -// * @dev Return value -// * @return value of 'number' -// */ -// function retrieve() public view returns (uint256){ -// return number; -// } -// } - std::string bytecode = "608060405234801561001057600080fd5b5061015e806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c80632e64cec11461003b5780636057361d14610059575b600080fd5b610043610075565b60405161005091906100e7565b60405180910390f35b610073600480360381019061006e91906100ab565b61007e565b005b60008054905090565b80600081905550806001819055508060028190555050565b6000813590506100a581610111565b92915050565b6000602082840312156100c1576100c061010c565b5b60006100cf84828501610096565b91505092915050565b6100e181610102565b82525050565b60006020820190506100fc60008301846100d8565b92915050565b6000819050919050565b600080fd5b61011a81610102565b811461012557600080fd5b5056fea2646970667358221220780703bb6ac2eec922a510d57edcae39b852b578e7f63a263ddb936758dc9c4264736f6c63430008070033"; + // // SPDX-License-Identifier: GPL-3.0 + + // pragma solidity >=0.8.2 <0.9.0; + + // /** + // * @title Storage + // * @dev Store & retrieve value in a variable + // * @custom:dev-run-script ./scripts/deploy_with_ethers.ts + // */ + // contract Storage { + + // uint256 number; + // uint256 number1; + // uint256 number2; + + // /** + // * @dev Store value in variable + // * @param num value to store + // */ + // function store(uint256 num) public { + // number = num; + // number1 = num; + // number2 = num; + // } + + // /** + // * @dev Return value + // * @return value of 'number' + // */ + // function retrieve() public view returns (uint256){ + // return number; + // } + // } + std::string bytecode = + "608060405234801561001057600080fd5b5061015e806100206000396000f3fe60806040523480156100105760" + "0080fd5b50600436106100365760003560e01c80632e64cec11461003b5780636057361d14610059575b600080" + "fd5b610043610075565b60405161005091906100e7565b60405180910390f35b61007360048036038101906100" + "6e91906100ab565b61007e565b005b60008054905090565b806000819055508060018190555080600281905550" + "50565b6000813590506100a581610111565b92915050565b6000602082840312156100c1576100c061010c565b" + "5b60006100cf84828501610096565b91505092915050565b6100e181610102565b82525050565b600060208201" + "90506100fc60008301846100d8565b92915050565b6000819050919050565b600080fd5b61011a81610102565b" + "811461012557600080fd5b5056fea2646970667358221220780703bb6ac2eec922a510d57edcae39b852b578e7" + "f63a263ddb936758dc9c4264736f6c63430008070033"; // deploy contact Json::Value create; @@ -1774,6 +1836,8 @@ BOOST_AUTO_TEST_CASE( recalculateExternalGas ) { std::string txHash = fixture.rpcClient->eth_sendTransaction( create ); dev::eth::mineTransaction( *( fixture.client ), 1 ); + + fixture.client->state().getOriginalDb()->createBlockSnap( 2 ); Json::Value receipt = fixture.rpcClient->eth_getTransactionReceipt( txHash ); BOOST_REQUIRE( receipt["status"].asString() == "0x1" ); std::string contractAddress = receipt["contractAddress"].asString(); @@ -1790,16 +1854,19 @@ BOOST_AUTO_TEST_CASE( recalculateExternalGas ) { txn["to"] = contractAddress; auto ts = toTransactionSkeleton( txn ); - auto t = dev::eth::Transaction( ts, dev::Secret( "7be24de049f2d0d4ecaeaa81564aecf647fa7a4c86264243d77e01da25d859a0" ) ); + auto t = dev::eth::Transaction( + ts, dev::Secret( "7be24de049f2d0d4ecaeaa81564aecf647fa7a4c86264243d77e01da25d859a0" ) ); txHash = fixture.rpcClient->eth_sendRawTransaction( dev::toHex( t.toBytes() ) ); dev::eth::mineTransaction( *( fixture.client ), 1 ); + fixture.client->state().getOriginalDb()->createBlockSnap( 3 ); receipt = fixture.rpcClient->eth_getTransactionReceipt( txHash ); - BOOST_REQUIRE( receipt["status"].asString() == "0x0" ); - BOOST_REQUIRE( receipt["gasUsed"].asString() == "0x61cb" ); - sleep(10); + BOOST_REQUIRE( receipt["status"].asString() == "0x1" ); + BOOST_REQUIRE( receipt["gasUsed"].asString() == "0x13ef4" ); + + sleep( 10 ); // push new block to update timestamp Json::Value refill; @@ -1812,6 +1879,8 @@ BOOST_AUTO_TEST_CASE( recalculateExternalGas ) { txHash = fixture.rpcClient->eth_sendTransaction( refill ); dev::eth::mineTransaction( *( fixture.client ), 1 ); + fixture.client->state().getOriginalDb()->createBlockSnap( 4 ); + // send txn to a contract from another suspicious account // store( 4 ) txn["from"] = "0x5cdb7527ec85022991D4e27F254C438E8337ad7E"; @@ -1823,14 +1892,16 @@ BOOST_AUTO_TEST_CASE( recalculateExternalGas ) { txn["to"] = contractAddress; ts = toTransactionSkeleton( txn ); - t = dev::eth::Transaction( ts, dev::Secret( "8df08814fcfc169aad0015654114be06c28b27bdcdef286cf4dbd5e2950a3ffc" ) ); + t = dev::eth::Transaction( + ts, dev::Secret( "8df08814fcfc169aad0015654114be06c28b27bdcdef286cf4dbd5e2950a3ffc" ) ); txHash = fixture.rpcClient->eth_sendRawTransaction( dev::toHex( t.toBytes() ) ); dev::eth::mineTransaction( *( fixture.client ), 1 ); + fixture.client->state().getOriginalDb()->createBlockSnap( 5 ); receipt = fixture.rpcClient->eth_getTransactionReceipt( txHash ); BOOST_REQUIRE( receipt["status"].asString() == "0x1" ); - BOOST_REQUIRE( receipt["gasUsed"].asString() == "0x13ef4" ); + BOOST_REQUIRE( receipt["gasUsed"].asString() == "0x8f2c" ); } BOOST_AUTO_TEST_CASE( skipTransactionExecution ) { @@ -1871,7 +1942,8 @@ BOOST_AUTO_TEST_CASE( skipTransactionExecution ) { txn["to"] = "0x5cdb7527ec85022991D4e27F254C438E8337ad7E"; auto ts = toTransactionSkeleton( txn ); - auto t = dev::eth::Transaction( ts, dev::Secret( "08cee1f4bc8c37f88124bb3fc64566ccd35dbeeac84c62300f6b8809cab9ea2f" ) ); + auto t = dev::eth::Transaction( + ts, dev::Secret( "08cee1f4bc8c37f88124bb3fc64566ccd35dbeeac84c62300f6b8809cab9ea2f" ) ); txHash = fixture.rpcClient->eth_sendRawTransaction( dev::toHex( t.toBytes() ) ); BOOST_REQUIRE( txHash == "0x95fb5557db8cc6de0aff3a64c18a6d9378b0d312b24f5d77e8dbf5cc0612d74f" ); @@ -1928,8 +2000,8 @@ BOOST_AUTO_TEST_CASE( transactionWithoutFunds ) { transact["to"] = contractAddress; transact["data"] = "0x15b2eec30000000000000000000000000000000000000000000000000000000000000003"; - string gasEstimateStr = fixture.rpcClient->eth_estimateGas(transact); - u256 gasEstimate = jsToU256(gasEstimateStr); + string gasEstimateStr = fixture.rpcClient->eth_estimateGas( transact ); + u256 gasEstimate = jsToU256( gasEstimateStr ); u256 powGasPrice = 0; do { @@ -1937,7 +2009,7 @@ BOOST_AUTO_TEST_CASE( transactionWithoutFunds ) { u256 candidate = h256::random(); h256 hash = dev::sha3( address2 ) ^ dev::sha3( u256( 0 ) ) ^ dev::sha3( candidate ); u256 externalGas = ~u256( 0 ) / u256( hash ) * GAS_PER_HASH; - if ( externalGas >= gasEstimate && externalGas < gasEstimate + gasEstimate/10 ) { + if ( externalGas >= gasEstimate && externalGas < gasEstimate + gasEstimate / 10 ) { powGasPrice = candidate; } } while ( !powGasPrice ); @@ -1989,7 +2061,8 @@ BOOST_AUTO_TEST_CASE( eth_sendRawTransaction_gasPriceTooLow ) { t["nonce"] = "1"; t["gasPrice"] = jsToDecimal( toJS( initial_gasPrice - 1 ) ); auto signedTx2 = fixture.rpcClient->eth_signTransaction( t ); - BOOST_CHECK_EQUAL( fixture.sendingRawShouldFail( signedTx2["raw"].asString() ), "Transaction gas price lower than current eth_gasPrice." ); + BOOST_CHECK_EQUAL( fixture.sendingRawShouldFail( signedTx2["raw"].asString() ), + "Transaction gas price lower than current eth_gasPrice." ); } // different ways to ask for topic(s) @@ -1998,26 +2071,33 @@ BOOST_AUTO_TEST_CASE( logs ) { dev::eth::simulateMining( *( fixture.client ), 1 ); // will generate topics [0xxxx, 0, 0], [0xxx, 0, 1] etc -/* -pragma solidity >=0.4.10 <0.7.0; + /* + pragma solidity >=0.4.10 <0.7.0; -contract Logger{ + contract Logger{ - uint256 i; - uint256 j; + uint256 i; + uint256 j; - fallback() external payable { - log3(bytes32(block.number), bytes32(block.number), bytes32(i), bytes32(j)); - j++; - if(j==10){ - j = 0; - i++; - }// j overflow + fallback() external payable { + log3(bytes32(block.number), bytes32(block.number), bytes32(i), bytes32(j)); + j++; + if(j==10){ + j = 0; + i++; + }// j overflow + } } + } */ - string bytecode = "6080604052348015600f57600080fd5b50609b8061001e6000396000f3fe608060405260015460001b60005460001b4360001b4360001b6040518082815260200191505060405180910390a3600160008154809291906001019190505550600a6001541415606357600060018190555060008081548092919060010191905055505b00fea2646970667358221220fdf2f98961b803b6b32dfc9be766990cbdb17559d9a03724d12fc672e33804b164736f6c634300060c0033"; + string bytecode = + "6080604052348015600f57600080fd5b50609b8061001e6000396000f3fe608060405260015460001b60005460" + "001b4360001b4360001b6040518082815260200191505060405180910390a36001600081548092919060010191" + "90505550600a6001541415606357600060018190555060008081548092919060010191905055505b00fea26469" + "70667358221220fdf2f98961b803b6b32dfc9be766990cbdb17559d9a03724d12fc672e33804b164736f6c6343" + "00060c0033"; Json::Value create; create["code"] = bytecode; @@ -2029,7 +2109,7 @@ contract Logger{ Json::Value deployReceipt = fixture.rpcClient->eth_getTransactionReceipt( deployHash ); string contractAddress = deployReceipt["contractAddress"].asString(); - for(int i=0; i<=23; ++i){ + for ( int i = 0; i <= 23; ++i ) { Json::Value t; t["from"] = toJS( fixture.coinbase.address() ); t["value"] = jsToDecimal( "0" ); @@ -2042,138 +2122,144 @@ contract Logger{ dev::eth::mineTransaction( *( fixture.client ), 1 ); Json::Value receipt = fixture.rpcClient->eth_getTransactionReceipt( txHash ); } - BOOST_REQUIRE_EQUAL(fixture.client->number(), 26); // block 1 - bootstrapAll, block 2 - deploy + BOOST_REQUIRE_EQUAL( fixture.client->number(), 26 ); // block 1 - bootstrapAll, block 2 - + // deploy // ask for logs Json::Value t; t["fromBlock"] = 3; t["toBlock"] = 26; t["address"] = contractAddress; - t["topics"] = Json::Value(Json::arrayValue); + t["topics"] = Json::Value( Json::arrayValue ); // 1 topics = [] - Json::Value logs = fixture.rpcClient->eth_getLogs(t); + Json::Value logs = fixture.rpcClient->eth_getLogs( t ); - BOOST_REQUIRE(logs.isArray()); - BOOST_REQUIRE_EQUAL(logs.size(), 24); + BOOST_REQUIRE( logs.isArray() ); + BOOST_REQUIRE_EQUAL( logs.size(), 24 ); u256 t1 = dev::jsToU256( logs[12]["topics"][1].asString() ); - BOOST_REQUIRE_EQUAL(t1, 1); + BOOST_REQUIRE_EQUAL( t1, 1 ); u256 t2 = dev::jsToU256( logs[12]["topics"][2].asString() ); - BOOST_REQUIRE_EQUAL(t2, 2); + BOOST_REQUIRE_EQUAL( t2, 2 ); // 2 topics = [a] - t["topics"] = Json::Value(Json::arrayValue); - t["topics"][1] = u256_to_js(dev::u256(2)); + t["topics"] = Json::Value( Json::arrayValue ); + t["topics"][1] = u256_to_js( dev::u256( 2 ) ); - logs = fixture.rpcClient->eth_getLogs(t); + logs = fixture.rpcClient->eth_getLogs( t ); - BOOST_REQUIRE(logs.isArray()); - BOOST_REQUIRE_EQUAL(logs.size(), 4); + BOOST_REQUIRE( logs.isArray() ); + BOOST_REQUIRE_EQUAL( logs.size(), 4 ); t1 = dev::jsToU256( logs[0]["topics"][1].asString() ); - BOOST_REQUIRE_EQUAL(t1, 2); + BOOST_REQUIRE_EQUAL( t1, 2 ); t2 = dev::jsToU256( logs[0]["topics"][2].asString() ); - BOOST_REQUIRE_EQUAL(t2, 0); + BOOST_REQUIRE_EQUAL( t2, 0 ); // 3 topics = [null, a] - t["topics"] = Json::Value(Json::arrayValue); - t["topics"][2] = u256_to_js(dev::u256(1)); // 01,11,21 but not 1x + t["topics"] = Json::Value( Json::arrayValue ); + t["topics"][2] = u256_to_js( dev::u256( 1 ) ); // 01,11,21 but not 1x - logs = fixture.rpcClient->eth_getLogs(t); + logs = fixture.rpcClient->eth_getLogs( t ); - BOOST_REQUIRE(logs.isArray()); - BOOST_REQUIRE_EQUAL(logs.size(), 3); + BOOST_REQUIRE( logs.isArray() ); + BOOST_REQUIRE_EQUAL( logs.size(), 3 ); // 4 topics = [a,b] - t["topics"] = Json::Value(Json::arrayValue); - t["topics"][1] = u256_to_js(dev::u256(1)); - t["topics"][2] = u256_to_js(dev::u256(2)); + t["topics"] = Json::Value( Json::arrayValue ); + t["topics"][1] = u256_to_js( dev::u256( 1 ) ); + t["topics"][2] = u256_to_js( dev::u256( 2 ) ); - logs = fixture.rpcClient->eth_getLogs(t); + logs = fixture.rpcClient->eth_getLogs( t ); - BOOST_REQUIRE(logs.isArray()); - BOOST_REQUIRE_EQUAL(logs.size(), 1); + BOOST_REQUIRE( logs.isArray() ); + BOOST_REQUIRE_EQUAL( logs.size(), 1 ); // 5 topics = [[a,b]] - t["topics"] = Json::Value(Json::arrayValue); - t["topics"][1] = Json::Value(Json::arrayValue); - t["topics"][1][0] = u256_to_js(dev::u256(1)); - t["topics"][1][1] = u256_to_js(dev::u256(2)); + t["topics"] = Json::Value( Json::arrayValue ); + t["topics"][1] = Json::Value( Json::arrayValue ); + t["topics"][1][0] = u256_to_js( dev::u256( 1 ) ); + t["topics"][1][1] = u256_to_js( dev::u256( 2 ) ); - logs = fixture.rpcClient->eth_getLogs(t); + logs = fixture.rpcClient->eth_getLogs( t ); - BOOST_REQUIRE(logs.isArray()); - BOOST_REQUIRE_EQUAL(logs.size(), 10+4); + BOOST_REQUIRE( logs.isArray() ); + BOOST_REQUIRE_EQUAL( logs.size(), 10 + 4 ); // 6 topics = [a,a] - t["topics"] = Json::Value(Json::arrayValue); - t["topics"][1] = u256_to_js(dev::u256(1)); - t["topics"][2] = u256_to_js(dev::u256(1)); + t["topics"] = Json::Value( Json::arrayValue ); + t["topics"][1] = u256_to_js( dev::u256( 1 ) ); + t["topics"][2] = u256_to_js( dev::u256( 1 ) ); - logs = fixture.rpcClient->eth_getLogs(t); + logs = fixture.rpcClient->eth_getLogs( t ); - BOOST_REQUIRE(logs.isArray()); - BOOST_REQUIRE_EQUAL(logs.size(), 1); + BOOST_REQUIRE( logs.isArray() ); + BOOST_REQUIRE_EQUAL( logs.size(), 1 ); // 7 topics = [[a,b], c] - t["topics"] = Json::Value(Json::arrayValue); - t["topics"][1] = Json::Value(Json::arrayValue); - t["topics"][1][0] = u256_to_js(dev::u256(1)); - t["topics"][1][1] = u256_to_js(dev::u256(2)); - t["topics"][2] = u256_to_js(dev::u256(1)); // 11, 21 + t["topics"] = Json::Value( Json::arrayValue ); + t["topics"][1] = Json::Value( Json::arrayValue ); + t["topics"][1][0] = u256_to_js( dev::u256( 1 ) ); + t["topics"][1][1] = u256_to_js( dev::u256( 2 ) ); + t["topics"][2] = u256_to_js( dev::u256( 1 ) ); // 11, 21 - logs = fixture.rpcClient->eth_getLogs(t); + logs = fixture.rpcClient->eth_getLogs( t ); - BOOST_REQUIRE(logs.isArray()); - BOOST_REQUIRE_EQUAL(logs.size(), 2); + BOOST_REQUIRE( logs.isArray() ); + BOOST_REQUIRE_EQUAL( logs.size(), 2 ); t1 = dev::jsToU256( logs[0]["topics"][1].asString() ); - BOOST_REQUIRE_EQUAL(t1, 1); + BOOST_REQUIRE_EQUAL( t1, 1 ); t2 = dev::jsToU256( logs[0]["topics"][2].asString() ); - BOOST_REQUIRE_EQUAL(t2, 1); + BOOST_REQUIRE_EQUAL( t2, 1 ); t1 = dev::jsToU256( logs[1]["topics"][1].asString() ); - BOOST_REQUIRE_EQUAL(t1, 2); + BOOST_REQUIRE_EQUAL( t1, 2 ); t2 = dev::jsToU256( logs[1]["topics"][2].asString() ); - BOOST_REQUIRE_EQUAL(t2, 1); + BOOST_REQUIRE_EQUAL( t2, 1 ); // 8 repeat #7 without address auto logs7 = logs; - t["address"] = Json::Value(Json::arrayValue); - logs = fixture.rpcClient->eth_getLogs(t); - BOOST_REQUIRE_EQUAL(logs7, logs); + t["address"] = Json::Value( Json::arrayValue ); + logs = fixture.rpcClient->eth_getLogs( t ); + BOOST_REQUIRE_EQUAL( logs7, logs ); // 9 repeat #7 with 2 addresses - t["address"] = Json::Value(Json::arrayValue); + t["address"] = Json::Value( Json::arrayValue ); t["address"][0] = contractAddress; - t["address"][1] = "0x2adc25665018aa1fe0e6bc666dac8fc2697ff9ba"; // dummy - logs = fixture.rpcClient->eth_getLogs(t); - BOOST_REQUIRE_EQUAL(logs7, logs); + t["address"][1] = "0x2adc25665018aa1fe0e6bc666dac8fc2697ff9ba"; // dummy + logs = fixture.rpcClient->eth_getLogs( t ); + BOOST_REQUIRE_EQUAL( logs7, logs ); // 10 request address only - t["topics"] = Json::Value(Json::arrayValue); - logs = fixture.rpcClient->eth_getLogs(t); - BOOST_REQUIRE(logs.isArray()); - BOOST_REQUIRE_EQUAL(logs.size(), 24); + t["topics"] = Json::Value( Json::arrayValue ); + logs = fixture.rpcClient->eth_getLogs( t ); + BOOST_REQUIRE( logs.isArray() ); + BOOST_REQUIRE_EQUAL( logs.size(), 24 ); } // limit on getLogs output BOOST_AUTO_TEST_CASE( getLogs_limit ) { - JsonRpcFixture fixture( "", true, true, false, false, false, -1, - {{"getLogsBlocksLimit", "10"}} ); + JsonRpcFixture fixture( + "", true, true, false, false, false, -1, { { "getLogsBlocksLimit", "10" } } ); dev::eth::simulateMining( *( fixture.client ), 1 ); /* - // SPDX-License-Identifier: None +// SPDX-License-Identifier: None pragma solidity ^0.8; contract Logger{ - event DummyEvent(uint256, uint256); - fallback() external payable { - for(uint i=0; i<100; ++i) - emit DummyEvent(block.number, i); - } +event DummyEvent(uint256, uint256); +fallback() external payable { + for(uint i=0; i<100; ++i) + emit DummyEvent(block.number, i); +} } */ - string bytecode = "6080604052348015600e575f80fd5b5060c080601a5f395ff3fe60806040525f5b6064811015604f577f90778767414a5c844b9d35a8745f67697ee3b8c2c3f4feafe5d9a3e234a5a3654382604051603d9291906067565b60405180910390a18060010190506006565b005b5f819050919050565b6061816051565b82525050565b5f60408201905060785f830185605a565b60836020830184605a565b939250505056fea264697066735822122040208e35f2706dd92c17579466ab671c308efec51f558a755ea2cf81105ab22964736f6c63430008190033"; + string bytecode = + "6080604052348015600e575f80fd5b5060c080601a5f395ff3fe60806040525f5b6064811015604f577f907787" + "67414a5c844b9d35a8745f67697ee3b8c2c3f4feafe5d9a3e234a5a3654382604051603d9291906067565b6040" + "5180910390a18060010190506006565b005b5f819050919050565b6061816051565b82525050565b5f60408201" + "905060785f830185605a565b60836020830184605a565b939250505056fea264697066735822122040208e35f2" + "706dd92c17579466ab671c308efec51f558a755ea2cf81105ab22964736f6c63430008190033"; Json::Value create; create["code"] = bytecode; @@ -2193,36 +2279,36 @@ contract Logger{ t["to"] = contractAddress; t["gas"] = "99000"; - for(int i=0; i<11; ++i){ - + for ( int i = 0; i < 11; ++i ) { std::string txHash = fixture.rpcClient->eth_sendTransaction( t ); BOOST_REQUIRE( !txHash.empty() ); dev::eth::mineTransaction( *( fixture.client ), 1 ); Json::Value receipt = fixture.rpcClient->eth_getTransactionReceipt( txHash ); - BOOST_REQUIRE_EQUAL(receipt["status"], "0x1"); + BOOST_REQUIRE_EQUAL( receipt["status"], "0x1" ); } // ask for logs Json::Value req; req["fromBlock"] = 1; req["toBlock"] = 11; - req["topics"] = Json::Value(Json::arrayValue); + req["topics"] = Json::Value( Json::arrayValue ); // 1 10 blocks - BOOST_REQUIRE_NO_THROW( Json::Value logs = fixture.rpcClient->eth_getLogs(req) ); + BOOST_REQUIRE_NO_THROW( Json::Value logs = fixture.rpcClient->eth_getLogs( req ) ); // 2 with topics req["address"] = contractAddress; - BOOST_REQUIRE_NO_THROW( Json::Value logs = fixture.rpcClient->eth_getLogs(req) ); + BOOST_REQUIRE_NO_THROW( Json::Value logs = fixture.rpcClient->eth_getLogs( req ) ); // 3 11 blocks req["toBlock"] = 12; - BOOST_REQUIRE_THROW( Json::Value logs = fixture.rpcClient->eth_getLogs(req), std::exception ); + BOOST_REQUIRE_THROW( Json::Value logs = fixture.rpcClient->eth_getLogs( req ), std::exception ); // 4 filter string filterId = fixture.rpcClient->eth_newFilter( req ); - BOOST_REQUIRE_THROW( Json::Value res = fixture.rpcClient->eth_getFilterLogs(filterId), std::exception ); - BOOST_REQUIRE_NO_THROW( Json::Value res = fixture.rpcClient->eth_getFilterChanges(filterId) ); + BOOST_REQUIRE_THROW( + Json::Value res = fixture.rpcClient->eth_getFilterLogs( filterId ), std::exception ); + BOOST_REQUIRE_NO_THROW( Json::Value res = fixture.rpcClient->eth_getFilterChanges( filterId ) ); } // test blockHash parameter @@ -2230,31 +2316,32 @@ BOOST_AUTO_TEST_CASE( getLogs_blockHash ) { JsonRpcFixture fixture; dev::eth::simulateMining( *( fixture.client ), 1 ); - string latestHash = fixture.rpcClient->eth_getBlockByNumber("latest", false)["hash"].asString(); + string latestHash = + fixture.rpcClient->eth_getBlockByNumber( "latest", false )["hash"].asString(); Json::Value req; req["blockHash"] = "xyz"; - BOOST_REQUIRE_THROW( Json::Value logs = fixture.rpcClient->eth_getLogs(req), std::exception ); + BOOST_REQUIRE_THROW( Json::Value logs = fixture.rpcClient->eth_getLogs( req ), std::exception ); - req["blockHash"] = Json::Value(Json::arrayValue); - BOOST_REQUIRE_THROW( Json::Value logs = fixture.rpcClient->eth_getLogs(req), std::exception ); + req["blockHash"] = Json::Value( Json::arrayValue ); + BOOST_REQUIRE_THROW( Json::Value logs = fixture.rpcClient->eth_getLogs( req ), std::exception ); req["fromBlock"] = 1; req["toBlock"] = 1; - BOOST_REQUIRE_THROW( Json::Value logs = fixture.rpcClient->eth_getLogs(req), std::exception ); + BOOST_REQUIRE_THROW( Json::Value logs = fixture.rpcClient->eth_getLogs( req ), std::exception ); req["blockHash"] = latestHash; - BOOST_REQUIRE_THROW( Json::Value logs = fixture.rpcClient->eth_getLogs(req), std::exception ); + BOOST_REQUIRE_THROW( Json::Value logs = fixture.rpcClient->eth_getLogs( req ), std::exception ); - req.removeMember("fromBlock"); - req.removeMember("toBlock"); - BOOST_REQUIRE_NO_THROW( Json::Value logs = fixture.rpcClient->eth_getLogs(req) ); + req.removeMember( "fromBlock" ); + req.removeMember( "toBlock" ); + BOOST_REQUIRE_NO_THROW( Json::Value logs = fixture.rpcClient->eth_getLogs( req ) ); req["blockHash"] = "0x88df016429689c079f3b2f6ad39fa052532c56795b733da78a91ebe6a713944b"; - BOOST_REQUIRE_THROW( Json::Value logs = fixture.rpcClient->eth_getLogs(req), std::exception ); + BOOST_REQUIRE_THROW( Json::Value logs = fixture.rpcClient->eth_getLogs( req ), std::exception ); req["blockHash"] = ""; - BOOST_REQUIRE_THROW( Json::Value logs = fixture.rpcClient->eth_getLogs(req), std::exception ); + BOOST_REQUIRE_THROW( Json::Value logs = fixture.rpcClient->eth_getLogs( req ), std::exception ); } BOOST_AUTO_TEST_CASE( estimate_gas_low_gas_txn ) { @@ -2263,26 +2350,33 @@ BOOST_AUTO_TEST_CASE( estimate_gas_low_gas_txn ) { auto senderAddress = fixture.coinbase.address(); -/* -// SPDX-License-Identifier: None -pragma solidity ^0.6.0; + /* + // SPDX-License-Identifier: None + pragma solidity ^0.6.0; -contract TestEstimateGas { - uint256[256] number; - uint256 counter = 0; + contract TestEstimateGas { + uint256[256] number; + uint256 counter = 0; - function store(uint256 x) public { - number[counter] = x; - counter += 1; - } + function store(uint256 x) public { + number[counter] = x; + counter += 1; + } - function clear(uint256 pos) public { - number[pos] = 0; + function clear(uint256 pos) public { + number[pos] = 0; + } } -} -*/ + */ - string bytecode = "608060405260006101005534801561001657600080fd5b50610104806100266000396000f3fe6080604052348015600f57600080fd5b506004361060325760003560e01c80636057361d146037578063c0fe1af8146062575b600080fd5b606060048036036020811015604b57600080fd5b8101908080359060200190929190505050608d565b005b608b60048036036020811015607657600080fd5b810190808035906020019092919050505060b8565b005b806000610100546101008110609e57fe5b018190555060016101006000828254019250508190555050565b60008082610100811060c657fe5b01819055505056fea26469706673582212206c8da972693a5b8c9bf59c197c4a0c554e9f51abd20047572c9c19125b533d2964736f6c634300060c0033"; + string bytecode = + "608060405260006101005534801561001657600080fd5b50610104806100266000396000f3fe60806040523480" + "15600f57600080fd5b506004361060325760003560e01c80636057361d146037578063c0fe1af8146062575b60" + "0080fd5b606060048036036020811015604b57600080fd5b8101908080359060200190929190505050608d565b" + "005b608b60048036036020811015607657600080fd5b810190808035906020019092919050505060b8565b005b" + "806000610100546101008110609e57fe5b018190555060016101006000828254019250508190555050565b6000" + "8082610100811060c657fe5b01819055505056fea26469706673582212206c8da972693a5b8c9bf59c197c4a0c" + "554e9f51abd20047572c9c19125b533d2964736f6c634300060c0033"; Json::Value create; create["code"] = bytecode; @@ -2304,73 +2398,96 @@ contract TestEstimateGas { Json::Value estimateGasCall; // call clear(0) estimateGasCall["to"] = contractAddress; - estimateGasCall["data"] = "0xc0fe1af80000000000000000000000000000000000000000000000000000000000000000"; + estimateGasCall["data"] = + "0xc0fe1af80000000000000000000000000000000000000000000000000000000000000000"; estimateGasCall["from"] = toJS( senderAddress ); estimateGasCall["gasPrice"] = fixture.rpcClient->eth_gasPrice(); string estimatedGas = fixture.rpcClient->eth_estimateGas( estimateGasCall ); dev::bytes data = dev::jsToBytes( estimateGasCall["data"].asString() ); - BOOST_REQUIRE( dev::jsToU256( estimatedGas ) > dev::eth::TransactionBase::baseGasRequired( - false, &data, fixture.client->chainParams().makeEvmSchedule( - fixture.client->latestBlock().info().timestamp(), fixture.client->number() ) ) ); + BOOST_REQUIRE( + dev::jsToU256( estimatedGas ) > + dev::eth::TransactionBase::baseGasRequired( false, &data, + fixture.client->chainParams().makeEvmSchedule( + fixture.client->latestBlock().info().timestamp(), fixture.client->number() ) ) ); // try to send with this gas estimateGasCall["gas"] = toJS( jsToInt( estimatedGas ) ); string clearHash = fixture.rpcClient->eth_sendTransaction( estimateGasCall ); dev::eth::mineTransaction( *( fixture.client ), 1 ); Json::Value clearReceipt = fixture.rpcClient->eth_getTransactionReceipt( clearHash ); - BOOST_REQUIRE_EQUAL(clearReceipt["status"], "0x1"); - BOOST_REQUIRE_LT(jsToInt(clearReceipt["gasUsed"].asString()), 21000); + BOOST_REQUIRE_EQUAL( clearReceipt["status"], "0x1" ); + BOOST_REQUIRE_LT( jsToInt( clearReceipt["gasUsed"].asString() ), 21000 ); // try to lower gas estimateGasCall["gas"] = toJS( jsToInt( estimatedGas ) - 1 ); clearHash = fixture.rpcClient->eth_sendTransaction( estimateGasCall ); dev::eth::mineTransaction( *( fixture.client ), 1 ); clearReceipt = fixture.rpcClient->eth_getTransactionReceipt( clearHash ); - BOOST_REQUIRE_EQUAL(clearReceipt["status"], "0x0"); - BOOST_REQUIRE_GT(jsToInt(clearReceipt["gasUsed"].asString()), 21000); + BOOST_REQUIRE_EQUAL( clearReceipt["status"], "0x0" ); + BOOST_REQUIRE_GT( jsToInt( clearReceipt["gasUsed"].asString() ), 21000 ); } BOOST_AUTO_TEST_CASE( storage_limit_contract ) { JsonRpcFixture fixture; dev::eth::simulateMining( *( fixture.client ), 10 ); -// pragma solidity 0.4.25; + // pragma solidity 0.4.25; -// contract TestStorageLimit { + // contract TestStorageLimit { -// uint[] public storageArray; + // uint[] public storageArray; -// function store(uint256 num) public { -// storageArray.push( num ); -// } + // function store(uint256 num) public { + // storageArray.push( num ); + // } -// function erase(uint256 index) public { -// delete storageArray[index]; -// } + // function erase(uint256 index) public { + // delete storageArray[index]; + // } -// function foo() public view { -// uint len = storageArray.length; -// storageArray.push(1); -// } + // function foo() public view { + // uint len = storageArray.length; + // storageArray.push(1); + // } -// function storeAndCall(uint256 num) public { -// storageArray.push( num ); -// foo(); -// } + // function storeAndCall(uint256 num) public { + // storageArray.push( num ); + // foo(); + // } -// function zero(uint256 index) public { -// storageArray[index] = 0; -// } + // function zero(uint256 index) public { + // storageArray[index] = 0; + // } -// function strangeFunction(uint256 index) public { -// storageArray[index] = 1; -// storageArray[index] = 0; -// storageArray[index] = 2; -// } -// } + // function strangeFunction(uint256 index) public { + // storageArray[index] = 1; + // storageArray[index] = 0; + // storageArray[index] = 2; + // } + // } - std::string bytecode = "0x608060405234801561001057600080fd5b5061034f806100206000396000f300608060405260043610610083576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680630e031ab1146100885780631007f753146100c95780636057361d146100f6578063c298557814610123578063c67cd8841461013a578063d269ad4e14610167578063e0353e5914610194575b600080fd5b34801561009457600080fd5b506100b3600480360381019080803590602001909291905050506101c1565b6040518082815260200191505060405180910390f35b3480156100d557600080fd5b506100f4600480360381019080803590602001909291905050506101e4565b005b34801561010257600080fd5b5061012160048036038101908080359060200190929190505050610204565b005b34801561012f57600080fd5b50610138610233565b005b34801561014657600080fd5b506101656004803603810190808035906020019092919050505061026c565b005b34801561017357600080fd5b50610192600480360381019080803590602001909291905050506102a3565b005b3480156101a057600080fd5b506101bf60048036038101908080359060200190929190505050610302565b005b6000818154811015156101d057fe5b906000526020600020016000915090505481565b6000818154811015156101f357fe5b906000526020600020016000905550565b600081908060018154018082558091505090600182039060005260206000200160009091929091909150555050565b60008080549050905060006001908060018154018082558091505090600182039060005260206000200160009091929091909150555050565b60008190806001815401808255809150509060018203906000526020600020016000909192909190915055506102a0610233565b50565b60016000828154811015156102b457fe5b9060005260206000200181905550600080828154811015156102d257fe5b906000526020600020018190555060026000828154811015156102f157fe5b906000526020600020018190555050565b6000808281548110151561031257fe5b9060005260206000200181905550505600a165627a7a723058201ed095336772c55688864a6b45ca6ab89311c5533f8d38cdf931f1ce38be78080029"; + std::string bytecode = + "0x608060405234801561001057600080fd5b5061034f806100206000396000f300608060405260043610610083" + "576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680630e" + "031ab1146100885780631007f753146100c95780636057361d146100f6578063c298557814610123578063c67c" + "d8841461013a578063d269ad4e14610167578063e0353e5914610194575b600080fd5b34801561009457600080" + "fd5b506100b3600480360381019080803590602001909291905050506101c1565b604051808281526020019150" + "5060405180910390f35b3480156100d557600080fd5b506100f460048036038101908080359060200190929190" + "5050506101e4565b005b34801561010257600080fd5b5061012160048036038101908080359060200190929190" + "505050610204565b005b34801561012f57600080fd5b50610138610233565b005b34801561014657600080fd5b" + "506101656004803603810190808035906020019092919050505061026c565b005b34801561017357600080fd5b" + "50610192600480360381019080803590602001909291905050506102a3565b005b3480156101a057600080fd5b" + "506101bf60048036038101908080359060200190929190505050610302565b005b6000818154811015156101d0" + "57fe5b906000526020600020016000915090505481565b6000818154811015156101f357fe5b90600052602060" + "0020016000905550565b6000819080600181540180825580915050906001820390600052602060002001600090" + "91929091909150555050565b600080805490509050600060019080600181540180825580915050906001820390" + "60005260206000200160009091929091909150555050565b600081908060018154018082558091505090600182" + "03906000526020600020016000909192909190915055506102a0610233565b50565b6001600082815481101515" + "6102b457fe5b9060005260206000200181905550600080828154811015156102d257fe5b906000526020600020" + "018190555060026000828154811015156102f157fe5b906000526020600020018190555050565b600080828154" + "8110151561031257fe5b9060005260206000200181905550505600a165627a7a723058201ed095336772c55688" + "864a6b45ca6ab89311c5533f8d38cdf931f1ce38be78080029"; auto senderAddress = fixture.coinbase.address(); @@ -2393,9 +2510,10 @@ BOOST_AUTO_TEST_CASE( storage_limit_contract ) { txHash = fixture.rpcClient->eth_call( txCall, "latest" ); BOOST_REQUIRE( fixture.client->state().storageUsed( contract ) == 0 ); - Json::Value txPushValueAndCall; // call storeAndCall(1) + Json::Value txPushValueAndCall; // call storeAndCall(1) txPushValueAndCall["to"] = contractAddress; - txPushValueAndCall["data"] = "0xc67cd8840000000000000000000000000000000000000000000000000000000000000001"; + txPushValueAndCall["data"] = + "0xc67cd8840000000000000000000000000000000000000000000000000000000000000001"; txPushValueAndCall["from"] = toJS( senderAddress ); txPushValueAndCall["gasPrice"] = fixture.rpcClient->eth_gasPrice(); txHash = fixture.rpcClient->eth_sendTransaction( txPushValueAndCall ); @@ -2404,7 +2522,8 @@ BOOST_AUTO_TEST_CASE( storage_limit_contract ) { Json::Value txPushValue; // call store(2) txPushValue["to"] = contractAddress; - txPushValue["data"] = "0x6057361d0000000000000000000000000000000000000000000000000000000000000002"; + txPushValue["data"] = + "0x6057361d0000000000000000000000000000000000000000000000000000000000000002"; txPushValue["from"] = toJS( senderAddress ); txPushValue["gasPrice"] = fixture.rpcClient->eth_gasPrice(); txHash = fixture.rpcClient->eth_sendTransaction( txPushValue ); @@ -2422,7 +2541,8 @@ BOOST_AUTO_TEST_CASE( storage_limit_contract ) { Json::Value txEraseValue; // call erase(2) txEraseValue["to"] = contractAddress; - txEraseValue["data"] = "0x1007f7530000000000000000000000000000000000000000000000000000000000000002"; + txEraseValue["data"] = + "0x1007f7530000000000000000000000000000000000000000000000000000000000000002"; txEraseValue["from"] = toJS( senderAddress ); txEraseValue["gasPrice"] = fixture.rpcClient->eth_gasPrice(); txHash = fixture.rpcClient->eth_sendTransaction( txEraseValue ); @@ -2431,7 +2551,8 @@ BOOST_AUTO_TEST_CASE( storage_limit_contract ) { Json::Value txZeroValue; // call zero(1) txZeroValue["to"] = contractAddress; - txZeroValue["data"] = "0xe0353e590000000000000000000000000000000000000000000000000000000000000001"; + txZeroValue["data"] = + "0xe0353e590000000000000000000000000000000000000000000000000000000000000001"; txZeroValue["from"] = toJS( senderAddress ); txZeroValue["gasPrice"] = fixture.rpcClient->eth_gasPrice(); txHash = fixture.rpcClient->eth_sendTransaction( txZeroValue ); @@ -2440,7 +2561,8 @@ BOOST_AUTO_TEST_CASE( storage_limit_contract ) { Json::Value txZeroValue1; // call zero(1) txZeroValue1["to"] = contractAddress; - txZeroValue1["data"] = "0xe0353e590000000000000000000000000000000000000000000000000000000000000001"; + txZeroValue1["data"] = + "0xe0353e590000000000000000000000000000000000000000000000000000000000000001"; txZeroValue1["from"] = toJS( senderAddress ); txZeroValue1["gasPrice"] = fixture.rpcClient->eth_gasPrice(); txHash = fixture.rpcClient->eth_sendTransaction( txZeroValue1 ); @@ -2449,7 +2571,8 @@ BOOST_AUTO_TEST_CASE( storage_limit_contract ) { Json::Value txValueChanged; // call strangeFunction(1) txValueChanged["to"] = contractAddress; - txValueChanged["data"] = "0xd269ad4e0000000000000000000000000000000000000000000000000000000000000001"; + txValueChanged["data"] = + "0xd269ad4e0000000000000000000000000000000000000000000000000000000000000001"; txValueChanged["from"] = toJS( senderAddress ); txValueChanged["gasPrice"] = fixture.rpcClient->eth_gasPrice(); txHash = fixture.rpcClient->eth_sendTransaction( txValueChanged ); @@ -2458,7 +2581,8 @@ BOOST_AUTO_TEST_CASE( storage_limit_contract ) { Json::Value txValueChanged1; // call strangeFunction(0) txValueChanged1["to"] = contractAddress; - txValueChanged1["data"] = "0xd269ad4e0000000000000000000000000000000000000000000000000000000000000000"; + txValueChanged1["data"] = + "0xd269ad4e0000000000000000000000000000000000000000000000000000000000000000"; txValueChanged1["from"] = toJS( senderAddress ); txValueChanged1["gasPrice"] = fixture.rpcClient->eth_gasPrice(); txHash = fixture.rpcClient->eth_sendTransaction( txValueChanged1 ); @@ -2467,7 +2591,8 @@ BOOST_AUTO_TEST_CASE( storage_limit_contract ) { Json::Value txValueChanged2; // call strangeFunction(2) txValueChanged2["to"] = contractAddress; - txValueChanged2["data"] = "0xd269ad4e0000000000000000000000000000000000000000000000000000000000000002"; + txValueChanged2["data"] = + "0xd269ad4e0000000000000000000000000000000000000000000000000000000000000002"; txValueChanged2["from"] = toJS( senderAddress ); txValueChanged2["gasPrice"] = fixture.rpcClient->eth_gasPrice(); txHash = fixture.rpcClient->eth_sendTransaction( txValueChanged2 ); @@ -2476,7 +2601,8 @@ BOOST_AUTO_TEST_CASE( storage_limit_contract ) { Json::Value txValueChanged3; // try call strangeFunction(3) txValueChanged3["to"] = contractAddress; - txValueChanged3["data"] = "0xd269ad4e0000000000000000000000000000000000000000000000000000000000000003"; + txValueChanged3["data"] = + "0xd269ad4e0000000000000000000000000000000000000000000000000000000000000003"; txValueChanged3["from"] = toJS( senderAddress ); txValueChanged3["gasPrice"] = fixture.rpcClient->eth_gasPrice(); txHash = fixture.rpcClient->eth_sendTransaction( txValueChanged3 ); @@ -2487,21 +2613,29 @@ BOOST_AUTO_TEST_CASE( storage_limit_contract ) { BOOST_AUTO_TEST_CASE( storage_limit_chain ) { JsonRpcFixture fixture; dev::eth::simulateMining( *( fixture.client ), 20 ); -// pragma solidity >=0.4.22 <0.7.0; + // pragma solidity >=0.4.22 <0.7.0; -// contract TestStorage1 { + // contract TestStorage1 { -// uint[] array; + // uint[] array; -// function store(uint256 num) public { -// array.push( num + 2 ); -// } + // function store(uint256 num) public { + // array.push( num + 2 ); + // } -// function erase(uint idx) public { -// delete array[idx]; -// } -// } - std::string bytecode1 = "608060405234801561001057600080fd5b5061012c806100206000396000f3fe6080604052348015600f57600080fd5b5060043610604f576000357c0100000000000000000000000000000000000000000000000000000000900480631007f7531460545780636057361d14607f575b600080fd5b607d60048036036020811015606857600080fd5b810190808035906020019092919050505060aa565b005b60a860048036036020811015609357600080fd5b810190808035906020019092919050505060c7565b005b6000818154811060b657fe5b906000526020600020016000905550565b60006002820190806001815401808255809150506001900390600052602060002001600090919091909150555056fea264697066735822122055c65b9e093cdb44864dac3fb79ec15a542db86c2f897b938043d8e15468ca4464736f6c63430006060033"; + // function erase(uint idx) public { + // delete array[idx]; + // } + // } + std::string bytecode1 = + "608060405234801561001057600080fd5b5061012c806100206000396000f3fe6080604052348015600f576000" + "80fd5b5060043610604f576000357c010000000000000000000000000000000000000000000000000000000090" + "0480631007f7531460545780636057361d14607f575b600080fd5b607d60048036036020811015606857600080" + "fd5b810190808035906020019092919050505060aa565b005b60a860048036036020811015609357600080fd5b" + "810190808035906020019092919050505060c7565b005b6000818154811060b657fe5b90600052602060002001" + "6000905550565b6000600282019080600181540180825580915050600190039060005260206000200160009091" + "9091909150555056fea264697066735822122055c65b9e093cdb44864dac3fb79ec15a542db86c2f897b938043" + "d8e15468ca4464736f6c63430006060033"; auto senderAddress = fixture.coinbase.address(); @@ -2515,20 +2649,20 @@ BOOST_AUTO_TEST_CASE( storage_limit_chain ) { Json::Value receipt1 = fixture.rpcClient->eth_getTransactionReceipt( txHash ); string contractAddress1 = receipt1["contractAddress"].asString(); -// pragma solidity >=0.4.22 <0.7.0; + // pragma solidity >=0.4.22 <0.7.0; -// contract TestStorage2 { + // contract TestStorage2 { -// uint[] array; + // uint[] array; -// function store(uint256 num) public { -// array.push( num ); -// } + // function store(uint256 num) public { + // array.push( num ); + // } -// function erase(uint idx) public { -// delete array[idx]; -// } -// } + // function erase(uint idx) public { + // delete array[idx]; + // } + // } Json::Value txStore; // call store(1) txStore["to"] = contractAddress1; txStore["data"] = "0x6057361d0000000000000000000000000000000000000000000000000000000000000001"; @@ -2536,7 +2670,7 @@ BOOST_AUTO_TEST_CASE( storage_limit_chain ) { txStore["gasPrice"] = fixture.rpcClient->eth_gasPrice(); txHash = fixture.rpcClient->eth_sendTransaction( txStore ); dev::eth::mineTransaction( *( fixture.client ), 1 ); - BOOST_REQUIRE( fixture.client->state().storageUsedTotal() == 64); + BOOST_REQUIRE( fixture.client->state().storageUsedTotal() == 64 ); // call store(2) txStore["to"] = contractAddress1; @@ -2554,23 +2688,31 @@ BOOST_AUTO_TEST_CASE( storage_limit_chain ) { txErase["gasPrice"] = fixture.rpcClient->eth_gasPrice(); txHash = fixture.rpcClient->eth_sendTransaction( txErase ); dev::eth::mineTransaction( *( fixture.client ), 1 ); - BOOST_REQUIRE( fixture.client->state().storageUsedTotal() == 64); + BOOST_REQUIRE( fixture.client->state().storageUsedTotal() == 64 ); -// pragma solidity >=0.4.22 <0.7.0; + // pragma solidity >=0.4.22 <0.7.0; -// contract TestStorage2 { + // contract TestStorage2 { -// uint[] array; + // uint[] array; -// function store(uint256 num) public { -// array.push( num ); -// } + // function store(uint256 num) public { + // array.push( num ); + // } -// function erase(uint idx) public { -// delete array[idx]; -// } -// } - std::string bytecode2 = "608060405234801561001057600080fd5b50610129806100206000396000f3fe6080604052348015600f57600080fd5b5060043610604f576000357c0100000000000000000000000000000000000000000000000000000000900480631007f7531460545780636057361d14607f575b600080fd5b607d60048036036020811015606857600080fd5b810190808035906020019092919050505060aa565b005b60a860048036036020811015609357600080fd5b810190808035906020019092919050505060c7565b005b6000818154811060b657fe5b906000526020600020016000905550565b60008190806001815401808255809150506001900390600052602060002001600090919091909150555056fea26469706673582212202bfb5f6fb63ae4f1c9a362ed3f7de7aa5514029db925efa368e711e35d9ebc0a64736f6c63430006060033"; + // function erase(uint idx) public { + // delete array[idx]; + // } + // } + std::string bytecode2 = + "608060405234801561001057600080fd5b50610129806100206000396000f3fe6080604052348015600f576000" + "80fd5b5060043610604f576000357c010000000000000000000000000000000000000000000000000000000090" + "0480631007f7531460545780636057361d14607f575b600080fd5b607d60048036036020811015606857600080" + "fd5b810190808035906020019092919050505060aa565b005b60a860048036036020811015609357600080fd5b" + "810190808035906020019092919050505060c7565b005b6000818154811060b657fe5b90600052602060002001" + "6000905550565b6000819080600181540180825580915050600190039060005260206000200160009091909190" + "9150555056fea26469706673582212202bfb5f6fb63ae4f1c9a362ed3f7de7aa5514029db925efa368e711e35d" + "9ebc0a64736f6c63430006060033"; Json::Value create2; create2["from"] = toJS( senderAddress ); @@ -2582,9 +2724,10 @@ BOOST_AUTO_TEST_CASE( storage_limit_chain ) { Json::Value receipt2 = fixture.rpcClient->eth_getTransactionReceipt( txHash ); string contractAddress2 = receipt2["contractAddress"].asString(); - Json::Value txStoreSecondContract; // call store(1) + Json::Value txStoreSecondContract; // call store(1) txStoreSecondContract["to"] = contractAddress2; - txStoreSecondContract["data"] = "0x6057361d0000000000000000000000000000000000000000000000000000000000000001"; + txStoreSecondContract["data"] = + "0x6057361d0000000000000000000000000000000000000000000000000000000000000001"; txStoreSecondContract["from"] = toJS( senderAddress ); txStoreSecondContract["gasPrice"] = fixture.rpcClient->eth_gasPrice(); txHash = fixture.rpcClient->eth_sendTransaction( txStoreSecondContract ); @@ -2593,7 +2736,8 @@ BOOST_AUTO_TEST_CASE( storage_limit_chain ) { // try call store(2) to second contract txStoreSecondContract["to"] = contractAddress2; - txStoreSecondContract["data"] = "0x6057361d0000000000000000000000000000000000000000000000000000000000000002"; + txStoreSecondContract["data"] = + "0x6057361d0000000000000000000000000000000000000000000000000000000000000002"; txStoreSecondContract["from"] = toJS( senderAddress ); txStoreSecondContract["gasPrice"] = fixture.rpcClient->eth_gasPrice(); txHash = fixture.rpcClient->eth_sendTransaction( txStoreSecondContract ); @@ -2611,7 +2755,8 @@ BOOST_AUTO_TEST_CASE( storage_limit_chain ) { Json::Value txZeroValue; // call zero(1) txZeroValue["to"] = contractAddress1; - txZeroValue["data"] = "0x1007f7530000000000000000000000000000000000000000000000000000000000000000"; + txZeroValue["data"] = + "0x1007f7530000000000000000000000000000000000000000000000000000000000000000"; txZeroValue["from"] = toJS( senderAddress ); txZeroValue["gasPrice"] = fixture.rpcClient->eth_gasPrice(); txHash = fixture.rpcClient->eth_sendTransaction( txZeroValue ); @@ -2625,11 +2770,12 @@ BOOST_AUTO_TEST_CASE( storage_limit_predeployed ) { BOOST_REQUIRE( fixture.client->state().storageUsedTotal() == 64 ); string contractAddress = "0xC2002000000000000000000000000000000000C2"; - string senderAddress = toJS(fixture.coinbase.address()); + string senderAddress = toJS( fixture.coinbase.address() ); Json::Value txChangeInt; txChangeInt["to"] = contractAddress; - txChangeInt["data"] = "0xcd16ecbf0000000000000000000000000000000000000000000000000000000000000002"; + txChangeInt["data"] = + "0xcd16ecbf0000000000000000000000000000000000000000000000000000000000000002"; txChangeInt["from"] = senderAddress; txChangeInt["gasPrice"] = fixture.rpcClient->eth_gasPrice(); string txHash = fixture.rpcClient->eth_sendTransaction( txChangeInt ); @@ -2638,7 +2784,8 @@ BOOST_AUTO_TEST_CASE( storage_limit_predeployed ) { Json::Value txZeroValue; txZeroValue["to"] = contractAddress; - txZeroValue["data"] = "0xcd16ecbf0000000000000000000000000000000000000000000000000000000000000000"; + txZeroValue["data"] = + "0xcd16ecbf0000000000000000000000000000000000000000000000000000000000000000"; txZeroValue["from"] = senderAddress; txZeroValue["gasPrice"] = fixture.rpcClient->eth_gasPrice(); txHash = fixture.rpcClient->eth_sendTransaction( txZeroValue ); @@ -2648,7 +2795,8 @@ BOOST_AUTO_TEST_CASE( storage_limit_predeployed ) { Json::Value txChangeInt1; txChangeInt["to"] = contractAddress; - txChangeInt["data"] = "0x9b0631040000000000000000000000000000000000000000000000000000000000000001"; + txChangeInt["data"] = + "0x9b0631040000000000000000000000000000000000000000000000000000000000000001"; txChangeInt["from"] = senderAddress; txChangeInt["gasPrice"] = fixture.rpcClient->eth_gasPrice(); txHash = fixture.rpcClient->eth_sendTransaction( txChangeInt ); @@ -2660,21 +2808,29 @@ BOOST_AUTO_TEST_CASE( storage_limit_predeployed ) { BOOST_AUTO_TEST_CASE( storage_limit_reverted ) { JsonRpcFixture fixture; dev::eth::simulateMining( *( fixture.client ), 1000 ); -// pragma solidity >=0.7.0 <0.9.0; + // pragma solidity >=0.7.0 <0.9.0; -// contract Storage { + // contract Storage { -// uint256[10] number; + // uint256[10] number; -// /** -// * @dev Store value in variable -// * @param num value to store -// */ -// function store(uint256 num, uint256 pos) public { -// number[pos] = num; -// } -// } - std::string bytecode1 = "0x608060405234801561001057600080fd5b50610134806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c80636ed28ed014602d575b600080fd5b60436004803603810190603f91906096565b6045565b005b81600082600a8110605757605660cf565b5b01819055505050565b600080fd5b6000819050919050565b6076816065565b8114608057600080fd5b50565b600081359050609081606f565b92915050565b6000806040838503121560aa5760a96060565b5b600060b6858286016083565b925050602060c5858286016083565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea2646970667358221220ec8739ad7fc74a76053c683510b3c836d01c7eda3687d89e65380260a97e741b64736f6c63430008120033"; + // /** + // * @dev Store value in variable + // * @param num value to store + // */ + // function store(uint256 num, uint256 pos) public { + // number[pos] = num; + // } + // } + std::string bytecode1 = + "0x608060405234801561001057600080fd5b50610134806100206000396000f3fe6080604052348015600f5760" + "0080fd5b506004361060285760003560e01c80636ed28ed014602d575b600080fd5b6043600480360381019060" + "3f91906096565b6045565b005b81600082600a8110605757605660cf565b5b01819055505050565b600080fd5b" + "6000819050919050565b6076816065565b8114608057600080fd5b50565b600081359050609081606f565b9291" + "5050565b6000806040838503121560aa5760a96060565b5b600060b6858286016083565b925050602060c58582" + "86016083565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000" + "00000000600052603260045260246000fdfea2646970667358221220ec8739ad7fc74a76053c683510b3c836d0" + "1c7eda3687d89e65380260a97e741b64736f6c63430008120033"; auto senderAddress = fixture.coinbase.address(); Json::Value create1; @@ -2688,36 +2844,77 @@ BOOST_AUTO_TEST_CASE( storage_limit_reverted ) { BOOST_REQUIRE( receipt1["status"] == string( "0x1" ) ); string contractAddress1 = receipt1["contractAddress"].asString(); -// contract CallTry { - -// bool success; -// uint256 count; -// address storageAddress; - -// event Message(string mes); - -// constructor(address newAddress) { -// storageAddress = newAddress; -// } - -// function storeTry() public { -// count = 1; -// success = true; -// try Storage(storageAddress).store(10, 10) { -// emit Message("true"); -// } catch Error(string memory reason) { -// emit Message(reason); -// } catch Panic(uint errorCode) { -// emit Message(string(abi.encodePacked(errorCode))); -// } catch (bytes memory revertData) { -// emit Message(string(revertData)); -// }contractAddress1 -// count = 0; -// success = false; -// } -// } - - std::string bytecode2 = "608060405234801561001057600080fd5b506040516106f93803806106f9833981810160405281019061003291906100dc565b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050610109565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006100a98261007e565b9050919050565b6100b98161009e565b81146100c457600080fd5b50565b6000815190506100d6816100b0565b92915050565b6000602082840312156100f2576100f1610079565b5b6000610100848285016100c7565b91505092915050565b6105e1806101186000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063c18829ca14610030575b600080fd5b61003861003a565b005b6001808190555060016000806101000a81548160ff021916908315150217905550600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636ed28ed0600a806040518363ffffffff1660e01b81526004016100b99291906102de565b600060405180830381600087803b1580156100d357600080fd5b505af19250505080156100e4575060015b610235576100f0610314565b806308c379a00361014c57506101046103b1565b8061010f57506101c5565b7f51a7f65c6325882f237d4aeb43228179cfad48b868511d508e24b4437a8191378160405161013e91906104c0565b60405180910390a150610230565b634e487b71036101c55761015e6104e2565b9061016957506101c5565b7f51a7f65c6325882f237d4aeb43228179cfad48b868511d508e24b4437a8191378160405160200161019b9190610524565b6040516020818303038152906040526040516101b791906104c0565b60405180910390a150610230565b3d80600081146101f1576040519150601f19603f3d011682016040523d82523d6000602084013e6101f6565b606091505b507f51a7f65c6325882f237d4aeb43228179cfad48b868511d508e24b4437a8191378160405161022691906104c0565b60405180910390a1505b61026b565b7f51a7f65c6325882f237d4aeb43228179cfad48b868511d508e24b4437a8191376040516102629061058b565b60405180910390a15b600060018190555060008060006101000a81548160ff021916908315150217905550565b6000819050919050565b6000819050919050565b6000819050919050565b60006102c86102c36102be8461028f565b6102a3565b610299565b9050919050565b6102d8816102ad565b82525050565b60006040820190506102f360008301856102cf565b61030060208301846102cf565b9392505050565b60008160e01c9050919050565b600060033d11156103335760046000803e610330600051610307565b90505b90565b6000604051905090565b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61038982610340565b810181811067ffffffffffffffff821117156103a8576103a7610351565b5b80604052505050565b600060443d1061043e576103c3610336565b60043d036004823e80513d602482011167ffffffffffffffff821117156103eb57505061043e565b808201805167ffffffffffffffff811115610409575050505061043e565b80602083010160043d03850181111561042657505050505061043e565b61043582602001850186610380565b82955050505050505b90565b600081519050919050565b600082825260208201905092915050565b60005b8381101561047b578082015181840152602081019050610460565b60008484015250505050565b600061049282610441565b61049c818561044c565b93506104ac81856020860161045d565b6104b581610340565b840191505092915050565b600060208201905081810360008301526104da8184610487565b905092915050565b60008060233d11156104ff576020600460003e6001915060005190505b9091565b6000819050919050565b61051e61051982610299565b610503565b82525050565b6000610530828461050d565b60208201915081905092915050565b7f7472756500000000000000000000000000000000000000000000000000000000600082015250565b600061057560048361044c565b91506105808261053f565b602082019050919050565b600060208201905081810360008301526105a481610568565b905091905056fea26469706673582212201a522ad11a321603efd182e33e10b59f65b8c9a8b84c8ec3d832ff1d0b726cc564736f6c63430008120033" + std::string("000000000000000000000000") + contractAddress1.substr(2); + // contract CallTry { + + // bool success; + // uint256 count; + // address storageAddress; + + // event Message(string mes); + + // constructor(address newAddress) { + // storageAddress = newAddress; + // } + + // function storeTry() public { + // count = 1; + // success = true; + // try Storage(storageAddress).store(10, 10) { + // emit Message("true"); + // } catch Error(string memory reason) { + // emit Message(reason); + // } catch Panic(uint errorCode) { + // emit Message(string(abi.encodePacked(errorCode))); + // } catch (bytes memory revertData) { + // emit Message(string(revertData)); + // }contractAddress1 + // count = 0; + // success = false; + // } + // } + + std::string bytecode2 = + "608060405234801561001057600080fd5b506040516106f93803806106f9833981810160405281019061003291" + "906100dc565b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373" + "ffffffffffffffffffffffffffffffffffffffff16021790555050610109565b600080fd5b600073ffffffffff" + "ffffffffffffffffffffffffffffff82169050919050565b60006100a98261007e565b9050919050565b6100b9" + "8161009e565b81146100c457600080fd5b50565b6000815190506100d6816100b0565b92915050565b60006020" + "82840312156100f2576100f1610079565b5b6000610100848285016100c7565b91505092915050565b6105e180" + "6101186000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063c1" + "8829ca14610030575b600080fd5b61003861003a565b005b6001808190555060016000806101000a81548160ff" + "021916908315150217905550600260009054906101000a900473ffffffffffffffffffffffffffffffffffffff" + "ff1673ffffffffffffffffffffffffffffffffffffffff16636ed28ed0600a806040518363ffffffff1660e01b" + "81526004016100b99291906102de565b600060405180830381600087803b1580156100d357600080fd5b505af1" + "9250505080156100e4575060015b610235576100f0610314565b806308c379a00361014c57506101046103b156" + "5b8061010f57506101c5565b7f51a7f65c6325882f237d4aeb43228179cfad48b868511d508e24b4437a819137" + "8160405161013e91906104c0565b60405180910390a150610230565b634e487b71036101c55761015e6104e256" + "5b9061016957506101c5565b7f51a7f65c6325882f237d4aeb43228179cfad48b868511d508e24b4437a819137" + "8160405160200161019b9190610524565b6040516020818303038152906040526040516101b791906104c0565b" + "60405180910390a150610230565b3d80600081146101f1576040519150601f19603f3d011682016040523d8252" + "3d6000602084013e6101f6565b606091505b507f51a7f65c6325882f237d4aeb43228179cfad48b868511d508e" + "24b4437a8191378160405161022691906104c0565b60405180910390a1505b61026b565b7f51a7f65c6325882f" + "237d4aeb43228179cfad48b868511d508e24b4437a8191376040516102629061058b565b60405180910390a15b" + "600060018190555060008060006101000a81548160ff021916908315150217905550565b600081905091905056" + "5b6000819050919050565b6000819050919050565b60006102c86102c36102be8461028f565b6102a3565b6102" + "99565b9050919050565b6102d8816102ad565b82525050565b60006040820190506102f360008301856102cf56" + "5b61030060208301846102cf565b9392505050565b60008160e01c9050919050565b600060033d111561033357" + "60046000803e610330600051610307565b90505b90565b6000604051905090565b6000601f19601f8301169050" + "919050565b7f4e487b710000000000000000000000000000000000000000000000000000000060005260416004" + "5260246000fd5b61038982610340565b810181811067ffffffffffffffff821117156103a8576103a761035156" + "5b5b80604052505050565b600060443d1061043e576103c3610336565b60043d036004823e80513d6024820111" + "67ffffffffffffffff821117156103eb57505061043e565b808201805167ffffffffffffffff81111561040957" + "5050505061043e565b80602083010160043d03850181111561042657505050505061043e565b61043582602001" + "850186610380565b82955050505050505b90565b600081519050919050565b6000828252602082019050929150" + "50565b60005b8381101561047b578082015181840152602081019050610460565b60008484015250505050565b" + "600061049282610441565b61049c818561044c565b93506104ac81856020860161045d565b6104b58161034056" + "5b840191505092915050565b600060208201905081810360008301526104da8184610487565b90509291505056" + "5b60008060233d11156104ff576020600460003e6001915060005190505b9091565b6000819050919050565b61" + "051e61051982610299565b610503565b82525050565b6000610530828461050d565b6020820191508190509291" + "5050565b7f7472756500000000000000000000000000000000000000000000000000000000600082015250565b" + "600061057560048361044c565b91506105808261053f565b602082019050919050565b60006020820190508181" + "0360008301526105a481610568565b905091905056fea26469706673582212201a522ad11a321603efd182e33e" + "10b59f65b8c9a8b84c8ec3d832ff1d0b726cc564736f6c63430008120033" + + std::string( "000000000000000000000000" ) + contractAddress1.substr( 2 ); Json::Value create2; create2["from"] = toJS( senderAddress ); create2["data"] = bytecode2; @@ -2749,7 +2946,8 @@ BOOST_AUTO_TEST_CASE( setSchainExitTime ) { JsonRpcFixture fixture; Json::Value requestJson; requestJson["finishTime"] = 100; - BOOST_REQUIRE_THROW(fixture.rpcClient->setSchainExitTime(requestJson), jsonrpc::JsonRpcException); + BOOST_REQUIRE_THROW( + fixture.rpcClient->setSchainExitTime( requestJson ), jsonrpc::JsonRpcException ); } /* @@ -2761,10 +2959,9 @@ BOOST_AUTO_TEST_CASE( oracle, *boost::unit_test::disabled() ) { std::time_t current = std::time(nullptr); std::string request; for (int i = 0; i < 1000000; ++i) { - request = skutils::tools::format("{\"cid\":1,\"uri\":\"http://worldtimeapi.org/api/timezone/Europe/Kiev\",\"jsps\":[\"/unixtime\",\"/day_of_year\",\"/xxx\"],\"trims\":[1,1,1],\"time\":%zu000,\"pow\":%zu}", current, i); - auto os = make_shared(request); - if ( os->verifyPow() ) { - break; + request = +skutils::tools::format("{\"cid\":1,\"uri\":\"http://worldtimeapi.org/api/timezone/Europe/Kiev\",\"jsps\":[\"/unixtime\",\"/day_of_year\",\"/xxx\"],\"trims\":[1,1,1],\"time\":%zu000,\"pow\":%zu}", +current, i); auto os = make_shared(request); if ( os->verifyPow() ) { break; } } uint64_t status = fixture.client->submitOracleRequest(request, receipt); @@ -2791,18 +2988,19 @@ BOOST_AUTO_TEST_CASE( doDbCompactionDebugCall ) { } BOOST_AUTO_TEST_CASE( powTxnGasLimit ) { - JsonRpcFixture fixture(c_genesisConfigString, false, false, true, false); + JsonRpcFixture fixture( c_genesisConfigString, false, false, true, false ); // mine blocks without transactions dev::eth::simulateMining( *( fixture.client ), 2000000 ); - string senderAddress = toJS(fixture.coinbase.address()); + string senderAddress = toJS( fixture.coinbase.address() ); Json::Value txPOW1; txPOW1["to"] = "0x0000000000000000000000000000000000000033"; txPOW1["from"] = senderAddress; txPOW1["gas"] = "100000"; - txPOW1["gasPrice"] = "0xa449dcaf2bca14e6bd0ac650eed9555008363002b2fc3a4c8422b7a9525a8135"; // gas 200k + txPOW1["gasPrice"] = + "0xa449dcaf2bca14e6bd0ac650eed9555008363002b2fc3a4c8422b7a9525a8135"; // gas 200k txPOW1["value"] = 1; string txHash = fixture.rpcClient->eth_sendTransaction( txPOW1 ); dev::eth::mineTransaction( *( fixture.client ), 1 ); @@ -2814,9 +3012,12 @@ BOOST_AUTO_TEST_CASE( powTxnGasLimit ) { txPOW2["to"] = "0x0000000000000000000000000000000000000033"; txPOW2["from"] = senderAddress; txPOW2["gas"] = "100000"; - txPOW2["gasPrice"] = "0xc5002ab03e1e7e196b3d0ffa9801e783fcd48d4c6d972f1389ab63f4e2d0bef0"; // gas 1m + txPOW2["gasPrice"] = + "0xc5002ab03e1e7e196b3d0ffa9801e783fcd48d4c6d972f1389ab63f4e2d0bef0"; // gas 1m txPOW2["value"] = 100; - BOOST_REQUIRE_THROW( fixture.rpcClient->eth_sendTransaction( txPOW2 ), jsonrpc::JsonRpcException ); // block gas limit reached + + BOOST_REQUIRE_THROW( fixture.rpcClient->eth_sendTransaction( txPOW2 ), + jsonrpc::JsonRpcException ); // block gas limit reached } BOOST_AUTO_TEST_CASE( EIP1898Calls ) { @@ -2860,56 +3061,70 @@ BOOST_AUTO_TEST_CASE( EIP1898Calls ) { eip1898BadFormed5["blockNumber"] = dev::h256::random().hex(); eip1898BadFormed5["requireCanonical"] = 228; - std::array wellFormedCalls = { eip1898WellFormed, eip1898WellFormed1, eip1898WellFormed2, eip1898WellFormed3 }; - std::array badFormedCalls = { eip1898BadFormed, eip1898BadFormed1, eip1898BadFormed2, eip1898BadFormed3, eip1898BadFormed4, eip1898BadFormed5 }; + + std::array< Json::Value, 4 > wellFormedCalls = { eip1898WellFormed, eip1898WellFormed1, + eip1898WellFormed2, eip1898WellFormed3 }; + std::array< Json::Value, 6 > badFormedCalls = { eip1898BadFormed, eip1898BadFormed1, + eip1898BadFormed2, eip1898BadFormed3, eip1898BadFormed4, eip1898BadFormed5 }; + auto address = fixture.coinbase.address(); std::string response; - for (const auto& call: wellFormedCalls) { - BOOST_REQUIRE_NO_THROW(fixture.rpcClient->eth_getBalanceEIP1898( toJS( address ), call )); + for ( const auto& call : wellFormedCalls ) { + BOOST_REQUIRE_NO_THROW( fixture.rpcClient->eth_getBalanceEIP1898( toJS( address ), call ) ); } - for (const auto& call: badFormedCalls) { - BOOST_REQUIRE_THROW(fixture.rpcClient->eth_getBalanceEIP1898( toJS( address ), call ), jsonrpc::JsonRpcException); + for ( const auto& call : badFormedCalls ) { + BOOST_REQUIRE_THROW( fixture.rpcClient->eth_getBalanceEIP1898( toJS( address ), call ), + jsonrpc::JsonRpcException ); } - for (const auto& call: wellFormedCalls) { + + for ( const auto& call : wellFormedCalls ) { Json::Value transactionCallObject; transactionCallObject["to"] = "0x0000000000000000000000000000000000000005"; transactionCallObject["data"] = "0x0000000000000000000000000000000000000005"; - BOOST_REQUIRE_NO_THROW(fixture.rpcClient->eth_callEIP1898( transactionCallObject, call )); + BOOST_REQUIRE_NO_THROW( fixture.rpcClient->eth_callEIP1898( transactionCallObject, call ) ); } - for (const auto& call: badFormedCalls) { + for ( const auto& call : badFormedCalls ) { Json::Value transactionCallObject; transactionCallObject["to"] = "0x0000000000000000000000000000000000000005"; transactionCallObject["data"] = "0x0000000000000000000000000000000000000005"; - BOOST_REQUIRE_THROW(fixture.rpcClient->eth_callEIP1898( transactionCallObject, call ), jsonrpc::JsonRpcException); + BOOST_REQUIRE_THROW( fixture.rpcClient->eth_callEIP1898( transactionCallObject, call ), + jsonrpc::JsonRpcException ); } - for (const auto& call: wellFormedCalls) { - BOOST_REQUIRE_NO_THROW(fixture.rpcClient->eth_getCodeEIP1898( toJS( address ), call )); + for ( const auto& call : wellFormedCalls ) { + BOOST_REQUIRE_NO_THROW( fixture.rpcClient->eth_getCodeEIP1898( toJS( address ), call ) ); } - for (const auto& call: badFormedCalls) { - BOOST_REQUIRE_THROW(fixture.rpcClient->eth_getCodeEIP1898( toJS( address ), call ), jsonrpc::JsonRpcException); + for ( const auto& call : badFormedCalls ) { + BOOST_REQUIRE_THROW( fixture.rpcClient->eth_getCodeEIP1898( toJS( address ), call ), + jsonrpc::JsonRpcException ); } - for (const auto& call: wellFormedCalls) { - BOOST_REQUIRE_NO_THROW(fixture.rpcClient->eth_getStorageAtEIP1898( toJS( address ), toJS( address ), call )); + for ( const auto& call : wellFormedCalls ) { + BOOST_REQUIRE_NO_THROW( + fixture.rpcClient->eth_getStorageAtEIP1898( toJS( address ), toJS( address ), call ) ); } - for (const auto& call: badFormedCalls) { - BOOST_REQUIRE_THROW(fixture.rpcClient->eth_getStorageAtEIP1898( toJS( address ), toJS( address ), call ), jsonrpc::JsonRpcException); + for ( const auto& call : badFormedCalls ) { + BOOST_REQUIRE_THROW( + fixture.rpcClient->eth_getStorageAtEIP1898( toJS( address ), toJS( address ), call ), + jsonrpc::JsonRpcException ); } - for (const auto& call: wellFormedCalls) { - BOOST_REQUIRE_NO_THROW(fixture.rpcClient->eth_getTransactionCountEIP1898( toJS( address ), call )); + for ( const auto& call : wellFormedCalls ) { + BOOST_REQUIRE_NO_THROW( + fixture.rpcClient->eth_getTransactionCountEIP1898( toJS( address ), call ) ); } - for (const auto& call: badFormedCalls) { - BOOST_REQUIRE_THROW(fixture.rpcClient->eth_getTransactionCountEIP1898( toJS( address ), call ), jsonrpc::JsonRpcException); + for ( const auto& call : badFormedCalls ) { + BOOST_REQUIRE_THROW( + fixture.rpcClient->eth_getTransactionCountEIP1898( toJS( address ), call ), + jsonrpc::JsonRpcException ); } } @@ -2921,15 +3136,17 @@ BOOST_AUTO_TEST_CASE( eip2930Transactions ) { // Set chainID = 151 std::string chainID = "0x97"; ret["params"]["chainID"] = chainID; - time_t eip1559PatchActivationTimestamp = time(nullptr) + 10; - ret["skaleConfig"]["sChain"]["EIP1559TransactionsPatchTimestamp"] = eip1559PatchActivationTimestamp; + time_t eip1559PatchActivationTimestamp = time( nullptr ) + 10; + ret["skaleConfig"]["sChain"]["EIP1559TransactionsPatchTimestamp"] = + eip1559PatchActivationTimestamp; + Json::FastWriter fastWriter; std::string config = fastWriter.write( ret ); JsonRpcFixture fixture( config ); dev::eth::simulateMining( *( fixture.client ), 20 ); - string senderAddress = toJS(fixture.coinbase.address()); + string senderAddress = toJS( fixture.coinbase.address() ); Json::Value txRefill; txRefill["to"] = "0xc868AF52a6549c773082A334E5AE232e0Ea3B513"; @@ -2949,10 +3166,16 @@ BOOST_AUTO_TEST_CASE( eip2930Transactions ) { BOOST_REQUIRE( !result.isMember( "yParity" ) ); BOOST_REQUIRE( !result.isMember( "accessList" ) ); - BOOST_REQUIRE( fixture.rpcClient->eth_getBalance( "0xc868AF52a6549c773082A334E5AE232e0Ea3B513", "latest" ) == "0x16345785d8a0000" ); + BOOST_REQUIRE( fixture.rpcClient->eth_getBalance( "0xc868AF52a6549c773082A334E5AE232e0Ea3B513", + "latest" ) == "0x16345785d8a0000" ); // try sending type1 txn before patchTimestmap - BOOST_REQUIRE_THROW( fixture.rpcClient->eth_sendRawTransaction( "0x01f8678197808504a817c800827530947d36af85a184e220a656525fcbb9a63b9ab3c12b0180c001a01ebdc546c8b85511b7ba831f47c4981069d7af972d10b7dce2c57225cb5df6a7a055ae1e84fea41d37589eb740a0a93017a5cd0e9f10ee50f165bf4b1b4c78ddae" ), jsonrpc::JsonRpcException ); // INVALID_PARAMS + BOOST_REQUIRE_THROW( + fixture.rpcClient->eth_sendRawTransaction( + "0x01f8678197808504a817c800827530947d36af85a184e220a656525fcbb9a63b9ab3c12b0180c001a01e" + "bdc546c8b85511b7ba831f47c4981069d7af972d10b7dce2c57225cb5df6a7a055ae1e84fea41d37589eb7" + "40a0a93017a5cd0e9f10ee50f165bf4b1b4c78ddae" ), + jsonrpc::JsonRpcException ); // INVALID_PARAMS sleep( 10 ); // force 1 block to update timestamp @@ -2967,21 +3190,29 @@ BOOST_AUTO_TEST_CASE( eip2930Transactions ) { BOOST_REQUIRE( receipt["status"] == string( "0x1" ) ); BOOST_REQUIRE( receipt["type"] == "0x0" ); - // send 1 WEI from 0xc868AF52a6549c773082A334E5AE232e0Ea3B513 to 0x7D36aF85A184E220A656525fcBb9A63B9ab3C12b - // encoded type 1 txn - txHash = fixture.rpcClient->eth_sendRawTransaction( "0x01f8678197808504a817c800827530947d36af85a184e220a656525fcbb9a63b9ab3c12b0180c001a01ebdc546c8b85511b7ba831f47c4981069d7af972d10b7dce2c57225cb5df6a7a055ae1e84fea41d37589eb740a0a93017a5cd0e9f10ee50f165bf4b1b4c78ddae" ); + // send 1 WEI from 0xc868AF52a6549c773082A334E5AE232e0Ea3B513 to + // 0x7D36aF85A184E220A656525fcBb9A63B9ab3C12b encoded type 1 txn + txHash = fixture.rpcClient->eth_sendRawTransaction( + "0x01f8678197808504a817c800827530947d36af85a184e220a656525fcbb9a63b9ab3c12b0180c001a01ebdc5" + "46c8b85511b7ba831f47c4981069d7af972d10b7dce2c57225cb5df6a7a055ae1e84fea41d37589eb740a0a930" + "17a5cd0e9f10ee50f165bf4b1b4c78ddae" ); auto pendingTransactions = fixture.rpcClient->eth_pendingTransactions(); - BOOST_REQUIRE( pendingTransactions.isArray() && pendingTransactions.size() == 1); + BOOST_REQUIRE( pendingTransactions.isArray() && pendingTransactions.size() == 1 ); BOOST_REQUIRE( pendingTransactions[0]["type"] == "0x1" ); - BOOST_REQUIRE( pendingTransactions[0].isMember( "yParity" ) && pendingTransactions[0].isMember( "accessList" ) ); + BOOST_REQUIRE( pendingTransactions[0].isMember( "yParity" ) && + pendingTransactions[0].isMember( "accessList" ) ); dev::eth::mineTransaction( *( fixture.client ), 1 ); // compare with txn hash from geth BOOST_REQUIRE( txHash == "0xc843560015a655b8f81f65a458be9019bdb5cd8e416b6329ca18f36de0b8244d" ); - BOOST_REQUIRE( dev::toHexPrefixed( fixture.client->transactions( 4 )[0].toBytes() ) == "0x01f8678197808504a817c800827530947d36af85a184e220a656525fcbb9a63b9ab3c12b0180c001a01ebdc546c8b85511b7ba831f47c4981069d7af972d10b7dce2c57225cb5df6a7a055ae1e84fea41d37589eb740a0a93017a5cd0e9f10ee50f165bf4b1b4c78ddae" ); + BOOST_REQUIRE( dev::toHexPrefixed( fixture.client->transactions( 4 )[0].toBytes() ) == + "0x01f8678197808504a817c800827530947d36af85a184e220a656525fcbb9a63b9ab3c12b0180c" + "001a01ebdc546c8b85511b7ba831f47c4981069d7af972d10b7dce2c57225cb5df6a7a055ae1e84" + "fea41d37589eb740a0a93017a5cd0e9f10ee50f165bf4b1b4c78ddae" ); - BOOST_REQUIRE( fixture.rpcClient->eth_getBalance( "0x7D36aF85A184E220A656525fcBb9A63B9ab3C12b", "latest" ) == "0x1" ); + BOOST_REQUIRE( fixture.rpcClient->eth_getBalance( + "0x7D36aF85A184E220A656525fcBb9A63B9ab3C12b", "latest" ) == "0x1" ); auto block = fixture.rpcClient->eth_getBlockByNumber( "4", false ); BOOST_REQUIRE( block["transactions"].size() == 1 ); @@ -2991,14 +3222,19 @@ BOOST_AUTO_TEST_CASE( eip2930Transactions ) { BOOST_REQUIRE( block["transactions"].size() == 1 ); BOOST_REQUIRE( block["transactions"][0]["hash"].asString() == txHash ); BOOST_REQUIRE( block["transactions"][0]["type"] == "0x1" ); - BOOST_REQUIRE( block["transactions"][0]["yParity"].asString() == block["transactions"][0]["v"].asString() ); + + BOOST_REQUIRE( block["transactions"][0]["yParity"].asString() == + block["transactions"][0]["v"].asString() ); + BOOST_REQUIRE( block["transactions"][0]["accessList"].isArray() ); BOOST_REQUIRE( block["transactions"][0]["accessList"].size() == 0 ); BOOST_REQUIRE( block["transactions"][0].isMember( "chainId" ) ); BOOST_REQUIRE( block["transactions"][0]["chainId"].asString() == chainID ); std::string blockHash = block["hash"].asString(); - BOOST_REQUIRE( fixture.client->transactionHashes( dev::h256( blockHash ) )[0] == dev::h256( "0xc843560015a655b8f81f65a458be9019bdb5cd8e416b6329ca18f36de0b8244d") ); + BOOST_REQUIRE( + fixture.client->transactionHashes( dev::h256( blockHash ) )[0] == + dev::h256( "0xc843560015a655b8f81f65a458be9019bdb5cd8e416b6329ca18f36de0b8244d" ) ); receipt = fixture.rpcClient->eth_getTransactionReceipt( txHash ); BOOST_REQUIRE( receipt["status"] == string( "0x1" ) ); @@ -3008,7 +3244,9 @@ BOOST_AUTO_TEST_CASE( eip2930Transactions ) { result = fixture.rpcClient->eth_getTransactionByHash( txHash ); BOOST_REQUIRE( result["hash"].asString() == txHash ); BOOST_REQUIRE( result["type"] == "0x1" ); + BOOST_REQUIRE( result["yParity"].asString() == result["v"].asString() ); + BOOST_REQUIRE( result["accessList"].isArray() ); BOOST_REQUIRE( result["accessList"].size() == 0 ); @@ -3021,45 +3259,73 @@ BOOST_AUTO_TEST_CASE( eip2930Transactions ) { result = fixture.rpcClient->eth_getTransactionByBlockNumberAndIndex( "0x4", "0x0" ); BOOST_REQUIRE( result["hash"].asString() == txHash ); BOOST_REQUIRE( result["type"] == "0x1" ); + BOOST_REQUIRE( result["yParity"].asString() == result["v"].asString() ); + BOOST_REQUIRE( result["accessList"].isArray() ); BOOST_REQUIRE( result["accessList"].size() == 0 ); // now the same txn with accessList and increased nonce - // [ { 'address': HexBytes( "0xde0b295669a9fd93d5f28d9ec85e40f4cb697bae" ), 'storageKeys': ( "0x0000000000000000000000000000000000000000000000000000000000000003", "0x0000000000000000000000000000000000000000000000000000000000000007" ) } ] - txHash = fixture.rpcClient->eth_sendRawTransaction( "0x01f8c38197018504a817c800827530947d36af85a184e220a656525fcbb9a63b9ab3c12b0180f85bf85994de0b295669a9fd93d5f28d9ec85e40f4cb697baef842a00000000000000000000000000000000000000000000000000000000000000003a0000000000000000000000000000000000000000000000000000000000000000780a0b03eaf481958e22fc39bd1d526eb9255be1e6625614f02ca939e51c3d7e64bcaa05f675640c04bb050d27bd1f39c07b6ff742311b04dab760bb3bc206054332879" ); + // [ { 'address': HexBytes( "0xde0b295669a9fd93d5f28d9ec85e40f4cb697bae" ), 'storageKeys': ( + // "0x0000000000000000000000000000000000000000000000000000000000000003", + // "0x0000000000000000000000000000000000000000000000000000000000000007" ) } ] + txHash = fixture.rpcClient->eth_sendRawTransaction( + "0x01f8c38197018504a817c800827530947d36af85a184e220a656525fcbb9a63b9ab3c12b0180f85bf85994de" + "0b295669a9fd93d5f28d9ec85e40f4cb697baef842a00000000000000000000000000000000000000000000000" + "000000000000000003a0000000000000000000000000000000000000000000000000000000000000000780a0b0" + "3eaf481958e22fc39bd1d526eb9255be1e6625614f02ca939e51c3d7e64bcaa05f675640c04bb050d27bd1f39c" + "07b6ff742311b04dab760bb3bc206054332879" ); pendingTransactions = fixture.rpcClient->eth_pendingTransactions(); - BOOST_REQUIRE( pendingTransactions.isArray() && pendingTransactions.size() == 1); + BOOST_REQUIRE( pendingTransactions.isArray() && pendingTransactions.size() == 1 ); BOOST_REQUIRE( pendingTransactions[0]["type"] == "0x1" ); - BOOST_REQUIRE( pendingTransactions[0].isMember( "yParity" ) && pendingTransactions[0].isMember( "accessList" ) ); + BOOST_REQUIRE( pendingTransactions[0].isMember( "yParity" ) && + pendingTransactions[0].isMember( "accessList" ) ); dev::eth::mineTransaction( *( fixture.client ), 1 ); // compare with txn hash from geth BOOST_REQUIRE( txHash == "0xa6d3541e06dff71fb8344a4db2a4ad4e0b45024eb23a8f568982b70a5f50f94d" ); - BOOST_REQUIRE( dev::toHexPrefixed( fixture.client->transactions( 5 )[0].toBytes() ) == "0x01f8c38197018504a817c800827530947d36af85a184e220a656525fcbb9a63b9ab3c12b0180f85bf85994de0b295669a9fd93d5f28d9ec85e40f4cb697baef842a00000000000000000000000000000000000000000000000000000000000000003a0000000000000000000000000000000000000000000000000000000000000000780a0b03eaf481958e22fc39bd1d526eb9255be1e6625614f02ca939e51c3d7e64bcaa05f675640c04bb050d27bd1f39c07b6ff742311b04dab760bb3bc206054332879" ); + BOOST_REQUIRE( + dev::toHexPrefixed( fixture.client->transactions( 5 )[0].toBytes() ) == + "0x01f8c38197018504a817c800827530947d36af85a184e220a656525fcbb9a63b9ab3c12b0180f85bf85994de" + "0b295669a9fd93d5f28d9ec85e40f4cb697baef842a00000000000000000000000000000000000000000000000" + "000000000000000003a0000000000000000000000000000000000000000000000000000000000000000780a0b0" + "3eaf481958e22fc39bd1d526eb9255be1e6625614f02ca939e51c3d7e64bcaa05f675640c04bb050d27bd1f39c" + "07b6ff742311b04dab760bb3bc206054332879" ); result = fixture.rpcClient->eth_getTransactionByHash( txHash ); BOOST_REQUIRE( result["type"] == "0x1" ); BOOST_REQUIRE( result["accessList"].isArray() ); BOOST_REQUIRE( result["accessList"].size() == 1 ); - BOOST_REQUIRE( result["accessList"][0].isObject() && result["accessList"][0].getMemberNames().size() == 2 ); - BOOST_REQUIRE( result["accessList"][0].isMember( "address" ) && result["accessList"][0].isMember( "storageKeys" ) ); - BOOST_REQUIRE( result["accessList"][0]["address"].asString() == "0xde0b295669a9fd93d5f28d9ec85e40f4cb697bae" ); - BOOST_REQUIRE( result["accessList"][0]["storageKeys"].isArray() && result["accessList"][0]["storageKeys"].size() == 2 ); - BOOST_REQUIRE( result["accessList"][0]["storageKeys"][0].asString() == "0x0000000000000000000000000000000000000000000000000000000000000003" ); - BOOST_REQUIRE( result["accessList"][0]["storageKeys"][1].asString() == "0x0000000000000000000000000000000000000000000000000000000000000007" ); + BOOST_REQUIRE( result["accessList"][0].isObject() && + result["accessList"][0].getMemberNames().size() == 2 ); + BOOST_REQUIRE( result["accessList"][0].isMember( "address" ) && + result["accessList"][0].isMember( "storageKeys" ) ); + BOOST_REQUIRE( result["accessList"][0]["address"].asString() == + "0xde0b295669a9fd93d5f28d9ec85e40f4cb697bae" ); + BOOST_REQUIRE( result["accessList"][0]["storageKeys"].isArray() && + result["accessList"][0]["storageKeys"].size() == 2 ); + BOOST_REQUIRE( result["accessList"][0]["storageKeys"][0].asString() == + "0x0000000000000000000000000000000000000000000000000000000000000003" ); + BOOST_REQUIRE( result["accessList"][0]["storageKeys"][1].asString() == + "0x0000000000000000000000000000000000000000000000000000000000000007" ); block = fixture.rpcClient->eth_getBlockByNumber( "5", true ); result = block["transactions"][0]; BOOST_REQUIRE( result["type"] == "0x1" ); BOOST_REQUIRE( result["accessList"].isArray() ); BOOST_REQUIRE( result["accessList"].size() == 1 ); - BOOST_REQUIRE( result["accessList"][0].isObject() && result["accessList"][0].getMemberNames().size() == 2 ); - BOOST_REQUIRE( result["accessList"][0].isMember( "address" ) && result["accessList"][0].isMember( "storageKeys" ) ); - BOOST_REQUIRE( result["accessList"][0]["address"].asString() == "0xde0b295669a9fd93d5f28d9ec85e40f4cb697bae" ); - BOOST_REQUIRE( result["accessList"][0]["storageKeys"].isArray() && result["accessList"][0]["storageKeys"].size() == 2 ); - BOOST_REQUIRE( result["accessList"][0]["storageKeys"][0].asString() == "0x0000000000000000000000000000000000000000000000000000000000000003" ); - BOOST_REQUIRE( result["accessList"][0]["storageKeys"][1].asString() == "0x0000000000000000000000000000000000000000000000000000000000000007" ); + BOOST_REQUIRE( result["accessList"][0].isObject() && + result["accessList"][0].getMemberNames().size() == 2 ); + BOOST_REQUIRE( result["accessList"][0].isMember( "address" ) && + result["accessList"][0].isMember( "storageKeys" ) ); + BOOST_REQUIRE( result["accessList"][0]["address"].asString() == + "0xde0b295669a9fd93d5f28d9ec85e40f4cb697bae" ); + BOOST_REQUIRE( result["accessList"][0]["storageKeys"].isArray() && + result["accessList"][0]["storageKeys"].size() == 2 ); + BOOST_REQUIRE( result["accessList"][0]["storageKeys"][0].asString() == + "0x0000000000000000000000000000000000000000000000000000000000000003" ); + BOOST_REQUIRE( result["accessList"][0]["storageKeys"][1].asString() == + "0x0000000000000000000000000000000000000000000000000000000000000007" ); } BOOST_AUTO_TEST_CASE( eip1559Transactions ) { @@ -3070,15 +3336,17 @@ BOOST_AUTO_TEST_CASE( eip1559Transactions ) { // Set chainID = 151 std::string chainID = "0x97"; ret["params"]["chainID"] = chainID; - time_t eip1559PatchActivationTimestamp = time(nullptr) + 10; - ret["skaleConfig"]["sChain"]["EIP1559TransactionsPatchTimestamp"] = eip1559PatchActivationTimestamp; + time_t eip1559PatchActivationTimestamp = time( nullptr ) + 10; + ret["skaleConfig"]["sChain"]["EIP1559TransactionsPatchTimestamp"] = + eip1559PatchActivationTimestamp; Json::FastWriter fastWriter; std::string config = fastWriter.write( ret ); JsonRpcFixture fixture( config ); dev::eth::simulateMining( *( fixture.client ), 20 ); - string senderAddress = toJS(fixture.coinbase.address()); + fixture.client->state().getOriginalDb()->createBlockSnap( 2 ); + string senderAddress = toJS( fixture.coinbase.address() ); Json::Value txRefill; txRefill["to"] = "0x5EdF1e852fdD1B0Bc47C0307EF755C76f4B9c251"; @@ -3088,6 +3356,7 @@ BOOST_AUTO_TEST_CASE( eip1559Transactions ) { txRefill["value"] = 100000000000000000; string txHash = fixture.rpcClient->eth_sendTransaction( txRefill ); dev::eth::mineTransaction( *( fixture.client ), 1 ); + fixture.client->state().getOriginalDb()->createBlockSnap( 3 ); Json::Value receipt = fixture.rpcClient->eth_getTransactionReceipt( txHash ); BOOST_REQUIRE( receipt["status"] == string( "0x1" ) ); @@ -3098,10 +3367,18 @@ BOOST_AUTO_TEST_CASE( eip1559Transactions ) { BOOST_REQUIRE( !result.isMember( "yParity" ) ); BOOST_REQUIRE( !result.isMember( "accessList" ) ); - BOOST_REQUIRE( fixture.rpcClient->eth_getBalance( "0x5EdF1e852fdD1B0Bc47C0307EF755C76f4B9c251", "latest" ) == "0x16345785d8a0000" ); + BOOST_REQUIRE( fixture.rpcClient->eth_getBalance( "0x5EdF1e852fdD1B0Bc47C0307EF755C76f4B9c251", + "latest" ) == "0x16345785d8a0000" ); // try sending type2 txn before patchTimestmap - BOOST_REQUIRE_THROW( fixture.rpcClient->eth_sendRawTransaction( "0x02f8c98197808504a817c8008504a817c800827530947d36af85a184e220a656525fcbb9a63b9ab3c12b0180f85bf85994de0b295669a9fd93d5f28d9ec85e40f4cb697baef842a00000000000000000000000000000000000000000000000000000000000000003a0000000000000000000000000000000000000000000000000000000000000000780a0f1a407dfc1a9f782001d89f617e9b3a2f295378533784fb39960dea60beea2d0a05ac3da2946554ba3d5721850f4f89ee7a0c38e4acab7130908e7904d13174388" ), jsonrpc::JsonRpcException ); // INVALID_PARAMS + BOOST_REQUIRE_THROW( + fixture.rpcClient->eth_sendRawTransaction( + "0x02f8c98197808504a817c8008504a817c800827530947d36af85a184e220a656525fcbb9a63b9ab3c12b" + "0180f85bf85994de0b295669a9fd93d5f28d9ec85e40f4cb697baef842a000000000000000000000000000" + "00000000000000000000000000000000000003a00000000000000000000000000000000000000000000000" + "00000000000000000780a0f1a407dfc1a9f782001d89f617e9b3a2f295378533784fb39960dea60beea2d0" + "a05ac3da2946554ba3d5721850f4f89ee7a0c38e4acab7130908e7904d13174388" ), + jsonrpc::JsonRpcException ); // INVALID_PARAMS sleep( 10 ); // force 1 block to update timestamp @@ -3112,26 +3389,45 @@ BOOST_AUTO_TEST_CASE( eip1559Transactions ) { txRefill["value"] = 0; txHash = fixture.rpcClient->eth_sendTransaction( txRefill ); dev::eth::mineTransaction( *( fixture.client ), 1 ); + fixture.client->state().getOriginalDb()->createBlockSnap( 4 ); receipt = fixture.rpcClient->eth_getTransactionReceipt( txHash ); BOOST_REQUIRE( receipt["status"] == string( "0x1" ) ); BOOST_REQUIRE( receipt["type"] == "0x0" ); BOOST_REQUIRE( receipt["effectiveGasPrice"] == "0x4a817c800" ); - // send 1 WEI from 0x5EdF1e852fdD1B0Bc47C0307EF755C76f4B9c251 to 0x7D36aF85A184E220A656525fcBb9A63B9ab3C12b - // encoded type 2 txn - txHash = fixture.rpcClient->eth_sendRawTransaction( "0x02f8c98197808504a817c8018504a817c800827530947d36af85a184e220a656525fcbb9a63b9ab3c12b0180f85bf85994de0b295669a9fd93d5f28d9ec85e40f4cb697baef842a00000000000000000000000000000000000000000000000000000000000000003a0000000000000000000000000000000000000000000000000000000000000000701a005bd1eedc509a8e94cfcfc84d0b5fd53a0888a475274cbeee321047da5d139f8a00e7f0dd8b5277766d447ea51b7d8f571dc8bb57ff95c068c58f5b6fe9089dde8" ); + + // send 1 WEI from 0x5EdF1e852fdD1B0Bc47C0307EF755C76f4B9c251 to + // 0x7D36aF85A184E220A656525fcBb9A63B9ab3C12b encoded type 2 txn + txHash = fixture.rpcClient->eth_sendRawTransaction( + "0x02f8c98197808504a817c8008504a817c800827530947d36af85a184e220a656525fcbb9a63b9ab3c12b0180" + "f85bf85994de0b295669a9fd93d5f28d9ec85e40f4cb697baef842a00000000000000000000000000000000000" + "000000000000000000000000000003a00000000000000000000000000000000000000000000000000000000000" + "00000780a0f1a407dfc1a9f782001d89f617e9b3a2f295378533784fb39960dea60beea2d0a05ac3da2946554b" + "a3d5721850f4f89ee7a0c38e4acab7130908e7904d13174388" ); + auto pendingTransactions = fixture.rpcClient->eth_pendingTransactions(); - BOOST_REQUIRE( pendingTransactions.isArray() && pendingTransactions.size() == 1); + BOOST_REQUIRE( pendingTransactions.isArray() && pendingTransactions.size() == 1 ); BOOST_REQUIRE( pendingTransactions[0]["type"] == "0x2" ); - BOOST_REQUIRE( pendingTransactions[0].isMember( "yParity" ) && pendingTransactions[0].isMember( "accessList" ) ); - BOOST_REQUIRE( pendingTransactions[0].isMember( "maxFeePerGas" ) && pendingTransactions[0].isMember( "maxPriorityFeePerGas" ) ); + BOOST_REQUIRE( pendingTransactions[0].isMember( "yParity" ) && + pendingTransactions[0].isMember( "accessList" ) ); + BOOST_REQUIRE( pendingTransactions[0].isMember( "maxFeePerGas" ) && + pendingTransactions[0].isMember( "maxPriorityFeePerGas" ) ); dev::eth::mineTransaction( *( fixture.client ), 1 ); // compare with txn hash from geth - BOOST_REQUIRE( txHash == "0xde30b1c26b89e20f6426a87b9427381f9e79e2bb80f992a6f2e1b4dccfa345de" ); - BOOST_REQUIRE( dev::toHexPrefixed( fixture.client->transactions( 4 )[0].toBytes() ) == "0x02f8c98197808504a817c8018504a817c800827530947d36af85a184e220a656525fcbb9a63b9ab3c12b0180f85bf85994de0b295669a9fd93d5f28d9ec85e40f4cb697baef842a00000000000000000000000000000000000000000000000000000000000000003a0000000000000000000000000000000000000000000000000000000000000000701a005bd1eedc509a8e94cfcfc84d0b5fd53a0888a475274cbeee321047da5d139f8a00e7f0dd8b5277766d447ea51b7d8f571dc8bb57ff95c068c58f5b6fe9089dde8" ); + BOOST_REQUIRE( txHash == "0x7bd586e93e3012577de4ba33e3b887baf520cbb92c5dd10996b262f9c5c8f747" ); + std::cout << dev::toHexPrefixed( fixture.client->transactions( 4 )[0].toBytes() ) << '\n'; + BOOST_REQUIRE( + dev::toHexPrefixed( fixture.client->transactions( 4 )[0].toBytes() ) == + "0x02f8c98197808504a817c8008504a817c800827530947d36af85a184e220a656525fcbb9a63b9ab3c12b0180" + "f85bf85994de0b295669a9fd93d5f28d9ec85e40f4cb697baef842a00000000000000000000000000000000000" + "000000000000000000000000000003a00000000000000000000000000000000000000000000000000000000000" + "00000780a0f1a407dfc1a9f782001d89f617e9b3a2f295378533784fb39960dea60beea2d0a05ac3da2946554b" + "a3d5721850f4f89ee7a0c38e4acab7130908e7904d13174388" ); - BOOST_REQUIRE( fixture.rpcClient->eth_getBalance( "0x7D36aF85A184E220A656525fcBb9A63B9ab3C12b", "latest" ) == "0x1" ); + + BOOST_REQUIRE( fixture.rpcClient->eth_getBalance( + "0x7D36aF85A184E220A656525fcBb9A63B9ab3C12b", "latest" ) == "0x1" ); auto block = fixture.rpcClient->eth_getBlockByNumber( "4", false ); BOOST_REQUIRE( block["transactions"].size() == 1 ); @@ -3142,7 +3438,10 @@ BOOST_AUTO_TEST_CASE( eip1559Transactions ) { BOOST_REQUIRE( block["transactions"].size() == 1 ); BOOST_REQUIRE( block["transactions"][0]["hash"].asString() == txHash ); BOOST_REQUIRE( block["transactions"][0]["type"] == "0x2" ); - BOOST_REQUIRE( block["transactions"][0]["yParity"].asString() == block["transactions"][0]["v"].asString() ); + + BOOST_REQUIRE( block["transactions"][0]["yParity"].asString() == + block["transactions"][0]["v"].asString() ); + BOOST_REQUIRE( block["transactions"][0]["accessList"].isArray() ); BOOST_REQUIRE( block["transactions"][0].isMember( "chainId" ) ); BOOST_REQUIRE( block["transactions"][0]["chainId"].asString() == chainID ); @@ -3157,27 +3456,34 @@ BOOST_AUTO_TEST_CASE( eip1559Transactions ) { result = fixture.rpcClient->eth_getTransactionByHash( txHash ); BOOST_REQUIRE( result["hash"].asString() == txHash ); BOOST_REQUIRE( result["type"] == "0x2" ); + BOOST_REQUIRE( result["yParity"].asString() == result["v"].asString() ); + BOOST_REQUIRE( result["accessList"].isArray() ); - BOOST_REQUIRE( result.isMember( "maxPriorityFeePerGas" ) && result["maxPriorityFeePerGas"].isString() ); + BOOST_REQUIRE( + result.isMember( "maxPriorityFeePerGas" ) && result["maxPriorityFeePerGas"].isString() ); BOOST_REQUIRE( result.isMember( "maxFeePerGas" ) && result["maxFeePerGas"].isString() ); - BOOST_REQUIRE( result["maxPriorityFeePerGas"] == "0x4a817c801" ); + BOOST_REQUIRE( result["maxPriorityFeePerGas"] == "0x4a817c800" ); BOOST_REQUIRE( result["maxFeePerGas"] == "0x4a817c800" ); result = fixture.rpcClient->eth_getTransactionByBlockHashAndIndex( blockHash, "0x0" ); BOOST_REQUIRE( result["hash"].asString() == txHash ); BOOST_REQUIRE( result["type"] == "0x2" ); + BOOST_REQUIRE( result["yParity"].asString() == result["v"].asString() ); + BOOST_REQUIRE( result["accessList"].isArray() ); - BOOST_REQUIRE( result["maxPriorityFeePerGas"] == "0x4a817c801" ); + BOOST_REQUIRE( result["maxPriorityFeePerGas"] == "0x4a817c800" ); BOOST_REQUIRE( result["maxFeePerGas"] == "0x4a817c800" ); result = fixture.rpcClient->eth_getTransactionByBlockNumberAndIndex( "0x4", "0x0" ); BOOST_REQUIRE( result["hash"].asString() == txHash ); BOOST_REQUIRE( result["type"] == "0x2" ); + BOOST_REQUIRE( result["yParity"].asString() == result["v"].asString() ); + BOOST_REQUIRE( result["accessList"].isArray() ); - BOOST_REQUIRE( result["maxPriorityFeePerGas"] == "0x4a817c801" ); + BOOST_REQUIRE( result["maxPriorityFeePerGas"] == "0x4a817c800" ); BOOST_REQUIRE( result["maxFeePerGas"] == "0x4a817c800" ); BOOST_REQUIRE_NO_THROW( fixture.rpcClient->eth_getBlockByNumber( "0x0", false ) ); @@ -3196,7 +3502,7 @@ BOOST_AUTO_TEST_CASE( eip2930RpcMethods ) { JsonRpcFixture fixture( config ); dev::eth::simulateMining( *( fixture.client ), 20 ); - string senderAddress = toJS(fixture.coinbase.address()); + string senderAddress = toJS( fixture.coinbase.address() ); Json::Value txRefill; txRefill["to"] = "0x5EdF1e852fdD1B0Bc47C0307EF755C76f4B9c251"; @@ -3224,15 +3530,16 @@ BOOST_AUTO_TEST_CASE( eip1559RpcMethods ) { // Set chainID = 151 ret["params"]["chainID"] = "0x97"; - time_t eip1559PatchActivationTimestamp = time(nullptr) + 5; - ret["skaleConfig"]["sChain"]["EIP1559TransactionsPatchTimestamp"] = eip1559PatchActivationTimestamp; + time_t eip1559PatchActivationTimestamp = time( nullptr ) + 5; + ret["skaleConfig"]["sChain"]["EIP1559TransactionsPatchTimestamp"] = + eip1559PatchActivationTimestamp; Json::FastWriter fastWriter; std::string config = fastWriter.write( ret ); JsonRpcFixture fixture( config ); dev::eth::simulateMining( *( fixture.client ), 20 ); - string senderAddress = toJS(fixture.coinbase.address()); + string senderAddress = toJS( fixture.coinbase.address() ); Json::Value txRefill; txRefill["to"] = "0x5EdF1e852fdD1B0Bc47C0307EF755C76f4B9c251"; @@ -3240,7 +3547,7 @@ BOOST_AUTO_TEST_CASE( eip1559RpcMethods ) { txRefill["gas"] = "100000"; txRefill["gasPrice"] = fixture.rpcClient->eth_gasPrice(); txRefill["value"] = 100000000000000000; - for (size_t i = 0; i < 10; ++i) { + for ( size_t i = 0; i < 10; ++i ) { // mine 10 blocks string txHash = fixture.rpcClient->eth_sendTransaction( txRefill ); dev::eth::mineTransaction( *( fixture.client ), 1 ); @@ -3263,10 +3570,13 @@ BOOST_AUTO_TEST_CASE( eip1559RpcMethods ) { BOOST_REQUIRE( feeHistory.isMember( "baseFeePerGas" ) ); BOOST_REQUIRE( feeHistory["baseFeePerGas"].isArray() ); - for (Json::Value::ArrayIndex i = 0; i < blockCnt; ++i) { + for ( Json::Value::ArrayIndex i = 0; i < blockCnt; ++i ) { BOOST_REQUIRE( feeHistory["baseFeePerGas"][i].isString() ); - std::string estimatedBaseFeePerGas = EIP1559TransactionsPatch::isEnabledWhen( - fixture.client->blockInfo( bn - i - 1 ).timestamp() ) ? toJS( fixture.client->gasBidPrice( bn - i - 1 ) ) : toJS( 0 ); + std::string estimatedBaseFeePerGas = + EIP1559TransactionsPatch::isEnabledWhen( + fixture.client->blockInfo( bn - i - 1 ).timestamp() ) ? + toJS( fixture.client->gasBidPrice( bn - i - 1 ) ) : + toJS( 0 ); BOOST_REQUIRE( feeHistory["baseFeePerGas"][i].asString() == estimatedBaseFeePerGas ); BOOST_REQUIRE_GT( feeHistory["gasUsedRatio"][i].asDouble(), 0 ); BOOST_REQUIRE_GT( 1, feeHistory["gasUsedRatio"][i].asDouble() ); @@ -3285,15 +3595,16 @@ BOOST_AUTO_TEST_CASE( vInTxnSignature ) { // Set chainID = 151 ret["params"]["chainID"] = "0x97"; - time_t eip1559PatchActivationTimestamp = time(nullptr); - ret["skaleConfig"]["sChain"]["EIP1559TransactionsPatchTimestamp"] = eip1559PatchActivationTimestamp; + time_t eip1559PatchActivationTimestamp = time( nullptr ); + ret["skaleConfig"]["sChain"]["EIP1559TransactionsPatchTimestamp"] = + eip1559PatchActivationTimestamp; Json::FastWriter fastWriter; std::string config = fastWriter.write( ret ); JsonRpcFixture fixture( config ); dev::eth::simulateMining( *( fixture.client ), 20 ); - string senderAddress = toJS(fixture.coinbase.address()); + string senderAddress = toJS( fixture.coinbase.address() ); Json::Value txRefill; txRefill["to"] = "0x5EdF1e852fdD1B0Bc47C0307EF755C76f4B9c251"; @@ -3305,7 +3616,10 @@ BOOST_AUTO_TEST_CASE( vInTxnSignature ) { dev::eth::mineTransaction( *( fixture.client ), 1 ); // send non replay protected txn - txHash = fixture.rpcClient->eth_sendRawTransaction( "0xf864808504a817c800827530947d36af85a184e220a656525fcbb9a63b9ab3c12b01801ba0171c7f31feaa0fd7825a5a28d7b535d0b0ee200b27792f66eb7796e7a6a555d7a0081790244f21cefa563b55a7a68ee78f8466738b5827be19faaeff0586fd71be" ); + txHash = fixture.rpcClient->eth_sendRawTransaction( + "0xf864808504a817c800827530947d36af85a184e220a656525fcbb9a63b9ab3c12b01801ba0171c7f31feaa0f" + "d7825a5a28d7b535d0b0ee200b27792f66eb7796e7a6a555d7a0081790244f21cefa563b55a7a68ee78f846673" + "8b5827be19faaeff0586fd71be" ); dev::eth::mineTransaction( *( fixture.client ), 1 ); Json::Value txn = fixture.rpcClient->eth_getTransactionByHash( txHash ); @@ -3313,15 +3627,23 @@ BOOST_AUTO_TEST_CASE( vInTxnSignature ) { BOOST_REQUIRE( v < 29 && v > 26 ); // send replay protected legacy txn - txHash = fixture.rpcClient->eth_sendRawTransaction( "0xf866018504a817c800827530947d36af85a184e220a656525fcbb9a63b9ab3c12b0180820151a018b400fc56bc3568e4f23f6f93d538745a5b18054252d6030791c294c9aea9d4a00930492125784fad0a8b38b915e8621f54c53f0878a77f21920c751ec5fd220a" ); + txHash = fixture.rpcClient->eth_sendRawTransaction( + "0xf866018504a817c800827530947d36af85a184e220a656525fcbb9a63b9ab3c12b0180820151a018b400fc56" + "bc3568e4f23f6f93d538745a5b18054252d6030791c294c9aea9d4a00930492125784fad0a8b38b915e8621f54" + "c53f0878a77f21920c751ec5fd220a" ); dev::eth::mineTransaction( *( fixture.client ), 1 ); txn = fixture.rpcClient->eth_getTransactionByHash( txHash ); v = dev::jsToU256( txn["v"].asString() ); - BOOST_REQUIRE( v < 339 && v > 336 ); // 2 * 151 + 35 + BOOST_REQUIRE( v < 339 && v > 336 ); // 2 * 151 + 35 // send type1 txn - txHash = fixture.rpcClient->eth_sendRawTransaction( "0x01f8c38197028504a817c800827530947d36af85a184e220a656525fcbb9a63b9ab3c12b0180f85bf85994de0b295669a9fd93d5f28d9ec85e40f4cb697baef842a00000000000000000000000000000000000000000000000000000000000000003a0000000000000000000000000000000000000000000000000000000000000000701a0ee608b7c5df843b4a1988a3e9c24d53019fa674e06a6b2ae0c347a00601c1a84a06ed451f9cc0f4334a180458605ecaa212e58f8436e1a4318e75ae417c72eba2b" ); + txHash = fixture.rpcClient->eth_sendRawTransaction( + "0x01f8c38197028504a817c800827530947d36af85a184e220a656525fcbb9a63b9ab3c12b0180f85bf85994de" + "0b295669a9fd93d5f28d9ec85e40f4cb697baef842a00000000000000000000000000000000000000000000000" + "000000000000000003a0000000000000000000000000000000000000000000000000000000000000000701a0ee" + "608b7c5df843b4a1988a3e9c24d53019fa674e06a6b2ae0c347a00601c1a84a06ed451f9cc0f4334a180458605" + "ecaa212e58f8436e1a4318e75ae417c72eba2b" ); dev::eth::mineTransaction( *( fixture.client ), 1 ); txn = fixture.rpcClient->eth_getTransactionByHash( txHash ); @@ -3329,7 +3651,12 @@ BOOST_AUTO_TEST_CASE( vInTxnSignature ) { BOOST_REQUIRE( v < 2 && v >= 0 ); // send type2 txn - txHash = fixture.rpcClient->eth_sendRawTransaction( "0x02f8c98197038504a817c8018504a817c800827530947d36af85a184e220a656525fcbb9a63b9ab3c12b0180f85bf85994de0b295669a9fd93d5f28d9ec85e40f4cb697baef842a00000000000000000000000000000000000000000000000000000000000000003a0000000000000000000000000000000000000000000000000000000000000000701a0c16ec291a6f4e91476f39e624baf42730b21a805e570fe52334df13d69b63d3fa01c7e9662635512a3bc47d479b17af2df59491e6663823ca13789a86da6dff1a5" ); + txHash = fixture.rpcClient->eth_sendRawTransaction( + "0x02f8c98197038504a817c8018504a817c800827530947d36af85a184e220a656525fcbb9a63b9ab3c12b0180" + "f85bf85994de0b295669a9fd93d5f28d9ec85e40f4cb697baef842a00000000000000000000000000000000000" + "000000000000000000000000000003a00000000000000000000000000000000000000000000000000000000000" + "00000701a0c16ec291a6f4e91476f39e624baf42730b21a805e570fe52334df13d69b63d3fa01c7e9662635512" + "a3bc47d479b17af2df59491e6663823ca13789a86da6dff1a5" ); dev::eth::mineTransaction( *( fixture.client ), 1 ); txn = fixture.rpcClient->eth_getTransactionByHash( txHash ); @@ -3338,12 +3665,10 @@ BOOST_AUTO_TEST_CASE( vInTxnSignature ) { } BOOST_AUTO_TEST_CASE( etherbase_generation2 ) { - JsonRpcFixture fixture(c_genesisGeneration2ConfigString, false, false, true); + JsonRpcFixture fixture( c_genesisGeneration2ConfigString, false, false, true ); string etherbase = fixture.rpcClient->eth_coinbase(); - // before mining u256 etherbaseBalance = fixture.client->balanceAt( jsToAddress( etherbase ) ); - BOOST_REQUIRE_EQUAL( etherbaseBalance, 0 ); // mine block without transactions dev::eth::simulateMining( *( fixture.client ), 1 ); @@ -3360,14 +3685,25 @@ BOOST_AUTO_TEST_CASE( etherbase_generation2 ) { std::string txHash = fixture.rpcClient->eth_sendTransaction( sampleTx ); BOOST_REQUIRE( !txHash.empty() ); dev::eth::mineTransaction( *( fixture.client ), 1 ); + fixture.client->state().getOriginalDb()->createBlockSnap( 2 ); BOOST_REQUIRE_EQUAL( fixture.client->balanceAt( fixture.account2.address() ), u256( 1000000 ) ); // partially retrieve 1000000 etherbaseBalance = fixture.client->balanceAt( jsToAddress( etherbase ) ); - u256 balance = fixture.client->balanceAt( jsToAddress( "0x7aa5E36AA15E93D10F4F26357C30F052DacDde5F" ) ); + u256 balance = + fixture.client->balanceAt( jsToAddress( "0x7aa5E36AA15E93D10F4F26357C30F052DacDde5F" ) ); Json::Value partiallyRetrieveTx; - partiallyRetrieveTx["data"] = "0xc6427474000000000000000000000000d2c0deface0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000e4b61d27f6000000000000000000000000d2ba3e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044204a3e930000000000000000000000007aa5e36aa15e93d10f4f26357c30f052dacdde5f00000000000000000000000000000000000000000000000000000000000f42400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + partiallyRetrieveTx["data"] = + "0xc6427474000000000000000000000000d2c0deface0000000000000000000000000000000000000000000000" + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "000000000000000000006000000000000000000000000000000000000000000000000000000000000000e4b61d" + "27f6000000000000000000000000d2ba3e00000000000000000000000000000000000000000000000000000000" + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "00000000000000600000000000000000000000000000000000000000000000000000000000000044204a3e9300" + "00000000000000000000007aa5e36aa15e93d10f4f26357c30f052dacdde5f0000000000000000000000000000" + "0000000000000000000000000000000f4240000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000"; partiallyRetrieveTx["from"] = "0x5C4e11842E8be09264dc1976943571d7Af6d00F9"; partiallyRetrieveTx["to"] = "0xD244519000000000000000000000000000000000"; partiallyRetrieveTx["gasPrice"] = fixture.rpcClient->eth_gasPrice(); @@ -3375,16 +3711,32 @@ BOOST_AUTO_TEST_CASE( etherbase_generation2 ) { txHash = fixture.rpcClient->eth_sendTransaction( partiallyRetrieveTx ); BOOST_REQUIRE( !txHash.empty() ); dev::eth::mineTransaction( *( fixture.client ), 1 ); + fixture.client->state().getOriginalDb()->createBlockSnap( 3 ); auto t = fixture.rpcClient->eth_getTransactionReceipt( txHash ); - BOOST_REQUIRE_EQUAL( fixture.client->balanceAt( jsToAddress( etherbase ) ), etherbaseBalance + jsToU256( t["gasUsed"].asString() ) * jsToU256( partiallyRetrieveTx["gasPrice"].asString() )- u256( 1000000 ) ); - BOOST_REQUIRE_EQUAL( fixture.client->balanceAt( jsToAddress( "0x7aa5E36AA15E93D10F4F26357C30F052DacDde5F" ) ), balance + u256( 1000000 ) ); + BOOST_REQUIRE_EQUAL( fixture.client->balanceAt( jsToAddress( etherbase ) ), + etherbaseBalance + + jsToU256( t["gasUsed"].asString() ) * + jsToU256( partiallyRetrieveTx["gasPrice"].asString() ) - + u256( 1000000 ) ); + BOOST_REQUIRE_EQUAL( + fixture.client->balanceAt( jsToAddress( "0x7aa5E36AA15E93D10F4F26357C30F052DacDde5F" ) ), + balance + u256( 1000000 ) ); // retrieve all u256 oldEtherbaseBalance = fixture.client->balanceAt( jsToAddress( etherbase ) ); - balance = fixture.client->balanceAt( jsToAddress( "0x7aa5E36AA15E93D10F4F26357C30F052DacDde5F" ) ); + balance = + fixture.client->balanceAt( jsToAddress( "0x7aa5E36AA15E93D10F4F26357C30F052DacDde5F" ) ); Json::Value retrieveTx; - retrieveTx["data"] = "0xc6427474000000000000000000000000d2c0deface0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000c4b61d27f6000000000000000000000000d2ba3e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000240a79309b0000000000000000000000007aa5e36aa15e93d10f4f26357c30f052dacdde5f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + retrieveTx["data"] = + "0xc6427474000000000000000000000000d2c0deface0000000000000000000000000000000000000000000000" + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "000000000000000000006000000000000000000000000000000000000000000000000000000000000000c4b61d" + "27f6000000000000000000000000d2ba3e00000000000000000000000000000000000000000000000000000000" + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "000000000000006000000000000000000000000000000000000000000000000000000000000000240a79309b00" + "00000000000000000000007aa5e36aa15e93d10f4f26357c30f052dacdde5f0000000000000000000000000000" + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; retrieveTx["from"] = "0x5C4e11842E8be09264dc1976943571d7Af6d00F9"; retrieveTx["to"] = "0xD244519000000000000000000000000000000000"; retrieveTx["gasPrice"] = fixture.rpcClient->eth_gasPrice(); @@ -3392,29 +3744,37 @@ BOOST_AUTO_TEST_CASE( etherbase_generation2 ) { txHash = fixture.rpcClient->eth_sendTransaction( retrieveTx ); BOOST_REQUIRE( !txHash.empty() ); dev::eth::mineTransaction( *( fixture.client ), 1 ); + fixture.client->state().getOriginalDb()->createBlockSnap( 4 ); t = fixture.rpcClient->eth_getTransactionReceipt( txHash ); etherbaseBalance = fixture.client->balanceAt( jsToAddress( etherbase ) ); - BOOST_REQUIRE_EQUAL( jsToU256( t["gasUsed"].asString() ) * jsToU256( partiallyRetrieveTx["gasPrice"].asString() ), etherbaseBalance ); - BOOST_REQUIRE_EQUAL( fixture.client->balanceAt( jsToAddress( "0x7aa5E36AA15E93D10F4F26357C30F052DacDde5F" ) ), balance + oldEtherbaseBalance ); + BOOST_REQUIRE_EQUAL( jsToU256( t["gasUsed"].asString() ) * + jsToU256( partiallyRetrieveTx["gasPrice"].asString() ), + etherbaseBalance ); + BOOST_REQUIRE_EQUAL( + fixture.client->balanceAt( jsToAddress( "0x7aa5E36AA15E93D10F4F26357C30F052DacDde5F" ) ), + balance + oldEtherbaseBalance ); } BOOST_AUTO_TEST_CASE( deploy_controller_generation2 ) { - JsonRpcFixture fixture(c_genesisGeneration2ConfigString, false, false, true); + JsonRpcFixture fixture( c_genesisGeneration2ConfigString, false, false, true ); Json::Value hasRoleBeforeGrantingCall; - hasRoleBeforeGrantingCall["data"] = "0x91d14854fc425f2263d0df187444b70e47283d622c70181c5baebb1306a01edba1ce184c0000000000000000000000007aa5e36aa15e93d10f4f26357c30f052dacdde5f"; + hasRoleBeforeGrantingCall["data"] = + "0x91d14854fc425f2263d0df187444b70e47283d622c70181c5baebb1306a01edba1ce184c0000000000000000" + "000000007aa5e36aa15e93d10f4f26357c30f052dacdde5f"; hasRoleBeforeGrantingCall["to"] = "0xD2002000000000000000000000000000000000d2"; - BOOST_REQUIRE( jsToInt( fixture.rpcClient->eth_call( hasRoleBeforeGrantingCall, "latest" ) ) == 0 ); + BOOST_REQUIRE( + jsToInt( fixture.rpcClient->eth_call( hasRoleBeforeGrantingCall, "latest" ) ) == 0 ); string compiled = - "6080604052341561000f57600080fd5b60b98061001d6000396000f300" - "608060405260043610603f576000357c01000000000000000000000000" - "00000000000000000000000000000000900463ffffffff168063b3de64" - "8b146044575b600080fd5b3415604e57600080fd5b606a600480360381" - "019080803590602001909291905050506080565b604051808281526020" - "0191505060405180910390f35b60006007820290509190505600a16562" - "7a7a72305820f294e834212334e2978c6dd090355312a3f0f9476b8eb9" - "8fb480406fc2728a960029"; + "6080604052341561000f57600080fd5b60b98061001d6000396000f300" + "608060405260043610603f576000357c01000000000000000000000000" + "00000000000000000000000000000000900463ffffffff168063b3de64" + "8b146044575b600080fd5b3415604e57600080fd5b606a600480360381" + "019080803590602001909291905050506080565b604051808281526020" + "0191505060405180910390f35b60006007820290509190505600a16562" + "7a7a72305820f294e834212334e2978c6dd090355312a3f0f9476b8eb9" + "8fb480406fc2728a960029"; Json::Value deployContractWithoutRoleTx; deployContractWithoutRoleTx["from"] = "0x7aa5e36aa15e93d10f4f26357c30f052dacdde5f"; @@ -3428,12 +3788,20 @@ BOOST_AUTO_TEST_CASE( deploy_controller_generation2 ) { Json::Value receipt = fixture.rpcClient->eth_getTransactionReceipt( txHash ); BOOST_REQUIRE_EQUAL( receipt["status"], string( "0x0" ) ); Json::Value code = - fixture.rpcClient->eth_getCode( receipt["contractAddress"].asString(), "latest" ); + fixture.rpcClient->eth_getCode( receipt["contractAddress"].asString(), "latest" ); BOOST_REQUIRE( code.asString() == "0x" ); // grant deployer role to 0x7aa5e36aa15e93d10f4f26357c30f052dacdde5f Json::Value grantDeployerRoleTx; - grantDeployerRoleTx["data"] = "0xc6427474000000000000000000000000d2c0deface0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000c4b61d27f6000000000000000000000000d2002000000000000000000000000000000000d2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000024e43252d70000000000000000000000007aa5e36aa15e93d10f4f26357c30f052dacdde5f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + grantDeployerRoleTx["data"] = + "0xc6427474000000000000000000000000d2c0deface0000000000000000000000000000000000000000000000" + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "000000000000000000006000000000000000000000000000000000000000000000000000000000000000c4b61d" + "27f6000000000000000000000000d2002000000000000000000000000000000000d20000000000000000000000" + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "00000000000000600000000000000000000000000000000000000000000000000000000000000024e43252d700" + "00000000000000000000007aa5e36aa15e93d10f4f26357c30f052dacdde5f0000000000000000000000000000" + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; grantDeployerRoleTx["from"] = "0x5C4e11842E8be09264dc1976943571d7Af6d00F9"; grantDeployerRoleTx["to"] = "0xD244519000000000000000000000000000000000"; grantDeployerRoleTx["gasPrice"] = fixture.rpcClient->eth_gasPrice(); @@ -3443,7 +3811,9 @@ BOOST_AUTO_TEST_CASE( deploy_controller_generation2 ) { dev::eth::mineTransaction( *( fixture.client ), 1 ); Json::Value hasRoleCall; - hasRoleCall["data"] = "0x91d14854fc425f2263d0df187444b70e47283d622c70181c5baebb1306a01edba1ce184c0000000000000000000000007aa5e36aa15e93d10f4f26357c30f052dacdde5f"; + hasRoleCall["data"] = + "0x91d14854fc425f2263d0df187444b70e47283d622c70181c5baebb1306a01edba1ce184c0000000000000000" + "000000007aa5e36aa15e93d10f4f26357c30f052dacdde5f"; hasRoleCall["to"] = "0xD2002000000000000000000000000000000000d2"; BOOST_REQUIRE( jsToInt( fixture.rpcClient->eth_call( hasRoleCall, "latest" ) ) == 1 ); @@ -3468,7 +3838,6 @@ BOOST_AUTO_TEST_CASE( deploy_controller_generation2 ) { } BOOST_AUTO_TEST_CASE( deployment_control_v2 ) { - // Inserting ConfigController mockup into config and enabling flexibleDeploymentPatch. // ConfigController mockup contract: @@ -3488,27 +3857,28 @@ BOOST_AUTO_TEST_CASE( deployment_control_v2 ) { // } string configControllerV2 = - "0x608060405234801561001057600080fd5b506004361061004c576000" - "3560e01c806313f44d1014610051578063a2306c4f14610081578063d0" - "f557f41461009f578063f7e2a91b146100cf575b600080fd5b61006b60" - "048036038101906100669190610189565b6100d9565b60405161007891" - "906101d1565b60405180910390f35b6100896100e0565b604051610096" - "91906101d1565b60405180910390f35b6100b960048036038101906100" - "b491906101ec565b6100f1565b6040516100c691906101d1565b604051" - "80910390f35b6100d761010a565b005b6000919050565b600080549061" - "01000a900460ff1681565b60008060009054906101000a900460ff1690" - "5092915050565b60016000806101000a81548160ff0219169083151502" - "17905550565b600080fd5b600073ffffffffffffffffffffffffffffff" - "ffffffffff82169050919050565b60006101568261012b565b90509190" - "50565b6101668161014b565b811461017157600080fd5b50565b600081" - "3590506101838161015d565b92915050565b6000602082840312156101" - "9f5761019e610126565b5b60006101ad84828501610174565b91505092" - "915050565b60008115159050919050565b6101cb816101b6565b825250" - "50565b60006020820190506101e660008301846101c2565b9291505056" - "5b6000806040838503121561020357610202610126565b5b6000610211" - "85828601610174565b925050602061022285828601610174565b915050" - "925092905056fea2646970667358221220b5f971b16f7bbba22272b220" - "7e02f10abf1682c17fe636c7bf6406c5cae5716064736f6c63430008090033"; + "0x608060405234801561001057600080fd5b506004361061004c576000" + "3560e01c806313f44d1014610051578063a2306c4f14610081578063d0" + "f557f41461009f578063f7e2a91b146100cf575b600080fd5b61006b60" + "048036038101906100669190610189565b6100d9565b60405161007891" + "906101d1565b60405180910390f35b6100896100e0565b604051610096" + "91906101d1565b60405180910390f35b6100b960048036038101906100" + "b491906101ec565b6100f1565b6040516100c691906101d1565b604051" + "80910390f35b6100d761010a565b005b6000919050565b600080549061" + "01000a900460ff1681565b60008060009054906101000a900460ff1690" + "5092915050565b60016000806101000a81548160ff0219169083151502" + "17905550565b600080fd5b600073ffffffffffffffffffffffffffffff" + "ffffffffff82169050919050565b60006101568261012b565b90509190" + "50565b6101668161014b565b811461017157600080fd5b50565b600081" + "3590506101838161015d565b92915050565b6000602082840312156101" + "9f5761019e610126565b5b60006101ad84828501610174565b91505092" + "915050565b60008115159050919050565b6101cb816101b6565b825250" + "50565b60006020820190506101e660008301846101c2565b9291505056" + "5b6000806040838503121561020357610202610126565b5b6000610211" + "85828601610174565b925050602061022285828601610174565b915050" + "925092905056fea2646970667358221220b5f971b16f7bbba22272b220" + "7e02f10abf1682c17fe636c7bf6406c5cae5716064736f6c63430008090033"; + std::string _config = c_genesisGeneration2ConfigString; Json::Value ret; @@ -3518,7 +3888,7 @@ BOOST_AUTO_TEST_CASE( deployment_control_v2 ) { Json::FastWriter fastWriter; std::string config = fastWriter.write( ret ); - JsonRpcFixture fixture(config, false, false, true ); + JsonRpcFixture fixture( config, false, false, true ); Address senderAddress = fixture.coinbase.address(); fixture.client->setAuthor( senderAddress ); @@ -3527,14 +3897,14 @@ BOOST_AUTO_TEST_CASE( deployment_control_v2 ) { // } string compiled = - "6080604052341561000f57600080fd5b60b98061001d6000396000f300" - "608060405260043610603f576000357c01000000000000000000000000" - "00000000000000000000000000000000900463ffffffff168063b3de64" - "8b146044575b600080fd5b3415604e57600080fd5b606a600480360381" - "019080803590602001909291905050506080565b604051808281526020" - "0191505060405180910390f35b60006007820290509190505600a16562" - "7a7a72305820f294e834212334e2978c6dd090355312a3f0f9476b8eb9" - "8fb480406fc2728a960029"; + "6080604052341561000f57600080fd5b60b98061001d6000396000f300" + "608060405260043610603f576000357c01000000000000000000000000" + "00000000000000000000000000000000900463ffffffff168063b3de64" + "8b146044575b600080fd5b3415604e57600080fd5b606a600480360381" + "019080803590602001909291905050506080565b604051808281526020" + "0191505060405180910390f35b60006007820290509190505600a16562" + "7a7a72305820f294e834212334e2978c6dd090355312a3f0f9476b8eb9" + "8fb480406fc2728a960029"; // Trying to deploy contract without permission @@ -3551,7 +3921,7 @@ BOOST_AUTO_TEST_CASE( deployment_control_v2 ) { BOOST_REQUIRE_EQUAL( receipt["status"], string( "0x0" ) ); Json::Value code = - fixture.rpcClient->eth_getCode( receipt["contractAddress"].asString(), "latest" ); + fixture.rpcClient->eth_getCode( receipt["contractAddress"].asString(), "latest" ); BOOST_REQUIRE( code.asString() == "0x" ); // Allow to deploy by calling setFreeContractDeployment() @@ -3583,15 +3953,20 @@ BOOST_AUTO_TEST_CASE( deployment_control_v2 ) { } BOOST_AUTO_TEST_CASE( filestorage_generation2 ) { - JsonRpcFixture fixture(c_genesisGeneration2ConfigString, false, false, true); + JsonRpcFixture fixture( c_genesisGeneration2ConfigString, false, false, true ); Json::Value hasRoleBeforeGrantingCall; - hasRoleBeforeGrantingCall["data"] = "0x91d1485468bf109b95a5c15fb2bb99041323c27d15f8675e11bf7420a1cd6ad64c394f460000000000000000000000007aa5e36aa15e93d10f4f26357c30f052dacdde5f"; + hasRoleBeforeGrantingCall["data"] = + "0x91d1485468bf109b95a5c15fb2bb99041323c27d15f8675e11bf7420a1cd6ad64c394f460000000000000000" + "000000007aa5e36aa15e93d10f4f26357c30f052dacdde5f"; hasRoleBeforeGrantingCall["to"] = "0xD3002000000000000000000000000000000000d3"; - BOOST_REQUIRE( jsToInt( fixture.rpcClient->eth_call( hasRoleBeforeGrantingCall, "latest" ) ) == 0 ); + BOOST_REQUIRE( + jsToInt( fixture.rpcClient->eth_call( hasRoleBeforeGrantingCall, "latest" ) ) == 0 ); Json::Value reserveSpaceBeforeGrantRoleTx; - reserveSpaceBeforeGrantRoleTx["data"] = "0x1cfe4e3b0000000000000000000000007aa5e36aa15e93d10f4f26357c30f052dacdde5f0000000000000000000000000000000000000000000000000000000000000064"; + reserveSpaceBeforeGrantRoleTx["data"] = + "0x1cfe4e3b0000000000000000000000007aa5e36aa15e93d10f4f26357c30f052dacdde5f0000000000000000" + "000000000000000000000000000000000000000000000064"; reserveSpaceBeforeGrantRoleTx["from"] = "0x7aa5e36aa15e93d10f4f26357c30f052dacdde5f"; reserveSpaceBeforeGrantRoleTx["to"] = "0xD3002000000000000000000000000000000000d3"; reserveSpaceBeforeGrantRoleTx["gasPrice"] = fixture.rpcClient->eth_gasPrice(); @@ -3603,7 +3978,16 @@ BOOST_AUTO_TEST_CASE( filestorage_generation2 ) { BOOST_REQUIRE_EQUAL( receipt["status"], string( "0x0" ) ); Json::Value grantRoleTx; - grantRoleTx["data"] = "0xc6427474000000000000000000000000d2c0deface0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000e4b61d27f6000000000000000000000000d3002000000000000000000000000000000000d30000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000442f2ff15d68bf109b95a5c15fb2bb99041323c27d15f8675e11bf7420a1cd6ad64c394f460000000000000000000000007aa5e36aa15e93d10f4f26357c30f052dacdde5f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + grantRoleTx["data"] = + "0xc6427474000000000000000000000000d2c0deface0000000000000000000000000000000000000000000000" + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "000000000000000000006000000000000000000000000000000000000000000000000000000000000000e4b61d" + "27f6000000000000000000000000d3002000000000000000000000000000000000d30000000000000000000000" + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "000000000000006000000000000000000000000000000000000000000000000000000000000000442f2ff15d68" + "bf109b95a5c15fb2bb99041323c27d15f8675e11bf7420a1cd6ad64c394f460000000000000000000000007aa5" + "e36aa15e93d10f4f26357c30f052dacdde5f000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000"; grantRoleTx["from"] = "0x5C4e11842E8be09264dc1976943571d7Af6d00F9"; grantRoleTx["to"] = "0xD244519000000000000000000000000000000000"; grantRoleTx["gasPrice"] = fixture.rpcClient->eth_gasPrice(); @@ -3615,12 +3999,16 @@ BOOST_AUTO_TEST_CASE( filestorage_generation2 ) { BOOST_REQUIRE_EQUAL( receipt["status"], string( "0x1" ) ); Json::Value hasRoleCall; - hasRoleCall["data"] = "0x91d1485468bf109b95a5c15fb2bb99041323c27d15f8675e11bf7420a1cd6ad64c394f460000000000000000000000007aa5e36aa15e93d10f4f26357c30f052dacdde5f"; + hasRoleCall["data"] = + "0x91d1485468bf109b95a5c15fb2bb99041323c27d15f8675e11bf7420a1cd6ad64c394f460000000000000000" + "000000007aa5e36aa15e93d10f4f26357c30f052dacdde5f"; hasRoleCall["to"] = "0xD3002000000000000000000000000000000000d3"; BOOST_REQUIRE( jsToInt( fixture.rpcClient->eth_call( hasRoleCall, "latest" ) ) == 1 ); Json::Value reserveSpaceTx; - reserveSpaceTx["data"] = "0x1cfe4e3b0000000000000000000000007aa5e36aa15e93d10f4f26357c30f052dacdde5f0000000000000000000000000000000000000000000000000000000000000064"; + reserveSpaceTx["data"] = + "0x1cfe4e3b0000000000000000000000007aa5e36aa15e93d10f4f26357c30f052dacdde5f0000000000000000" + "000000000000000000000000000000000000000000000064"; reserveSpaceTx["from"] = "0x7aa5e36aa15e93d10f4f26357c30f052dacdde5f"; reserveSpaceTx["to"] = "0xD3002000000000000000000000000000000000d3"; reserveSpaceTx["gasPrice"] = fixture.rpcClient->eth_gasPrice(); @@ -3632,50 +4020,66 @@ BOOST_AUTO_TEST_CASE( filestorage_generation2 ) { BOOST_REQUIRE_EQUAL( receipt["status"], string( "0x1" ) ); Json::Value getReservedSpaceCall; - hasRoleCall["data"] = "0xbb559d160000000000000000000000007aa5e36aa15e93d10f4f26357c30f052dacdde5f"; + hasRoleCall["data"] = + "0xbb559d160000000000000000000000007aa5e36aa15e93d10f4f26357c30f052dacdde5f"; hasRoleCall["to"] = "0xD3002000000000000000000000000000000000d3"; BOOST_REQUIRE( jsToInt( fixture.rpcClient->eth_call( hasRoleCall, "latest" ) ) == 100 ); } -BOOST_AUTO_TEST_CASE( PrecompiledPrintFakeEth, *boost::unit_test::precondition( []( unsigned long ) -> bool { return false; } ) ) { - JsonRpcFixture fixture(c_genesisConfigString, false, false); +BOOST_AUTO_TEST_CASE( PrecompiledPrintFakeEth, + *boost::unit_test::precondition( []( unsigned long ) -> bool { return false; } ) ) { + JsonRpcFixture fixture( c_genesisConfigString, false, false ); dev::eth::simulateMining( *( fixture.client ), 20 ); - fixture.accountHolder->setAccounts( {fixture.coinbase, fixture.account2, dev::KeyPair(dev::Secret("0x1c2cd4b70c2b8c6cd7144bbbfbd1e5c6eacb4a5efd9c86d0e29cbbec4e8483b9"))} ); + fixture.accountHolder->setAccounts( { fixture.coinbase, fixture.account2, + dev::KeyPair( dev::Secret( + "0x1c2cd4b70c2b8c6cd7144bbbfbd1e5c6eacb4a5efd9c86d0e29cbbec4e8483b9" ) ) } ); - u256 balance = fixture.client->balanceAt( jsToAddress( "0x5C4e11842E8Be09264DC1976943571D7AF6d00f8" ) ); + u256 balance = + fixture.client->balanceAt( jsToAddress( "0x5C4e11842E8Be09264DC1976943571D7AF6d00f8" ) ); BOOST_REQUIRE_EQUAL( balance, 0 ); Json::Value printFakeEthFromDisallowedAddressTx; - printFakeEthFromDisallowedAddressTx["data"] = "0x5C4e11842E8Be09264DC1976943571D7AF6d00f80000000000000000000000000000000000000000000000000000000000000010"; + printFakeEthFromDisallowedAddressTx["data"] = + "0x5C4e11842E8Be09264DC1976943571D7AF6d00f8000000000000000000000000000000000000000000000000" + "0000000000000010"; printFakeEthFromDisallowedAddressTx["from"] = fixture.coinbase.address().hex(); printFakeEthFromDisallowedAddressTx["to"] = "0000000000000000000000000000000000000006"; printFakeEthFromDisallowedAddressTx["gasPrice"] = fixture.rpcClient->eth_gasPrice(); fixture.rpcClient->eth_sendTransaction( printFakeEthFromDisallowedAddressTx ); dev::eth::mineTransaction( *( fixture.client ), 1 ); - balance = fixture.client->balanceAt( jsToAddress( "0x5C4e11842E8Be09264DC1976943571D7AF6d00f8" ) ); + balance = + fixture.client->balanceAt( jsToAddress( "0x5C4e11842E8Be09264DC1976943571D7AF6d00f8" ) ); BOOST_REQUIRE_EQUAL( balance, 0 ); Json::Value printFakeEthTx; - printFakeEthTx["data"] = "0x5C4e11842E8Be09264DC1976943571D7AF6d00f80000000000000000000000000000000000000000000000000000000000000010"; + printFakeEthTx["data"] = + "0x5C4e11842E8Be09264DC1976943571D7AF6d00f8000000000000000000000000000000000000000000000000" + "0000000000000010"; printFakeEthTx["from"] = "0x5C4e11842E8be09264dc1976943571d7Af6d00F9"; printFakeEthTx["to"] = "0000000000000000000000000000000000000006"; printFakeEthTx["gasPrice"] = fixture.rpcClient->eth_gasPrice(); fixture.rpcClient->eth_sendTransaction( printFakeEthTx ); dev::eth::mineTransaction( *( fixture.client ), 1 ); - balance = fixture.client->balanceAt( jsToAddress( "0x5C4e11842E8Be09264DC1976943571D7AF6d00f8" ) ); + balance = + fixture.client->balanceAt( jsToAddress( "0x5C4e11842E8Be09264DC1976943571D7AF6d00f8" ) ); BOOST_REQUIRE_EQUAL( balance, 16 ); Json::Value printFakeEthCall; - printFakeEthCall["data"] = "0x5C4e11842E8Be09264DC1976943571D7AF6d00f80000000000000000000000000000000000000000000000000000000000000010"; + + printFakeEthCall["data"] = + "0x5C4e11842E8Be09264DC1976943571D7AF6d00f8000000000000000000000000000000000000000000000000" + "0000000000000010"; + printFakeEthCall["from"] = "0x5C4e11842E8be09264dc1976943571d7Af6d00F9"; printFakeEthCall["to"] = "0000000000000000000000000000000000000006"; printFakeEthCall["gasPrice"] = fixture.rpcClient->eth_gasPrice(); fixture.rpcClient->eth_call( printFakeEthCall, "latest" ); - balance = fixture.client->balanceAt( jsToAddress( "0x5C4e11842E8Be09264DC1976943571D7AF6d00f8" ) ); + balance = + fixture.client->balanceAt( jsToAddress( "0x5C4e11842E8Be09264DC1976943571D7AF6d00f8" ) ); BOOST_REQUIRE_EQUAL( balance, 16 ); // pragma solidity ^0.4.25; @@ -3694,7 +4098,12 @@ BOOST_AUTO_TEST_CASE( PrecompiledPrintFakeEth, *boost::unit_test::precondition( // } // } - string compiled = "0x6080604052348015600f57600080fd5b5060a78061001e6000396000f30060806040526004361060225760003560e01c63ffffffff16806328b5e32b146027575b600080fd5b348015603257600080fd5b506039603b565b005b600080600060109150735c4e11842e8be09264dc1976943571d7af6d00f890506040518181528260208201526020816040836006600019f49350505050505600a165627a7a72305820c99b5f7e9e41fb0fee1724d382ca0f2c003087f66b3b46037ca6c7d452b076f20029"; + string compiled = + "0x6080604052348015600f57600080fd5b5060a78061001e6000396000f3006080604052600436106022576000" + "3560e01c63ffffffff16806328b5e32b146027575b600080fd5b348015603257600080fd5b506039603b565b00" + "5b600080600060109150735c4e11842e8be09264dc1976943571d7af6d00f89050604051818152826020820152" + "6020816040836006600019f49350505050505600a165627a7a72305820c99b5f7e9e41fb0fee1724d382ca0f2c" + "003087f66b3b46037ca6c7d452b076f20029"; Json::Value create; create["from"] = fixture.coinbase.address().hex(); @@ -3717,7 +4126,8 @@ BOOST_AUTO_TEST_CASE( PrecompiledPrintFakeEth, *boost::unit_test::precondition( transactionCallObject["data"] = "0x28b5e32b"; fixture.rpcClient->eth_call( transactionCallObject, "latest" ); - balance = fixture.client->balanceAt( jsToAddress( "0x5C4e11842E8Be09264DC1976943571D7AF6d00f8" ) ); + balance = + fixture.client->balanceAt( jsToAddress( "0x5C4e11842E8Be09264DC1976943571D7AF6d00f8" ) ); BOOST_REQUIRE_EQUAL( balance, 16 ); } @@ -3747,13 +4157,13 @@ BOOST_AUTO_TEST_CASE( mtm_import_sequential_txs ) { pair< bool, Secret > ar3 = fixture.accountHolder->authenticate( ts3 ); Transaction tx3( ts3, ar3.second ); - h256 h1 = fixture.client->importTransaction( tx1 ); - h256 h2 = fixture.client->importTransaction( tx2 ); - h256 h3 = fixture.client->importTransaction( tx3 ); + h256 h1 = fixture.client->importTransaction( tx1, TransactionBroadcast::DontBroadcast ); + h256 h2 = fixture.client->importTransaction( tx2, TransactionBroadcast::DontBroadcast ); + h256 h3 = fixture.client->importTransaction( tx3, TransactionBroadcast::DontBroadcast ); BOOST_REQUIRE( h1 ); BOOST_REQUIRE( h2 ); BOOST_REQUIRE( h3 ); - BOOST_REQUIRE( fixture.client->transactionQueueStatus().current == 3); + BOOST_REQUIRE( fixture.client->transactionQueueStatus().current == 3 ); } BOOST_AUTO_TEST_CASE( mtm_import_future_txs ) { @@ -3798,53 +4208,57 @@ BOOST_AUTO_TEST_CASE( mtm_import_future_txs ) { h256 h1 = fixture.client->importTransaction( tx5 ); BOOST_REQUIRE( h1 ); - BOOST_REQUIRE_EQUAL( tq->futureSize(), 1); + BOOST_REQUIRE_EQUAL( tq->futureSize(), 1 ); Json::Value call = fixture.rpcClient->debug_getFutureTransactions(); - BOOST_REQUIRE_EQUAL( call.size(), 1); + BOOST_REQUIRE_EQUAL( call.size(), 1 ); h256 h2 = fixture.client->importTransaction( tx3 ); BOOST_REQUIRE( h2 ); - BOOST_REQUIRE_EQUAL( tq->futureSize(), 2); + BOOST_REQUIRE_EQUAL( tq->futureSize(), 2 ); call = fixture.rpcClient->debug_getFutureTransactions(); - BOOST_REQUIRE_EQUAL( call.size(), 2); - BOOST_REQUIRE_EQUAL( call[0]["from"], string("0x")+txJson["from"].asString() ); + BOOST_REQUIRE_EQUAL( call.size(), 2 ); + BOOST_REQUIRE_EQUAL( call[0]["from"], string( "0x" ) + txJson["from"].asString() ); h256 h3 = fixture.client->importTransaction( tx2 ); BOOST_REQUIRE( h3 ); - BOOST_REQUIRE_EQUAL( tq->futureSize(), 3); + BOOST_REQUIRE_EQUAL( tq->futureSize(), 3 ); call = fixture.rpcClient->debug_getFutureTransactions(); - BOOST_REQUIRE_EQUAL( call.size(), 3); + BOOST_REQUIRE_EQUAL( call.size(), 3 ); h256 h4 = fixture.client->importTransaction( tx1 ); BOOST_REQUIRE( h4 ); - BOOST_REQUIRE_EQUAL( tq->futureSize(), 1); - BOOST_REQUIRE_EQUAL( tq->status().current, 3); + BOOST_REQUIRE_EQUAL( tq->futureSize(), 1 ); + BOOST_REQUIRE_EQUAL( tq->status().current, 3 ); call = fixture.rpcClient->debug_getFutureTransactions(); - BOOST_REQUIRE_EQUAL( call.size(), 1); + BOOST_REQUIRE_EQUAL( call.size(), 1 ); h256 h5 = fixture.client->importTransaction( tx4 ); BOOST_REQUIRE( h5 ); - BOOST_REQUIRE_EQUAL( tq->futureSize(), 0); - BOOST_REQUIRE_EQUAL( tq->status().current, 5); + BOOST_REQUIRE_EQUAL( tq->futureSize(), 0 ); + BOOST_REQUIRE_EQUAL( tq->status().current, 5 ); call = fixture.rpcClient->debug_getFutureTransactions(); - BOOST_REQUIRE_EQUAL( call.size(), 0); + BOOST_REQUIRE_EQUAL( call.size(), 0 ); fixture.client->skaleHost()->pauseConsensus( false ); } // TODO: Enable for multitransaction mode checking + // historic node shall ignore invalid transactions in block BOOST_AUTO_TEST_CASE( skip_invalid_transactions ) { JsonRpcFixture fixture( c_genesisConfigString, true, true, false, true ); - dev::eth::simulateMining( *( fixture.client ), 1 ); // 2 Ether + dev::eth::simulateMining( *( fixture.client ), 1 ); // 2 Ether - cout << "Balance: " << fixture.rpcClient->eth_getBalance(fixture.accountHolder->allAccounts()[0].hex(), "latest") << endl; + cout << "Balance: " + << fixture.rpcClient->eth_getBalance( + fixture.accountHolder->allAccounts()[0].hex(), "latest" ) + << endl; // 1 import 1 transaction to increase block number // also send 1 eth to account2 @@ -3864,15 +4278,18 @@ BOOST_AUTO_TEST_CASE( skip_invalid_transactions ) { fixture.client->importTransaction( tx1 ); // 1 eth left (returned to author) - dev::eth::mineTransaction(*(fixture.client), 1); - cout << "Balance2: " << fixture.rpcClient->eth_getBalance(fixture.accountHolder->allAccounts()[0].hex(), "latest") << endl; + dev::eth::mineTransaction( *( fixture.client ), 1 ); + cout << "Balance2: " + << fixture.rpcClient->eth_getBalance( + fixture.accountHolder->allAccounts()[0].hex(), "latest" ) + << endl; // 2 import 4 transactions with money for 1st, 2nd, and 3rd // require full 1 Ether for gas+value txJson["gas"] = "100000"; txJson["nonce"] = "1"; - txJson["value"] = "500000000000000000";// take 0.5 eth out + txJson["value"] = "500000000000000000"; // take 0.5 eth out ts1 = toTransactionSkeleton( txJson ); ts1 = fixture.client->populateTransactionWithDefaults( ts1 ); ar1 = fixture.accountHolder->authenticate( ts1 ); @@ -3900,109 +4317,235 @@ BOOST_AUTO_TEST_CASE( skip_invalid_transactions ) { pair< bool, Secret > ar4 = fixture.accountHolder->authenticate( ts4 ); Transaction tx4( ts3, ar3.second ); - h256 h4 = fixture.client->importTransaction( tx4 ); // ok - h256 h2 = fixture.client->importTransaction( tx2 ); // invalid - h256 h3 = fixture.client->importTransaction( tx3 ); // ok - h256 h1 = fixture.client->importTransaction( tx1 ); // ok + h256 h4 = fixture.client->importTransaction( tx4 ); // ok + h256 h2 = fixture.client->importTransaction( tx2 ); // invalid + h256 h3 = fixture.client->importTransaction( tx3 ); // ok + h256 h1 = fixture.client->importTransaction( tx1 ); // ok - dev::eth::mineTransaction(*(fixture.client), 1); - cout << "Balance3: " << fixture.rpcClient->eth_getBalance(fixture.accountHolder->allAccounts()[0].hex(), "latest") << endl; + dev::eth::mineTransaction( *( fixture.client ), 1 ); + cout << "Balance3: " + << fixture.rpcClient->eth_getBalance( + fixture.accountHolder->allAccounts()[0].hex(), "latest" ) + << endl; - (void)h1; - (void)h2; - (void)h3; - (void)h4; + ( void ) h1; + ( void ) h2; + ( void ) h3; + ( void ) h4; #ifdef HISTORIC_STATE // 3 check that historic node sees only 3 txns - string explicitNumberStr = to_string(fixture.client->number()); + string explicitNumberStr = to_string( fixture.client->number() ); // 1 Block - Json::Value block = fixture.rpcClient->eth_getBlockByNumber("latest", "false"); + Json::Value block = fixture.rpcClient->eth_getBlockByNumber( "latest", "false" ); string bh = block["hash"].asString(); // 2 transaction count - Json::Value cnt = fixture.rpcClient->eth_getBlockTransactionCountByNumber("latest"); - BOOST_REQUIRE_EQUAL(cnt.asString(), "0x3"); - cnt = fixture.rpcClient->eth_getBlockTransactionCountByNumber(explicitNumberStr); - BOOST_REQUIRE_EQUAL(cnt.asString(), "0x3"); - cnt = fixture.rpcClient->eth_getBlockTransactionCountByHash(bh); - BOOST_REQUIRE_EQUAL(cnt.asString(), "0x3"); + Json::Value cnt = fixture.rpcClient->eth_getBlockTransactionCountByNumber( "latest" ); + BOOST_REQUIRE_EQUAL( cnt.asString(), "0x3" ); + cnt = fixture.rpcClient->eth_getBlockTransactionCountByNumber( explicitNumberStr ); + BOOST_REQUIRE_EQUAL( cnt.asString(), "0x3" ); + cnt = fixture.rpcClient->eth_getBlockTransactionCountByHash( bh ); + BOOST_REQUIRE_EQUAL( cnt.asString(), "0x3" ); - BOOST_REQUIRE_EQUAL(block["transactions"].size(), 3); - BOOST_REQUIRE_EQUAL(block["transactions"][0]["transactionIndex"], "0x0"); - BOOST_REQUIRE_EQUAL(block["transactions"][1]["transactionIndex"], "0x1"); - BOOST_REQUIRE_EQUAL(block["transactions"][2]["transactionIndex"], "0x2"); + BOOST_REQUIRE_EQUAL( block["transactions"].size(), 3 ); + BOOST_REQUIRE_EQUAL( block["transactions"][0]["transactionIndex"], "0x0" ); + BOOST_REQUIRE_EQUAL( block["transactions"][1]["transactionIndex"], "0x1" ); + BOOST_REQUIRE_EQUAL( block["transactions"][2]["transactionIndex"], "0x2" ); // same with explicit number - block = fixture.rpcClient->eth_getBlockByNumber(explicitNumberStr, "false"); + block = fixture.rpcClient->eth_getBlockByNumber( explicitNumberStr, "false" ); - BOOST_REQUIRE_EQUAL(block["transactions"].size(), 3); - BOOST_REQUIRE_EQUAL(block["transactions"][0]["transactionIndex"], "0x0"); - BOOST_REQUIRE_EQUAL(block["transactions"][1]["transactionIndex"], "0x1"); - BOOST_REQUIRE_EQUAL(block["transactions"][2]["transactionIndex"], "0x2"); + BOOST_REQUIRE_EQUAL( block["transactions"].size(), 3 ); + BOOST_REQUIRE_EQUAL( block["transactions"][0]["transactionIndex"], "0x0" ); + BOOST_REQUIRE_EQUAL( block["transactions"][1]["transactionIndex"], "0x1" ); + BOOST_REQUIRE_EQUAL( block["transactions"][2]["transactionIndex"], "0x2" ); // 3 receipts - Json::Value r1,r3,r4; - BOOST_REQUIRE_NO_THROW(r1 = fixture.rpcClient->eth_getTransactionReceipt(toJS(h1))); - BOOST_REQUIRE_THROW (fixture.rpcClient->eth_getTransactionReceipt(toJS(h2)), jsonrpc::JsonRpcException); - BOOST_REQUIRE_NO_THROW(r3 = fixture.rpcClient->eth_getTransactionReceipt(toJS(h3))); - BOOST_REQUIRE_NO_THROW(r4 = fixture.rpcClient->eth_getTransactionReceipt(toJS(h4))); + Json::Value r1, r3, r4; + BOOST_REQUIRE_NO_THROW( r1 = fixture.rpcClient->eth_getTransactionReceipt( toJS( h1 ) ) ); + BOOST_REQUIRE_THROW( + fixture.rpcClient->eth_getTransactionReceipt( toJS( h2 ) ), jsonrpc::JsonRpcException ); + BOOST_REQUIRE_NO_THROW( r3 = fixture.rpcClient->eth_getTransactionReceipt( toJS( h3 ) ) ); + BOOST_REQUIRE_NO_THROW( r4 = fixture.rpcClient->eth_getTransactionReceipt( toJS( h4 ) ) ); - BOOST_REQUIRE_EQUAL(r1["transactionIndex"], "0x0"); - BOOST_REQUIRE_EQUAL(r3["transactionIndex"], "0x1"); - BOOST_REQUIRE_EQUAL(r4["transactionIndex"], "0x2"); + BOOST_REQUIRE_EQUAL( r1["transactionIndex"], "0x0" ); + BOOST_REQUIRE_EQUAL( r3["transactionIndex"], "0x1" ); + BOOST_REQUIRE_EQUAL( r4["transactionIndex"], "0x2" ); // 4 transaction by index - Json::Value t0 = fixture.rpcClient->eth_getTransactionByBlockNumberAndIndex("latest", "0"); - Json::Value t1 = fixture.rpcClient->eth_getTransactionByBlockNumberAndIndex("latest", "1"); - Json::Value t2 = fixture.rpcClient->eth_getTransactionByBlockNumberAndIndex("latest", "2"); - BOOST_REQUIRE_EQUAL(jsToFixed<32>(t0["hash"].asString()), h1); - BOOST_REQUIRE_EQUAL(jsToFixed<32>(t1["hash"].asString()), h3); - BOOST_REQUIRE_EQUAL(jsToFixed<32>(t2["hash"].asString()), h4); + Json::Value t0 = fixture.rpcClient->eth_getTransactionByBlockNumberAndIndex( "latest", "0" ); + Json::Value t1 = fixture.rpcClient->eth_getTransactionByBlockNumberAndIndex( "latest", "1" ); + Json::Value t2 = fixture.rpcClient->eth_getTransactionByBlockNumberAndIndex( "latest", "2" ); + BOOST_REQUIRE_EQUAL( jsToFixed< 32 >( t0["hash"].asString() ), h1 ); + BOOST_REQUIRE_EQUAL( jsToFixed< 32 >( t1["hash"].asString() ), h3 ); + BOOST_REQUIRE_EQUAL( jsToFixed< 32 >( t2["hash"].asString() ), h4 ); // same with explicit block number - t0 = fixture.rpcClient->eth_getTransactionByBlockNumberAndIndex(explicitNumberStr, "0"); - t1 = fixture.rpcClient->eth_getTransactionByBlockNumberAndIndex(explicitNumberStr, "1"); - t2 = fixture.rpcClient->eth_getTransactionByBlockNumberAndIndex(explicitNumberStr, "2"); - BOOST_REQUIRE_EQUAL(jsToFixed<32>(t0["hash"].asString()), h1); - BOOST_REQUIRE_EQUAL(jsToFixed<32>(t1["hash"].asString()), h3); - BOOST_REQUIRE_EQUAL(jsToFixed<32>(t2["hash"].asString()), h4); + t0 = fixture.rpcClient->eth_getTransactionByBlockNumberAndIndex( explicitNumberStr, "0" ); + t1 = fixture.rpcClient->eth_getTransactionByBlockNumberAndIndex( explicitNumberStr, "1" ); + t2 = fixture.rpcClient->eth_getTransactionByBlockNumberAndIndex( explicitNumberStr, "2" ); + BOOST_REQUIRE_EQUAL( jsToFixed< 32 >( t0["hash"].asString() ), h1 ); + BOOST_REQUIRE_EQUAL( jsToFixed< 32 >( t1["hash"].asString() ), h3 ); + BOOST_REQUIRE_EQUAL( jsToFixed< 32 >( t2["hash"].asString() ), h4 ); - BOOST_REQUIRE_EQUAL(bh, r1["blockHash"].asString()); + BOOST_REQUIRE_EQUAL( bh, r1["blockHash"].asString() ); - t0 = fixture.rpcClient->eth_getTransactionByBlockHashAndIndex(bh, "0"); - t1 = fixture.rpcClient->eth_getTransactionByBlockHashAndIndex(bh, "1"); - t2 = fixture.rpcClient->eth_getTransactionByBlockHashAndIndex(bh, "2"); + t0 = fixture.rpcClient->eth_getTransactionByBlockHashAndIndex( bh, "0" ); + t1 = fixture.rpcClient->eth_getTransactionByBlockHashAndIndex( bh, "1" ); + t2 = fixture.rpcClient->eth_getTransactionByBlockHashAndIndex( bh, "2" ); - BOOST_REQUIRE_EQUAL(jsToFixed<32>(t0["hash"].asString()), h1); - BOOST_REQUIRE_EQUAL(jsToFixed<32>(t1["hash"].asString()), h3); - BOOST_REQUIRE_EQUAL(jsToFixed<32>(t2["hash"].asString()), h4); + BOOST_REQUIRE_EQUAL( jsToFixed< 32 >( t0["hash"].asString() ), h1 ); + BOOST_REQUIRE_EQUAL( jsToFixed< 32 >( t1["hash"].asString() ), h3 ); + BOOST_REQUIRE_EQUAL( jsToFixed< 32 >( t2["hash"].asString() ), h4 ); // 5 transaction by hash - BOOST_REQUIRE_THROW (fixture.rpcClient->eth_getTransactionByHash(toJS(h2)), jsonrpc::JsonRpcException); + BOOST_REQUIRE_THROW( + fixture.rpcClient->eth_getTransactionByHash( toJS( h2 ) ), jsonrpc::JsonRpcException ); // send it successfully // make money - dev::eth::simulateMining( *fixture.client, 1); + dev::eth::simulateMining( *fixture.client, 1 ); - h2 = fixture.client->importTransaction( tx2 ); // invalid + h2 = fixture.client->importTransaction( tx2 ); // invalid - dev::eth::mineTransaction(*(fixture.client), 1); + dev::eth::mineTransaction( *( fixture.client ), 1 ); // checks: Json::Value r2; - BOOST_REQUIRE_NO_THROW(r2 = fixture.rpcClient->eth_getTransactionReceipt(toJS(h2))); - BOOST_REQUIRE_EQUAL(r2["blockNumber"], toJS(fixture.client->number())); + BOOST_REQUIRE_NO_THROW( r2 = fixture.rpcClient->eth_getTransactionReceipt( toJS( h2 ) ) ); + BOOST_REQUIRE_EQUAL( r2["blockNumber"], toJS( fixture.client->number() ) ); #endif } +BOOST_AUTO_TEST_CASE( + eth_signAndSendRawTransaction, *boost::unit_test::precondition( dev::test::run_not_express ) ) { + SkaledFixture fixture( skaledConfigFileName ); + fixture.setupFirstKey(); + auto firstAccount = fixture.testAccounts.begin()->second; + auto gasPrice = fixture.getCurrentGasPrice(); + for ( uint64_t i = 0; i < 3; i++ ) { + auto dst = SkaledAccount::generate(); + fixture.splitAccountInHalves( + firstAccount, dst, gasPrice, TransactionWait::WAIT_FOR_COMPLETION ); + } + + cout << fixture.rpcClient()->skale_stats() << endl; +} + +BOOST_AUTO_TEST_CASE( perf_sendManyParalelEthTransfers, + *boost::unit_test::precondition( dev::test::run_not_express ) ) { + SkaledFixture fixture( skaledConfigFileName ); + vector< Secret > accountPieces; + + fixture.verifyTransactions = false; + fixture.threadsCountForTestTransactions = 8; + fixture.mtmBatchSize = 1; + + fixture.setupFirstKey(); + fixture.deployERC20(); + + fixture.setupTwoToTheNKeys( 12 ); + + fixture.sendTinyTransfersForAllAccounts( 10, TransferType::NATIVE ); +} + +BOOST_AUTO_TEST_CASE( perf_sendManyParalelEthMTMTransfers, + *boost::unit_test::precondition( dev::test::run_not_express ) ) { + SkaledFixture fixture( skaledConfigFileName ); + vector< Secret > accountPieces; + + fixture.verifyTransactions = false; + fixture.threadsCountForTestTransactions = 8; + fixture.mtmBatchSize = 5; + + fixture.setupFirstKey(); + fixture.setupTwoToTheNKeys( 8 ); + + fixture.sendTinyTransfersForAllAccounts( 10, TransferType::NATIVE ); +} + + +BOOST_AUTO_TEST_CASE( perf_sendManyParalelEthType1Transfers, + *boost::unit_test::precondition( dev::test::run_not_express ) ) { + SkaledFixture fixture( skaledConfigFileName ); + vector< Secret > accountPieces; + + fixture.verifyTransactions = false; + fixture.threadsCountForTestTransactions = 8; + fixture.transactionType = TransactionType::Type1; + + fixture.setupFirstKey(); + fixture.deployERC20(); + + fixture.setupTwoToTheNKeys( 12 ); + + fixture.sendTinyTransfersForAllAccounts( 1000, TransferType::NATIVE ); +} + + +BOOST_AUTO_TEST_CASE( perf_sendManyParalelEthType2Transfers, + *boost::unit_test::precondition( dev::test::run_not_express ) ) { + SkaledFixture fixture( skaledConfigFileName ); + vector< Secret > accountPieces; + + fixture.verifyTransactions = false; + fixture.threadsCountForTestTransactions = 8; + fixture.transactionType = TransactionType::Type2; + + fixture.setupFirstKey(); + fixture.deployERC20(); + + fixture.setupTwoToTheNKeys( 12 ); + + fixture.sendTinyTransfersForAllAccounts( 1000, TransferType::NATIVE ); +} + + +BOOST_AUTO_TEST_CASE( perf_sendManyParalelEthPowTransfers, + *boost::unit_test::precondition( dev::test::run_not_express ) ) { + SkaledFixture fixture( skaledConfigFileName ); + vector< Secret > accountPieces; + + fixture.verifyTransactions = false; + fixture.threadsCountForTestTransactions = 8; + fixture.usePow = true; + + fixture.setupFirstKey(); + fixture.deployERC20(); + + fixture.setupTwoToTheNKeys( 4 ); + + fixture.sendTinyTransfersForAllAccounts( 1000, TransferType::NATIVE ); +} + + +BOOST_AUTO_TEST_CASE( perf_sendManyParalelERC20Transfers, + *boost::unit_test::precondition( dev::test::run_not_express ) ) { + SkaledFixture fixture( skaledConfigFileName ); + vector< Secret > accountPieces; + + fixture.verifyTransactions = false; + fixture.threadsCountForTestTransactions = 8; + + fixture.setupFirstKey(); + + fixture.deployERC20(); + + fixture.setupTwoToTheNKeys( 12 ); + fixture.mintAllKeysWithERC20(); + + fixture.sendTinyTransfersForAllAccounts( 10, TransferType::ERC20 ); +} + + BOOST_FIXTURE_TEST_SUITE( RestrictedAddressSuite, RestrictedAddressFixture ) BOOST_AUTO_TEST_CASE( direct_call ) { @@ -4134,7 +4677,6 @@ BOOST_AUTO_TEST_SUITE_END() BOOST_AUTO_TEST_SUITE( FilestorageCacheSuite ) BOOST_AUTO_TEST_CASE( cached_filestorage ) { - auto _config = c_genesisConfigString; Json::Value ret; Json::Reader().parse( _config, ret ); @@ -4164,7 +4706,6 @@ BOOST_AUTO_TEST_CASE( cached_filestorage ) { } BOOST_AUTO_TEST_CASE( uncached_filestorage ) { - auto _config = c_genesisConfigString; Json::Value ret; Json::Reader().parse( _config, ret ); @@ -4200,64 +4741,68 @@ BOOST_FIXTURE_TEST_SUITE( GappedCacheSuite, JsonRpcFixture ) #ifdef HISTORIC_STATE BOOST_AUTO_TEST_CASE( test_blocks ) { - dev::rpc::_detail::GappedTransactionIndexCache cache(10, *client); - BOOST_REQUIRE_EQUAL(cache.realBlockTransactionCount(LatestBlock), 0); - BOOST_REQUIRE_EQUAL(cache.realBlockTransactionCount(PendingBlock), 0); - BOOST_REQUIRE_EQUAL(cache.realBlockTransactionCount(999999999), 0); + dev::rpc::_detail::GappedTransactionIndexCache cache( 10, *client ); + BOOST_REQUIRE_EQUAL( cache.realBlockTransactionCount( LatestBlock ), 0 ); + BOOST_REQUIRE_EQUAL( cache.realBlockTransactionCount( PendingBlock ), 0 ); + BOOST_REQUIRE_EQUAL( cache.realBlockTransactionCount( 999999999 ), 0 ); } BOOST_AUTO_TEST_CASE( test_transactions ) { + simulateMining( *client, 1, Address( "0xf6c2a4ba2350e58a45916a03d0faa70dcc5dcfbf" ) ); - simulateMining(*client, 1, Address("0xf6c2a4ba2350e58a45916a03d0faa70dcc5dcfbf")); + dev::rpc::_detail::GappedTransactionIndexCache cache( 10, *client ); - dev::rpc::_detail::GappedTransactionIndexCache cache(10, *client); - - Transaction invalid( - fromHex("0x0011223344556677889900112233445566778899001122334455667788990011223344556677889900112233" - "445566778899001122334455667788990011223344556677889900112233445566778899001122334455667788" - "990011223344556677889900112233445566778899" ), + Transaction invalid( fromHex( "0x00112233445566778899001122334455667788990011223344556677889900" + "11223344556677889900112233" + "4455667788990011223344556677889900112233445566778899001122334455" + "66778899001122334455667788" + "990011223344556677889900112233445566778899" ), CheckTransaction::None, true ); Transaction valid( - fromHex( "0xf86c808504a817c80083015f90943d7112ee86223baf0a506b9d2a77595cbbba51d1872386f26fc10000801ca0655757fd0650a65a373c48a4dc0f3d6ac5c3831aa0cc2cb863a5909dc6c25f72a071882ee8633466a243c0ea64dadb3120c1ca7a5cc7433c6c0b1c861a85322265" ), + fromHex( "0xf86c808504a817c80083015f90943d7112ee86223baf0a506b9d2a77595cbbba51d1872386f26fc" + "10000801ca0655757fd0650a65a373c48a4dc0f3d6ac5c3831aa0cc2cb863a5909dc6c25f72a07188" + "2ee8633466a243c0ea64dadb3120c1ca7a5cc7433c6c0b1c861a85322265" ), CheckTransaction::None ); valid.ignoreExternalGas(); - client->importTransactionsAsBlock(Transactions{invalid, valid}, 1); + client->importTransactionsAsBlock( Transactions{ invalid, valid }, 1 ); - BOOST_REQUIRE_EQUAL(cache.realBlockTransactionCount(LatestBlock), 2); - BOOST_REQUIRE_EQUAL(cache.gappedBlockTransactionCount(LatestBlock), 1); - BOOST_REQUIRE_EQUAL(cache.realIndexFromGapped(LatestBlock, 0), 1); - BOOST_REQUIRE_EQUAL(cache.gappedIndexFromReal(LatestBlock, 1), 0); - BOOST_REQUIRE_THROW(cache.gappedIndexFromReal(LatestBlock, 0), std::out_of_range); - BOOST_REQUIRE_EQUAL(cache.transactionPresent(LatestBlock, 0), false); - BOOST_REQUIRE_EQUAL(cache.transactionPresent(LatestBlock, 1), true); + BOOST_REQUIRE_EQUAL( cache.realBlockTransactionCount( LatestBlock ), 2 ); + BOOST_REQUIRE_EQUAL( cache.gappedBlockTransactionCount( LatestBlock ), 1 ); + BOOST_REQUIRE_EQUAL( cache.realIndexFromGapped( LatestBlock, 0 ), 1 ); + BOOST_REQUIRE_EQUAL( cache.gappedIndexFromReal( LatestBlock, 1 ), 0 ); + BOOST_REQUIRE_THROW( cache.gappedIndexFromReal( LatestBlock, 0 ), std::out_of_range ); + BOOST_REQUIRE_EQUAL( cache.transactionPresent( LatestBlock, 0 ), false ); + BOOST_REQUIRE_EQUAL( cache.transactionPresent( LatestBlock, 1 ), true ); } BOOST_AUTO_TEST_CASE( test_exceptions ) { + simulateMining( *client, 1, Address( "0xf6c2a4ba2350e58a45916a03d0faa70dcc5dcfbf" ) ); - simulateMining(*client, 1, Address("0xf6c2a4ba2350e58a45916a03d0faa70dcc5dcfbf")); - - dev::rpc::_detail::GappedTransactionIndexCache cache(10, *client); + dev::rpc::_detail::GappedTransactionIndexCache cache( 10, *client ); - Transaction invalid( - fromHex("0x0011223344556677889900112233445566778899001122334455667788990011223344556677889900112233" - "445566778899001122334455667788990011223344556677889900112233445566778899001122334455667788" - "990011223344556677889900112233445566778899" ), + Transaction invalid( fromHex( "0x00112233445566778899001122334455667788990011223344556677889900" + "11223344556677889900112233" + "4455667788990011223344556677889900112233445566778899001122334455" + "66778899001122334455667788" + "990011223344556677889900112233445566778899" ), CheckTransaction::None, true ); Transaction valid( - fromHex( "0xf86c808504a817c80083015f90943d7112ee86223baf0a506b9d2a77595cbbba51d1872386f26fc10000801ca0655757fd0650a65a373c48a4dc0f3d6ac5c3831aa0cc2cb863a5909dc6c25f72a071882ee8633466a243c0ea64dadb3120c1ca7a5cc7433c6c0b1c861a85322265" ), + fromHex( "0xf86c808504a817c80083015f90943d7112ee86223baf0a506b9d2a77595cbbba51d1872386f26fc" + "10000801ca0655757fd0650a65a373c48a4dc0f3d6ac5c3831aa0cc2cb863a5909dc6c25f72a07188" + "2ee8633466a243c0ea64dadb3120c1ca7a5cc7433c6c0b1c861a85322265" ), CheckTransaction::None ); valid.ignoreExternalGas(); - client->importTransactionsAsBlock(Transactions{invalid, valid}, 1); + client->importTransactionsAsBlock( Transactions{ invalid, valid }, 1 ); - BOOST_REQUIRE_THROW(cache.realIndexFromGapped(LatestBlock, 1), std::out_of_range); - BOOST_REQUIRE_THROW(cache.realIndexFromGapped(LatestBlock, 2), std::out_of_range); - BOOST_REQUIRE_THROW(cache.gappedIndexFromReal(LatestBlock, 2), std::out_of_range); - BOOST_REQUIRE_THROW(cache.gappedIndexFromReal(LatestBlock, 0), std::out_of_range); - BOOST_REQUIRE_THROW(cache.transactionPresent(LatestBlock, 2), std::out_of_range); + BOOST_REQUIRE_THROW( cache.realIndexFromGapped( LatestBlock, 1 ), std::out_of_range ); + BOOST_REQUIRE_THROW( cache.realIndexFromGapped( LatestBlock, 2 ), std::out_of_range ); + BOOST_REQUIRE_THROW( cache.gappedIndexFromReal( LatestBlock, 2 ), std::out_of_range ); + BOOST_REQUIRE_THROW( cache.gappedIndexFromReal( LatestBlock, 0 ), std::out_of_range ); + BOOST_REQUIRE_THROW( cache.transactionPresent( LatestBlock, 2 ), std::out_of_range ); } #endif diff --git a/test/unittests/libweb3jsonrpc/process_memory_monitor.bash b/test/unittests/libweb3jsonrpc/process_memory_monitor.bash new file mode 100755 index 000000000..a8a10af1e --- /dev/null +++ b/test/unittests/libweb3jsonrpc/process_memory_monitor.bash @@ -0,0 +1,54 @@ +#!/bin/bash + +# Set the process ID (PID) to monitor +PROCESS_PID=47822 # Replace with your process's PID + +# Check if the PID is valid +if ! ps -p $PROCESS_PID > /dev/null 2>&1; then + echo "Process with PID $PROCESS_PID not found." + exit 1 +fi + +# File to store memory usage data +DATA_FILE="rss_memory_usage.dat" +PLOT_FILE="rss_memory_plot.png" + +# Initialize the data file +echo "# Time(s) RSS(MB)" > $DATA_FILE + +# Function to get the current memory usage of the process +get_rss_memory_usage() { + # Get the RSS memory in kilobytes and convert to megabytes + ps -p $PROCESS_PID -o rss= | awk '{ printf "%.2f", $1/1024 }' +} + +# Start time in seconds +START_TIME=$(date +%s) + +# Trap to handle script interruption (e.g., Ctrl+C) +trap "echo; echo 'Plotting data...'; plot_data; exit 0" SIGINT + +# Function to plot data using gnuplot +plot_data() { + gnuplot -persist <<-EOFMarker + set terminal png size 800,600 + set output "$PLOT_FILE" + set title "RSS Memory Usage of Process PID $PROCESS_PID" + set xlabel "Time (s)" + set ylabel "RSS Memory (MB)" + set grid + plot "$DATA_FILE" using 1:2 with lines title "RSS Memory" +EOFMarker + echo "Plot saved to $PLOT_FILE" +} + +# Main loop to collect memory usage data over time +while true; do + CURRENT_TIME=$(date +%s) + ELAPSED_TIME=$((CURRENT_TIME - START_TIME)) + RSS_USAGE=$(get_rss_memory_usage) + echo "$ELAPSED_TIME $RSS_USAGE" >> $DATA_FILE + echo "Time: $ELAPSED_TIME s, RSS Memory: $RSS_USAGE MB" + sleep 1 # Collect data every second +done + diff --git a/test/unittests/libweb3jsonrpc/run_skaled.py b/test/unittests/libweb3jsonrpc/run_skaled.py new file mode 100644 index 000000000..2ee93309a --- /dev/null +++ b/test/unittests/libweb3jsonrpc/run_skaled.py @@ -0,0 +1,52 @@ +import subprocess +import sys +import shutil +from pathlib import Path + +import time + +# Set these +TOTAL_NODES: int = 16 +BUILD_DIR: str = "cmake-build-debug" +skaled_executable: str = "../../../" + BUILD_DIR + '/skaled/skaled' + +processes = [] + + +def run_skaled(_schain_index: int, _total_nodes: int): + try: + print("Starting skaled...") + skaled_dir : str = f"/tmp/skaled_{_schain_index}_of_{_total_nodes}" + skaled_path = Path(skaled_dir) + + + # Create directory if it doesn't exist + if not skaled_path.exists(): + skaled_path.mkdir(parents=True, exist_ok=True) + print("Directory created successfully.") + + shutil.copy2(skaled_executable, skaled_dir + "/skaled") + + + configFile: str = f"../../historicstate/configs/test_{_schain_index}_of_{_total_nodes}.json" + process = subprocess.Popen([skaled_dir + "/skaled", + '--config', configFile], stdout=sys.stdout, stderr=sys.stderr) + processes.append(process) + + except Exception as e: + print(f"Exception occurred: {e}") + finally: + print("skaled crashed or terminated.") + + + +def main(): + for i in range(TOTAL_NODES): + run_skaled(i + 1, TOTAL_NODES) + + for i in range(TOTAL_NODES): + processes[i].wait() + + +if __name__ == "__main__": + main() diff --git a/test/unittests/mapreduce_consensus/ConsensusEngine.cpp b/test/unittests/mapreduce_consensus/ConsensusEngine.cpp index 8c6932c1d..84638ea4d 100644 --- a/test/unittests/mapreduce_consensus/ConsensusEngine.cpp +++ b/test/unittests/mapreduce_consensus/ConsensusEngine.cpp @@ -41,8 +41,8 @@ #include #include -#include #include +#include #include @@ -87,7 +87,6 @@ class TestIpcClient : public jsonrpc::IClientConnector { }; class SingleNodeConsensusFixture : public ConsensusExtFace { - TransientDirectory m_tempDir; protected: @@ -112,15 +111,15 @@ class SingleNodeConsensusFixture : public ConsensusExtFace { ////////////////////////////////////////////// - setenv("DATA_DIR", m_tempDir.path().c_str(), 1); + setenv( "DATA_DIR", m_tempDir.path().c_str(), 1 ); - m_consensus.reset( new ConsensusEngine( - *this, 0, BlockHeader( chainParams.genesisBlock() ).timestamp(), - 0, std::map() ) ); + m_consensus.reset( + new ConsensusEngine( *this, 0, BlockHeader( chainParams.genesisBlock() ).timestamp(), 0, + std::map< std::string, std::uint64_t >() ) ); m_consensus->parseFullConfigAndCreateNode( chainParams.getOriginalJson(), "" ); m_consensusThread = std::thread( [this]() { - sleep(1); + sleep( 1 ); m_consensus->startAll(); m_consensus->bootStrapAll(); } ); @@ -136,7 +135,8 @@ class SingleNodeConsensusFixture : public ConsensusExtFace { } virtual void createBlock( const transactions_vector& _approvedTransactions, uint64_t _timeStamp, - uint32_t _timeStampMs, uint64_t _blockID, u256 _gasPrice, u256 /*_stateRoot*/, uint64_t /*_winningNodeIndex*/ ) override { + uint32_t _timeStampMs, uint64_t _blockID, u256 _gasPrice, u256 /*_stateRoot*/, + uint64_t /*_winningNodeIndex*/ ) override { transaction_promise = decltype( transaction_promise )(); std::cerr << "Block arrived with " << _approvedTransactions.size() << " txns" << std::endl; @@ -152,7 +152,7 @@ class SingleNodeConsensusFixture : public ConsensusExtFace { m_consensusThread.join(); while ( m_consensus->getStatus() != CONSENSUS_EXITED ) { - timespec ms100{0, 100000000}; + timespec ms100{ 0, 100000000 }; nanosleep( &ms100, nullptr ); } } @@ -200,11 +200,10 @@ class ConsensusExtFaceFixture : public ConsensusExtFace { unique_ptr< WebThreeStubClient > rpcClient; unique_ptr< FixedAccountHolder > accountHolder; - dev::KeyPair coinbase{KeyPair::create()}; + dev::KeyPair coinbase{ KeyPair::create() }; public: ConsensusExtFaceFixture() { - ChainParams chainParams; chainParams.sealEngineName = NoProof::name(); chainParams.allowFutureBlocks = true; @@ -214,14 +213,15 @@ class ConsensusExtFaceFixture : public ConsensusExtFace { chainParams.nodeInfo.port = chainParams.nodeInfo.port6 = rand_port; chainParams.sChain.nodes[0].port = chainParams.sChain.nodes[0].port6 = rand_port; - sChainNode node2{u256( 2 ), "127.0.0.12", u256( 11111 ), "::1", u256( 11111 ), u256( 1 ), "0xfa", {"0", "1", "0", "1"}}; + sChainNode node2{ u256( 2 ), "127.0.0.12", u256( 11111 ), "::1", u256( 11111 ), u256( 1 ), + "0xfa", { "0", "1", "0", "1" } }; chainParams.sChain.nodes.push_back( node2 ); ////////////////////////////////////////////// - m_consensus.reset( new ConsensusEngine( - *this, 0, BlockHeader( chainParams.genesisBlock() ).timestamp(), 0 , - std::map())); + m_consensus.reset( + new ConsensusEngine( *this, 0, BlockHeader( chainParams.genesisBlock() ).timestamp(), 0, + std::map< std::string, std::uint64_t >() ) ); m_consensus->parseFullConfigAndCreateNode( chainParams.getOriginalJson(), "" ); m_consensusThread = std::thread( [this]() { @@ -238,12 +238,12 @@ class ConsensusExtFaceFixture : public ConsensusExtFace { // web3.reset( new WebThreeDirect( // "eth tests", "", "", chainParams, WithExisting::Kill, {"eth"}, true ) ); - auto monitor = make_shared< InstanceMonitor >("test"); + auto monitor = make_shared< InstanceMonitor >( "test" ); - setenv("DATA_DIR", m_tempDir.path().c_str(), 1); - client.reset( - new eth::Client( chainParams, ( int ) chainParams.networkID, shared_ptr< GasPricer >(), - NULL, monitor, m_tempDir.path().c_str(), WithExisting::Kill, TransactionQueue::Limits{100000, 1024} ) ); + setenv( "DATA_DIR", m_tempDir.path().c_str(), 1 ); + client.reset( new eth::Client( chainParams, ( int ) chainParams.networkID, + shared_ptr< GasPricer >(), NULL, monitor, m_tempDir.path().c_str(), WithExisting::Kill, + TransactionQueue::Limits{ 100000, 1024 } ) ); client->injectSkaleHost(); client->startWorking(); @@ -251,12 +251,12 @@ class ConsensusExtFaceFixture : public ConsensusExtFace { client->setAuthor( coinbase.address() ); accountHolder.reset( new FixedAccountHolder( [&]() { return client.get(); }, {} ) ); - accountHolder->setAccounts( {coinbase} ); + accountHolder->setAccounts( { coinbase } ); using FullServer = ModularServer< rpc::EthFace, rpc::SkaleFace, rpc::Web3Face, rpc::DebugFace, rpc::TestFace >; - auto ethFace = new rpc::Eth( std::string(""), *client, *accountHolder.get() ); + auto ethFace = new rpc::Eth( std::string( "" ), *client, *accountHolder.get() ); rpcServer.reset( new FullServer( ethFace, new rpc::Skale( *client ), new rpc::Web3( /*web3->clientVersion()*/ ), new rpc::Debug( *client ), // TODO add @@ -266,7 +266,7 @@ class ConsensusExtFaceFixture : public ConsensusExtFace { rpcServer->addConnector( ipcServer ); ipcServer->StartListening(); - auto client = new TestIpcClient{*ipcServer}; + auto client = new TestIpcClient{ *ipcServer }; rpcClient = unique_ptr< WebThreeStubClient >( new WebThreeStubClient( *client ) ); } @@ -286,8 +286,8 @@ class ConsensusExtFaceFixture : public ConsensusExtFace { } virtual void createBlock( const transactions_vector& _approvedTransactions, uint64_t _timeStamp, - uint32_t /* timeStampMs */, uint64_t _blockID, u256 /*_gasPrice */, - u256 /*_stateRoot*/, uint64_t /*_winningNodeIndex*/ ) override { + uint32_t /* timeStampMs */, uint64_t _blockID, u256 /*_gasPrice */, u256 /*_stateRoot*/, + uint64_t /*_winningNodeIndex*/ ) override { ( void ) _timeStamp; ( void ) _blockID; std::cerr << "Block arrived with " << _approvedTransactions.size() << " txns" << std::endl; @@ -398,8 +398,8 @@ BOOST_AUTO_TEST_CASE( gasPriceIncrease ) { v = transactions_vector( 9000 ); size_t i = 0; for ( auto& tx : v ) { - for(size_t j=0; j