Contract Overview
Balance: 0.1115 Ether
Transactions: 13462 txns
 Latest 25 transactions from a total of 13462 transactions

TxHash Age From To Value [TxFee]
0xb1c1455129312ee791bce4a5eac27aad85e4867a01fd89ab75899ffaa7fb6ee81 min ago0x1a0ce99ddf08310a97f4cca5d21e91d4c89f2f2a  IN   0x831e30cd3f8fa60c66af44a565065268546321d10 Ether0.000379368977
0x8b735b3e6aceec5cdcdac658c51c02077d3ca8232f8fec35c0e455f106d7fd6b6 mins ago0x1a0ce99ddf08310a97f4cca5d21e91d4c89f2f2a  IN   0x831e30cd3f8fa60c66af44a565065268546321d10 Ether0.000504567555
0xf4d5724087605d5003c204e22ef23f214d5ca9e60e0f6697299855adfcbf450d6 mins ago0x1a0ce99ddf08310a97f4cca5d21e91d4c89f2f2a  IN   0x831e30cd3f8fa60c66af44a565065268546321d10 Ether0.000504567555
0x2acc501e2725b584354eb8c3510d0a1be464b0e2ebb0684e269833af7ec882296 mins ago0x1a0ce99ddf08310a97f4cca5d21e91d4c89f2f2a  IN   0x831e30cd3f8fa60c66af44a565065268546321d10 Ether0.000501542311
0x9c4725f79e615cbef598a0a9e6c2577735cad40e98f713e73230f8aa603a7ac76 mins ago0x1a0ce99ddf08310a97f4cca5d21e91d4c89f2f2a  IN   0x831e30cd3f8fa60c66af44a565065268546321d10 Ether0.000504567555
0x703238fa8fe939321815e0497caa4e006d398ac608cf4fa1e590e2882b57e51416 mins ago0x1a0ce99ddf08310a97f4cca5d21e91d4c89f2f2a  IN   0x831e30cd3f8fa60c66af44a565065268546321d10 Ether0.000387648444
0xd33a33f80e1b7526968f5889e9a1703bc2da7a895e9e18e253952e46db763c4b16 mins ago0x1a0ce99ddf08310a97f4cca5d21e91d4c89f2f2a  IN   0x831e30cd3f8fa60c66af44a565065268546321d10 Ether0.000387167733
0x68b0015d8e457365a9c616b6c108accf7118a6869fb5314db8bd15bd1424368e16 mins ago0x1a0ce99ddf08310a97f4cca5d21e91d4c89f2f2a  IN   0x831e30cd3f8fa60c66af44a565065268546321d10 Ether0.000387648444
0xc9ca10c4f83c539ede03828b49487f541b9db6a5febf8b2bbfbb7da05f5817fb16 mins ago0x1a0ce99ddf08310a97f4cca5d21e91d4c89f2f2a  IN   0x831e30cd3f8fa60c66af44a565065268546321d10 Ether0.000387648444
0x51b6de84c80afef7188612167ccbfa8c7918d01cab3c4bfcbb613308f164eae216 mins ago0x1a0ce99ddf08310a97f4cca5d21e91d4c89f2f2a  IN   0x831e30cd3f8fa60c66af44a565065268546321d10 Ether0.000500315111
0x5bc20bdbb1e24a7a604ad7b0aa78f6a8d0ce2f5826b5d1764f26687c49e3b6b756 mins ago0x1a0ce99ddf08310a97f4cca5d21e91d4c89f2f2a  IN   0x831e30cd3f8fa60c66af44a565065268546321d10 Ether0.000402294888
0x948a494b34107b46474e3d0d0a059474f1dcd66a81e97ae9bc095e3f6ea17aa856 mins ago0x1a0ce99ddf08310a97f4cca5d21e91d4c89f2f2a  IN   0x831e30cd3f8fa60c66af44a565065268546321d10 Ether0.000402294888
0xf88d4ddcb5e6b2323fd4bc46e1cddf2b94063225d8a76d2b1c224d69c6911a2156 mins ago0x1a0ce99ddf08310a97f4cca5d21e91d4c89f2f2a  IN   0x831e30cd3f8fa60c66af44a565065268546321d10 Ether0.000336894999
0x202696148cec99b298f8e88e45b1ce2515987b93513a8e1a3834e27621d7ff3f56 mins ago0x1a0ce99ddf08310a97f4cca5d21e91d4c89f2f2a  IN   0x831e30cd3f8fa60c66af44a565065268546321d10 Ether0.000336894999
0xa263fd14b888984defa08cc8a03c556029e4a4380086c0b06749628d354bc61b1 hr 6 mins ago0x1a0ce99ddf08310a97f4cca5d21e91d4c89f2f2a  IN   0x831e30cd3f8fa60c66af44a565065268546321d10 Ether0.000370758888
0xaf1a2038180a58c1170cadd5e9261c314ad51669e5f3429334950127bc9b401c1 hr 6 mins ago0x1a0ce99ddf08310a97f4cca5d21e91d4c89f2f2a  IN   0x831e30cd3f8fa60c66af44a565065268546321d10 Ether0.000489473111
0xd27abe58dda730112515e7375a9c9b6b5ca63b459e7f3c3c11135b1b3f1fd5921 hr 16 mins ago0x1a0ce99ddf08310a97f4cca5d21e91d4c89f2f2a  IN   0x831e30cd3f8fa60c66af44a565065268546321d10 Ether0.000418614444
0xa61fbaed592a6c1de7bcd67beddde9f11816f0fa599d23bf30b9471d378505a41 hr 16 mins ago0x1a0ce99ddf08310a97f4cca5d21e91d4c89f2f2a  IN   0x831e30cd3f8fa60c66af44a565065268546321d10 Ether0.000540281111
0x9654b8667e9057f4eac91006485031126ef74a4ec0ff3a3851498ea6c83054e61 hr 56 mins ago0x1a0ce99ddf08310a97f4cca5d21e91d4c89f2f2a  IN   0x831e30cd3f8fa60c66af44a565065268546321d10 Ether0.000303098888
0x9fb303a204cf78e936c305a96fd1e89509105ff7707c6021e4cded7c775147751 hr 56 mins ago0x1a0ce99ddf08310a97f4cca5d21e91d4c89f2f2a  IN   0x831e30cd3f8fa60c66af44a565065268546321d10 Ether0.000303098888
0xef0892db898f2651efd426d93426f31f4ca04f023e4e9ca6a7c77d11283fbbd71 hr 56 mins ago0x1a0ce99ddf08310a97f4cca5d21e91d4c89f2f2a  IN   0x831e30cd3f8fa60c66af44a565065268546321d10 Ether0.000253824999
0x79b205098718e2acfe6da4c2ea6b6575b0b8aaef69d5de5e5ff03d981a8f5dfa1 hr 56 mins ago0x1a0ce99ddf08310a97f4cca5d21e91d4c89f2f2a  IN   0x831e30cd3f8fa60c66af44a565065268546321d10 Ether0.000253824999
0x83ea03b80ba3d7a2ca7fe50a3cddfc1a235b0793f2e1ae55d16e5f7eab5f699a2 hrs 6 mins ago0x1a0ce99ddf08310a97f4cca5d21e91d4c89f2f2a  IN   0x831e30cd3f8fa60c66af44a565065268546321d10 Ether0.000279338888
0xcca90e235344a8e6b3c8971aaac088d089ddb2870617de076161717bd4d5b0472 hrs 6 mins ago0x1a0ce99ddf08310a97f4cca5d21e91d4c89f2f2a  IN   0x831e30cd3f8fa60c66af44a565065268546321d10 Ether0.000368781111
0xcfb98023b5b7d3cd66458fd3972e3923a0b545a99fe25205f9667422ea68f9ef2 hrs 16 mins ago0x1a0ce99ddf08310a97f4cca5d21e91d4c89f2f2a  IN   0x831e30cd3f8fa60c66af44a565065268546321d10 Ether0.000315394444
[ Download CSV Export  ] 
 Internal Transactions as a result of Contract Execution
 Latest 15 Internal Transactions

ParentTxHash Block Age From To Value
0xfeff04f43100d49bdb09de4bce3173480afa993bbd0541b360697a655cdbb806936743668 days 16 hrs ago0x831e30cd3f8fa60c66af44a565065268546321d10x2ee07553782f210de0babb66c055f47b8e5e5a3c0 Ether
0x33e8d40d72033dd3b3dbee26bb4a058a0af0ca3228c25ef405a60b27b4efbe6d936743268 days 16 hrs ago0x831e30cd3f8fa60c66af44a565065268546321d10x2ee07553782f210de0babb66c055f47b8e5e5a3c0 Ether
0xa90e5bc6b6e2931cfaf11e8ec5aa99bcbce4c7385eec0ea85a38170808aa741a936742868 days 16 hrs ago0x831e30cd3f8fa60c66af44a565065268546321d10x2ee07553782f210de0babb66c055f47b8e5e5a3c0 Ether
0xe2dac230edd556113a20382390039a03b448471b8cc56eb3ef0d29b937b20a31936682768 days 17 hrs ago0x831e30cd3f8fa60c66af44a565065268546321d10xb230b6a2a84d6878b0655ec0c9ec80460d6fa6f00.08 Ether
0x72f323cc87d60813190e20bb4e8d764683e93d76ecb622c972abdd8dc402ab02923286982 days 12 hrs ago0x831e30cd3f8fa60c66af44a565065268546321d10x1255fa6eedb97f73bd8d2cfab4f98310e171138c0 Ether
0xa3f97fcb41209ff1118ee7a63a13359322139e14a55d8ef96623a62334e59722917247288 days 15 hrs ago0x831e30cd3f8fa60c66af44a565065268546321d10x2ee07553782f210de0babb66c055f47b8e5e5a3c0 Ether
0x95d44df4ce908c56ce54936691ba21b30605579ce525758da1378a42708e16d5917243988 days 15 hrs ago0x831e30cd3f8fa60c66af44a565065268546321d10x2ee07553782f210de0babb66c055f47b8e5e5a3c0 Ether
0x5d0b80cb95879c7827b5b6d870b2afa21c4348a781c3d239cb999fc7704f6c3c917243788 days 15 hrs ago0x831e30cd3f8fa60c66af44a565065268546321d10x2ee07553782f210de0babb66c055f47b8e5e5a3c0 Ether
0x92f2a5c82dcba8a675613bcb560fc94ec0b0372ab34201f4e4126ee4ed9882b7917242388 days 15 hrs ago0x831e30cd3f8fa60c66af44a565065268546321d10x2ee07553782f210de0babb66c055f47b8e5e5a3c0 Ether
0x20349f2a631f23ebef746a29e565ab4199a704cabdd17dc861b0a5e2c1f74938917239188 days 15 hrs ago0x831e30cd3f8fa60c66af44a565065268546321d10x2ee07553782f210de0babb66c055f47b8e5e5a3c0 Ether
0x23d342b573fc0a745c91dfae4dbfc5f2047bcf1904709709a7059c5a62c03609917238788 days 15 hrs ago0x831e30cd3f8fa60c66af44a565065268546321d10x2ee07553782f210de0babb66c055f47b8e5e5a3c0 Ether
0xc452194d57ec43a9fe06d21125d5b9b05b808885453d26709a067f24dbd333f3917047188 days 20 hrs ago0x831e30cd3f8fa60c66af44a565065268546321d10x2ee07553782f210de0babb66c055f47b8e5e5a3c0 Ether
0xbb0c69db447228f8fd81c71cb8e7a53209a3e808a58e6bc7390e3daad90f75a7917046388 days 20 hrs ago0x831e30cd3f8fa60c66af44a565065268546321d10x2ee07553782f210de0babb66c055f47b8e5e5a3c0 Ether
0xb21e1bb5015cc0b8110ae89c591a40addffe0a74b0a8c33142c4ebfccbf24655911592494 days 13 hrs ago0x831e30cd3f8fa60c66af44a565065268546321d10x2ee07553782f210de0babb66c055f47b8e5e5a3c0 Ether
0x5f78f8a2a97a6eb80f0c92e36b631a6afd7cd68ff65976d569aeb274689ec6a6911591094 days 13 hrs ago0x831e30cd3f8fa60c66af44a565065268546321d10x2ee07553782f210de0babb66c055f47b8e5e5a3c0 Ether
[ Download CSV Export  ] 
Contract Source Code Verified (Exact Match)
Contract Name: Auction
Compiler Text: v0.4.25+commit.59dbf8f1
Optimization Enabled: Yes
Runs (Optimiser):  200



  Contract Source Code   Find Similiar Contracts

pragma solidity ^0.4.24;

contract SafeMath {
    function safeMul(uint a, uint b) internal pure returns (uint) {
        uint c = a * b;
        assert(a == 0 || c / a == b);
        return c;
    }

    function safeSub(uint a, uint b) internal pure returns (uint) {
        assert(b <= a);
        return a - b;
    }

    function safeAdd(uint a, uint b) internal pure returns (uint) {
        uint c = a + b;
        assert(c>=a && c>=b);
        return c;
    }

    function is112bit(uint x) internal pure returns (bool) {
        if (x < 1 << 112) {
            return true;
        } else {
            return false;
        }
    }

    function is32bit(uint x) internal pure returns (bool) {
        if (x < 1 << 32) {
            return true;
        } else {
            return false;
        }
    }
}

contract Token {
    function totalSupply() constant returns (uint256 supply) {}
    function balanceOf(address _owner) constant returns (uint256 balance) {}
    function transfer(address _to, uint256 _value) returns (bool success) {}
    function transferFrom(address _from, address _to, uint256 _value) returns (bool success) {}
    function approve(address _spender, uint256 _value) returns (bool success) {}
    function allowance(address _owner, address _spender) constant returns (uint256 remaining) {}

    event Transfer(address indexed _from, address indexed _to, uint256 _value);
    event Approval(address indexed _owner, address indexed _spender, uint256 _value);

    uint public decimals;
    string public name;
}

// ERC-20 token contract with no return value for transfer(), approve() and transferFrom()
contract NoReturnToken {
    function totalSupply() constant returns (uint256 supply) {}
    function balanceOf(address _owner) constant returns (uint256 balance) {}
    function transfer(address _to, uint256 _value) {}
    function transferFrom(address _from, address _to, uint256 _value) {}
    function approve(address _spender, uint256 _value) {}
    function allowance(address _owner, address _spender) constant returns (uint256 remaining) {}

    event Transfer(address indexed _from, address indexed _to, uint256 _value);
    event Approval(address indexed _owner, address indexed _spender, uint256 _value);

    uint public decimals;
    string public name;
}

// Allows smoother migration to a new version of the auction smart contract via migrate()
contract NewAuction {
    function depositForUser(address _user) payable {}
    function depositTokenForUser(address _user, address _token, uint _amount) {}
}



contract Auction is SafeMath {
    // ALl the data relevant to the auctions for one specific token
    struct TokenAuction {
        mapping (uint => uint) buyOrders;
        uint buyCount;
        mapping (uint => uint) sellOrders;
        uint sellCount;

        uint maxVolume; // The maximum volume of orders that can be filled in the current auction
        uint maxVolumePrice; // The price at which orders will be filled in the current auction
        uint maxVolumePriceB; // Buy orders below this price cannot be filled as orders are first prioritised by price
        uint maxVolumePriceS; // Sell orders above this price cannot be filled as orders are first prioritised by price
        bool toBeExecuted; // The auction is ready for execution
        bool activeAuction; // There is an ongoing auction for the token
        uint executionIndex; // The index for the next order that needs to be executed in the auction, using storage is necessary to allow batches in separate transactions
        uint executionBuyVolume; // The volume filled so far on the buy side in the current auction
        uint executionSellVolume; // The volume filled so far on the sell side in the current auction
        uint auctionIndex; // The index for the current auction

        mapping (uint => mapping (uint => uint)) checkAuctionIndex; // The auction index when checkVolume() was last called with the given price limits
        mapping (uint => mapping (uint => uint)) checkIndex; // The index for the next order to be processed in checkVolume() for the given price limits
        mapping (uint => mapping (uint => uint)) checkBuyVolume; // The volume of buy orders that can be filled so far in checkVolume() for the given price limits
        mapping (uint => mapping (uint => uint)) checkSellVolume; // The volume of sell orders that can be filled so far in checkVolume() for the given price limits

        uint minimumOrder;

        bool supported;
        bool lastAuction; // Whether token is to be removed after the next auction
        bool everSupported; // Whether the token has ever been supported by this contract

        uint nextAuctionTime;
        uint checkDuration;
        bool startedReveal;
        bool startedCheck;
        bool startedExecute;

        uint onchainBuyCount; // Orders after this index are offchain and have tier 2/3 fees
        uint onchainSellCount; // Orders after this index are offchain and have tier 2/3 fees
        uint publicBuyCount; // Orders after this index are hidden and have tier 3 fees
        uint publicSellCount; // Orders after this index are hidden and have tier 3 fees
        uint revealDuration;

        uint decimals;
        uint unit;

        uint lastPrice;

        bool noReturnTransfer; // Whether the token implementation is missing the return value in transfer()
        bool noReturnApprove; // Whether the token implementation is missing the return value in approve()
        bool noReturnTransferFrom; // Whether the token implementation is missing the return value in transferFrom()
        bool autoWithdrawDisabled;
    }

    mapping (address => TokenAuction) token;

    address[] indexToAddress; // List of user IDs for more efficient storage
    mapping (address => uint32) public addressToIndex;
    address admin;
    address operator;
    mapping (address => mapping (address => uint)) public balances; // Address 0 represents the Ether balance
    bool constant developmentTiming = false; // Timing checks are disabled when true, to make testing easier during development
    uint[] public fees; // Multiplied by (1 ether). Three tiers: On-chain, Off-Chain Public, Off-Chain Hidden
    address feeAccount;
    bool feeAccountFinalised; // If true, the fee account can no longer be changed
    address[] tokenList;
    uint public activeAuctionCount = 0; // The number of auctions that are currently active (either running or in the check/reveal/execute period)
    uint public revealingAuctionCount = 0; // The number of auctions that are currently in their reveal period
    mapping (address => uint) public signedWithdrawalNonce;
    mapping (address => bool) public autoWithdraw;
    mapping (address => bool) public staticAutoWithdraw;
    mapping (address => bool) public verifiedContract;

    uint[] reserve; // An array used as a gas reserve

    event BuyOrderPosted(address indexed tokenAddress, uint indexed auctionIndex, address indexed userAddress, uint orderIndex, uint price, uint amount);
    event BuyOrderRemoved(address indexed tokenAddress, uint indexed auctionIndex, address indexed userAddress, uint orderIndex);
    event SellOrderPosted(address indexed tokenAddress, uint indexed auctionIndex, address indexed userAddress, uint orderIndex, uint price, uint amount);
    event SellOrderRemoved(address indexed tokenAddress, uint indexed auctionIndex, address indexed userAddress, uint orderIndex);
    event Deposit(address indexed tokenAddress, address indexed userAddress, uint amount);
    event Withdrawal(address indexed tokenAddress, address indexed userAddress, uint amount);
    event AuctionHistory(address indexed tokenAddress, uint indexed auctionIndex, uint auctionTime, uint price, uint volume);

    function Auction(address a) {
        admin = a;
        indexToAddress.push(0);
        operator = a;
        feeAccount = a;
        fees.push(0);
        fees.push(0);
        fees.push(0);
    }

    function addToken(address t, uint min) external {
        require(msg.sender == operator);
        require(t > 0);
        if (!token[t].everSupported) {
            tokenList.push(t);
        }
        token[t].supported = true;
        token[t].everSupported = true;
        token[t].lastAuction = false;
        token[t].minimumOrder = min;
        if (token[t].unit == 0) {
            token[t].decimals = Token(t).decimals();
            token[t].unit = 10**token[t].decimals;
        }
    }

    function setNoReturnToken(address t, bool nrt, bool nra, bool nrtf) external {
        require(msg.sender == operator);
        token[t].noReturnTransfer = nrt;
        token[t].noReturnApprove = nra;
        token[t].noReturnTransferFrom = nrtf;
    }

    function removeToken(address t) external {
        require(msg.sender == operator);
        token[t].lastAuction = true;
    }

    function changeAdmin(address a) external {
        require(msg.sender == admin);
        admin = a;
    }

    function changeOperator(address a) external {
        require(msg.sender == admin);
        operator = a;
    }

    function changeFeeAccount(address a) external {
        require(msg.sender == admin);
        // Check if there are any ongoing auctions, otherwise the feeAccountBalance could cause problems
        require(activeAuctionCount == 0);
        require(!feeAccountFinalised);
        feeAccount = a;
    }

    // Finalising the fee account allows giving the fees to a smart contract with no ability to change it
    function finaliseFeeAccount() external {
        require(msg.sender == admin);
        feeAccountFinalised = true;
    }

    function changeMinimumOrder(address t, uint x) external {
        require(msg.sender == operator);
        require(token[t].supported);
        token[t].minimumOrder = x;
    }

    function changeFees(uint[] f) external {
        require(msg.sender == operator);
        // Check if there are any ongoing auctions
        require(activeAuctionCount == 0);
        // Check that all fees are at most 1%
        for (uint i=0; i < f.length; i++) {
            require(f[i] < (10 finney));
        }
        fees = f;
    }

    // There are three tiers of fees: On-Chain, Off-Chain Public and Off-Chain Hidden
    function feeForBuyOrder(address t, uint i) public view returns (uint) {
        if (i < token[t].onchainBuyCount) {
            return fees[0];
        } else {
            if (i < token[t].publicBuyCount) {
                return fees[1];
            } else {
                return fees[2];
            }
        }
    }

    function feeForSellOrder(address t, uint i) public view returns (uint) {
        if (i < token[t].onchainSellCount) {
            return fees[0];
        } else {
            if (i < token[t].publicSellCount) {
                return fees[1];
            } else {
                return fees[2];
            }
        }
    }

    function isAuctionTime(address t) public view returns (bool) {
        if (developmentTiming) { return true; }
        return (block.timestamp < token[t].nextAuctionTime) && (!token[t].startedReveal);
    }

    function isRevealTime(address t) public view returns (bool) {
        if (developmentTiming) { return true; }
        return (block.timestamp >= token[t].nextAuctionTime || token[t].startedReveal) && (block.timestamp < token[t].nextAuctionTime + token[t].revealDuration && !token[t].startedCheck);
    }

    function isCheckingTime(address t) public view returns (bool) {
        if (developmentTiming) { return true; }
        return (block.timestamp >= token[t].nextAuctionTime + token[t].revealDuration || token[t].startedCheck) && (block.timestamp < token[t].nextAuctionTime + token[t].revealDuration + token[t].checkDuration && !token[t].startedExecute);
    }

    function isExecutionTime(address t) public view returns (bool) {
        if (developmentTiming) { return true; }
        return (block.timestamp >= token[t].nextAuctionTime + token[t].revealDuration + token[t].checkDuration || token[t].startedExecute);
    }

    function setDecimals(address t, uint x) public {
        require(msg.sender == operator);
        require(token[t].unit == 0);
        token[t].decimals = x;
        token[t].unit = 10**x;
    }

    function addReserve(uint x) external {
        uint maxUInt = 0;
        maxUInt = maxUInt - 1;
        for (uint i=0; i < x; i++) {
            reserve.push(maxUInt);
        }
    }

    function useReserve(uint x) private {
        require(x <= reserve.length);
        reserve.length = reserve.length - x;
    }



    function startAuction(address t, uint auctionTime, uint revealDuration, uint checkDuration) external {
        require(msg.sender == operator);
        require(token[t].supported);
        // Disabling startAuction() during Reveal periods ensures that there will always be a time when withdrawals are allowed, even with a malicious operator
        require(revealingAuctionCount == 0);
        require(isExecutionTime(t) || token[t].nextAuctionTime == 0);
        require(!token[t].toBeExecuted);
        require(!token[t].activeAuction);
        require(auctionTime > block.timestamp || developmentTiming);
        require(auctionTime <= block.timestamp + 7 * 24 * 3600 || developmentTiming);
        require(revealDuration <= 24 * 3600);
        require(checkDuration <= 24 * 3600);
        require(checkDuration >= 5 * 60);
        token[t].nextAuctionTime = auctionTime;
        token[t].revealDuration = revealDuration;
        token[t].checkDuration = checkDuration;
        token[t].startedReveal = false;
        token[t].startedCheck = false;
        token[t].startedExecute = false;
        uint maxUInt = 0;
        maxUInt = maxUInt - 1;
        token[t].onchainBuyCount = maxUInt;
        token[t].onchainSellCount = maxUInt;
        token[t].publicBuyCount = maxUInt;
        token[t].publicSellCount = maxUInt;
        token[t].activeAuction = true;
        activeAuctionCount++;
    }

    function buy_(address t, address u, uint p, uint a, uint buyCount) private {
        require(is112bit(p));
        require(is112bit(a));
        require(token[t].supported);
        require(t != address(0));
        require(u != feeAccount); // Fee account balance is handled separately in executeAuction()
        // Appropriate timing constraints are in buy() and revealBuy() methods
        uint index = addressToIndex[u];
        require(index != 0);
        uint balance = balances[0][u];
        uint cost = safeMul(p, a) / (token[t].unit);
        require(safeMul(cost, token[t].unit) == safeMul(p, a));
        uint fee = feeForBuyOrder(t, buyCount);
        uint totalCost = safeAdd(cost, safeMul(cost, fee) / (1 ether));
        require(balance >= totalCost);
        require(cost >= token[0].minimumOrder);
        require(a >= token[t].minimumOrder);
        balances[0][u] = safeSub(balance, totalCost);
        token[t].buyOrders[buyCount] = (((index << 112) | p) << 112) | a;
        emit BuyOrderPosted(t, token[t].auctionIndex, u, buyCount, p, a);
    }

    function sell_(address t, address u, uint p, uint a, uint sellCount) private {
        require(is112bit(p));
        require(is112bit(a));
        require(token[t].supported);
        require(t != address(0));
        require(u != feeAccount);
        // Appropriate timing constraints are in sell() and revealSell() methods
        uint index = addressToIndex[u];
        require(index != 0);
        uint balance = balances[t][u];
        require(balance >= a);
        uint cost = safeMul(p, a) / (token[t].unit);
        require(safeMul(cost, token[t].unit) == safeMul(p, a));
        require(cost >= token[0].minimumOrder);
        require(a >= token[t].minimumOrder);
        balances[t][u] = safeSub(balance, a);
        token[t].sellOrders[sellCount] = (((index << 112) | p) << 112) | a;
        emit SellOrderPosted(t, token[t].auctionIndex, u, sellCount, p, a);
    }

    function buy(address t, uint p, uint a) public {
        require(isAuctionTime(t));
        uint buyCount = token[t].buyCount;
        buy_(t, msg.sender, p, a, buyCount);
        token[t].buyCount = buyCount + 1;
    }

    function sell(address t, uint p, uint a) public {
        require(isAuctionTime(t));
        uint sellCount = token[t].sellCount;
        sell_(t, msg.sender, p, a, sellCount);
        token[t].sellCount = sellCount + 1;
    }

    function depositAndBuy(address t, uint p, uint a) external payable {
        deposit();
        buy(t, p, a);
        if (!staticAutoWithdraw[msg.sender] && !autoWithdraw[msg.sender]) {
            autoWithdraw[msg.sender] = true;
        }
    }

    function depositAndSell(address t, uint p, uint a, uint depositAmount) external {
        depositToken(t, depositAmount);
        sell(t, p, a);
        if (!staticAutoWithdraw[msg.sender] && !autoWithdraw[msg.sender]) {
            autoWithdraw[msg.sender] = true;
        }
    }

    function removeBuy(address t, uint i) external {
        require(token[t].supported);
        require(isAuctionTime(t));
        uint index = addressToIndex[msg.sender];
        require(index != 0);
        uint order = token[t].buyOrders[i];
        require(order >> 224 == index);
        uint cost = safeMul(((order << 32) >> 144), ((order << 144) >> 144)) / (token[t].unit);
        uint totalCost = safeAdd(cost, safeMul(cost, feeForBuyOrder(t, i)) / (1 ether));
        balances[0][msg.sender] = safeAdd(balances[0][msg.sender], totalCost);
        token[t].buyOrders[i] &= (((1 << 144) - 1) << 112);
        emit BuyOrderRemoved(t, token[t].auctionIndex, msg.sender, i);
    }

    function removeSell(address t, uint i) external {
        require(token[t].supported);
        require(isAuctionTime(t));
        uint index = addressToIndex[msg.sender];
        require(index != 0);
        uint order = token[t].sellOrders[i];
        require(order >> 224 == index);
        balances[t][msg.sender] = safeAdd(balances[t][msg.sender], (order << 144) >> 144);
        token[t].sellOrders[i] &= (((1 << 144) - 1) << 112);
        emit SellOrderRemoved(t, token[t].auctionIndex, msg.sender, i);
    }

    // The operator needs to finalise the on-chain orders by calling this function so that the optimal price can be calculated and the operator can filter the off-chain orders based on that price (off-chain orders that would not get filled are not submitted to the blockchain to reduce transaction fees)
    function startReveal(address t) external {
        require(msg.sender == operator);
        require(isRevealTime(t));
        require(!token[t].startedReveal);
        revealingAuctionCount++;
        token[t].startedReveal = true;
    }

    // The smart contract needs to know in advance which off-chain orders are visible and which are hidden, since they can have different fees
    // Off-chain orders are sorted so that all visible orders come before the hidden orders and submitting the count for the total number of visible orders is enough to tell which off-chain orders are visible and hidden
    function revealPublicOrdersCount(address t, uint pbc, uint psc) external {
        require(msg.sender == operator);
        require(isRevealTime(t));
        require(token[t].startedReveal);
        require(pbc >= token[t].buyCount);
        require(psc >= token[t].sellCount);
        require(token[t].onchainBuyCount > token[t].buyCount); // This ensures the function can only be called once per auction
        require(token[t].onchainSellCount > token[t].sellCount); // This ensures the function can only be called once per auction
        token[t].onchainBuyCount = token[t].buyCount;
        token[t].onchainSellCount = token[t].sellCount;
        token[t].publicBuyCount = pbc;
        token[t].publicSellCount = psc;
    }

    function recoverHashSignatory(address t, bytes type_, uint price, uint amount, uint id, uint8 v, bytes32 r, bytes32 s) public pure returns (address) {
        bytes32 hash = keccak256(abi.encodePacked(type_, amount, t, price, id));
        address signatory = ecrecover(keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)), v, r, s);
        require(signatory != address(0));
        return signatory;
    }

    function recoverTypedSignatory(address t, bytes type_, uint price, uint amount, uint id, uint8 v, bytes32 r, bytes32 s) public pure returns (address) {
        bytes32 hash = keccak256(abi.encodePacked(
          keccak256(abi.encodePacked('string Order type', 'address Token address', 'uint256 Price', 'uint256 Amount', 'uint256 Auction index')),
          keccak256(abi.encodePacked(type_, t, price, amount, id))
        ));
        address signatory = ecrecover(hash, v, r, s);
        require(signatory != address(0));
        return signatory;
    }

    // Allows the operator to reveal off-chain orders (which have two benefits: they only need to be submitted if they get filled and cost no gas otherwise, and they can optionally be hidden from other users until filled)
    function revealBuy_(address t, uint order, uint8 v, bytes32 r, bytes32 s, uint buyCount) private {
        require(msg.sender == operator);
        require(isRevealTime(t));
        require(token[t].startedReveal);
        if (buyCount > token[t].onchainBuyCount && buyCount != token[t].publicBuyCount) {
            require(order > token[t].buyOrders[buyCount - 1]); // Enforces the ordering to prevent double submission
        }
        address userAddress = indexToAddress[order >> 224];
        uint price = (order << 32) >> 144;
        uint amount = (order << 144) >> 144;
        uint id = token[t].auctionIndex;
        address signedUserAddress;
        if (buyCount < token[t].publicBuyCount) {
            signedUserAddress = recoverTypedSignatory(t, "Public buy", price, amount, id, v, r, s);
        } else {
            signedUserAddress = recoverTypedSignatory(t, "Hidden buy", price, amount, id, v, r, s);
        }
        if (signedUserAddress != userAddress) {
            if (buyCount < token[t].publicBuyCount) {
                signedUserAddress = recoverHashSignatory(t, "Public buy", price, amount, id, v, r, s);
            } else {
                signedUserAddress = recoverHashSignatory(t, "Hidden buy", price, amount, id, v, r, s);
            }
            require(signedUserAddress == userAddress);
        }
        buy_(t, userAddress, price, amount, buyCount);
    }

    function revealSell_(address t, uint order, uint8 v, bytes32 r, bytes32 s, uint sellCount) private {
        require(msg.sender == operator);
        require(isRevealTime(t));
        require(token[t].startedReveal);
        if (sellCount > token[t].onchainSellCount && sellCount != token[t].publicSellCount) {
            require(order > token[t].sellOrders[sellCount - 1]); // Enforces the ordering to prevent double submission
        }
        address userAddress = indexToAddress[order >> 224];
        uint price = (order << 32) >> 144;
        uint amount = (order << 144) >> 144;
        uint id = token[t].auctionIndex;
        address signedUserAddress;
        if (sellCount < token[t].publicSellCount) {
            signedUserAddress = recoverTypedSignatory(t, "Public sell", price, amount, id, v, r, s);
        } else {
            signedUserAddress = recoverTypedSignatory(t, "Hidden sell", price, amount, id, v, r, s);
        }
        if (signedUserAddress != userAddress) {
            if (sellCount < token[t].publicSellCount) {
                signedUserAddress = recoverHashSignatory(t, "Public sell", price, amount, id, v, r, s);
            } else {
                signedUserAddress = recoverHashSignatory(t, "Hidden sell", price, amount, id, v, r, s);
            }
            require(signedUserAddress == userAddress);
        }
        sell_(t, userAddress, price, amount, sellCount);
    }

    // The operator can submit off-chain orders in batches to reduce gas use
    function revealBuys(address t, uint[] order, uint8[] v, bytes32[] r, bytes32[] s, uint reserveUsage) external {
        uint buyCount = token[t].buyCount;
        for (uint i = 0; i < order.length; i++) {
            revealBuy_(t, order[i], v[i], r[i], s[i], buyCount);
            buyCount++;
        }
        token[t].buyCount = buyCount;
        useReserve(reserveUsage);
    }

    function revealSells(address t, uint[] order, uint8[] v, bytes32[] r, bytes32[] s, uint reserveUsage) external {
        uint sellCount = token[t].sellCount;
        for (uint i = 0; i < order.length; i++) {
            revealSell_(t, order[i], v[i], r[i], s[i], sellCount);
            sellCount++;
        }
        token[t].sellCount = sellCount;
        useReserve(reserveUsage);
    }



    // Note: Excluding the tokenAddress parameter is necessary to prevent stack overflow when executing a successful sell order
    function addEtherBalance_(address userAddress, uint amount) private {
        bool withdrawn = false;
        if (amount > 0) {
            if (autoWithdraw[userAddress] && !token[0].autoWithdrawDisabled) {
                uint size;
                assembly {size := extcodesize(userAddress)}
                if (size == 0) {
                    withdrawn = userAddress.send(amount);
                }
            }
            if (!withdrawn) {
                balances[0][userAddress] = safeAdd(balances[0][userAddress], amount);
            }
        }
    }

    function addTokenBalance_(address tokenAddress, address userAddress, uint amount) private {
        require(tokenAddress != address(0));
        bool withdrawn = false;
        if (amount > 0) {
            if (autoWithdraw[userAddress] && !token[tokenAddress].autoWithdrawDisabled) {
                if (!token[tokenAddress].noReturnTransfer) {
                    withdrawn = Token(tokenAddress).transfer(userAddress, amount);
                }
            }
            if (!withdrawn) {
                balances[tokenAddress][userAddress] = safeAdd(balances[tokenAddress][userAddress], amount);
            }
        }
    }

    // Checks the volume for the given limit prices for buy and sell orders
    function checkVolume(address t, uint pb, uint ps, uint limit, uint reserveUsage) external {
        require(is112bit(pb));
        require(is112bit(ps));
        require(ps <= pb);
        require(token[t].supported);
        require(isCheckingTime(t));
        require(token[t].startedReveal);
        if (!token[t].startedCheck) {
            revealingAuctionCount = safeSub(revealingAuctionCount, 1);
            token[t].startedCheck = true;
        }
        if (token[t].checkAuctionIndex[pb][ps] < token[t].auctionIndex) {
            token[t].checkIndex[pb][ps] = 0;
            token[t].checkBuyVolume[pb][ps] = 0;
            token[t].checkSellVolume[pb][ps] = 0;
            token[t].checkAuctionIndex[pb][ps] = token[t].auctionIndex;
        }
        uint buyVolume = token[t].checkBuyVolume[pb][ps];
        uint order;
        for (uint i = token[t].checkIndex[pb][ps]; (i < safeAdd(token[t].checkIndex[pb][ps], limit)) && (i < token[t].buyCount); i++) {
            order = token[t].buyOrders[i];
            if ((order << 32) >> 144 >= pb) {
                buyVolume += (order << 144) >> 144;
            }
        }
        uint sellVolume = token[t].checkSellVolume[pb][ps];
        for (i = token[t].checkIndex[pb][ps]; (i < safeAdd(token[t].checkIndex[pb][ps], limit)) && (i < token[t].sellCount); i++) {
            order = token[t].sellOrders[i];
            if ((order << 32) >> 144 <= ps) {
                sellVolume += (order << 144) >> 144;
            }
        }
        token[t].checkIndex[pb][ps] = safeAdd(token[t].checkIndex[pb][ps], limit);
        if ((token[t].checkIndex[pb][ps] >= token[t].buyCount) && (token[t].checkIndex[pb][ps] >= token[t].sellCount)) {
            uint volume;
            if (buyVolume < sellVolume) {
                volume = buyVolume;
            } else {
                volume = sellVolume;
            }
            if (volume > token[t].maxVolume || (volume == token[t].maxVolume && pb > token[t].maxVolumePriceB) || (volume == token[t].maxVolume && pb == token[t].maxVolumePriceB && ps < token[t].maxVolumePriceS)) {
                token[t].maxVolume = volume;
                if (buyVolume > sellVolume) {
                    token[t].maxVolumePrice = pb;
                } else {
                    if (sellVolume > buyVolume) {
                        token[t].maxVolumePrice = ps;
                    } else {
                        token[t].maxVolumePrice = ps;
                        token[t].maxVolumePrice += (pb - ps) / 2;
                    }
                }
                token[t].maxVolumePriceB = pb;
                token[t].maxVolumePriceS = ps;
            }
            // Requires a final call from the operator to confirm the auction, in order to prevent potential spam attacks
            // The optimal price from the received submissions will still be chosen, but this ensures that the operator's price suggestion is always considered
            if (msg.sender == operator) {
                token[t].toBeExecuted = true;
            }
        } else {
            token[t].checkBuyVolume[pb][ps] = buyVolume;
            token[t].checkSellVolume[pb][ps] = sellVolume;
        }
        if (msg.sender == operator) {
            useReserve(reserveUsage);
        }
    }

    function executeAuction(address t, uint limit, uint reserveUsage) external {
        require(isExecutionTime(t));
        require(token[t].supported);
        require(token[t].activeAuction);
        // Set flags that allow withdrawal even if no checkVolume() call was made in the Check period
        if (!token[t].startedCheck) {
            // Only decrement revealingAuctionCount if it was incremented by startReveal()
            if (token[t].startedReveal) {
                revealingAuctionCount = safeSub(revealingAuctionCount, 1);
            }
            token[t].startedCheck = true;
        }
        // If the auction could not be confirmed, execution is avoided by setting the volume to zero
        if (!token[t].toBeExecuted) {
            token[t].maxVolume = 0;
        }
        if (!token[t].startedExecute) {
            token[t].startedExecute = true;
        }
        uint amount;
        uint volume = token[t].executionBuyVolume;
        uint[6] memory current; // A memory array is required to avoid stack overflow, index descriptions below:
        // [0] - currentOrder
        // [1] - currentCost
        // [2] - currentTotalCost
        // [3] - currentNewCost
        // [4] - currentNewTotalCost
        // [5] - currentFee
        uint feeAccountBalance = balances[0][feeAccount];
        address currentAddress;
        for (uint i = token[t].executionIndex; (i < safeAdd(token[t].executionIndex, limit)) && (i < token[t].buyCount); i++) {
            current[0] = token[t].buyOrders[i];
            currentAddress = indexToAddress[current[0] >> 224];
            if ((current[0] << 32) >> 144 >= token[t].maxVolumePriceB && volume < token[t].maxVolume) {
                // If the order gets filled
                amount = (current[0] << 144) >> 144;
                volume += amount;
                if (volume > token[t].maxVolume) {
                    // If the volume overflows, return the difference
                    current[1] = safeMul((current[0] << 32) >> 144, amount) / (token[t].unit);
                    current[2] = safeAdd(current[1], safeMul(current[1], feeForBuyOrder(t, i)) / (1 ether));
                    amount = safeSub(amount, safeSub(volume, token[t].maxVolume));
                    current[3] = safeMul((current[0] << 32) >> 144, amount) / (token[t].unit);
                    current[4] = safeAdd(current[3], safeMul(current[3], feeForBuyOrder(t, i)) / (1 ether));
                    addEtherBalance_(currentAddress, safeSub(current[2], current[4]));
                }
                if ((current[0] << 32) >> 144 > token[t].maxVolumePrice) {
                    // If the price is different, return the difference
                    current[1] = safeMul((current[0] << 32) >> 144, amount) / (token[t].unit);
                    current[2] = safeAdd(current[1], safeMul(current[1], feeForBuyOrder(t, i)) / (1 ether));
                    current[3] = safeMul(token[t].maxVolumePrice, amount) / (token[t].unit);
                    current[4] = safeAdd(current[3], safeMul(current[3], feeForBuyOrder(t, i)) / (1 ether));
                    addEtherBalance_(currentAddress, safeSub(current[2], current[4]));
                }
                // Add the correct amount of tokens
                addTokenBalance_(t, currentAddress, amount);
                current[5] = safeMul(safeMul(token[t].maxVolumePrice, amount) / (token[t].unit), feeForBuyOrder(t, i)) / (1 ether);
                feeAccountBalance += current[5];
            } else {
                // If there is no liquidity left to fill the order, return the whole amount
                current[1] = safeMul((current[0] << 32) >> 144, (current[0] << 144) >> 144) / (token[t].unit);
                current[2] = safeAdd(current[1], safeMul(current[1], feeForBuyOrder(t, i)) / (1 ether));
                addEtherBalance_(currentAddress, current[2]);
            }
        }
        token[t].executionBuyVolume = volume;
        volume = token[t].executionSellVolume;
        for (i = token[t].executionIndex; (i < safeAdd(token[t].executionIndex, limit)) && (i < token[t].sellCount); i++) {
            current[0] = token[t].sellOrders[i];
            currentAddress = indexToAddress[current[0] >> 224];
            if ((current[0] << 32) >> 144 <= token[t].maxVolumePriceS && volume < token[t].maxVolume) {
                // If the order gets filled
                amount = (current[0] << 144) >> 144;
                volume += amount;
                if (volume > token[t].maxVolume) {
                    // If the volume overflows, return the difference
                    addTokenBalance_(t, currentAddress, safeSub(volume, token[t].maxVolume));
                    amount = safeSub(amount, safeSub(volume, token[t].maxVolume));
                }
                // Add the correct amount of ether
                current[5] = safeMul(safeMul(token[t].maxVolumePrice, amount) / (token[t].unit), feeForSellOrder(t, i)) / (1 ether);
                addEtherBalance_(currentAddress, safeSub(safeMul(token[t].maxVolumePrice, amount) / (token[t].unit), current[5]));
                feeAccountBalance += current[5];
            } else {
                // If there is no liquidity left to fill the order, return the whole amount
                addTokenBalance_(t, currentAddress, (current[0] << 144) >> 144);
            }
        }
        token[t].executionSellVolume = volume;
        balances[0][feeAccount] = feeAccountBalance;
        token[t].executionIndex = safeAdd(token[t].executionIndex, limit);
        if ((token[t].executionIndex >= token[t].buyCount) && (token[t].executionIndex >= token[t].sellCount)) {
            if (token[t].maxVolume > 0) {
                token[t].lastPrice = token[t].maxVolumePrice;
                emit AuctionHistory(t, token[t].auctionIndex, token[t].nextAuctionTime, token[t].maxVolumePrice, token[t].maxVolume);
            }
            token[t].buyCount = 0;
            token[t].sellCount = 0;
            token[t].maxVolume = 0;
            token[t].executionIndex = 0;
            token[t].executionBuyVolume = 0;
            token[t].executionSellVolume = 0;
            token[t].toBeExecuted = false;
            token[t].activeAuction = false;
            token[t].auctionIndex++;
            activeAuctionCount = safeSub(activeAuctionCount, 1);
            if (token[t].lastAuction) {
                token[t].supported = false;
            }
        }
        useReserve(reserveUsage);
    }



    function register_() private returns (uint32) {
        require(is32bit(indexToAddress.length + 1));
        require(addressToIndex[msg.sender] == 0);
        uint32 index = uint32(indexToAddress.length);
        addressToIndex[msg.sender] = index;
        indexToAddress.push(msg.sender);
        return index;
    }

    function deposit() public payable {
        address index = addressToIndex[msg.sender];
        if (index == 0) {
            index = register_();
        }
        balances[0][msg.sender] = safeAdd(balances[0][msg.sender], msg.value);
        emit Deposit(0, msg.sender, msg.value);
        if (!staticAutoWithdraw[msg.sender] && autoWithdraw[msg.sender]) {
            autoWithdraw[msg.sender] = false;
        }
    }

    function withdraw(uint a) external {
        require(balances[0][msg.sender] >= a);
        // Withdrawals are not allowed while any auction is in the Reveal period
        require(revealingAuctionCount == 0);
        balances[0][msg.sender] = safeSub(balances[0][msg.sender], a);
        emit Withdrawal(0, msg.sender, a);
        require(msg.sender.send(a));
    }

    function depositToken_(address t, uint a, address u) private {
        require(t > 0);
        require(token[t].supported);
        uint32 index = addressToIndex[u];
        if (index == 0) {
            index = register_();
        }
        if (!token[t].noReturnTransferFrom) {
            require(Token(t).transferFrom(u, this, a));
        } else {
            NoReturnToken(t).transferFrom(u, this, a);
        }
        balances[t][u] = safeAdd(balances[t][u], a);
        emit Deposit(t, u, a);
        if (!staticAutoWithdraw[u] && autoWithdraw[u]) {
            autoWithdraw[u] = false;
        }
    }

    // It is necessary to call Token(t).approve(this, a) before depositToken() can complete the transfer
    function depositToken(address t, uint a) public {
        depositToken_(t, a, msg.sender);
    }

    // Automatically runs depositToken() or depositAndSell() on Token(t).approveAndCall(this, a, d)
    // Sell order is placed if the extraData in d is 64 bytes long, with the first half being the price and the second the amount
    function receiveApproval(address u, uint256 a, address t, bytes d) external {
        require(t == msg.sender);
        require(token[t].supported);
        if (d.length < 64) {
            depositToken_(t, a, u);
        } else {
            require(d.length == 64);
            uint price;
            uint amount;
            assembly { price := calldataload(164) } // Skip 4 bytes for the function identifier, 3×32 for the other parameters and 2×32 for the dynamically-sized byte array's length
            assembly { amount := calldataload(196) }
            // depositAndSell() with custom userAddress
            depositToken_(t, a, u);
            // sell() with custom userAddress
            require(isAuctionTime(t));
            uint sellCount = token[t].sellCount;
            sell_(t, u, price, amount, sellCount);
            token[t].sellCount = sellCount + 1;
            if (!staticAutoWithdraw[u] && !autoWithdraw[u]) {
                autoWithdraw[u] = true;
            }
        }
    }

    function withdrawToken(address t, uint a) external {
        require(t > 0);
        require(balances[t][msg.sender] >= a);
        // Withdrawals are not allowed while the specified token's auction is in the Reveal period
        require((!token[t].startedReveal) || (token[t].startedCheck));
        balances[t][msg.sender] = safeSub(balances[t][msg.sender], a);
        emit Withdrawal(t, msg.sender, a);
        if (!token[t].noReturnTransfer) {
            require(Token(t).transfer(msg.sender, a));
        } else {
            NoReturnToken(t).transfer(msg.sender, a);
        }
    }

    // Allows the operator to withdraw on behalf of the user when authorised by signature
    // This is a bonus feature for convenience so that the user can pay the transaction fee for withdrawal from their auction balance if they have no Ether left on their account
    function withdrawForUser(address u, address t, uint a, address feeAddress, uint fee, uint8 v, bytes32 r, bytes32 s) external {
        require(msg.sender == operator);
        require(u != address(0));
        bytes32 hash = keccak256(abi.encodePacked(t, a, feeAddress, fee, signedWithdrawalNonce[u]));
        address signatory = ecrecover(keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", hash)), v, r, s);
        require(signatory == u);
        signedWithdrawalNonce[u]++;
        balances[feeAddress][u] = safeSub(balances[feeAddress][u], fee);
        balances[feeAddress][feeAccount] = safeAdd(balances[feeAddress][feeAccount], fee);
        require(balances[t][u] >= a);
        if (t == address(0)) {
            balances[t][u] = safeSub(balances[t][u], a);
            emit Withdrawal(t, u, a);
            require(u.call.value(a)());
        } else {
            balances[t][u] = safeSub(balances[t][u], a);
            emit Withdrawal(t, u, a);
            if (!token[t].noReturnTransfer) {
                require(Token(t).transfer(u, a));
            } else {
                NoReturnToken(t).transfer(u, a);
            }
        }
    }

    function setStaticAutoWithdraw(bool b) external {
        staticAutoWithdraw[msg.sender] = b;
    }

    function setAutoWithdrawDisabled(address t, bool b) external {
        require(msg.sender == operator);
        token[t].autoWithdrawDisabled = b;
    }

    function setVerifiedContract(address c, bool b) external {
        require(msg.sender == admin);
        verifiedContract[c] = b;
    }

    // Allows the admin to claim tokens that had never been supported (and therefore could never have been deposited directly by a user, only transferred)
    // This may allow us to distribute tokens to users from large airdrops or tokens with a new smart contract
    function claimNeverSupportedToken(address t, uint a) external {
        require(!token[t].everSupported);
        require(msg.sender == admin);
        require(Token(t).balanceOf(this) >= a);
        balances[t][msg.sender] = safeAdd(balances[t][msg.sender], a);
    }

    // Allows migrating all the user's funds to an upgraded smart contract
    function migrate(address contractAddress, uint low, uint high) external {
        require(verifiedContract[contractAddress]);
        require(tokenList.length > 0);
        // Withdrawals are not allowed while any auction is in the Reveal period
        require(revealingAuctionCount == 0);
        uint amount = 0;
        if (balances[0][msg.sender] > 0) {
            amount = balances[0][msg.sender];
            balances[0][msg.sender] = 0;
            NewAuction(contractAddress).depositForUser.value(amount)(msg.sender);
        }
        uint to;
        if (high >= tokenList.length) {
            to = safeSub(tokenList.length, 1);
        } else {
            to = high;
        }
        for (uint i=low; i <= to; i++) {
            if (balances[tokenList[i]][msg.sender] > 0) {
                amount = balances[tokenList[i]][msg.sender];
                balances[tokenList[i]][msg.sender] = 0;
                if (!token[tokenList[i]].noReturnApprove) {
                    require(Token(tokenList[i]).approve(contractAddress, balances[tokenList[i]][msg.sender]));
                } else {
                    NoReturnToken(tokenList[i]).approve(contractAddress, balances[tokenList[i]][msg.sender]);
                }
                NewAuction(contractAddress).depositTokenForUser(msg.sender, tokenList[i], amount);
            }
        }
    }



    function getBalance(address t, address a) external constant returns (uint) {
        return balances[t][a];
    }

    function getBuyCount(address t) external constant returns (uint) {
        return token[t].buyCount;
    }

    function getBuyAddress(address t, uint i) external constant returns (address) {
        return indexToAddress[token[t].buyOrders[i] >> 224];
    }

    function getBuyPrice(address t, uint i) external constant returns (uint) {
        return (token[t].buyOrders[i] << 32) >> 144;
    }

    function getBuyAmount(address t, uint i) external constant returns (uint) {
        return (token[t].buyOrders[i] << 144) >> 144;
    }

    function getSellCount(address t) external constant returns (uint) {
        return token[t].sellCount;
    }

    function getSellAddress(address t, uint i) external constant returns (address) {
        return indexToAddress[token[t].sellOrders[i] >> 224];
    }

    function getSellPrice(address t, uint i) external constant returns (uint) {
        return (token[t].sellOrders[i] << 32) >> 144;
    }

    function getSellAmount(address t, uint i) external constant returns (uint) {
        return (token[t].sellOrders[i] << 144) >> 144;
    }

    function getMaxVolume(address t) external constant returns (uint) {
        return token[t].maxVolume;
    }

    function getMaxVolumePriceB(address t) external constant returns (uint) {
        return token[t].maxVolumePriceB;
    }

    function getMaxVolumePriceS(address t) external constant returns (uint) {
        return token[t].maxVolumePriceS;
    }

    function getMaxVolumePrice(address t) external constant returns (uint) {
        return token[t].maxVolumePrice;
    }

    function getUserIndex(address u) external constant returns (uint) {
        return addressToIndex[u];
    }

    function getAuctionIndex(address t) external constant returns (uint) {
        return token[t].auctionIndex;
    }

    function getNextAuctionTime(address t) external constant returns (uint) {
        return token[t].nextAuctionTime;
    }

    function getLastPrice(address t) external constant returns (uint) {
        return token[t].lastPrice;
    }
}

    Contract ABI  
[{"constant":false,"inputs":[{"name":"t","type":"address"},{"name":"i","type":"uint256"}],"name":"removeBuy","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"t","type":"address"}],"name":"isAuctionTime","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"a","type":"address"}],"name":"changeOperator","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"t","type":"address"},{"name":"limit","type":"uint256"},{"name":"reserveUsage","type":"uint256"}],"name":"executeAuction","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"revealingAuctionCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"t","type":"address"},{"name":"i","type":"uint256"}],"name":"getBuyAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"t","type":"address"}],"name":"isCheckingTime","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"t","type":"address"}],"name":"getNextAuctionTime","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"f","type":"uint256[]"}],"name":"changeFees","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"t","type":"address"}],"name":"getMaxVolumePrice","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"a","type":"uint256"}],"name":"withdraw","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"t","type":"address"}],"name":"getMaxVolumePriceS","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"t","type":"address"},{"name":"a","type":"uint256"}],"name":"depositToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"t","type":"address"},{"name":"i","type":"uint256"}],"name":"removeSell","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"t","type":"address"},{"name":"i","type":"uint256"}],"name":"feeForBuyOrder","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"t","type":"address"},{"name":"i","type":"uint256"}],"name":"getBuyPrice","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"fees","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"x","type":"uint256"}],"name":"addReserve","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"t","type":"address"}],"name":"getMaxVolumePriceB","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"t","type":"address"},{"name":"order","type":"uint256[]"},{"name":"v","type":"uint8[]"},{"name":"r","type":"bytes32[]"},{"name":"s","type":"bytes32[]"},{"name":"reserveUsage","type":"uint256"}],"name":"revealSells","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"t","type":"address"}],"name":"isRevealTime","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"u","type":"address"},{"name":"t","type":"address"},{"name":"a","type":"uint256"},{"name":"feeAddress","type":"address"},{"name":"fee","type":"uint256"},{"name":"v","type":"uint8"},{"name":"r","type":"bytes32"},{"name":"s","type":"bytes32"}],"name":"withdrawForUser","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"signedWithdrawalNonce","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"t","type":"address"}],"name":"removeToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"t","type":"address"}],"name":"isExecutionTime","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"t","type":"address"},{"name":"p","type":"uint256"},{"name":"a","type":"uint256"}],"name":"sell","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"a","type":"address"}],"name":"changeFeeAccount","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"activeAuctionCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"c","type":"address"},{"name":"b","type":"bool"}],"name":"setVerifiedContract","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"t","type":"address"},{"name":"i","type":"uint256"}],"name":"getSellAmount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"t","type":"address"},{"name":"x","type":"uint256"}],"name":"setDecimals","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"finaliseFeeAccount","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"verifiedContract","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"a","type":"address"}],"name":"changeAdmin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"u","type":"address"},{"name":"a","type":"uint256"},{"name":"t","type":"address"},{"name":"d","type":"bytes"}],"name":"receiveApproval","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"t","type":"address"},{"name":"type_","type":"bytes"},{"name":"price","type":"uint256"},{"name":"amount","type":"uint256"},{"name":"id","type":"uint256"},{"name":"v","type":"uint8"},{"name":"r","type":"bytes32"},{"name":"s","type":"bytes32"}],"name":"recoverTypedSignatory","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"name":"t","type":"address"},{"name":"pbc","type":"uint256"},{"name":"psc","type":"uint256"}],"name":"revealPublicOrdersCount","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"t","type":"address"},{"name":"i","type":"uint256"}],"name":"getSellPrice","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"t","type":"address"},{"name":"b","type":"bool"}],"name":"setAutoWithdrawDisabled","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"t","type":"address"},{"name":"auctionTime","type":"uint256"},{"name":"revealDuration","type":"uint256"},{"name":"checkDuration","type":"uint256"}],"name":"startAuction","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"t","type":"address"},{"name":"a","type":"uint256"}],"name":"withdrawToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"t","type":"address"}],"name":"getMaxVolume","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"t","type":"address"},{"name":"p","type":"uint256"},{"name":"a","type":"uint256"}],"name":"buy","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"t","type":"address"}],"name":"startReveal","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"t","type":"address"},{"name":"min","type":"uint256"}],"name":"addToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"t","type":"address"},{"name":"p","type":"uint256"},{"name":"a","type":"uint256"},{"name":"depositAmount","type":"uint256"}],"name":"depositAndSell","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"t","type":"address"},{"name":"i","type":"uint256"}],"name":"feeForSellOrder","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"t","type":"address"},{"name":"p","type":"uint256"},{"name":"a","type":"uint256"}],"name":"depositAndBuy","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"name":"t","type":"address"},{"name":"type_","type":"bytes"},{"name":"price","type":"uint256"},{"name":"amount","type":"uint256"},{"name":"id","type":"uint256"},{"name":"v","type":"uint8"},{"name":"r","type":"bytes32"},{"name":"s","type":"bytes32"}],"name":"recoverHashSignatory","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"name":"t","type":"address"},{"name":"x","type":"uint256"}],"name":"changeMinimumOrder","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"t","type":"address"},{"name":"pb","type":"uint256"},{"name":"ps","type":"uint256"},{"name":"limit","type":"uint256"},{"name":"reserveUsage","type":"uint256"}],"name":"checkVolume","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"},{"name":"","type":"address"}],"name":"balances","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"autoWithdraw","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"t","type":"address"}],"name":"getLastPrice","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"t","type":"address"},{"name":"nrt","type":"bool"},{"name":"nra","type":"bool"},{"name":"nrtf","type":"bool"}],"name":"setNoReturnToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"t","type":"address"},{"name":"a","type":"uint256"}],"name":"claimNeverSupportedToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"t","type":"address"}],"name":"getSellCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"deposit","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"name":"t","type":"address"}],"name":"getBuyCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"t","type":"address"},{"name":"a","type":"address"}],"name":"getBalance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"staticAutoWithdraw","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"t","type":"address"},{"name":"order","type":"uint256[]"},{"name":"v","type":"uint8[]"},{"name":"r","type":"bytes32[]"},{"name":"s","type":"bytes32[]"},{"name":"reserveUsage","type":"uint256"}],"name":"revealBuys","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"t","type":"address"}],"name":"getAuctionIndex","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"b","type":"bool"}],"name":"setStaticAutoWithdraw","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"t","type":"address"},{"name":"i","type":"uint256"}],"name":"getSellAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"u","type":"address"}],"name":"getUserIndex","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"t","type":"address"},{"name":"i","type":"uint256"}],"name":"getBuyAmount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"addressToIndex","outputs":[{"name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"contractAddress","type":"address"},{"name":"low","type":"uint256"},{"name":"high","type":"uint256"}],"name":"migrate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[{"name":"a","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"tokenAddress","type":"address"},{"indexed":true,"name":"auctionIndex","type":"uint256"},{"indexed":true,"name":"userAddress","type":"address"},{"indexed":false,"name":"orderIndex","type":"uint256"},{"indexed":false,"name":"price","type":"uint256"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"BuyOrderPosted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"tokenAddress","type":"address"},{"indexed":true,"name":"auctionIndex","type":"uint256"},{"indexed":true,"name":"userAddress","type":"address"},{"indexed":false,"name":"orderIndex","type":"uint256"}],"name":"BuyOrderRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"tokenAddress","type":"address"},{"indexed":true,"name":"auctionIndex","type":"uint256"},{"indexed":true,"name":"userAddress","type":"address"},{"indexed":false,"name":"orderIndex","type":"uint256"},{"indexed":false,"name":"price","type":"uint256"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"SellOrderPosted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"tokenAddress","type":"address"},{"indexed":true,"name":"auctionIndex","type":"uint256"},{"indexed":true,"name":"userAddress","type":"address"},{"indexed":false,"name":"orderIndex","type":"uint256"}],"name":"SellOrderRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"tokenAddress","type":"address"},{"indexed":true,"name":"userAddress","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"tokenAddress","type":"address"},{"indexed":true,"name":"userAddress","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"Withdrawal","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"tokenAddress","type":"address"},{"indexed":true,"name":"auctionIndex","type":"uint256"},{"indexed":false,"name":"auctionTime","type":"uint256"},{"indexed":false,"name":"price","type":"uint256"},{"indexed":false,"name":"volume","type":"uint256"}],"name":"AuctionHistory","type":"event"}]

  Contract Creation Code Switch To Opcodes View
608060405260006009556000600a5534801561001a57600080fd5b5060405160208062005fc4833981016040525160038054600160a060020a03909216600160a060020a031992831681179091556001805480820182557fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf601805484169055600480548416831790556007805490931690911790915560068054808301825560008281527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f91820181905582548085018455820181905582549384019092559190910155615ed180620000f36000396000f3006080604052600436106103135763ffffffff60e060020a60003504166301629a758114610318578063018f73501461033e57806306394c9b14610373578063086e8af1146103945780630ad36eae146103bb57806313d6ca73146103e257806319b763991461042257806327fdc0b3146104435780632a95b374146104645780632ab3f3e3146104845780632e1a7d4d146104a5578063303726c6146104bd578063338b5dea146104de5780633b3b047f1461050257806341916c0b146105265780634635256e1461054a5780634acc79ed1461056e5780634b8243c91461058657806353b0ab881461059e57806354f437e2146105bf578063598c23d7146106135780635c469783146106345780635e49b443146106745780635fa7b5841461069557806360b3c831146106b65780636a272462146106d757806371ffcb16146106fe57806372e2867d1461071f5780637bb285f1146107345780637dc04c341461075a5780637e67e5ce1461077e578063830e58da146107a25780638632dbbe146107b75780638f283970146107d85780638f4ffcb1146107f95780639387f84d146108315780639ab1ae4c146108b85780639ae71781146108df5780639af9482a146109035780639c166273146109295780639e281a9814610953578063a40240cf14610977578063a59ac6dd14610998578063a82fe288146109bf578063af81c5b9146109e0578063b56badd414610a04578063b9211a1a14610a2e578063ba322a9214610a52578063bc42940814610a6c578063bc5a82a914610af3578063be1628f714610b17578063c23f001f14610b44578063c48354d014610b6b578063c692fc7414610b8c578063c76d02a314610bad578063cc9e19b114610bdd578063cfc5e7c814610c01578063d0e30db014610c22578063d489c0bf14610c2a578063d4fac45d14610c4b578063dbe6bb7214610c72578063e015d5fc14610c93578063e0e87e5014610ce7578063e9d3c83c14610d08578063eacc805514610d22578063ee9907a414610d46578063f5dc59c214610d67578063f667e0aa14610d8b578063fc22d0e514610dc5575b600080fd5b34801561032457600080fd5b5061033c600160a060020a0360043516602435610dec565b005b34801561034a57600080fd5b5061035f600160a060020a0360043516610fc6565b604080519115158252519081900360200190f35b34801561037f57600080fd5b5061033c600160a060020a0360043516611014565b3480156103a057600080fd5b5061033c600160a060020a036004351660243560443561105a565b3480156103c757600080fd5b506103d0611b24565b60408051918252519081900360200190f35b3480156103ee57600080fd5b50610406600160a060020a0360043516602435611b2a565b60408051600160a060020a039092168252519081900360200190f35b34801561042e57600080fd5b5061035f600160a060020a0360043516611b80565b34801561044f57600080fd5b506103d0600160a060020a0360043516611c37565b34801561047057600080fd5b5061033c6004803560248101910135611c55565b34801561049057600080fd5b506103d0600160a060020a0360043516611cc9565b3480156104b157600080fd5b5061033c600435611ce7565b3480156104c957600080fd5b506103d0600160a060020a0360043516611db4565b3480156104ea57600080fd5b5061033c600160a060020a0360043516602435611dd2565b34801561050e57600080fd5b5061033c600160a060020a0360043516602435611de1565b34801561053257600080fd5b506103d0600160a060020a0360043516602435611f4b565b34801561055657600080fd5b506103d0600160a060020a0360043516602435611fd0565b34801561057a57600080fd5b506103d0600435612005565b34801561059257600080fd5b5061033c600435612024565b3480156105aa57600080fd5b506103d0600160a060020a0360043516612073565b3480156105cb57600080fd5b5061033c60048035600160a060020a0316906024803580820192908101359160443580820192908101359160643580820192908101359160843590810191013560a435612091565b34801561061f57600080fd5b5061035f600160a060020a036004351661215c565b34801561064057600080fd5b5061033c600160a060020a03600435811690602435811690604435906064351660843560ff60a4351660c43560e4356121fd565b34801561068057600080fd5b506103d0600160a060020a03600435166127be565b3480156106a157600080fd5b5061033c600160a060020a03600435166127d0565b3480156106c257600080fd5b5061035f600160a060020a0360043516612810565b3480156106e357600080fd5b5061033c600160a060020a036004351660243560443561286d565b34801561070a57600080fd5b5061033c600160a060020a03600435166128d8565b34801561072b57600080fd5b506103d0612953565b34801561074057600080fd5b5061033c600160a060020a03600435166024351515612959565b34801561076657600080fd5b506103d0600160a060020a036004351660243561299b565b34801561078a57600080fd5b5061033c600160a060020a03600435166024356129ce565b3480156107ae57600080fd5b5061033c612a39565b3480156107c357600080fd5b5061035f600160a060020a0360043516612a87565b3480156107e457600080fd5b5061033c600160a060020a0360043516612a9c565b34801561080557600080fd5b5061033c60048035600160a060020a039081169160248035926044351691606435918201910135612ae2565b34801561083d57600080fd5b5060408051602060046024803582810135601f8101859004850286018501909652858552610406958335600160a060020a0316953695604494919390910191908190840183828082843750949750508435955050506020830135926040810135925060ff606082013516915060808101359060a00135612c29565b3480156108c457600080fd5b5061033c600160a060020a0360043516602435604435612f63565b3480156108eb57600080fd5b506103d0600160a060020a036004351660243561309d565b34801561090f57600080fd5b5061033c600160a060020a036004351660243515156130d6565b34801561093557600080fd5b5061033c600160a060020a0360043516602435604435606435613125565b34801561095f57600080fd5b5061033c600160a060020a03600435166024356132dd565b34801561098357600080fd5b506103d0600160a060020a036004351661353f565b3480156109a457600080fd5b5061033c600160a060020a036004351660243560443561355d565b3480156109cb57600080fd5b5061033c600160a060020a03600435166135c5565b3480156109ec57600080fd5b5061033c600160a060020a036004351660243561364e565b348015610a1057600080fd5b5061033c600160a060020a03600435166024356044356064356137e5565b348015610a3a57600080fd5b506103d0600160a060020a036004351660243561384f565b61033c600160a060020a03600435166024356044356138b3565b348015610a7857600080fd5b5060408051602060046024803582810135601f8101859004850286018501909652858552610406958335600160a060020a0316953695604494919390910191908190840183828082843750949750508435955050506020830135926040810135925060ff606082013516915060808101359060a0013561391a565b348015610aff57600080fd5b5061033c600160a060020a0360043516602435613b0e565b348015610b2357600080fd5b5061033c600160a060020a0360043516602435604435606435608435613b6e565b348015610b5057600080fd5b506103d0600160a060020a0360043581169060243516614234565b348015610b7757600080fd5b5061035f600160a060020a0360043516614251565b348015610b9857600080fd5b506103d0600160a060020a0360043516614266565b348015610bb957600080fd5b5061033c600160a060020a0360043516602435151560443515156064351515614284565b348015610be957600080fd5b5061033c600160a060020a03600435166024356142ec565b348015610c0d57600080fd5b506103d0600160a060020a0360043516614426565b61033c614444565b348015610c3657600080fd5b506103d0600160a060020a036004351661453f565b348015610c5757600080fd5b506103d0600160a060020a036004358116906024351661455d565b348015610c7e57600080fd5b5061035f600160a060020a0360043516614588565b348015610c9f57600080fd5b5061033c60048035600160a060020a0316906024803580820192908101359160443580820192908101359160643580820192908101359160843590810191013560a43561459d565b348015610cf357600080fd5b506103d0600160a060020a036004351661465a565b348015610d1457600080fd5b5061033c6004351515614678565b348015610d2e57600080fd5b50610406600160a060020a0360043516602435614698565b348015610d5257600080fd5b506103d0600160a060020a03600435166146d3565b348015610d7357600080fd5b506103d0600160a060020a03600435166024356146f4565b348015610d9757600080fd5b50610dac600160a060020a0360043516614723565b6040805163ffffffff9092168252519081900360200190f35b348015610dd157600080fd5b5061033c600160a060020a036004351660243560443561473b565b600160a060020a03821660009081526020819052604081206012015481908190819060ff161515610e1c57600080fd5b610e2586610fc6565b1515610e3057600080fd5b3360009081526002602052604090205463ffffffff169350831515610e5457600080fd5b600160a060020a038616600090815260208181526040808320888452909152902054925060e060020a83048414610e8a57600080fd5b600160a060020a0386166000908152602081905260409020601c0154610ec3609060020a64010000000086028190049080870204614be4565b811515610ecc57fe5b049150610efe82670de0b6b3a7640000610eef85610eea8b8b611f4b565b614be4565b811515610ef857fe5b04614c0f565b336000908152600080516020615e868339815191526020526040902054909150610f289082614c0f565b336000818152600080516020615e868339815191526020908152604080832094909455600160a060020a038a168083528282528483208a845280835285842080546dffffffffffffffffffffffffffff19169055818452928252600c9092015484518a81529451939490937f1ca972adf6ca5301476ad9c6e2334f4aed89302f4307151b942de8a578728a3b929181900390910190a4505050505050565b600160a060020a0381166000908152602081905260408120601301544210801561100c5750600160a060020a03821660009081526020819052604090206015015460ff16155b90505b919050565b600354600160a060020a0316331461102b57600080fd5b6004805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600080611065615dc2565b600080600061107389612810565b151561107e57600080fd5b600160a060020a03891660009081526020819052604090206012015460ff1615156110a857600080fd5b600160a060020a038916600090815260208190526040902060080154610100900460ff1615156110d757600080fd5b600160a060020a038916600090815260208190526040902060150154610100900460ff16151561115f57600160a060020a03891660009081526020819052604090206015015460ff161561113657611132600a546001614c29565b600a555b600160a060020a0389166000908152602081905260409020601501805461ff0019166101001790555b600160a060020a03891660009081526020819052604090206008015460ff1615156111a157600160a060020a0389166000908152602081905260408120600401555b600160a060020a03891660009081526020819052604090206015015462010000900460ff1615156111f757600160a060020a0389166000908152602081905260409020601501805462ff00001916620100001790555b50600160a060020a03808916600081815260208181526040808320600a8101546007549096168452600080516020615e868339815191528352908320549383529190526009015491955092505b600160a060020a03891660009081526020819052604090206009015461126a9089614c0f565b811080156112925750600160a060020a03891660009081526020819052604090206001015481105b1561166757600160a060020a03891660009081526020818152604080832084845290915290205480855260018054909160e060020a90049081106112d257fe5b600091825260208083209190910154600160a060020a038c81168452918390526040909220600601548651919092169350609060020a640100000000909102041080159061133a5750600160a060020a03891660009081526020819052604090206004015485105b156115f8578351600160a060020a038a16600090815260208190526040902060040154609060020a918202919091049650948601948511156114aa57600160a060020a0389166000908152602081815260408220601c0154916113b39160909188905b60200201519060020a029060020a900488614be4565b8115156113bc57fe5b0460208501526113ed8460015b6020020151670de0b6b3a7640000610eef8760015b6020020151610eea8e87611f4b565b604080860191909152600160a060020a038a16600090815260208190522060040154611425908790611420908890614c29565b614c29565b600160a060020a038a166000908152602081815260408220601c01549298506114539160909190889061139d565b81151561145c57fe5b0460608501526114828460035b6020020151670de0b6b3a7640000610eef8760036113de565b60808501526114aa826114a58660025b60200201518760045b6020020151614c29565b614c3b565b600160a060020a0389166000908152602081905260409020600501548451609060020a64010000000090910204111561158357600160a060020a0389166000908152602081815260408220601c01549161150891609091889061139d565b81151561151157fe5b0460208501526115228460016113c9565b604080860191909152600160a060020a038a166000908152602081905220601c8101546005909101546115559088614be4565b81151561155e57fe5b04606085015261156f846003611469565b6080850152611583826114a5866002611492565b61158e898388614d38565b600160a060020a0389166000908152602081905260409020601c810154600590910154670de0b6b3a7640000916115dd916115c9908a614be4565b8115156115d257fe5b04610eea8c85611f4b565b8115156115e657fe5b0460a08501819052929092019161165f565b600160a060020a0389166000908152602081905260409020601c0154845161163390609060020a640100000000820281900491810204614be4565b81151561163c57fe5b04602085015261164d8460016113c9565b6040850181905261165f908390614c3b565b600101611244565b50600160a060020a0388166000908152602081905260409020600a810194909455600b8401546009909401545b600160a060020a0389166000908152602081905260409020600901546116ba9089614c0f565b811080156116e25750600160a060020a03891660009081526020819052604090206003015481105b1561191357600160a060020a03891660009081526020818152604080832084845260020190915290205480855260018054909160e060020a900490811061172557fe5b600091825260208083209190910154600160a060020a038c81168452918390526040909220600701548651919092169350609060020a640100000000909102041180159061178d5750600160a060020a03891660009081526020819052604090206004015485105b156118f3578351600160a060020a038a16600090815260208190526040902060040154609060020a9182029190910496509486019485111561183c5761180489836117ff886000808f600160a060020a0316600160a060020a0316815260200190815260200160002060040154614c29565b614d38565b61183986611420876000808e600160a060020a0316600160a060020a0316815260200190815260200160002060040154614c29565b95505b600160a060020a0389166000908152602081905260409020601c810154600590910154670de0b6b3a76400009161188b91611877908a614be4565b81151561188057fe5b04610eea8c8561384f565b81151561189457fe5b0460a0850152600160a060020a0389166000908152602081905260409020601c8101546005909101546118e49184916114a591906118d2908b614be4565b8115156118db57fe5b0487600561149b565b60a0840151929092019161190b565b835161190b908a908490609060020a90810204614d38565b600101611694565b600160a060020a03808a16600081815260208181526040808320600b81018b90556007549095168352600080516020615e86833981519152825282208790559181529052600901546119659089614c0f565b600160a060020a038a1660009081526020819052604090206009810182905560010154118015906119b75750600160a060020a0389166000908152602081905260409020600381015460099091015410155b15611b1057600160a060020a0389166000908152602081905260408120600401541115611a5857600160a060020a038916600081815260208181526040918290206005810154601d8201819055600c82015460138301546004909301548551938452938301919091528184019290925291519092917faa1772e4386751b215cf8f8b851adee1a6a04e690675ebc4645e79b2d47c2e8c919081900360600190a35b600160a060020a0389166000908152602081905260408120600180820183905560038201839055600482018390556009808301849055600a8301849055600b83019390935560088201805461ffff19169055600c9091018054820190559054611ac091614c29565b600955600160a060020a038916600090815260208190526040902060120154610100900460ff1615611b1057600160a060020a0389166000908152602081905260409020601201805460ff191690555b611b1987614ec4565b505050505050505050565b600a5481565b600160a060020a03821660009081526020818152604080832084845290915281205460018054909160e060020a9004908110611b6257fe5b600091825260209091200154600160a060020a031690505b92915050565b600160a060020a0381166000908152602081905260408120601a8101546013909101540142101580611bd25750600160a060020a038216600090815260208190526040902060150154610100900460ff165b801561100c5750600160a060020a03821660009081526020819052604090206014810154601a820154601390920154909101014210801561100c575050600160a060020a031660009081526020819052604090206015015462010000900460ff161590565b600160a060020a031660009081526020819052604090206013015490565b600454600090600160a060020a03163314611c6f57600080fd5b60095415611c7c57600080fd5b5060005b81811015611cb757662386f26fc10000838383818110611c9c57fe5b90506020020135101515611caf57600080fd5b600101611c80565b611cc360068484615de1565b50505050565b600160a060020a031660009081526020819052604090206005015490565b336000908152600080516020615e868339815191526020526040902054811115611d1057600080fd5b600a5415611d1d57600080fd5b336000908152600080516020615e868339815191526020526040902054611d449082614c29565b336000818152600080516020615e8683398151915260209081526040808320949094558351858152935192939192600080516020615e668339815191529281900390910190a3604051339082156108fc029083906000818181858888f193505050501515611db157600080fd5b50565b600160a060020a031660009081526020819052604090206007015490565b611ddd828233614ee5565b5050565b600160a060020a038216600090815260208190526040812060120154819060ff161515611e0d57600080fd5b611e1684610fc6565b1515611e2157600080fd5b3360009081526002602052604090205463ffffffff169150811515611e4557600080fd5b50600160a060020a03831660009081526020818152604080832085845260020190915290205460e060020a81048214611e7d57600080fd5b600160a060020a0384166000908152600560209081526040808320338452909152902054611eb390609060020a80840204614c0f565b600160a060020a0385166000818152600560209081526040808320338085529083528184209590955583835282825280832088845260028101835281842080546dffffffffffffffffffffffffffff19169055848452928252600c90920154825188815292519093927ff1774d9edef31346001d761c17abb59d66d2e9f947c176bbfa93c8d6b1c132a592908290030190a450505050565b600160a060020a038216600090815260208190526040812060160154821015611f8f57600680546000908110611f7d57fe5b90600052602060002001549050611b7a565b600160a060020a038316600090815260208190526040902060180154821015611fc157600680546001908110611f7d57fe5b600680546002908110611f7d57fe5b600160a060020a03919091166000908152602081815260408083209383529290522054609060020a6401000000009091020490565b600680548290811061201357fe5b600091825260209091200154905081565b60001960005b8281101561206e57600f8054600181810183556000929092527f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac802018390550161202a565b505050565b600160a060020a031660009081526020819052604090206006015490565b600160a060020a038a16600090815260208190526040812060030154905b898110156121275761211b8c8c8c848181106120c757fe5b905060200201358b8b8581811015156120dc57fe5b9050602002013560ff168a8a8681811015156120f457fe5b6020029190910135905089898781811061210a57fe5b9050602002013560001916876151b8565b600191820191016120af565b600160a060020a038c16600090815260208190526040902060030182905561214e83614ec4565b505050505050505050505050565b600160a060020a038116600090815260208190526040812060130154421015806121a15750600160a060020a03821660009081526020819052604090206015015460ff165b801561100c5750600160a060020a0382166000908152602081905260409020601a810154601390910154014210801561100c575050600160a060020a0316600090815260208190526040902060150154610100900460ff161590565b6004546000908190600160a060020a0316331461221957600080fd5b600160a060020a038a16151561222e57600080fd5b600160a060020a03808b166000908152600b60209081526040918290205482516c01000000000000000000000000858f16810282850152603482018e9052948c169094026054850152606884018a90526088808501919091528251808503909101815260a890930191829052825182918401908083835b602083106122c45780518252601f1990920191602091820191016122a5565b51815160209384036101000a6000190180199092169116179052604080519290940182900382207f19457468657265756d205369676e6564204d6573736167653a0a00000000000083830152603a80840182905285518085039091018152605a909301948590528251909850600196509194508392508401908083835b602083106123605780518252601f199092019160209182019101612341565b51815160209384036101000a60001901801990921691161790526040805192909401829003822060008084528383018087529190915260ff8d1683860152606083018c9052608083018b9052935160a08084019750919550601f1981019492819003909101925090865af11580156123dc573d6000803e3d6000fd5b5050604051601f190151915050600160a060020a03808216908b161461240157600080fd5b600160a060020a03808b166000818152600b6020908152604080832080546001019055938b168252600581528382209282529190915220546124439087614c29565b600160a060020a0388811660009081526005602090815260408083208f8516845290915280822093909355600754909116815220546124829087614c0f565b600160a060020a038089166000908152600560208181526040808420600754861685528252808420959095558d84168352908152838220928e1682529190915220548811156124d057600080fd5b600160a060020a03891615156125c257600160a060020a03808a166000908152600560209081526040808320938e16835292905220546125109089614c29565b600560008b600160a060020a0316600160a060020a0316815260200190815260200160002060008c600160a060020a0316600160a060020a031681526020019081526020016000208190555089600160a060020a031689600160a060020a0316600080516020615e668339815191528a6040518082815260200191505060405180910390a3604051600160a060020a038b16908990600081818185875af19250505015156125bd57600080fd5b6127b2565b600160a060020a03808a166000908152600560209081526040808320938e16835292905220546125f29089614c29565b600560008b600160a060020a0316600160a060020a0316815260200190815260200160002060008c600160a060020a0316600160a060020a031681526020019081526020016000208190555089600160a060020a031689600160a060020a0316600080516020615e668339815191528a6040518082815260200191505060405180910390a3600160a060020a0389166000908152602081905260409020601e015460ff1615156127365788600160a060020a031663a9059cbb8b8a6040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050602060405180830381600087803b1580156126ff57600080fd5b505af1158015612713573d6000803e3d6000fd5b505050506040513d602081101561272957600080fd5b505115156125bd57600080fd5b88600160a060020a031663a9059cbb8b8a6040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050600060405180830381600087803b15801561279957600080fd5b505af11580156127ad573d6000803e3d6000fd5b505050505b50505050505050505050565b600b6020526000908152604090205481565b600454600160a060020a031633146127e757600080fd5b600160a060020a03166000908152602081905260409020601201805461ff001916610100179055565b600160a060020a03811660009081526020819052604081206014810154601a820154601390920154909101014210158061100c575050600160a060020a031660009081526020819052604090206015015462010000900460ff1690565b600061287884610fc6565b151561288357600080fd5b50600160a060020a0383166000908152602081905260409020600301546128ad8433858585615491565b600160a060020a03909316600090815260208190526040902060019093016003909301929092555050565b600354600160a060020a031633146128ef57600080fd5b600954156128fc57600080fd5b60075474010000000000000000000000000000000000000000900460ff161561292457600080fd5b6007805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b60095481565b600354600160a060020a0316331461297057600080fd5b600160a060020a03919091166000908152600e60205260409020805460ff1916911515919091179055565b600160a060020a0391909116600090815260208181526040808320938352600290930190522054609060020a9081020490565b600454600160a060020a031633146129e557600080fd5b600160a060020a0382166000908152602081905260409020601c015415612a0b57600080fd5b600160a060020a039091166000908152602081905260409020601b8101829055600a9190910a601c90910155565b600354600160a060020a03163314612a5057600080fd5b6007805474ff0000000000000000000000000000000000000000191674010000000000000000000000000000000000000000179055565b600e6020526000908152604090205460ff1681565b600354600160a060020a03163314612ab357600080fd5b6003805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b60008080600160a060020a0386163314612afb57600080fd5b600160a060020a03861660009081526020819052604090206012015460ff161515612b2557600080fd5b6040841015612b3e57612b3986888a614ee5565b612c1f565b60408414612b4b57600080fd5b60a435925060c4359150612b6086888a614ee5565b612b6986610fc6565b1515612b7457600080fd5b50600160a060020a038516600090815260208190526040902060030154612b9e8689858585615491565b600160a060020a0380871660009081526020818152604080832060018601600390910155928b168252600d9052205460ff16158015612bf65750600160a060020a0388166000908152600c602052604090205460ff16155b15612c1f57600160a060020a0388166000908152600c60205260409020805460ff191660011790555b5050505050505050565b604080517f737472696e67204f7264657220747970650000000000000000000000000000006020808301919091527f6164647265737320546f6b656e2061646472657373000000000000000000000060318301527f75696e743235362050726963650000000000000000000000000000000000000060468301527f75696e7432353620416d6f756e7400000000000000000000000000000000000060538301527f75696e743235362041756374696f6e20696e6465780000000000000000000000606183015282516056818403018152607690920192839052815160009384938493909282918401908083835b60208310612d355780518252601f199092019160209182019101612d16565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390208a8c8b8b8b6040516020018086805190602001908083835b60208310612d995780518252601f199092019160209182019101612d7a565b6001836020036101000a03801982511681845116808217855250505050505090500185600160a060020a0316600160a060020a03166c01000000000000000000000000028152601401848152602001838152602001828152602001955050505050506040516020818303038152906040526040518082805190602001908083835b60208310612e395780518252601f199092019160209182019101612e1a565b51815160209384036101000a6000190180199092169116179052604080519290940182900382208282019790975281840196909652825180820384018152606090910192839052805190959294508493509185019190508083835b60208310612eb35780518252601f199092019160209182019101612e94565b51815160209384036101000a600019018019909216911617905260408051929094018290038220600080845283830180875282905260ff8e1684870152606084018d9052608084018c905294519098506001965060a080840196509194601f19820194509281900390910191865af1158015612f33573d6000803e3d6000fd5b5050604051601f190151915050600160a060020a0381161515612f5557600080fd5b9a9950505050505050505050565b600454600160a060020a03163314612f7a57600080fd5b612f838361215c565b1515612f8e57600080fd5b600160a060020a03831660009081526020819052604090206015015460ff161515612fb857600080fd5b600160a060020a038316600090815260208190526040902060010154821015612fe057600080fd5b600160a060020a03831660009081526020819052604090206003015481101561300857600080fd5b600160a060020a038316600090815260208190526040902060018101546016909101541161303557600080fd5b600160a060020a038316600090815260208190526040902060038101546017909101541161306257600080fd5b600160a060020a0390921660009081526020819052604090206001810154601682015560038101546017820155601881019190915560190155565b600160a060020a0391909116600090815260208181526040808320938352600290930190522054609060020a6401000000009091020490565b600454600160a060020a031633146130ed57600080fd5b600160a060020a039091166000908152602081905260409020601e01805491151563010000000263ff00000019909216919091179055565b600454600090600160a060020a0316331461313f57600080fd5b600160a060020a03851660009081526020819052604090206012015460ff16151561316957600080fd5b600a541561317657600080fd5b61317f85612810565b806131a35750600160a060020a038516600090815260208190526040902060130154155b15156131ae57600080fd5b600160a060020a03851660009081526020819052604090206008015460ff16156131d757600080fd5b600160a060020a038516600090815260208190526040902060080154610100900460ff161561320557600080fd5b42841180613211575060005b151561321c57600080fd5b4262093a80018411158061322e575060005b151561323957600080fd5b6201518083111561324957600080fd5b6201518082111561325957600080fd5b61012c82101561326857600080fd5b50600160a060020a0390931660009081526020819052604090206013810192909255601a820155601481019190915560158101805462ffffff191690556000196016820181905560178201819055601882018190556019820155600801805461ff001916610100179055600980546001019055565b6000600160a060020a038316116132f357600080fd5b600160a060020a038216600090815260056020908152604080832033845290915290205481111561332357600080fd5b600160a060020a03821660009081526020819052604090206015015460ff16158061336e5750600160a060020a038216600090815260208190526040902060150154610100900460ff165b151561337957600080fd5b600160a060020a03821660009081526005602090815260408083203384529091529020546133a79082614c29565b600160a060020a0383166000818152600560209081526040808320338085529083529281902094909455835185815293519193600080516020615e66833981519152929081900390910190a3600160a060020a0382166000908152602081905260409020601e015460ff1615156134bc57604080517fa9059cbb000000000000000000000000000000000000000000000000000000008152336004820152602481018390529051600160a060020a0384169163a9059cbb9160448083019260209291908290030181600087803b15801561348057600080fd5b505af1158015613494573d6000803e3d6000fd5b505050506040513d60208110156134aa57600080fd5b505115156134b757600080fd5b611ddd565b604080517fa9059cbb000000000000000000000000000000000000000000000000000000008152336004820152602481018390529051600160a060020a0384169163a9059cbb91604480830192600092919082900301818387803b15801561352357600080fd5b505af1158015613537573d6000803e3d6000fd5b505050505050565b600160a060020a031660009081526020819052604090206004015490565b600061356884610fc6565b151561357357600080fd5b50600160a060020a03831660009081526020819052604090206001015461359d8433858585615700565b600160a060020a03909316600090815260208190526040902060019384019301929092555050565b600454600160a060020a031633146135dc57600080fd5b6135e58161215c565b15156135f057600080fd5b600160a060020a03811660009081526020819052604090206015015460ff161561361957600080fd5b600a80546001908101909155600160a060020a039091166000908152602081905260409020601501805460ff19169091179055565b600454600160a060020a0316331461366557600080fd5b6000600160a060020a0383161161367b57600080fd5b600160a060020a03821660009081526020819052604090206012015462010000900460ff1615156136ff57600880546001810182556000919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee301805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0384161790555b600160a060020a038216600090815260208190526040902060128101805461ff001962ff00001960ff1990921660011791909116620100001716905560118101829055601c01541515611ddd5781600160a060020a031663313ce5676040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561378a57600080fd5b505af115801561379e573d6000803e3d6000fd5b505050506040513d60208110156137b457600080fd5b5051600160a060020a0383166000908152602081905260409020601b8101829055600a9190910a601c909101555050565b6137ef8482611dd2565b6137fa84848461286d565b336000908152600d602052604090205460ff1615801561382a5750336000908152600c602052604090205460ff16155b15611cc357336000908152600c60205260409020805460ff1916600117905550505050565b600160a060020a03821660009081526020819052604081206017015482101561388157600680546000908110611f7d57fe5b600160a060020a038316600090815260208190526040902060190154821015611fc157600680546001908110611f7d57fe5b6138bb614444565b6138c683838361355d565b336000908152600d602052604090205460ff161580156138f65750336000908152600c602052604090205460ff16155b1561206e57336000908152600c60205260409020805460ff19166001179055505050565b600080600089888c8b8a6040516020018086805190602001908083835b602083106139565780518252601f199092019160209182019101613937565b6001836020036101000a03801982511681845116808217855250505050505090500185815260200184600160a060020a0316600160a060020a03166c01000000000000000000000000028152601401838152602001828152602001955050505050506040516020818303038152906040526040518082805190602001908083835b602083106139f65780518252601f1990920191602091820191016139d7565b51815160209384036101000a6000190180199092169116179052604080519290940182900382207f19457468657265756d205369676e6564204d6573736167653a0a33320000000083830152603c80840182905285518085039091018152605c909301948590528251909850600196509194508392508401908083835b60208310613a925780518252601f199092019160209182019101613a73565b51815160209384036101000a60001901801990921691161790526040805192909401829003822060008084528383018087529190915260ff8e1683860152606083018d9052608083018c9052935160a08084019750919550601f1981019492819003909101925090865af1158015612f33573d6000803e3d6000fd5b600454600160a060020a03163314613b2557600080fd5b600160a060020a03821660009081526020819052604090206012015460ff161515613b4f57600080fd5b600160a060020a03909116600090815260208190526040902060110155565b6000806000806000613b7f896159ff565b1515613b8a57600080fd5b613b93886159ff565b1515613b9e57600080fd5b88881115613bab57600080fd5b600160a060020a038a1660009081526020819052604090206012015460ff161515613bd557600080fd5b613bde8a611b80565b1515613be957600080fd5b600160a060020a038a1660009081526020819052604090206015015460ff161515613c1357600080fd5b600160a060020a038a16600090815260208190526040902060150154610100900460ff161515613c7657613c4a600a546001614c29565b600a55600160a060020a038a166000908152602081905260409020601501805461ff0019166101001790555b600160a060020a038a16600090815260208181526040808320600c8101548d8552600d90910183528184208c8552909252909120541015613d2c57600160a060020a038a166000908152602081815260408083208c8452600e810183528184208c855283528184208490558c8452600f810183528184208c855283528184208490558c84526010810183528184208c85528352818420849055600c8101548d8552600d90910183528184208c8552909252909120555b600160a060020a038a166000908152602081815260408083208c8452600f810183528184208c85528352818420548d8552600e90910183528184208c85529092529091205490955092505b600160a060020a038a166000908152602081815260408083208c8452600e0182528083208b8452909152902054613dae9088614c0f565b83108015613dd65750600160a060020a038a1660009081526020819052604090206001015483105b15613e2d57600160a060020a038a166000908152602081815260408083208684529091529020549350609060020a6401000000008502048911613e2257609060020a8085020494909401935b600190920191613d77565b600160a060020a038a166000908152602081815260408083208c84526010810183528184208c85528352818420548d8552600e90910183528184208c855290925290912054935091505b600160a060020a038a166000908152602081815260408083208c8452600e0182528083208b8452909152902054613eae9088614c0f565b83108015613ed65750600160a060020a038a1660009081526020819052604090206003015483105b15613f3057600160a060020a038a166000908152602081815260408083208684526002019091529020549350609060020a6401000000008502048810613f2557609060020a8085020491909101905b600190920191613e77565b600160a060020a038a166000908152602081815260408083208c8452600e0182528083208b8452909152902054613f679088614c0f565b600160a060020a038b166000908152602081815260408083208d8452600e810183528184208d85529092529091208290556001015411801590613fdd5750600160a060020a038a1660009081526020818152604080832060038101548d8552600e90910183528184208c85529092529091205410155b156141d15781851015613ff1575083613ff4565b50805b600160a060020a038a1660009081526020819052604090206004015481118061405c5750600160a060020a038a166000908152602081905260409020600401548114801561405c5750600160a060020a038a1660009081526020819052604090206006015489115b806140cc5750600160a060020a038a16600090815260208190526040902060040154811480156140a65750600160a060020a038a1660009081526020819052604090206006015489145b80156140cc5750600160a060020a038a1660009081526020819052604090206007015488105b1561419257600160a060020a038a1660009081526020819052604090206004018190558185111561411a57600160a060020a038a16600090815260208190526040902060050189905561416c565b8482111561414557600160a060020a038a16600090815260208190526040902060050188905561416c565b600160a060020a038a1660009081526020819052604090206002898b030489016005909101555b600160a060020a038a166000908152602081905260409020600681018a90556007018890555b600454600160a060020a03163314156141cc57600160a060020a038a166000908152602081905260409020600801805460ff191660011790555b614218565b600160a060020a038a166000908152602081815260408083208c8452600f810183528184208c855283528184208990558c845260100182528083208b845290915290208290555b600454600160a060020a03163314156127b2576127b286614ec4565b600560209081526000928352604080842090915290825290205481565b600c6020526000908152604090205460ff1681565b600160a060020a03166000908152602081905260409020601d015490565b600454600160a060020a0316331461429b57600080fd5b600160a060020a039093166000908152602081905260409020601e018054931515620100000262ff0000199215156101000261ff001994151560ff1990961695909517939093169390931716179055565b600160a060020a03821660009081526020819052604090206012015462010000900460ff161561431b57600080fd5b600354600160a060020a0316331461433257600080fd5b604080517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290518291600160a060020a038516916370a08231916024808201926020929091908290030181600087803b15801561439657600080fd5b505af11580156143aa573d6000803e3d6000fd5b505050506040513d60208110156143c057600080fd5b505110156143cd57600080fd5b600160a060020a03821660009081526005602090815260408083203384529091529020546143fb9082614c0f565b600160a060020a03909216600090815260056020908152604080832033845290915290209190915550565b600160a060020a031660009081526020819052604090206003015490565b3360009081526002602052604090205463ffffffff1680151561447257614469615a28565b63ffffffff1690505b336000908152600080516020615e8683398151915260205260409020546144999034614c0f565b336000818152600080516020615e86833981519152602090815260408083209490945583513481529351929391927f5548c837ab068cf56a2c2479df0882a4922fd203edb7517321831d95078c5f629281900390910190a3336000908152600d602052604090205460ff161580156145205750336000908152600c602052604090205460ff165b15611db157336000908152600c60205260409020805460ff1916905550565b600160a060020a031660009081526020819052604090206001015490565b600160a060020a03918216600090815260056020908152604080832093909416825291909152205490565b600d6020526000908152604090205460ff1681565b600160a060020a038a16600090815260208190526040812060010154905b89811015614633576146278c8c8c848181106145d357fe5b905060200201358b8b8581811015156145e857fe5b9050602002013560ff168a8a86818110151561460057fe5b6020029190910135905089898781811061461657fe5b905060200201356000191687615ae2565b600191820191016145bb565b600160a060020a038c16600090815260208190526040902060010182905561214e83614ec4565b600160a060020a03166000908152602081905260409020600c015490565b336000908152600d60205260409020805460ff1916911515919091179055565b600160a060020a03821660009081526020818152604080832084845260020190915281205460018054909160e060020a9004908110611b6257fe5b600160a060020a031660009081526002602052604090205463ffffffff1690565b600160a060020a03919091166000908152602081815260408083209383529290522054609060020a9081020490565b60026020526000908152604090205463ffffffff1681565b600160a060020a0383166000908152600e60205260408120548190819060ff16151561476657600080fd5b60085460001061477557600080fd5b600a541561478257600080fd5b336000908152600080516020615e86833981519152602052604081205490935083101561484657336000818152600080516020615e86833981519152602052604080822080549083905581517f6a523c5e00000000000000000000000000000000000000000000000000000000815260048101949094529051909550600160a060020a03891692636a523c5e92879260248084019382900301818588803b15801561482c57600080fd5b505af1158015614840573d6000803e3d6000fd5b50505050505b60085484106148645760085461485d906001614c29565b9150614868565b8391505b50835b8181116135375760006005600060088481548110151561488757fe5b6000918252602080832090910154600160a060020a0316835282810193909352604091820181203382529092529020541115614bdc57600560006008838154811015156148d057fe5b6000918252602080832090910154600160a060020a031683528281019390935260409182018120338252909252812054600880549195506005918391908590811061491757fe5b6000918252602080832090910154600160a060020a031683528281019390935260409182018120338252909252812091909155600880548291908490811061495b57fe5b6000918252602080832090910154600160a060020a031683528201929092526040019020601e015460ff610100909104161515614a825760088054829081106149a057fe5b600091825260208220015460088054600160a060020a039092169263095ea7b3928a9260059291879081106149d157fe5b6000918252602080832090910154600160a060020a0390811684528382019490945260409283018220338352815282822054835160e060020a63ffffffff8916028152959094166004860152602485019390935290516044808501949192918390030190829087803b158015614a4657600080fd5b505af1158015614a5a573d6000803e3d6000fd5b505050506040513d6020811015614a7057600080fd5b50511515614a7d57600080fd5b614b4a565b6008805482908110614a9057fe5b600091825260208220015460088054600160a060020a039092169263095ea7b3928a926005929187908110614ac157fe5b6000918252602080832090910154600160a060020a0390811684528382019490945260409283018220338352905281812054825160e060020a63ffffffff881602815294909316600485015260248401929092525160448084019382900301818387803b158015614b3157600080fd5b505af1158015614b45573d6000803e3d6000fd5b505050505b85600160a060020a03166357fe097d33600884815481101515614b6957fe5b60009182526020822001546040805160e060020a63ffffffff8716028152600160a060020a039485166004820152939091166024840152604483018890525160648084019382900301818387803b158015614bc357600080fd5b505af1158015614bd7573d6000803e3d6000fd5b505050505b60010161486b565b6000828202831580614c005750828482811515614bfd57fe5b04145b1515614c0857fe5b9392505050565b6000828201838110801590614c00575082811015614c0857fe5b600082821115614c3557fe5b50900390565b60008080831115611cc357600160a060020a0384166000908152600c602052604090205460ff168015614c9f575060008080526020527fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fd3546301000000900460ff16155b15614cd55750823b801515614cd557604051600160a060020a0385169084156108fc029085906000818181858888f19550505050505b811515611cc357600160a060020a0384166000908152600080516020615e868339815191526020526040902054614d0c9084614c0f565b600160a060020a0385166000908152600080516020615e86833981519152602052604090205550505050565b6000600160a060020a0384161515614d4f57600080fd5b50600080821115611cc357600160a060020a0383166000908152600c602052604090205460ff168015614da55750600160a060020a0384166000908152602081905260409020601e01546301000000900460ff16155b15614e6157600160a060020a0384166000908152602081905260409020601e015460ff161515614e615783600160a060020a031663a9059cbb84846040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050602060405180830381600087803b158015614e3257600080fd5b505af1158015614e46573d6000803e3d6000fd5b505050506040513d6020811015614e5c57600080fd5b505190505b801515611cc357600160a060020a03808516600090815260056020908152604080832093871683529290522054614e989083614c0f565b600160a060020a0380861660009081526005602090815260408083209388168352929052205550505050565b600f54811115614ed357600080fd5b600f805482900390611ddd9082615e28565b6000600160a060020a0384168110614efc57600080fd5b600160a060020a03841660009081526020819052604090206012015460ff161515614f2657600080fd5b50600160a060020a03811660009081526002602052604090205463ffffffff16801515614f5857614f55615a28565b90505b600160a060020a0384166000908152602081905260409020601e015462010000900460ff16151561503157604080517f23b872dd000000000000000000000000000000000000000000000000000000008152600160a060020a038481166004830152306024830152604482018690529151918616916323b872dd916064808201926020929091908290030181600087803b158015614ff557600080fd5b505af1158015615009573d6000803e3d6000fd5b505050506040513d602081101561501f57600080fd5b5051151561502c57600080fd5b6150bb565b604080517f23b872dd000000000000000000000000000000000000000000000000000000008152600160a060020a038481166004830152306024830152604482018690529151918616916323b872dd9160648082019260009290919082900301818387803b1580156150a257600080fd5b505af11580156150b6573d6000803e3d6000fd5b505050505b600160a060020a038085166000908152600560209081526040808320938616835292905220546150eb9084614c0f565b600160a060020a038086166000818152600560209081526040808320948816808452948252918290209490945580518781529051929391927f5548c837ab068cf56a2c2479df0882a4922fd203edb7517321831d95078c5f62929181900390910190a3600160a060020a0382166000908152600d602052604090205460ff1615801561518f5750600160a060020a0382166000908152600c602052604090205460ff165b15611cc35750600160a060020a03166000908152600c60205260409020805460ff191690555050565b6004546000908190819081908190600160a060020a031633146151da57600080fd5b6151e38b61215c565b15156151ee57600080fd5b600160a060020a038b1660009081526020819052604090206015015460ff16151561521857600080fd5b600160a060020a038b166000908152602081905260409020601701548611801561525d5750600160a060020a038b166000908152602081905260409020601901548614155b1561529657600160a060020a038b166000908152602081815260408083206000198a0184526002019091529020548a1161529657600080fd5b6001805460e060020a8c049081106152aa57fe5b6000918252602080832090910154600160a060020a038e81168452918390526040909220600c810154601990910154919092169650609060020a6401000000008d028190049650808d0204945090925086101561534d576153468b6040805190810160405280600b81526020017f5075626c69632073656c6c0000000000000000000000000000000000000000008152508686868e8e8e612c29565b9050615395565b6153928b6040805190810160405280600b81526020017f48696464656e2073656c6c0000000000000000000000000000000000000000008152508686868e8e8e612c29565b90505b600160a060020a038181169086161461547757600160a060020a038b16600090815260208190526040902060190154861015615417576154108b6040805190810160405280600b81526020017f5075626c69632073656c6c0000000000000000000000000000000000000000008152508686868e8e8e61391a565b905061545f565b61545c8b6040805190810160405280600b81526020017f48696464656e2073656c6c0000000000000000000000000000000000000000008152508686868e8e8e61391a565b90505b600160a060020a038181169086161461547757600080fd5b6154848b8686868a615491565b5050505050505050505050565b600080600061549f866159ff565b15156154aa57600080fd5b6154b3856159ff565b15156154be57600080fd5b600160a060020a03881660009081526020819052604090206012015460ff1615156154e857600080fd5b600160a060020a03881615156154fd57600080fd5b600754600160a060020a038881169116141561551857600080fd5b600160a060020a03871660009081526002602052604090205463ffffffff16925082151561554557600080fd5b600160a060020a038089166000908152600560209081526040808320938b168352929052205491508482101561557a57600080fd5b600160a060020a0388166000908152602081905260409020601c01546155a08787614be4565b8115156155a957fe5b0490506155b68686614be4565b600160a060020a0389166000908152602081905260409020601c01546155dd908390614be4565b146155e757600080fd5b60008080526020527fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fc65481101561561d57600080fd5b600160a060020a03881660009081526020819052604090206011015485101561564557600080fd5b61564f8286614c29565b600160a060020a03808a166000818152600560209081526040808320948d16808452948252808320959095558282528181528482208983526002810182528583206e010000000000000000000000000000808b028e17028c179055838352918152600c9091015484518981529182018b90528185018a905293519293927f505b500c18a1756d81b7801383ff3474465f52b62c265066bd4bc91998a92c8a9181900360600190a45050505050505050565b6000806000806000615711886159ff565b151561571c57600080fd5b615725876159ff565b151561573057600080fd5b600160a060020a038a1660009081526020819052604090206012015460ff16151561575a57600080fd5b600160a060020a038a16151561576f57600080fd5b600754600160a060020a038a81169116141561578a57600080fd5b600160a060020a03891660009081526002602052604090205463ffffffff1694508415156157b757600080fd5b600160a060020a038981166000908152600080516020615e868339815191526020908152604080832054938e168352908290529020601c01549094506157fd8989614be4565b81151561580657fe5b0492506158138888614be4565b600160a060020a038b166000908152602081905260409020601c015461583a908590614be4565b1461584457600080fd5b61584e8a87611f4b565b915061586783670de0b6b3a7640000610eef8686614be4565b90508084101561587657600080fd5b60008080526020527fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fc6548310156158ac57600080fd5b600160a060020a038a166000908152602081905260409020601101548710156158d457600080fd5b6158de8482614c29565b6005600080600160a060020a0316815260200190815260200160002060008b600160a060020a0316600160a060020a0316815260200190815260200160002081905550866070896070889060020a02179060020a02176000808c600160a060020a0316600160a060020a0316815260200190815260200160002060000160008881526020019081526020016000208190555088600160a060020a03166000808c600160a060020a0316600160a060020a03168152602001908152602001600020600c01548b600160a060020a03167f12ca0e6aed7d7dbea56d5de5c7775039d337bc1c1ff844f3ae0a3851ebdee7e5898c8c60405180848152602001838152602001828152602001935050505060405180910390a450505050505050505050565b60006e010000000000000000000000000000821015615a205750600161100f565b50600061100f565b600080615a3c600180549050600101615dab565b1515615a4757600080fd5b3360009081526002602052604090205463ffffffff1615615a6757600080fd5b505060018054336000818152600260205260408120805463ffffffff191663ffffffff8516179055835480850185559390527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6909201805473ffffffffffffffffffffffffffffffffffffffff1916909217909155805b5090565b6004546000908190819081908190600160a060020a03163314615b0457600080fd5b615b0d8b61215c565b1515615b1857600080fd5b600160a060020a038b1660009081526020819052604090206015015460ff161515615b4257600080fd5b600160a060020a038b1660009081526020819052604090206016015486118015615b875750600160a060020a038b166000908152602081905260409020601801548614155b15615bbd57600160a060020a038b166000908152602081815260408083206000198a0184529091529020548a11615bbd57600080fd5b6001805460e060020a8c04908110615bd157fe5b6000918252602080832090910154600160a060020a038e81168452918390526040909220600c810154601890910154919092169650609060020a6401000000008d028190049650808d02049450909250861015615c7457615c6d8b6040805190810160405280600a81526020017f5075626c696320627579000000000000000000000000000000000000000000008152508686868e8e8e612c29565b9050615cbc565b615cb98b6040805190810160405280600a81526020017f48696464656e20627579000000000000000000000000000000000000000000008152508686868e8e8e612c29565b90505b600160a060020a0381811690861614615d9e57600160a060020a038b16600090815260208190526040902060180154861015615d3e57615d378b6040805190810160405280600a81526020017f5075626c696320627579000000000000000000000000000000000000000000008152508686868e8e8e61391a565b9050615d86565b615d838b6040805190810160405280600a81526020017f48696464656e20627579000000000000000000000000000000000000000000008152508686868e8e8e61391a565b90505b600160a060020a0381811690861614615d9e57600080fd5b6154848b8686868a615700565b6000640100000000821015615a205750600161100f565b60c0604051908101604052806006906020820280388339509192915050565b828054828255906000526020600020908101928215615e1c579160200282015b82811115615e1c578235825591602001919060010190615e01565b50615ade929150615e48565b81548183558181111561206e5760008381526020902061206e9181019083015b615e6291905b80821115615ade5760008155600101615e4e565b9056002717ead6b9200dd235aad468c9809ea400fe33ac69b5bfaa6d3e90fc922b639805b8ccbb9d4d8fb16ea74ce3c29a41f1b461fbdaff4714a0d9a8eb05499746bca165627a7a723058209f744ed57b3f8bbdf82ab2cbcf8aeec8145c1490dfbf98f56a7deaabd643d2ba0029000000000000000000000000240838a434815a0ae32bdac48babf2191a9c0eb4

    Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000240838a434815a0ae32bdac48babf2191a9c0eb4

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000240838a434815a0ae32bdac48babf2191a9c0eb4


   Swarm Source:
bzzr://9f744ed57b3f8bbdf82ab2cbcf8aeec8145c1490dfbf98f56a7deaabd643d2ba

 

View All
Block Age transaction Difficulty GasUsed Reward
View All
Block Age UncleNumber Difficulty GasUsed Reward