ETH Price: $3,341.59 (-1.37%)
Gas: 20 Gwei

Contract

0x7113Dd99c79afF93d54CFa4B2885576535A132dE
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Value
0x59b54b0576cd08ec73ef773df197eea119261095b324e2be61800f87f389e718 Perform Swap Col...(pending)2024-06-23 3:28:143 days ago1719113294IN
Totle Exchange
0.005 ETH(Pending)(Pending)
0x3bd0972daae67416d82ec16b8f7e7b8c81ec819ea6a171260f87d3eae04afb69 Perform Swap Col...(pending)2024-06-23 3:28:043 days ago1719113284IN
Totle Exchange
0.0255 ETH(Pending)(Pending)
Perform Swap Col...152465982022-07-30 22:52:57696 days ago1659221577IN
Totle Exchange
0.005 ETH0.000109983
Perform Swap Col...150618182022-07-02 7:44:16725 days ago1656747856IN
Totle Exchange
0.159 ETH0.000256897
Perform Swap Col...134544072021-10-20 11:41:57980 days ago1634730117IN
Totle Exchange
0.08 ETH0.0129862957.93108812
Perform Swap Col...134543392021-10-20 11:25:39980 days ago1634729139IN
Totle Exchange
0.0002588 ETH0.0146234364.80207589
Perform Swap Col...134540532021-10-20 10:18:55980 days ago1634725135IN
Totle Exchange
0.11802627 ETH0.0168763553.28932479
Perform Swap Col...134529442021-10-20 6:05:28980 days ago1634709928IN
Totle Exchange
0 ETH0.0118399851.28999915
Perform Swap Col...134529352021-10-20 6:04:18980 days ago1634709858IN
Totle Exchange
0.0060629 ETH0.0151046570.87626114
Perform Swap Col...134529322021-10-20 6:03:37980 days ago1634709817IN
Totle Exchange
0.0030313 ETH0.0152102671.3684743
Perform Swap Col...134452452021-10-19 1:27:55981 days ago1634606875IN
Totle Exchange
0.052 ETH0.0137059467.02632349
Perform Swap Col...134329152021-10-17 3:01:05983 days ago1634439665IN
Totle Exchange
0.112 ETH0.0181093379.5846941
Perform Swap Col...134295782021-10-16 14:30:04984 days ago1634394604IN
Totle Exchange
0.25 ETH0.0161445471
Perform Swap Col...134274902021-10-16 6:46:15984 days ago1634366775IN
Totle Exchange
0.43160569 ETH0.0140511366
Perform Swap Col...134264782021-10-16 2:54:31984 days ago1634352871IN
Totle Exchange
0.1 ETH0.0166116673
Perform Swap Col...134259092021-10-16 0:46:23984 days ago1634345183IN
Totle Exchange
0.09 ETH0.0028267477
Perform Swap Col...134252972021-10-15 22:24:53984 days ago1634336693IN
Totle Exchange
1.36288474 ETH0.02150148101
Perform Swap Col...134248012021-10-15 20:37:27984 days ago1634330247IN
Totle Exchange
0.019486 ETH0.02942385121.83436876
Perform Swap Col...134218912021-10-15 9:37:06985 days ago1634290626IN
Totle Exchange
1 ETH0.0208518992
Perform Swap Col...134215872021-10-15 8:27:02985 days ago1634286422IN
Totle Exchange
0.7952373 ETH0.02509725115
Perform Swap Col...134215682021-10-15 8:21:58985 days ago1634286118IN
Totle Exchange
0.78519558 ETH0.02995827124
Perform Swap Col...134202632021-10-15 3:27:40985 days ago1634268460IN
Totle Exchange
0 ETH0.05590067140.72479259
Perform Swap Col...134123082021-10-13 21:10:49986 days ago1634159449IN
Totle Exchange
0.55724931 ETH0.03351026103.29729375
Perform Swap Col...134054622021-10-12 19:12:18987 days ago1634065938IN
Totle Exchange
0.0194483 ETH0.0229881107.85853712
Perform Swap Col...134053192021-10-12 18:40:29987 days ago1634064029IN
Totle Exchange
0.00748912 ETH0.02315934103
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To Value
151971962022-07-23 6:00:31704 days ago1658556031
Totle Exchange
0.0019825 ETH
134649182021-10-22 2:51:43978 days ago1634871103
Totle Exchange
0.00009912 ETH
134549542021-10-20 13:46:27980 days ago1634737587
Totle Exchange
0.0495625 ETH
134549542021-10-20 13:46:27980 days ago1634737587
Totle Exchange
0.0495625 ETH
134549132021-10-20 13:38:17980 days ago1634737097
Totle Exchange
0.00036566 ETH
134549132021-10-20 13:38:17980 days ago1634737097
Totle Exchange
0.00036566 ETH
134549132021-10-20 13:38:17980 days ago1634737097
Totle Exchange
0.57390377 ETH
134549132021-10-20 13:38:17980 days ago1634737097
Totle Exchange
0.57390377 ETH
134548542021-10-20 13:26:20980 days ago1634736380
Totle Exchange
0.297375 ETH
134548542021-10-20 13:26:20980 days ago1634736380
Totle Exchange
0.297375 ETH
134548362021-10-20 13:21:40980 days ago1634736100
Totle Exchange
3.8163125 ETH
134548362021-10-20 13:21:40980 days ago1634736100
Totle Exchange
3.8163125 ETH
134548102021-10-20 13:15:24980 days ago1634735724
Totle Exchange
0.2676375 ETH
134548102021-10-20 13:15:24980 days ago1634735724
Totle Exchange
0.2676375 ETH
134547772021-10-20 13:08:05980 days ago1634735285
Totle Exchange
0.0099125 ETH
134547772021-10-20 13:08:05980 days ago1634735285
Totle Exchange
0.0099125 ETH
134547742021-10-20 13:06:07980 days ago1634735167
Totle Exchange
0.1883375 ETH
134547742021-10-20 13:06:07980 days ago1634735167
Totle Exchange
0.1883375 ETH
134547472021-10-20 13:00:43980 days ago1634734843
Totle Exchange
0.1011075 ETH
134547472021-10-20 13:00:43980 days ago1634734843
Totle Exchange
0.1011075 ETH
134547162021-10-20 12:54:12980 days ago1634734452
Totle Exchange
0.059475 ETH
134547162021-10-20 12:54:12980 days ago1634734452
Totle Exchange
0.059475 ETH
134547042021-10-20 12:50:46980 days ago1634734246
Totle Exchange
1.8809006 ETH
134547042021-10-20 12:50:46980 days ago1634734246
Totle Exchange
1.8809006 ETH
134546432021-10-20 12:36:04980 days ago1634733364
Totle Exchange
0.099125 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
TotlePrimary

Compiler Version
v0.5.7+commit.6da8b019

Optimization Enabled:
Yes with 999 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2020-06-01
*/

pragma solidity 0.5.7;
pragma experimental ABIEncoderV2;

/*
 * @title Ownable
 * @dev The Ownable contract has an owner address, and provides basic authorization control
 * functions, this simplifies the implementation of "user permissions".
 */
contract Ownable {
  address payable public owner;


  event OwnershipRenounced(address indexed previousOwner);
  event OwnershipTransferred(
    address indexed previousOwner,
    address indexed newOwner
  );


  /**
   * @dev The Ownable constructor sets the original `owner` of the contract to the sender
   * account.
   */
  constructor() public {
    owner = msg.sender;
  }

  /**
   * @dev Throws if called by any account other than the owner.
   */
  modifier onlyOwner() {
    require(msg.sender == owner);
    _;
  }

  /**
   * @dev Allows the current owner to relinquish control of the contract.
   * @notice Renouncing to ownership will leave the contract without an owner.
   * It will not be possible to call the functions with the `onlyOwner`
   * modifier anymore.
   */
  function renounceOwnership() public onlyOwner {
    emit OwnershipRenounced(owner);
    owner = address(0);
  }

  /**
   * @dev Allows the current owner to transfer control of the contract to a newOwner.
   * @param _newOwner The address to transfer ownership to.
   */
  function transferOwnership(address payable _newOwner) public onlyOwner {
    _transferOwnership(_newOwner);
  }

  /**
   * @dev Transfers control of the contract to a newOwner.
   * @param _newOwner The address to transfer ownership to.
   */
  function _transferOwnership(address payable _newOwner) internal {
    require(_newOwner != address(0));
    emit OwnershipTransferred(owner, _newOwner);
    owner = _newOwner;
  }
}

library ERC20SafeTransfer {
    function safeTransfer(address _tokenAddress, address _to, uint256 _value) internal returns (bool success) {
        (success,) = _tokenAddress.call(abi.encodeWithSignature("transfer(address,uint256)", _to, _value));
        require(success, "Transfer failed");

        return fetchReturnData();
    }

    function safeTransferFrom(address _tokenAddress, address _from, address _to, uint256 _value) internal returns (bool success) {
        (success,) = _tokenAddress.call(abi.encodeWithSignature("transferFrom(address,address,uint256)", _from, _to, _value));
        require(success, "Transfer From failed");

        return fetchReturnData();
    }

    function safeApprove(address _tokenAddress, address _spender, uint256 _value) internal returns (bool success) {
        (success,) = _tokenAddress.call(abi.encodeWithSignature("approve(address,uint256)", _spender, _value));
        require(success,  "Approve failed");

        return fetchReturnData();
    }

    function fetchReturnData() internal pure returns (bool success){
        assembly {
            switch returndatasize()
            case 0 {
                success := 1
            }
            case 32 {
                returndatacopy(0, 0, 32)
                success := mload(0)
            }
            default {
                revert(0, 0)
            }
        }
    }

}

/// @title A contract which allows its owner to withdraw any ether which is contained inside
contract Withdrawable is Ownable {

    /// @notice Withdraw ether contained in this contract and send it back to owner
    /// @dev onlyOwner modifier only allows the contract owner to run the code
    /// @param _token The address of the token that the user wants to withdraw
    /// @param _amount The amount of tokens that the caller wants to withdraw
    /// @return bool value indicating whether the transfer was successful
    function withdrawToken(address _token, uint256 _amount) external onlyOwner returns (bool) {
        return ERC20SafeTransfer.safeTransfer(_token, owner, _amount);
    }

    /// @notice Withdraw ether contained in this contract and send it back to owner
    /// @dev onlyOwner modifier only allows the contract owner to run the code
    /// @param _amount The amount of ether that the caller wants to withdraw
    function withdrawETH(uint256 _amount) external onlyOwner {
        owner.transfer(_amount);
    }
}

/**
 * @title Pausable
 * @dev Base contract which allows children to implement an emergency stop mechanism.
 */
contract Pausable is Ownable {
  event Paused();
  event Unpaused();

  bool private _paused = false;

  /**
   * @return true if the contract is paused, false otherwise.
   */
  function paused() public view returns (bool) {
    return _paused;
  }

  /**
   * @dev Modifier to make a function callable only when the contract is not paused.
   */
  modifier whenNotPaused() {
    require(!_paused, "Contract is paused.");
    _;
  }

  /**
   * @dev Modifier to make a function callable only when the contract is paused.
   */
  modifier whenPaused() {
    require(_paused, "Contract not paused.");
    _;
  }

  /**
   * @dev called by the owner to pause, triggers stopped state
   */
  function pause() public onlyOwner whenNotPaused {
    _paused = true;
    emit Paused();
  }

  /**
   * @dev called by the owner to unpause, returns to normal state
   */
  function unpause() public onlyOwner whenPaused {
    _paused = false;
    emit Unpaused();
  }
}

/**
 * @title ERC20 interface
 * @dev see https://github.com/ethereum/EIPs/issues/20
 */
contract ERC20 {
  function totalSupply() public view returns (uint256);

  function balanceOf(address _who) public view returns (uint256);

  function allowance(address _owner, address _spender)
    public view returns (uint256);

  function transfer(address _to, uint256 _value) public returns (bool);

  function approve(address _spender, uint256 _value)
    public returns (bool);

  function transferFrom(address _from, address _to, uint256 _value)
    public returns (bool);

  function decimals() public view returns (uint256);

  event Transfer(
    address indexed from,
    address indexed to,
    uint256 value
  );

  event Approval(
    address indexed owner,
    address indexed spender,
    uint256 value
  );
}

// File: contracts/lib/TokenTransferProxy.sol

/*

  Copyright 2018 ZeroEx Intl.

  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.

*/

/// @title TokenTransferProxy - Transfers tokens on behalf of contracts that have been approved via decentralized governance.
/// @author Amir Bandeali - <[email protected]>, Will Warren - <[email protected]>
contract TokenTransferProxy is Ownable {

    /// @dev Only authorized addresses can invoke functions with this modifier.
    modifier onlyAuthorized {
        require(authorized[msg.sender]);
        _;
    }

    modifier targetAuthorized(address target) {
        require(authorized[target]);
        _;
    }

    modifier targetNotAuthorized(address target) {
        require(!authorized[target]);
        _;
    }

    mapping (address => bool) public authorized;
    address[] public authorities;

    event LogAuthorizedAddressAdded(address indexed target, address indexed caller);
    event LogAuthorizedAddressRemoved(address indexed target, address indexed caller);

    /*
     * Public functions
     */

    /// @dev Authorizes an address.
    /// @param target Address to authorize.
    function addAuthorizedAddress(address target)
        public
        onlyOwner
        targetNotAuthorized(target)
    {
        authorized[target] = true;
        authorities.push(target);
        emit LogAuthorizedAddressAdded(target, msg.sender);
    }

    /// @dev Removes authorizion of an address.
    /// @param target Address to remove authorization from.
    function removeAuthorizedAddress(address target)
        public
        onlyOwner
        targetAuthorized(target)
    {
        delete authorized[target];
        for (uint i = 0; i < authorities.length; i++) {
            if (authorities[i] == target) {
                authorities[i] = authorities[authorities.length - 1];
                authorities.length -= 1;
                break;
            }
        }
        emit LogAuthorizedAddressRemoved(target, msg.sender);
    }

    /// @dev Calls into ERC20 Token contract, invoking transferFrom.
    /// @param token Address of token to transfer.
    /// @param from Address to transfer token from.
    /// @param to Address to transfer token to.
    /// @param value Amount of token to transfer.
    /// @return Success of transfer.
    function transferFrom(
        address token,
        address from,
        address to,
        uint value)
        public
        onlyAuthorized
        returns (bool)
    {
        require(ERC20SafeTransfer.safeTransferFrom(token, from, to, value));
        return true;
    }

    /*
     * Public view functions
     */

    /// @dev Gets all authorized addresses.
    /// @return Array of authorized addresses.
    function getAuthorizedAddresses()
        public
        view
        returns (address[] memory)
    {
        return authorities;
    }
}

/*
    Modified Util contract as used by Kyber Network
*/

library Utils {

    uint256 constant internal PRECISION = (10**18);
    uint256 constant internal MAX_QTY   = (10**28); // 10B tokens
    uint256 constant internal MAX_RATE  = (PRECISION * 10**6); // up to 1M tokens per ETH
    uint256 constant internal MAX_DECIMALS = 18;
    uint256 constant internal ETH_DECIMALS = 18;
    uint256 constant internal MAX_UINT = 2**256-1;
    address constant internal ETH_ADDRESS = address(0x0);

    // Currently constants can't be accessed from other contracts, so providing functions to do that here
    function precision() internal pure returns (uint256) { return PRECISION; }
    function max_qty() internal pure returns (uint256) { return MAX_QTY; }
    function max_rate() internal pure returns (uint256) { return MAX_RATE; }
    function max_decimals() internal pure returns (uint256) { return MAX_DECIMALS; }
    function eth_decimals() internal pure returns (uint256) { return ETH_DECIMALS; }
    function max_uint() internal pure returns (uint256) { return MAX_UINT; }
    function eth_address() internal pure returns (address) { return ETH_ADDRESS; }

    /// @notice Retrieve the number of decimals used for a given ERC20 token
    /// @dev As decimals are an optional feature in ERC20, this contract uses `call` to
    /// ensure that an exception doesn't cause transaction failure
    /// @param token the token for which we should retrieve the decimals
    /// @return decimals the number of decimals in the given token
    function getDecimals(address token)
        internal
        returns (uint256 decimals)
    {
        bytes4 functionSig = bytes4(keccak256("decimals()"));

        /// @dev Using assembly due to issues with current solidity `address.call()`
        /// implementation: https://github.com/ethereum/solidity/issues/2884
        assembly {
            // Pointer to next free memory slot
            let ptr := mload(0x40)
            // Store functionSig variable at ptr
            mstore(ptr,functionSig)
            let functionSigLength := 0x04
            let wordLength := 0x20

            let success := call(
                                gas, // Amount of gas
                                token, // Address to call
                                0, // ether to send
                                ptr, // ptr to input data
                                functionSigLength, // size of data
                                ptr, // where to store output data (overwrite input)
                                wordLength // size of output data (32 bytes)
                               )

            switch success
            case 0 {
                decimals := 0 // If the token doesn't implement `decimals()`, return 0 as default
            }
            case 1 {
                decimals := mload(ptr) // Set decimals to return data from call
            }
            mstore(0x40,add(ptr,0x04)) // Reset the free memory pointer to the next known free location
        }
    }

    /// @dev Checks that a given address has its token allowance and balance set above the given amount
    /// @param tokenOwner the address which should have custody of the token
    /// @param tokenAddress the address of the token to check
    /// @param tokenAmount the amount of the token which should be set
    /// @param addressToAllow the address which should be allowed to transfer the token
    /// @return bool true if the allowance and balance is set, false if not
    function tokenAllowanceAndBalanceSet(
        address tokenOwner,
        address tokenAddress,
        uint256 tokenAmount,
        address addressToAllow
    )
        internal
        view
        returns (bool)
    {
        return (
            ERC20(tokenAddress).allowance(tokenOwner, addressToAllow) >= tokenAmount &&
            ERC20(tokenAddress).balanceOf(tokenOwner) >= tokenAmount
        );
    }

    function calcDstQty(uint srcQty, uint srcDecimals, uint dstDecimals, uint rate) internal pure returns (uint) {
        if (dstDecimals >= srcDecimals) {
            require((dstDecimals - srcDecimals) <= MAX_DECIMALS);
            return (srcQty * rate * (10**(dstDecimals - srcDecimals))) / PRECISION;
        } else {
            require((srcDecimals - dstDecimals) <= MAX_DECIMALS);
            return (srcQty * rate) / (PRECISION * (10**(srcDecimals - dstDecimals)));
        }
    }

    function calcSrcQty(uint dstQty, uint srcDecimals, uint dstDecimals, uint rate) internal pure returns (uint) {

        //source quantity is rounded up. to avoid dest quantity being too low.
        uint numerator;
        uint denominator;
        if (srcDecimals >= dstDecimals) {
            require((srcDecimals - dstDecimals) <= MAX_DECIMALS);
            numerator = (PRECISION * dstQty * (10**(srcDecimals - dstDecimals)));
            denominator = rate;
        } else {
            require((dstDecimals - srcDecimals) <= MAX_DECIMALS);
            numerator = (PRECISION * dstQty);
            denominator = (rate * (10**(dstDecimals - srcDecimals)));
        }
        return (numerator + denominator - 1) / denominator; //avoid rounding down errors
    }

    function calcDestAmount(ERC20 src, ERC20 dest, uint srcAmount, uint rate) internal returns (uint) {
        return calcDstQty(srcAmount, getDecimals(address(src)), getDecimals(address(dest)), rate);
    }

    function calcSrcAmount(ERC20 src, ERC20 dest, uint destAmount, uint rate) internal returns (uint) {
        return calcSrcQty(destAmount, getDecimals(address(src)), getDecimals(address(dest)), rate);
    }

    function calcRateFromQty(uint srcAmount, uint destAmount, uint srcDecimals, uint dstDecimals)
        internal pure returns (uint)
    {
        require(srcAmount <= MAX_QTY);
        require(destAmount <= MAX_QTY);

        if (dstDecimals >= srcDecimals) {
            require((dstDecimals - srcDecimals) <= MAX_DECIMALS);
            return (destAmount * PRECISION / ((10 ** (dstDecimals - srcDecimals)) * srcAmount));
        } else {
            require((srcDecimals - dstDecimals) <= MAX_DECIMALS);
            return (destAmount * PRECISION * (10 ** (srcDecimals - dstDecimals)) / srcAmount);
        }
    }

    /// @notice Bringing this in from the Math library as we've run out of space in TotlePrimary (see EIP-170)
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }
}

/**
 * @title SafeMath
 * @dev Math operations with safety checks that revert on error
 */
library SafeMath {

  /**
  * @dev Multiplies two numbers, reverts on overflow.
  */
  function mul(uint256 _a, uint256 _b) internal pure returns (uint256) {
    // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
    // benefit is lost if 'b' is also tested.
    // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522
    if (_a == 0) {
      return 0;
    }

    uint256 c = _a * _b;
    require(c / _a == _b);

    return c;
  }

  /**
  * @dev Integer division of two numbers truncating the quotient, reverts on division by zero.
  */
  function div(uint256 _a, uint256 _b) internal pure returns (uint256) {
    require(_b > 0); // Solidity only automatically asserts when dividing by 0
    uint256 c = _a / _b;
    // assert(_a == _b * c + _a % _b); // There is no case in which this doesn't hold

    return c;
  }

  /**
  * @dev Subtracts two numbers, reverts on overflow (i.e. if subtrahend is greater than minuend).
  */
  function sub(uint256 _a, uint256 _b) internal pure returns (uint256) {
    require(_b <= _a);
    uint256 c = _a - _b;

    return c;
  }

  /**
  * @dev Adds two numbers, reverts on overflow.
  */
  function add(uint256 _a, uint256 _b) internal pure returns (uint256) {
    uint256 c = _a + _b;
    require(c >= _a);

    return c;
  }

  /**
  * @dev Divides two numbers and returns the remainder (unsigned integer modulo),
  * reverts when dividing by zero.
  */
  function mod(uint256 a, uint256 b) internal pure returns (uint256) {
    require(b != 0);
    return a % b;
  }
}

/**
 * @title Math
 * @dev Assorted math operations
 */

library Math {
  function max(uint256 a, uint256 b) internal pure returns (uint256) {
    return a >= b ? a : b;
  }

  function min(uint256 a, uint256 b) internal pure returns (uint256) {
    return a < b ? a : b;
  }

  function average(uint256 a, uint256 b) internal pure returns (uint256) {
    // (a + b) / 2 can overflow, so we distribute
    return (a / 2) + (b / 2) + ((a % 2 + b % 2) / 2);
  }
}

contract PartnerRegistry is Ownable, Pausable {

    address target;
    mapping(address => bool) partnerContracts;
    address payable public companyBeneficiary;
    uint256 public basePercentage;
    PartnerRegistry public previousRegistry;

    event PartnerRegistered(address indexed creator, address indexed beneficiary, address partnerContract);

    constructor(PartnerRegistry _previousRegistry, address _target, address payable _companyBeneficiary, uint256 _basePercentage) public {
        previousRegistry = _previousRegistry;
        target = _target;
        companyBeneficiary = _companyBeneficiary;
        basePercentage = _basePercentage;
    }

    function registerPartner(address payable partnerBeneficiary, uint256 partnerPercentage) whenNotPaused external {
        Partner newPartner = Partner(createClone());
        newPartner.init(this,address(0x0000000000000000000000000000000000000000), 0, partnerBeneficiary, partnerPercentage);
        partnerContracts[address(newPartner)] = true;
        emit PartnerRegistered(address(msg.sender), partnerBeneficiary, address(newPartner));
    }

    function overrideRegisterPartner(
        address payable _companyBeneficiary,
        uint256 _companyPercentage,
        address payable partnerBeneficiary,
        uint256 partnerPercentage
    ) external onlyOwner {
        Partner newPartner = Partner(createClone());
        newPartner.init(PartnerRegistry(0x0000000000000000000000000000000000000000), _companyBeneficiary, _companyPercentage, partnerBeneficiary, partnerPercentage);
        partnerContracts[address(newPartner)] = true;
        emit PartnerRegistered(address(msg.sender), partnerBeneficiary, address(newPartner));
    }

    function deletePartner(address _partnerAddress) external onlyOwner {
        partnerContracts[_partnerAddress] = false;
    }

    function createClone() internal returns (address payable result) {
        bytes20 targetBytes = bytes20(target);
        assembly {
            let clone := mload(0x40)
            mstore(clone, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)
            mstore(add(clone, 0x14), targetBytes)
            mstore(add(clone, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)
            result := create(0, clone, 0x37)
        }
    }

    function isValidPartner(address partnerContract) external view returns(bool) {
        return partnerContracts[partnerContract] || previousRegistry.isValidPartner(partnerContract);
    }

    function updateCompanyInfo(address payable newCompanyBeneficiary, uint256 newBasePercentage) external onlyOwner {
        companyBeneficiary = newCompanyBeneficiary;
        basePercentage = newBasePercentage;
    }
}

contract Partner {

    address payable public partnerBeneficiary;
    uint256 public partnerPercentage; //This is out of 1 ETH, e.g. 0.5 ETH is 50% of the fee

    uint256 public overrideCompanyPercentage;
    address payable public overrideCompanyBeneficiary;

    PartnerRegistry public registry;

    event LogPayout(
        address[] tokens,
        uint256[] amount
    );

    function init(
        PartnerRegistry _registry,
        address payable _overrideCompanyBeneficiary,
        uint256 _overrideCompanyPercentage,
        address payable _partnerBeneficiary,
        uint256 _partnerPercentage
    ) public {
        require(registry == PartnerRegistry(0x0000000000000000000000000000000000000000) &&
          overrideCompanyBeneficiary == address(0x0) && partnerBeneficiary == address(0x0)
        );
        overrideCompanyBeneficiary = _overrideCompanyBeneficiary;
        overrideCompanyPercentage = _overrideCompanyPercentage;
        partnerBeneficiary = _partnerBeneficiary;
        partnerPercentage = _partnerPercentage;
        overrideCompanyPercentage = _overrideCompanyPercentage;
        registry = _registry;
    }

    function payout(
        address[] memory tokens,
        uint256[] memory amounts
    ) public {
        uint totalFeePercentage = getTotalFeePercentage();
        address payable companyBeneficiary = companyBeneficiary();
        // Payout both the partner and the company at the same time
        for(uint256 index = 0; index<tokens.length; index++){
            uint256 partnerAmount = SafeMath.div(SafeMath.mul(amounts[index], partnerPercentage), getTotalFeePercentage());
            uint256 companyAmount = amounts[index] - partnerAmount;
            if(tokens[index] == Utils.eth_address()){
                partnerBeneficiary.transfer(partnerAmount);
                companyBeneficiary.transfer(companyAmount);
            } else {
                ERC20SafeTransfer.safeTransfer(tokens[index], partnerBeneficiary, partnerAmount);
                ERC20SafeTransfer.safeTransfer(tokens[index], companyBeneficiary, companyAmount);
            }
        }
	emit LogPayout(tokens,amounts);
    }

    function getTotalFeePercentage() public view returns (uint256){
        return partnerPercentage + companyPercentage();
    }

    function companyPercentage() public view returns (uint256){
        if(registry != PartnerRegistry(0x0000000000000000000000000000000000000000)){
            return Math.max(registry.basePercentage(), partnerPercentage);
        } else {
            return overrideCompanyPercentage;
        }
    }

    function companyBeneficiary() public view returns (address payable) {
        if(registry != PartnerRegistry(0x0000000000000000000000000000000000000000)){
            return registry.companyBeneficiary();
        } else {
            return overrideCompanyBeneficiary;
        }    
    }

    function() external payable {

    }
}

library TokenBalanceLibrary {
    struct TokenBalance {
        address tokenAddress;
        uint256 balance;
    }

    function findToken(TokenBalance[20] memory balances, address token)
        internal
        pure
        returns (uint256)
    {
        for (uint256 index = 0; index < balances.length; index++) {
            if (balances[index].tokenAddress == token) {
                return index;
            } else if (
                index != 0 && balances[index].tokenAddress == address(0x0)
            ) {
                balances[index] = TokenBalance(token, 0);
                return index;
            }
        }
    }

    function addBalance(
        TokenBalance[20] memory balances,
        address tokenAddress,
        uint256 amountToAdd
    ) internal pure {
        uint256 tokenIndex = findToken(balances, tokenAddress);
        addBalance(balances, tokenIndex, amountToAdd);
    }

    function addBalance(
        TokenBalance[20] memory balances,
        uint256 balanceIndex,
        uint256 amountToAdd
    ) internal pure {
        balances[balanceIndex].balance += amountToAdd;
    }

    function removeBalance(
        TokenBalance[20] memory balances,
        address tokenAddress,
        uint256 amountToRemove
    ) internal pure {
        uint256 tokenIndex = findToken(balances, tokenAddress);
        removeBalance(balances, tokenIndex, amountToRemove);
    }

    function removeBalance(
        TokenBalance[20] memory balances,
        uint256 balanceIndex,
        uint256 amountToRemove
    ) internal pure {
        balances[balanceIndex].balance -= amountToRemove;
    }
}

/* import "../lib/Logger.sol"; */

/// @title Interface for all exchange handler contracts
contract ExchangeHandler is Withdrawable, Pausable {

    /*
    *   State Variables
    */

    /* Logger public logger; */
    /*
    *   Modifiers
    */

    function performOrder(
        bytes memory genericPayload,
        uint256 availableToSpend,
        uint256 targetAmount,
        bool targetAmountIsSource
    )
        public
        payable
        returns (uint256 amountSpentOnOrder, uint256 amountReceivedFromOrder);

}

interface IGST2 {
    function freeUpTo(uint256) external returns (uint256);
}


/// @title The primary contract for Totle
contract TotlePrimary is Withdrawable, Pausable {
    /*
     *   State Variables
     */

    IGST2 public constant GAS_TOKEN = IGST2(
        0x0000000000b3F879cb30FE243b4Dfee438691c04
    );
    TokenTransferProxy public tokenTransferProxy;
    mapping(address => bool) public signers;
    uint256 public MIN_REFUND_GAS_PRICE = 20000000000;
    /*
     *   Types
     */

    // Structs
    struct Order {
        address payable exchangeHandler;
        bytes encodedPayload;
        uint256 minSourceAmount;
        uint256 maxSourceAmount;
    }

    struct Trade {
        address sourceToken;
        address destinationToken;
        uint256 amount;
        bool isSourceAmount; //true if amount is sourceToken, false if it's destinationToken
        Order[] orders;
    }

    struct Swap {
        Trade[] trades;
        uint256 minimumExchangeRate;
        uint256 minimumDestinationAmount;
        uint256 sourceAmount;
        uint256 tradeToTakeFeeFrom;
        bool takeFeeFromSource; //Takes the fee before the trade if true, takes it after if false
        address payable redirectAddress;
        bool required;
    }

    struct SwapCollection {
        Swap[] swaps;
        address payable partnerContract;
        uint256 expirationBlock;
        bytes32 id;
        uint256 maxGasPrice;
        uint8 v;
        bytes32 r;
        bytes32 s;
    }

    /*
     *   Events
     */

    event LogSwapCollection(
        bytes32 indexed id,
        address indexed partnerContract,
        address indexed user
    );

    event LogSwap(
        bytes32 indexed id,
        address sourceAsset,
        address destinationAsset,
        uint256 sourceAmount,
        uint256 destinationAmount,
        address feeAsset,
        uint256 feeAmount
    );

    /// @notice Constructor
    /// @param _tokenTransferProxy address of the TokenTransferProxy
    /// @param _signer the suggester's address that signs the payloads. More can be added with add/removeSigner functions
    constructor(address _tokenTransferProxy, address _signer) public {
        tokenTransferProxy = TokenTransferProxy(_tokenTransferProxy);
        signers[_signer] = true;
    }

    /*
     *   Public functions
     */

    modifier notExpired(SwapCollection memory swaps) {
        require(swaps.expirationBlock > block.number, "Expired");
        _;
    }

    modifier validSignature(SwapCollection memory swaps) {
        bytes32 hash = keccak256(
            abi.encode(
                swaps.swaps,
                swaps.partnerContract,
                swaps.expirationBlock,
                swaps.id,
                swaps.maxGasPrice,
                msg.sender
            )
        );
        require(
            signers[ecrecover(
                keccak256(
                    abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)
                ),
                swaps.v,
                swaps.r,
                swaps.s
            )],
            "Invalid signature"
        );
        _;
    }

    modifier notAboveMaxGas(SwapCollection memory swaps) {
        require(tx.gasprice <= swaps.maxGasPrice, "Gas price too high");
        _;
    }

    /// @notice Performs the requested set of swaps
    /// @param swaps The struct that defines the collection of swaps to perform
    function performSwapCollection(SwapCollection memory swaps)
        public
        payable
        whenNotPaused
        notExpired(swaps)
        validSignature(swaps)
        notAboveMaxGas(swaps)
    {
        uint256 startingGas = 0;
        if (tx.gasprice >= MIN_REFUND_GAS_PRICE) {
            startingGas = gasleft();
        }


        TokenBalanceLibrary.TokenBalance[20] memory balances;
        balances[0] = TokenBalanceLibrary.TokenBalance(
            address(Utils.eth_address()),
            msg.value
        );
        for (
            uint256 swapIndex = 0;
            swapIndex < swaps.swaps.length;
            swapIndex++
        ) {
            performSwap(
                swaps.id,
                swaps.swaps[swapIndex],
                balances,
                swaps.partnerContract
            );
        }
        emit LogSwapCollection(swaps.id, swaps.partnerContract, msg.sender);
        transferAllTokensToUser(balances);
        if (startingGas > 0) {
            refundGas(startingGas);
        }
    }

    function refundGas(uint256 startingGas) internal {
        uint256 gasRemaining = gasleft();
        uint256 gasSpent = startingGas - gasRemaining;
        uint256 tokensToFree = Math.min(
            (gasSpent + 14154) / 41130,
            (gasRemaining - 27710) / (1148 + 5722 + 150)
        );
        GAS_TOKEN.freeUpTo(tokensToFree);
    }

    function addSigner(address newSigner) public onlyOwner {
        signers[newSigner] = true;
    }

    function removeSigner(address signer) public onlyOwner {
        signers[signer] = false;
    }

    function updateMinRefundGasPrice(uint256 newMinRefundGasPrice)
        external
        onlyOwner
    {
        MIN_REFUND_GAS_PRICE = newMinRefundGasPrice;
    }

    /*
     *   Internal functions
     */

    function performSwap(
        bytes32 swapCollectionId,
        Swap memory swap,
        TokenBalanceLibrary.TokenBalance[20] memory balances,
        address payable partnerContract
    ) internal {
        if (
            !transferFromSenderDifference(
                balances,
                swap.trades[0].sourceToken,
                swap.sourceAmount
            )
        ) {
            if (swap.required) {
                revert("Failed to get tokens for swap");
            } else {
                return;
            }
        }
        uint256 amountSpentFirstTrade = 0;
        uint256 amountReceived = 0;
        uint256 feeAmount = 0;
        for (
            uint256 tradeIndex = 0;
            tradeIndex < swap.trades.length;
            tradeIndex++
        ) {
            if (
                tradeIndex == swap.tradeToTakeFeeFrom && swap.takeFeeFromSource
            ) {
                feeAmount = takeFee(
                    balances,
                    swap.trades[tradeIndex].sourceToken,
                    partnerContract,
                    tradeIndex == 0 ? swap.sourceAmount : amountReceived
                );
            }
            uint256 tempSpent;
            (tempSpent, amountReceived) = performTrade(
                swap.trades[tradeIndex],
                balances,
                Utils.min(
                    tradeIndex == 0 ? swap.sourceAmount : amountReceived,
                    balances[TokenBalanceLibrary.findToken(
                        balances,
                        swap.trades[tradeIndex].sourceToken
                    )]
                        .balance
                )
            );
            if (
                !swap.trades[tradeIndex].isSourceAmount &&
                amountReceived < swap.trades[tradeIndex].amount
            ) {
                if (swap.required) {
                    revert("Not enough destination amount");
                }
                return;
            }
            if (tradeIndex == 0) {
                amountSpentFirstTrade = tempSpent;
                if (feeAmount != 0) {
                    amountSpentFirstTrade += feeAmount;
                }
            }
            if (
                tradeIndex == swap.tradeToTakeFeeFrom && !swap.takeFeeFromSource
            ) {
                feeAmount = takeFee(
                    balances,
                    swap.trades[tradeIndex].destinationToken,
                    partnerContract,
                    amountReceived
                );
                amountReceived -= feeAmount;
            }
        }
        emit LogSwap(
            swapCollectionId,
            swap.trades[0].sourceToken,
            swap.trades[swap.trades.length - 1].destinationToken,
            amountSpentFirstTrade,
            amountReceived,
            swap.takeFeeFromSource
                ? swap.trades[swap.tradeToTakeFeeFrom].sourceToken
                : swap.trades[swap.tradeToTakeFeeFrom].destinationToken,
            feeAmount
        );

        if (amountReceived < swap.minimumDestinationAmount) {
            revert("Got less than minimumDestinationAmount");
        } else if (
            minimumRateFailed(
                swap.trades[0].sourceToken,
                swap.trades[swap.trades.length - 1].destinationToken,
                swap.sourceAmount,
                amountReceived,
                swap.minimumExchangeRate
            )
        ) {
            revert("Minimum exchange rate not met");
        }
        if (
            swap.redirectAddress != msg.sender &&
            swap.redirectAddress != address(0x0)
        ) {
            uint256 destinationTokenIndex = TokenBalanceLibrary.findToken(
                balances,
                swap.trades[swap.trades.length - 1].destinationToken
            );
            uint256 amountToSend = Math.min(
                amountReceived,
                balances[destinationTokenIndex].balance
            );
            transferTokens(
                balances,
                destinationTokenIndex,
                swap.redirectAddress,
                amountToSend
            );
            TokenBalanceLibrary.removeBalance(
                balances,
                swap.trades[swap.trades.length - 1].destinationToken,
                amountToSend
            );
        }
    }

    function performTrade(
        Trade memory trade,
        TokenBalanceLibrary.TokenBalance[20] memory balances,
        uint256 availableToSpend
    ) internal returns (uint256 totalSpent, uint256 totalReceived) {
        uint256 tempSpent = 0;
        uint256 tempReceived = 0;
        uint256 missingSpend = 0; // This is the amount that we expected to have spent, but didn't. Not to be confused with the total amount left to spend
        uint256 totalRemainingExcess = getTotalExcess(trade);
        for (
            uint256 orderIndex = 0;
            orderIndex < trade.orders.length;
            orderIndex++
        ) {
            if ((availableToSpend - totalSpent) * 10000 < availableToSpend) {
                break;
            } else if (trade.isSourceAmount && tempSpent == trade.amount) {
                break;
            }
            uint256 targetSpend = getTargetSpend(
                trade.orders[orderIndex].minSourceAmount,
                trade.orders[orderIndex].maxSourceAmount,
                totalRemainingExcess,
                missingSpend);
            (tempSpent, tempReceived) = performOrder(
                trade.orders[orderIndex],
                availableToSpend - totalSpent,
                trade.isSourceAmount,
                trade.sourceToken,
                balances
            );
            totalRemainingExcess -= (trade.orders[orderIndex].maxSourceAmount -
                trade.orders[orderIndex].minSourceAmount);
            if (tempSpent < trade.orders[orderIndex].minSourceAmount) {
                missingSpend += (targetSpend - tempSpent);
            }
            totalSpent += tempSpent;
            totalReceived += tempReceived;
        }
        TokenBalanceLibrary.addBalance(
            balances,
            trade.destinationToken,
            totalReceived
        );
        TokenBalanceLibrary.removeBalance(
            balances,
            trade.sourceToken,
            totalSpent
        );
    }

    function performOrder(
        Order memory order,
        uint256 targetAmount,
        bool isSourceAmount,
        address tokenToSpend,
        TokenBalanceLibrary.TokenBalance[20] memory balances
    ) internal returns (uint256 spent, uint256 received) {
        if (tokenToSpend == Utils.eth_address()) {
            (spent, received) = ExchangeHandler(order.exchangeHandler)
                .performOrder
                .value(targetAmount)(
                order.encodedPayload,
                targetAmount,
                targetAmount,
                isSourceAmount
            );
        } else {
            transferTokens(
                balances,
                TokenBalanceLibrary.findToken(balances, tokenToSpend),
                order.exchangeHandler,
                targetAmount
            );
            (spent, received) = ExchangeHandler(order.exchangeHandler)
                .performOrder(
                order.encodedPayload,
                targetAmount,
                targetAmount,
                isSourceAmount
            );
        }
    }

    function getTargetSpend(
        uint256 minOrderAmount,
        uint256 maxOrderAmount,
        uint256 totalRemainingExcess,
        uint256 missingSpend
    ) internal returns (uint256 targetSpend) {
        if (missingSpend == 0 || minOrderAmount == maxOrderAmount) {
            return minOrderAmount;
        } else {
            return
                ((maxOrderAmount - minOrderAmount) * missingSpend) /
                totalRemainingExcess;
        }
    }

    function getTotalExcess(Trade memory trade)
        internal
        returns (uint256 totalExcess)
    {
        for (uint8 index = 0; index < trade.orders.length; index++) {
            totalExcess +=
                trade.orders[index].maxSourceAmount -
                trade.orders[index].minSourceAmount;
        }
        return totalExcess;
    }

    function minimumRateFailed(
        address sourceToken,
        address destinationToken,
        uint256 sourceAmount,
        uint256 destinationAmount,
        uint256 minimumExchangeRate
    ) internal returns (bool failed) {
        uint256 sourceDecimals = sourceToken == Utils.eth_address()
            ? 18
            : Utils.getDecimals(sourceToken);
        uint256 destinationDecimals = destinationToken == Utils.eth_address()
            ? 18
            : Utils.getDecimals(destinationToken);
        uint256 rateGot = Utils.calcRateFromQty(
            sourceAmount,
            destinationAmount,
            sourceDecimals,
            destinationDecimals
        );
        return rateGot < minimumExchangeRate;
    }

    function takeFee(
        TokenBalanceLibrary.TokenBalance[20] memory balances,
        address token,
        address payable partnerContract,
        uint256 amountTraded
    ) internal returns (uint256 feeAmount) {
        Partner partner = Partner(partnerContract);
        uint256 feePercentage = partner.getTotalFeePercentage();
        feeAmount = calculateFee(amountTraded, feePercentage);
        transferTokens(
            balances,
            TokenBalanceLibrary.findToken(balances, token),
            partnerContract,
            feeAmount
        );
        TokenBalanceLibrary.removeBalance(
            balances,
            TokenBalanceLibrary.findToken(balances, token),
            feeAmount
        );
        return feeAmount;
    }

    function transferFromSenderDifference(
        TokenBalanceLibrary.TokenBalance[20] memory balances,
        address token,
        uint256 sourceAmount
    ) internal returns (bool) {
        if (token == Utils.eth_address()) {
            if (sourceAmount > balances[0].balance) {
                return false;
            }
            return true;
        }

        uint256 tokenIndex = TokenBalanceLibrary.findToken(balances, token);
        if (sourceAmount > balances[tokenIndex].balance) {
            bool success;
            (success, ) = address(tokenTransferProxy).call(
                abi.encodeWithSignature(
                    "transferFrom(address,address,address,uint256)",
                    token,
                    msg.sender,
                    address(this),
                    sourceAmount - balances[tokenIndex].balance
                )
            );
            if (success) {
                balances[tokenIndex].balance = sourceAmount;
                return true;
            }
            return false;
        }
        return true;
    }

    function transferAllTokensToUser(
        TokenBalanceLibrary.TokenBalance[20] memory balances
    ) internal {
        for (
            uint256 balanceIndex = 0;
            balanceIndex < balances.length;
            balanceIndex++
        ) {
            if (
                balanceIndex != 0 &&
                balances[balanceIndex].tokenAddress == address(0x0)
            ) {
                return;
            }
            transferTokens(
                balances,
                balanceIndex,
                msg.sender,
                balances[balanceIndex].balance
            );
        }
    }

    function transferTokens(
        TokenBalanceLibrary.TokenBalance[20] memory balances,
        uint256 tokenIndex,
        address payable destination,
        uint256 tokenAmount
    ) internal {
        if (tokenAmount > 0) {
            if (balances[tokenIndex].tokenAddress == Utils.eth_address()) {
                destination.transfer(tokenAmount);
            } else {
                require(
                    ERC20SafeTransfer.safeTransfer(
                        balances[tokenIndex].tokenAddress,
                        destination,
                        tokenAmount
                    ),
                    "Transfer failed"
                );
            }
        }
    }

    // @notice Calculates the fee amount given a fee percentage and amount
    // @param amount the amount to calculate the fee based on
    // @param fee the percentage, out of 1 eth (e.g. 0.01 ETH would be 1%)
    function calculateFee(uint256 amount, uint256 fee)
        internal
        pure
        returns (uint256)
    {
        return SafeMath.div(SafeMath.mul(amount, fee), 1 ether);
    }

    /*
     *   Payable fallback function
     */

    /// @notice payable fallback to allow handler or exchange contracts to return ether
    /// @dev only accounts containing code (ie. contracts) can send ether to contract
    function() external payable whenNotPaused {
        // Check in here that the sender is a contract! (to stop accidents)
        uint256 size;
        address sender = msg.sender;
        assembly {
            size := extcodesize(sender)
        }
        if (size == 0) {
            revert("EOA cannot send ether to primary fallback");
        }
    }
}

Contract Security Audit

Contract ABI

[{"constant":false,"inputs":[{"name":"signer","type":"address"}],"name":"removeSigner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"tokenTransferProxy","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"components":[{"components":[{"components":[{"name":"sourceToken","type":"address"},{"name":"destinationToken","type":"address"},{"name":"amount","type":"uint256"},{"name":"isSourceAmount","type":"bool"},{"components":[{"name":"exchangeHandler","type":"address"},{"name":"encodedPayload","type":"bytes"},{"name":"minSourceAmount","type":"uint256"},{"name":"maxSourceAmount","type":"uint256"}],"name":"orders","type":"tuple[]"}],"name":"trades","type":"tuple[]"},{"name":"minimumExchangeRate","type":"uint256"},{"name":"minimumDestinationAmount","type":"uint256"},{"name":"sourceAmount","type":"uint256"},{"name":"tradeToTakeFeeFrom","type":"uint256"},{"name":"takeFeeFromSource","type":"bool"},{"name":"redirectAddress","type":"address"},{"name":"required","type":"bool"}],"name":"swaps","type":"tuple[]"},{"name":"partnerContract","type":"address"},{"name":"expirationBlock","type":"uint256"},{"name":"id","type":"bytes32"},{"name":"maxGasPrice","type":"uint256"},{"name":"v","type":"uint8"},{"name":"r","type":"bytes32"},{"name":"s","type":"bytes32"}],"name":"swaps","type":"tuple"}],"name":"performSwapCollection","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[],"name":"unpause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"signers","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MIN_REFUND_GAS_PRICE","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"pause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"GAS_TOKEN","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_token","type":"address"},{"name":"_amount","type":"uint256"}],"name":"withdrawToken","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"newMinRefundGasPrice","type":"uint256"}],"name":"updateMinRefundGasPrice","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"newSigner","type":"address"}],"name":"addSigner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_amount","type":"uint256"}],"name":"withdrawETH","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[{"name":"_tokenTransferProxy","type":"address"},{"name":"_signer","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":true,"name":"id","type":"bytes32"},{"indexed":true,"name":"partnerContract","type":"address"},{"indexed":true,"name":"user","type":"address"}],"name":"LogSwapCollection","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"id","type":"bytes32"},{"indexed":false,"name":"sourceAsset","type":"address"},{"indexed":false,"name":"destinationAsset","type":"address"},{"indexed":false,"name":"sourceAmount","type":"uint256"},{"indexed":false,"name":"destinationAmount","type":"uint256"},{"indexed":false,"name":"feeAsset","type":"address"},{"indexed":false,"name":"feeAmount","type":"uint256"}],"name":"LogSwap","type":"event"},{"anonymous":false,"inputs":[],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"}],"name":"OwnershipRenounced","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"}]

608060405260008054600160a01b60ff02191690556404a817c8006003553480156200002a57600080fd5b5060405160408062002a8383398101806040526200004c9190810190620000ab565b60008054336001600160a01b0319918216178255600180549091166001600160a01b0394851617815591909216825260026020526040909120805460ff1916909117905562000109565b6000620000a48251620000ea565b9392505050565b60008060408385031215620000bf57600080fd5b6000620000cd858562000096565b9250506020620000e08582860162000096565b9150509250929050565b6000620000f782620000fd565b92915050565b6001600160a01b031690565b61296a80620001196000396000f3fe6080604052600436106100f35760003560e01c80638456cb591161008a578063c571c67e11610059578063c571c67e146102ab578063eb12d61e146102cb578063f14210a6146102eb578063f2fde38b1461030b576100f3565b80638456cb591461023f5780638af8d4c3146102545780638da5cb5b146102695780639e281a981461028b576100f3565b80635c975abb116100c65780635c975abb146101c6578063715018a6146101e8578063736c0d5b146101fd5780637822b9ae1461021d576100f3565b80630e316ab7146101515780630eefdbad1461017357806311a861a71461019e5780633f4ba83a146101b1575b600054600160a01b900460ff161561012957604051600160e51b62461bcd028152600401610120906127f8565b60405180910390fd5b33803b908161014d57604051600160e51b62461bcd02815260040161012090612798565b5050005b34801561015d57600080fd5b5061017161016c366004611e37565b61032b565b005b34801561017f57600080fd5b50610188610363565b604051610195919061276a565b60405180910390f35b6101716101ac366004611e8f565b610372565b3480156101bd57600080fd5b506101716105da565b3480156101d257600080fd5b506101db610664565b60405161019591906126fa565b3480156101f457600080fd5b50610171610674565b34801561020957600080fd5b506101db610218366004611e37565b6106e0565b34801561022957600080fd5b506102326106f5565b6040516101959190612828565b34801561024b57600080fd5b506101716106fb565b34801561026057600080fd5b5061018861078c565b34801561027557600080fd5b5061027e61079f565b60405161019591906125ee565b34801561029757600080fd5b506101db6102a6366004611e55565b6107ae565b3480156102b757600080fd5b506101716102c6366004611ec4565b6107e7565b3480156102d757600080fd5b506101716102e6366004611e37565b610803565b3480156102f757600080fd5b50610171610306366004611ec4565b61083e565b34801561031757600080fd5b50610171610326366004611e37565b610892565b6000546001600160a01b0316331461034257600080fd5b6001600160a01b03166000908152600260205260409020805460ff19169055565b6001546001600160a01b031681565b600054600160a01b900460ff161561039f57604051600160e51b62461bcd028152600401610120906127f8565b80438160400151116103c657604051600160e51b62461bcd02815260040161012090612818565b81600081600001518260200151836040015184606001518560800151336040516020016103f8969594939291906126a6565b6040516020818303038152906040528051906020012090506002600060018360405160200161042791906125c3565b604051602081830303815290604052805190602001208560a001518660c001518760e00151604051600081526020016040526040516104699493929190612708565b6020604051602081039080840390855afa15801561048b573d6000803e3d6000fd5b505060408051601f1901516001600160a01b03168352602083019390935250016000205460ff166104d157604051600160e51b62461bcd028152600401610120906127a8565b8380608001513a11156104f957604051600160e51b62461bcd028152600401610120906127b8565b6003546000903a10610509575a90505b61051161197b565b60405180604001604052806105246108b5565b6001600160a01b0316815234602090910152815260005b8751518110156105785761057088606001518960000151838151811061055d57fe5b6020026020010151848b602001516108ba565b60010161053b565b506020870151606088015160405133926001600160a01b031691907fc3dcfccc2c1c6fe2a908d1825ba2e62b5b2d61a6b9c500791f75cdc538bdeb9d90600090a46105c281610cdf565b81156105d1576105d182610d47565b50505050505050565b6000546001600160a01b031633146105f157600080fd5b600054600160a01b900460ff1661061d57604051600160e51b62461bcd02815260040161012090612778565b6000805474ff0000000000000000000000000000000000000000191681556040517fa45f47fdea8a1efdd9029a5691c7f759c32b7c698632b563573e155625d169339190a1565b600054600160a01b900460ff1690565b6000546001600160a01b0316331461068b57600080fd5b600080546040516001600160a01b03909116917ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482091a26000805473ffffffffffffffffffffffffffffffffffffffff19169055565b60026020526000908152604090205460ff1681565b60035481565b6000546001600160a01b0316331461071257600080fd5b600054600160a01b900460ff161561073f57604051600160e51b62461bcd028152600401610120906127f8565b6000805474ff00000000000000000000000000000000000000001916600160a01b1781556040517f9e87fac88ff661f02d44f95383c817fece4bce600a3dab7a54406878b965e7529190a1565b6eb3f879cb30fe243b4dfee438691c0481565b6000546001600160a01b031681565b600080546001600160a01b031633146107c657600080fd5b6000546107de9084906001600160a01b031684610e13565b90505b92915050565b6000546001600160a01b031633146107fe57600080fd5b600355565b6000546001600160a01b0316331461081a57600080fd5b6001600160a01b03166000908152600260205260409020805460ff19166001179055565b6000546001600160a01b0316331461085557600080fd5b600080546040516001600160a01b039091169183156108fc02918491818181858888f1935050505015801561088e573d6000803e3d6000fd5b5050565b6000546001600160a01b031633146108a957600080fd5b6108b281610f0f565b50565b600090565b6108e58284600001516000815181106108cf57fe5b6020026020010151600001518560600151610f8a565b610913578260e001511561090e57604051600160e51b62461bcd028152600401610120906127d8565b610cd9565b60008080805b865151811015610acf5786608001518114801561093757508660a001515b1561097957610976868860000151838151811061095057fe5b602002602001015160000151878460001461096b5786610971565b8a606001515b61111b565b91505b60006109f18860000151838151811061098e57fe5b6020026020010151886109ec856000146109a857876109ae565b8b606001515b8b6109d48d8f600001518a815181106109c357fe5b6020026020010151600001516111d6565b601481106109de57fe5b602002015160200151611289565b61129f565b8951805191965091925083908110610a0557fe5b602002602001015160600151158015610a3657508751805183908110610a2757fe5b60200260200101516040015184105b15610a6a578760e0015115610a6057604051600160e51b62461bcd02815260040161012090612808565b5050505050610cd9565b81610a7d579350838215610a7d57938201935b876080015182148015610a9257508760a00151155b15610ac657610abe8789600001518481518110610aab57fe5b602002602001015160200151888761111b565b925082840393505b50600101610919565b50867f7c396f87ca37e7dab636d7ffad74fe2ef4729fda118a0a2c105bf74f4890437f8760000151600081518110610b0357fe5b602090810291909101015151885180516000198101908110610b2157fe5b60200260200101516020015186868b60a00151610b5a578b5160808d015181518110610b4957fe5b602002602001015160200151610b78565b8b5160808d015181518110610b6b57fe5b6020026020010151600001515b87604051610b8b96959493929190612631565b60405180910390a28560400151821015610bba57604051600160e51b62461bcd028152600401610120906127e8565b610c088660000151600081518110610bce57fe5b602090810291909101015151875180516000198101908110610bec57fe5b6020026020010151602001518860600151858a60200151611412565b15610c2857604051600160e51b62461bcd028152600401610120906127c8565b60c08601516001600160a01b03163314801590610c51575060c08601516001600160a01b031615155b156105d15785518051600091610c83918891906000198101908110610c7257fe5b6020026020010151602001516111d6565b90506000610c97848884601481106109de57fe5b9050610ca987838a60c001518461149c565b87518051610cd39189916000198101908110610cc157fe5b6020026020010151602001518361154b565b50505050505b50505050565b60005b601481101561088e578015801590610d1457506000828260148110610d0357fe5b6020020151516001600160a01b0316145b15610d1f57506108b2565b610d3f828233858560148110610d3157fe5b60200201516020015161149c565b600101610ce2565b60005a90508082036000610d6c61a0aa61374a840104611b6c616c3d19860104611289565b6040517f6366b9360000000000000000000000000000000000000000000000000000000081529091506eb3f879cb30fe243b4dfee438691c0490636366b93690610dba908490600401612828565b602060405180830381600087803b158015610dd457600080fd5b505af1158015610de8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610e0c9190810190611ee2565b5050505050565b6000836001600160a01b03168383604051602401610e3292919061268b565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905251610e9591906125b7565b6000604051808303816000865af19150503d8060008114610ed2576040519150601f19603f3d011682016040523d82523d6000602084013e610ed7565b606091505b50508091505080610efd57604051600160e51b62461bcd02815260040161012090612788565b610f05611564565b90505b9392505050565b6001600160a01b038116610f2257600080fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a36000805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6000610f946108b5565b6001600160a01b0316836001600160a01b03161415610fca57835160200151821115610fc257506000610f08565b506001610f08565b6000610fd685856111d6565b9050848160148110610fe457fe5b602002015160200151831115611110576001546000906001600160a01b031685333089866014811061101257fe5b602002015160200151880360405160240161103094939291906125fc565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f15dacbea000000000000000000000000000000000000000000000000000000001790525161109391906125b7565b6000604051808303816000865af19150503d80600081146110d0576040519150601f19603f3d011682016040523d82523d6000602084013e6110d5565b606091505b5090915050801561110557838683601481106110ed57fe5b60200201516020018181525050600192505050610f08565b600092505050610f08565b506001949350505050565b6000808390506000816001600160a01b031663064367bb6040518163ffffffff1660e01b815260040160206040518083038186803b15801561115c57600080fd5b505afa158015611170573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506111949190810190611ee2565b90506111a08482611593565b92506111b7876111b089896111d6565b878661149c565b6111cb876111c589896111d6565b856115b0565b50505b949350505050565b6000805b601481101561128257826001600160a01b03168482601481106111f957fe5b6020020151516001600160a01b031614156112155790506107e1565b801580159061123e5750600084826014811061122d57fe5b6020020151516001600160a01b0316145b1561127a576040518060400160405280846001600160a01b03168152602001600081525084826014811061126e57fe5b602002015290506107e1565b6001016111da565b5092915050565b600081831061129857816107de565b5090919050565b600080808080806112af896115d5565b905060005b8960800151518110156113e757878789036127100210156112d4576113e7565b896060015180156112e85750896040015185145b156112f2576113e7565b60006113368b60800151838151811061130757fe5b6020026020010151604001518c60800151848151811061132357fe5b602002602001015160600151858761163f565b90506113668b60800151838151811061134b57fe5b6020026020010151898b038d606001518e600001518e61166e565b80965081975050508a60800151828151811061137e57fe5b6020026020010151604001518b60800151838151811061139a57fe5b60200260200101516060015103830392508a6080015182815181106113bb57fe5b6020026020010151604001518610156113d657858103840193505b5095840195948301946001016112b4565b506113f7888a6020015187611809565b611406888a600001518861154b565b50505050935093915050565b60008061141d6108b5565b6001600160a01b0316876001600160a01b0316146114435761143e87611822565b611446565b60125b905060006114526108b5565b6001600160a01b0316876001600160a01b0316146114785761147387611822565b61147b565b60125b9050600061148b8787858561187e565b851193505050505b95945050505050565b8015610cd9576114aa6108b5565b6001600160a01b03168484601481106114bf57fe5b6020020151516001600160a01b03161415611510576040516001600160a01b0383169082156108fc029083906000818181858888f1935050505015801561150a573d6000803e3d6000fd5b50610cd9565b61152c84846014811061151f57fe5b6020020151518383610e13565b610cd957604051600160e51b62461bcd02815260040161012090612788565b600061155784846111d6565b9050610cd98482846115b0565b60003d801561157a576020811461158357600080fd5b6001915061158f565b60206000803e60005191505b5090565b60006107de6115a2848461190d565b670de0b6b3a7640000611934565b808383601481106115bd57fe5b60200201516020018181510391508181525050505050565b6000805b8260800151518160ff1610156116395782608001518160ff16815181106115fc57fe5b60200260200101516040015183608001518260ff168151811061161b57fe5b602002602001015160600151038201915080806001019150506115d9565b50919050565b600081158061164d57508385145b156116595750836111ce565b8282868603028161166657fe5b0490506111ce565b6000806116796108b5565b6001600160a01b0316846001600160a01b0316141561174157865160208801516040517f0345c2a60000000000000000000000000000000000000000000000000000000081526001600160a01b0390921691630345c2a69189916116e69190839081908c90600401612730565b60408051808303818588803b1580156116fe57600080fd5b505af1158015611712573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052506117379190810190611f00565b90925090506117ff565b6117578361174f85876111d6565b89518961149c565b865160208801516040517f0345c2a60000000000000000000000000000000000000000000000000000000081526001600160a01b0390921691630345c2a6916117a8918a9081908b90600401612730565b6040805180830381600087803b1580156117c157600080fd5b505af11580156117d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506117f99190810190611f00565b90925090505b9550959350505050565b600061181584846111d6565b9050610cd9848284611956565b600080604051611831906125e3565b6040519081900381208082529150600460208083838160008a5af180801561186057600181146118695761186e565b6000965061186e565b845196505b5050505060040160405250919050565b60006b204fce5e3e2502611000000085111561189957600080fd5b6b204fce5e3e250261100000008411156118b257600080fd5b8282106118e357601283830311156118c957600080fd5b84838303600a0a02670de0b6b3a764000085028161166657fe5b601282840311156118f357600080fd5b84828403600a0a670de0b6b3a76400008602028161166657fe5b60008261191c575060006107e1565b8282028284828161192957fe5b04146107de57600080fd5b600080821161194257600080fd5b600082848161194d57fe5b04949350505050565b8083836014811061196357fe5b60200201516020018181510191508181525050505050565b6040518061050001604052806014905b6119936119a9565b81526020019060019003908161198b5790505090565b604080518082019091526000808252602082015290565b60006107de82356128be565b600082601f8301126119dd57600080fd5b81356119f06119eb8261285d565b612836565b81815260209384019390925082018360005b83811015611a2e5781358601611a188882611b59565b8452506020928301929190910190600101611a02565b5050505092915050565b600082601f830112611a4957600080fd5b8135611a576119eb8261285d565b81815260209384019390925082018360005b83811015611a2e5781358601611a7f8882611cb8565b8452506020928301929190910190600101611a69565b600082601f830112611aa657600080fd5b8135611ab46119eb8261285d565b81815260209384019390925082018360005b83811015611a2e5781358601611adc8882611d84565b8452506020928301929190910190600101611ac6565b60006107de82356128c9565b60006107de82356128ce565b600082601f830112611b1b57600080fd5b8135611b296119eb8261287e565b91508082526020830160208301858383011115611b4557600080fd5b611b508382846128ee565b50505092915050565b600060808284031215611b6b57600080fd5b611b756080612836565b90506000611b8384846119c0565b825250602082013567ffffffffffffffff811115611ba057600080fd5b611bac84828501611b0a565b6020830152506040611bc084828501611afe565b6040830152506060611bd484828501611afe565b60608301525092915050565b60006101008284031215611bf357600080fd5b611bfe610100612836565b9050813567ffffffffffffffff811115611c1757600080fd5b611c2384828501611a38565b8252506020611c34848483016119c0565b6020830152506040611c4884828501611afe565b6040830152506060611c5c84828501611afe565b6060830152506080611c7084828501611afe565b60808301525060a0611c8484828501611e2b565b60a08301525060c0611c9884828501611afe565b60c08301525060e0611cac84828501611afe565b60e08301525092915050565b60006101008284031215611ccb57600080fd5b611cd6610100612836565b9050813567ffffffffffffffff811115611cef57600080fd5b611cfb84828501611a95565b8252506020611d0c84848301611afe565b6020830152506040611d2084828501611afe565b6040830152506060611d3484828501611afe565b6060830152506080611d4884828501611afe565b60808301525060a0611d5c84828501611af2565b60a08301525060c0611d70848285016119c0565b60c08301525060e0611cac84828501611af2565b600060a08284031215611d9657600080fd5b611da060a0612836565b90506000611dae84846119c0565b8252506020611dbf848483016119c0565b6020830152506040611dd384828501611afe565b6040830152506060611de784828501611af2565b606083015250608082013567ffffffffffffffff811115611e0757600080fd5b611e13848285016119cc565b60808301525092915050565b60006107de82516128ce565b60006107de82356128dd565b600060208284031215611e4957600080fd5b60006111ce84846119c0565b60008060408385031215611e6857600080fd5b6000611e7485856119c0565b9250506020611e8585828601611afe565b9150509250929050565b600060208284031215611ea157600080fd5b813567ffffffffffffffff811115611eb857600080fd5b6111ce84828501611be0565b600060208284031215611ed657600080fd5b60006111ce8484611afe565b600060208284031215611ef457600080fd5b60006111ce8484611e1f565b60008060408385031215611f1357600080fd5b6000611f1f8585611e1f565b9250506020611e8585828601611e1f565b60006107de838361244d565b60006107de83836124a9565b60006107de8383612549565b611f5d816128be565b82525050565b6000611f6e826128ac565b611f7881856128b0565b935083602082028501611f8a856128a6565b60005b84811015611fc1578383038852611fa5838351611f30565b9250611fb0826128a6565b602098909801979150600101611f8d565b50909695505050505050565b6000611fd8826128ac565b611fe281856128b0565b935083602082028501611ff4856128a6565b60005b84811015611fc157838303885261200f838351611f3c565b925061201a826128a6565b602098909801979150600101611ff7565b6000612036826128ac565b61204081856128b0565b935083602082028501612052856128a6565b60005b84811015611fc157838303885261206d838351611f48565b9250612078826128a6565b602098909801979150600101612055565b611f5d816128c9565b611f5d816128ce565b611f5d6120a7826128ce565b6128ce565b60006120b7826128ac565b6120c181856128b9565b93506120d18185602086016128fa565b9290920192915050565b60006120e6826128ac565b6120f081856128b0565b93506121008185602086016128fa565b61210981612926565b9093019392505050565b611f5d816128e3565b60006121296014836128b0565b7f436f6e7472616374206e6f74207061757365642e000000000000000000000000815260200192915050565b6000612162601c836128b9565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152601c0192915050565b600061219b600f836128b0565b7f5472616e73666572206661696c65640000000000000000000000000000000000815260200192915050565b60006121d4600a836128b9565b7f646563696d616c732829000000000000000000000000000000000000000000008152600a0192915050565b600061220d6029836128b0565b7f454f412063616e6e6f742073656e6420657468657220746f207072696d61727981527f2066616c6c6261636b0000000000000000000000000000000000000000000000602082015260400192915050565b600061226c6011836128b0565b7f496e76616c6964207369676e6174757265000000000000000000000000000000815260200192915050565b60006122a56012836128b0565b7f47617320707269636520746f6f20686967680000000000000000000000000000815260200192915050565b60006122de601d836128b0565b7f4d696e696d756d2065786368616e67652072617465206e6f74206d6574000000815260200192915050565b6000612317601d836128b0565b7f4661696c656420746f2067657420746f6b656e7320666f722073776170000000815260200192915050565b60006123506026836128b0565b7f476f74206c657373207468616e206d696e696d756d44657374696e6174696f6e81527f416d6f756e740000000000000000000000000000000000000000000000000000602082015260400192915050565b60006123af6013836128b0565b7f436f6e7472616374206973207061757365642e00000000000000000000000000815260200192915050565b60006123e8601d836128b0565b7f4e6f7420656e6f7567682064657374696e6174696f6e20616d6f756e74000000815260200192915050565b60006124216007836128b0565b7f4578706972656400000000000000000000000000000000000000000000000000815260200192915050565b805160009060808401906124618582611f54565b506020830151848203602086015261247982826120db565b915050604083015161248e6040860182612092565b5060608301516124a16060860182612092565b509392505050565b8051610100808452600091908401906124c2828261202b565b91505060208301516124d76020860182612092565b5060408301516124ea6040860182612092565b5060608301516124fd6060860182612092565b5060808301516125106080860182612092565b5060a083015161252360a0860182612089565b5060c083015161253660c0860182611f54565b5060e08301516124a160e0860182612089565b805160009060a084019061255d8582611f54565b5060208301516125706020860182611f54565b5060408301516125836040860182612092565b5060608301516125966060860182612089565b50608083015184820360808601526114938282611f63565b611f5d816128dd565b6000610f0882846120ac565b60006125ce82612155565b91506125da828461209b565b50602001919050565b60006107e1826121c7565b602081016107e18284611f54565b6080810161260a8287611f54565b6126176020830186611f54565b6126246040830185611f54565b6114936060830184612092565b60c0810161263f8289611f54565b61264c6020830188611f54565b6126596040830187612092565b6126666060830186612092565b6126736080830185611f54565b61268060a0830184612092565b979650505050505050565b604081016126998285611f54565b610f086020830184612092565b60c080825281016126b78189611fcd565b90506126c66020830188611f54565b6126d36040830187612092565b6126e06060830186612092565b6126ed6080830185612092565b61268060a0830184611f54565b602081016107e18284612089565b608081016127168287612092565b61272360208301866125ae565b6126246040830185612092565b6080808252810161274181876120db565b90506127506020830186612092565b61275d6040830185612092565b6114936060830184612089565b602081016107e18284612113565b602080825281016107e18161211c565b602080825281016107e18161218e565b602080825281016107e181612200565b602080825281016107e18161225f565b602080825281016107e181612298565b602080825281016107e1816122d1565b602080825281016107e18161230a565b602080825281016107e181612343565b602080825281016107e1816123a2565b602080825281016107e1816123db565b602080825281016107e181612414565b602081016107e18284612092565b60405181810167ffffffffffffffff8111828210171561285557600080fd5b604052919050565b600067ffffffffffffffff82111561287457600080fd5b5060209081020190565b600067ffffffffffffffff82111561289557600080fd5b506020601f91909101601f19160190565b60200190565b5190565b90815260200190565b919050565b60006107e1826128d1565b151590565b90565b6001600160a01b031690565b60ff1690565b60006107e1826128be565b82818337506000910152565b60005b838110156129155781810151838201526020016128fd565b83811115610cd95750506000910152565b601f01601f19169056fea265627a7a72305820d09795012e055d1cfd702eaaeb55e806c72224a35210229d4f10c77970a156036c6578706572696d656e74616cf5003700000000000000000000000074758acfce059f503a7e6b0fc2c8737600f9f2c4000000000000000000000000c2d7cf95645d33006175b78989035c7c9061d3f9

Deployed Bytecode

0x6080604052600436106100f35760003560e01c80638456cb591161008a578063c571c67e11610059578063c571c67e146102ab578063eb12d61e146102cb578063f14210a6146102eb578063f2fde38b1461030b576100f3565b80638456cb591461023f5780638af8d4c3146102545780638da5cb5b146102695780639e281a981461028b576100f3565b80635c975abb116100c65780635c975abb146101c6578063715018a6146101e8578063736c0d5b146101fd5780637822b9ae1461021d576100f3565b80630e316ab7146101515780630eefdbad1461017357806311a861a71461019e5780633f4ba83a146101b1575b600054600160a01b900460ff161561012957604051600160e51b62461bcd028152600401610120906127f8565b60405180910390fd5b33803b908161014d57604051600160e51b62461bcd02815260040161012090612798565b5050005b34801561015d57600080fd5b5061017161016c366004611e37565b61032b565b005b34801561017f57600080fd5b50610188610363565b604051610195919061276a565b60405180910390f35b6101716101ac366004611e8f565b610372565b3480156101bd57600080fd5b506101716105da565b3480156101d257600080fd5b506101db610664565b60405161019591906126fa565b3480156101f457600080fd5b50610171610674565b34801561020957600080fd5b506101db610218366004611e37565b6106e0565b34801561022957600080fd5b506102326106f5565b6040516101959190612828565b34801561024b57600080fd5b506101716106fb565b34801561026057600080fd5b5061018861078c565b34801561027557600080fd5b5061027e61079f565b60405161019591906125ee565b34801561029757600080fd5b506101db6102a6366004611e55565b6107ae565b3480156102b757600080fd5b506101716102c6366004611ec4565b6107e7565b3480156102d757600080fd5b506101716102e6366004611e37565b610803565b3480156102f757600080fd5b50610171610306366004611ec4565b61083e565b34801561031757600080fd5b50610171610326366004611e37565b610892565b6000546001600160a01b0316331461034257600080fd5b6001600160a01b03166000908152600260205260409020805460ff19169055565b6001546001600160a01b031681565b600054600160a01b900460ff161561039f57604051600160e51b62461bcd028152600401610120906127f8565b80438160400151116103c657604051600160e51b62461bcd02815260040161012090612818565b81600081600001518260200151836040015184606001518560800151336040516020016103f8969594939291906126a6565b6040516020818303038152906040528051906020012090506002600060018360405160200161042791906125c3565b604051602081830303815290604052805190602001208560a001518660c001518760e00151604051600081526020016040526040516104699493929190612708565b6020604051602081039080840390855afa15801561048b573d6000803e3d6000fd5b505060408051601f1901516001600160a01b03168352602083019390935250016000205460ff166104d157604051600160e51b62461bcd028152600401610120906127a8565b8380608001513a11156104f957604051600160e51b62461bcd028152600401610120906127b8565b6003546000903a10610509575a90505b61051161197b565b60405180604001604052806105246108b5565b6001600160a01b0316815234602090910152815260005b8751518110156105785761057088606001518960000151838151811061055d57fe5b6020026020010151848b602001516108ba565b60010161053b565b506020870151606088015160405133926001600160a01b031691907fc3dcfccc2c1c6fe2a908d1825ba2e62b5b2d61a6b9c500791f75cdc538bdeb9d90600090a46105c281610cdf565b81156105d1576105d182610d47565b50505050505050565b6000546001600160a01b031633146105f157600080fd5b600054600160a01b900460ff1661061d57604051600160e51b62461bcd02815260040161012090612778565b6000805474ff0000000000000000000000000000000000000000191681556040517fa45f47fdea8a1efdd9029a5691c7f759c32b7c698632b563573e155625d169339190a1565b600054600160a01b900460ff1690565b6000546001600160a01b0316331461068b57600080fd5b600080546040516001600160a01b03909116917ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482091a26000805473ffffffffffffffffffffffffffffffffffffffff19169055565b60026020526000908152604090205460ff1681565b60035481565b6000546001600160a01b0316331461071257600080fd5b600054600160a01b900460ff161561073f57604051600160e51b62461bcd028152600401610120906127f8565b6000805474ff00000000000000000000000000000000000000001916600160a01b1781556040517f9e87fac88ff661f02d44f95383c817fece4bce600a3dab7a54406878b965e7529190a1565b6eb3f879cb30fe243b4dfee438691c0481565b6000546001600160a01b031681565b600080546001600160a01b031633146107c657600080fd5b6000546107de9084906001600160a01b031684610e13565b90505b92915050565b6000546001600160a01b031633146107fe57600080fd5b600355565b6000546001600160a01b0316331461081a57600080fd5b6001600160a01b03166000908152600260205260409020805460ff19166001179055565b6000546001600160a01b0316331461085557600080fd5b600080546040516001600160a01b039091169183156108fc02918491818181858888f1935050505015801561088e573d6000803e3d6000fd5b5050565b6000546001600160a01b031633146108a957600080fd5b6108b281610f0f565b50565b600090565b6108e58284600001516000815181106108cf57fe5b6020026020010151600001518560600151610f8a565b610913578260e001511561090e57604051600160e51b62461bcd028152600401610120906127d8565b610cd9565b60008080805b865151811015610acf5786608001518114801561093757508660a001515b1561097957610976868860000151838151811061095057fe5b602002602001015160000151878460001461096b5786610971565b8a606001515b61111b565b91505b60006109f18860000151838151811061098e57fe5b6020026020010151886109ec856000146109a857876109ae565b8b606001515b8b6109d48d8f600001518a815181106109c357fe5b6020026020010151600001516111d6565b601481106109de57fe5b602002015160200151611289565b61129f565b8951805191965091925083908110610a0557fe5b602002602001015160600151158015610a3657508751805183908110610a2757fe5b60200260200101516040015184105b15610a6a578760e0015115610a6057604051600160e51b62461bcd02815260040161012090612808565b5050505050610cd9565b81610a7d579350838215610a7d57938201935b876080015182148015610a9257508760a00151155b15610ac657610abe8789600001518481518110610aab57fe5b602002602001015160200151888761111b565b925082840393505b50600101610919565b50867f7c396f87ca37e7dab636d7ffad74fe2ef4729fda118a0a2c105bf74f4890437f8760000151600081518110610b0357fe5b602090810291909101015151885180516000198101908110610b2157fe5b60200260200101516020015186868b60a00151610b5a578b5160808d015181518110610b4957fe5b602002602001015160200151610b78565b8b5160808d015181518110610b6b57fe5b6020026020010151600001515b87604051610b8b96959493929190612631565b60405180910390a28560400151821015610bba57604051600160e51b62461bcd028152600401610120906127e8565b610c088660000151600081518110610bce57fe5b602090810291909101015151875180516000198101908110610bec57fe5b6020026020010151602001518860600151858a60200151611412565b15610c2857604051600160e51b62461bcd028152600401610120906127c8565b60c08601516001600160a01b03163314801590610c51575060c08601516001600160a01b031615155b156105d15785518051600091610c83918891906000198101908110610c7257fe5b6020026020010151602001516111d6565b90506000610c97848884601481106109de57fe5b9050610ca987838a60c001518461149c565b87518051610cd39189916000198101908110610cc157fe5b6020026020010151602001518361154b565b50505050505b50505050565b60005b601481101561088e578015801590610d1457506000828260148110610d0357fe5b6020020151516001600160a01b0316145b15610d1f57506108b2565b610d3f828233858560148110610d3157fe5b60200201516020015161149c565b600101610ce2565b60005a90508082036000610d6c61a0aa61374a840104611b6c616c3d19860104611289565b6040517f6366b9360000000000000000000000000000000000000000000000000000000081529091506eb3f879cb30fe243b4dfee438691c0490636366b93690610dba908490600401612828565b602060405180830381600087803b158015610dd457600080fd5b505af1158015610de8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610e0c9190810190611ee2565b5050505050565b6000836001600160a01b03168383604051602401610e3292919061268b565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905251610e9591906125b7565b6000604051808303816000865af19150503d8060008114610ed2576040519150601f19603f3d011682016040523d82523d6000602084013e610ed7565b606091505b50508091505080610efd57604051600160e51b62461bcd02815260040161012090612788565b610f05611564565b90505b9392505050565b6001600160a01b038116610f2257600080fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a36000805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6000610f946108b5565b6001600160a01b0316836001600160a01b03161415610fca57835160200151821115610fc257506000610f08565b506001610f08565b6000610fd685856111d6565b9050848160148110610fe457fe5b602002015160200151831115611110576001546000906001600160a01b031685333089866014811061101257fe5b602002015160200151880360405160240161103094939291906125fc565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f15dacbea000000000000000000000000000000000000000000000000000000001790525161109391906125b7565b6000604051808303816000865af19150503d80600081146110d0576040519150601f19603f3d011682016040523d82523d6000602084013e6110d5565b606091505b5090915050801561110557838683601481106110ed57fe5b60200201516020018181525050600192505050610f08565b600092505050610f08565b506001949350505050565b6000808390506000816001600160a01b031663064367bb6040518163ffffffff1660e01b815260040160206040518083038186803b15801561115c57600080fd5b505afa158015611170573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506111949190810190611ee2565b90506111a08482611593565b92506111b7876111b089896111d6565b878661149c565b6111cb876111c589896111d6565b856115b0565b50505b949350505050565b6000805b601481101561128257826001600160a01b03168482601481106111f957fe5b6020020151516001600160a01b031614156112155790506107e1565b801580159061123e5750600084826014811061122d57fe5b6020020151516001600160a01b0316145b1561127a576040518060400160405280846001600160a01b03168152602001600081525084826014811061126e57fe5b602002015290506107e1565b6001016111da565b5092915050565b600081831061129857816107de565b5090919050565b600080808080806112af896115d5565b905060005b8960800151518110156113e757878789036127100210156112d4576113e7565b896060015180156112e85750896040015185145b156112f2576113e7565b60006113368b60800151838151811061130757fe5b6020026020010151604001518c60800151848151811061132357fe5b602002602001015160600151858761163f565b90506113668b60800151838151811061134b57fe5b6020026020010151898b038d606001518e600001518e61166e565b80965081975050508a60800151828151811061137e57fe5b6020026020010151604001518b60800151838151811061139a57fe5b60200260200101516060015103830392508a6080015182815181106113bb57fe5b6020026020010151604001518610156113d657858103840193505b5095840195948301946001016112b4565b506113f7888a6020015187611809565b611406888a600001518861154b565b50505050935093915050565b60008061141d6108b5565b6001600160a01b0316876001600160a01b0316146114435761143e87611822565b611446565b60125b905060006114526108b5565b6001600160a01b0316876001600160a01b0316146114785761147387611822565b61147b565b60125b9050600061148b8787858561187e565b851193505050505b95945050505050565b8015610cd9576114aa6108b5565b6001600160a01b03168484601481106114bf57fe5b6020020151516001600160a01b03161415611510576040516001600160a01b0383169082156108fc029083906000818181858888f1935050505015801561150a573d6000803e3d6000fd5b50610cd9565b61152c84846014811061151f57fe5b6020020151518383610e13565b610cd957604051600160e51b62461bcd02815260040161012090612788565b600061155784846111d6565b9050610cd98482846115b0565b60003d801561157a576020811461158357600080fd5b6001915061158f565b60206000803e60005191505b5090565b60006107de6115a2848461190d565b670de0b6b3a7640000611934565b808383601481106115bd57fe5b60200201516020018181510391508181525050505050565b6000805b8260800151518160ff1610156116395782608001518160ff16815181106115fc57fe5b60200260200101516040015183608001518260ff168151811061161b57fe5b602002602001015160600151038201915080806001019150506115d9565b50919050565b600081158061164d57508385145b156116595750836111ce565b8282868603028161166657fe5b0490506111ce565b6000806116796108b5565b6001600160a01b0316846001600160a01b0316141561174157865160208801516040517f0345c2a60000000000000000000000000000000000000000000000000000000081526001600160a01b0390921691630345c2a69189916116e69190839081908c90600401612730565b60408051808303818588803b1580156116fe57600080fd5b505af1158015611712573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052506117379190810190611f00565b90925090506117ff565b6117578361174f85876111d6565b89518961149c565b865160208801516040517f0345c2a60000000000000000000000000000000000000000000000000000000081526001600160a01b0390921691630345c2a6916117a8918a9081908b90600401612730565b6040805180830381600087803b1580156117c157600080fd5b505af11580156117d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506117f99190810190611f00565b90925090505b9550959350505050565b600061181584846111d6565b9050610cd9848284611956565b600080604051611831906125e3565b6040519081900381208082529150600460208083838160008a5af180801561186057600181146118695761186e565b6000965061186e565b845196505b5050505060040160405250919050565b60006b204fce5e3e2502611000000085111561189957600080fd5b6b204fce5e3e250261100000008411156118b257600080fd5b8282106118e357601283830311156118c957600080fd5b84838303600a0a02670de0b6b3a764000085028161166657fe5b601282840311156118f357600080fd5b84828403600a0a670de0b6b3a76400008602028161166657fe5b60008261191c575060006107e1565b8282028284828161192957fe5b04146107de57600080fd5b600080821161194257600080fd5b600082848161194d57fe5b04949350505050565b8083836014811061196357fe5b60200201516020018181510191508181525050505050565b6040518061050001604052806014905b6119936119a9565b81526020019060019003908161198b5790505090565b604080518082019091526000808252602082015290565b60006107de82356128be565b600082601f8301126119dd57600080fd5b81356119f06119eb8261285d565b612836565b81815260209384019390925082018360005b83811015611a2e5781358601611a188882611b59565b8452506020928301929190910190600101611a02565b5050505092915050565b600082601f830112611a4957600080fd5b8135611a576119eb8261285d565b81815260209384019390925082018360005b83811015611a2e5781358601611a7f8882611cb8565b8452506020928301929190910190600101611a69565b600082601f830112611aa657600080fd5b8135611ab46119eb8261285d565b81815260209384019390925082018360005b83811015611a2e5781358601611adc8882611d84565b8452506020928301929190910190600101611ac6565b60006107de82356128c9565b60006107de82356128ce565b600082601f830112611b1b57600080fd5b8135611b296119eb8261287e565b91508082526020830160208301858383011115611b4557600080fd5b611b508382846128ee565b50505092915050565b600060808284031215611b6b57600080fd5b611b756080612836565b90506000611b8384846119c0565b825250602082013567ffffffffffffffff811115611ba057600080fd5b611bac84828501611b0a565b6020830152506040611bc084828501611afe565b6040830152506060611bd484828501611afe565b60608301525092915050565b60006101008284031215611bf357600080fd5b611bfe610100612836565b9050813567ffffffffffffffff811115611c1757600080fd5b611c2384828501611a38565b8252506020611c34848483016119c0565b6020830152506040611c4884828501611afe565b6040830152506060611c5c84828501611afe565b6060830152506080611c7084828501611afe565b60808301525060a0611c8484828501611e2b565b60a08301525060c0611c9884828501611afe565b60c08301525060e0611cac84828501611afe565b60e08301525092915050565b60006101008284031215611ccb57600080fd5b611cd6610100612836565b9050813567ffffffffffffffff811115611cef57600080fd5b611cfb84828501611a95565b8252506020611d0c84848301611afe565b6020830152506040611d2084828501611afe565b6040830152506060611d3484828501611afe565b6060830152506080611d4884828501611afe565b60808301525060a0611d5c84828501611af2565b60a08301525060c0611d70848285016119c0565b60c08301525060e0611cac84828501611af2565b600060a08284031215611d9657600080fd5b611da060a0612836565b90506000611dae84846119c0565b8252506020611dbf848483016119c0565b6020830152506040611dd384828501611afe565b6040830152506060611de784828501611af2565b606083015250608082013567ffffffffffffffff811115611e0757600080fd5b611e13848285016119cc565b60808301525092915050565b60006107de82516128ce565b60006107de82356128dd565b600060208284031215611e4957600080fd5b60006111ce84846119c0565b60008060408385031215611e6857600080fd5b6000611e7485856119c0565b9250506020611e8585828601611afe565b9150509250929050565b600060208284031215611ea157600080fd5b813567ffffffffffffffff811115611eb857600080fd5b6111ce84828501611be0565b600060208284031215611ed657600080fd5b60006111ce8484611afe565b600060208284031215611ef457600080fd5b60006111ce8484611e1f565b60008060408385031215611f1357600080fd5b6000611f1f8585611e1f565b9250506020611e8585828601611e1f565b60006107de838361244d565b60006107de83836124a9565b60006107de8383612549565b611f5d816128be565b82525050565b6000611f6e826128ac565b611f7881856128b0565b935083602082028501611f8a856128a6565b60005b84811015611fc1578383038852611fa5838351611f30565b9250611fb0826128a6565b602098909801979150600101611f8d565b50909695505050505050565b6000611fd8826128ac565b611fe281856128b0565b935083602082028501611ff4856128a6565b60005b84811015611fc157838303885261200f838351611f3c565b925061201a826128a6565b602098909801979150600101611ff7565b6000612036826128ac565b61204081856128b0565b935083602082028501612052856128a6565b60005b84811015611fc157838303885261206d838351611f48565b9250612078826128a6565b602098909801979150600101612055565b611f5d816128c9565b611f5d816128ce565b611f5d6120a7826128ce565b6128ce565b60006120b7826128ac565b6120c181856128b9565b93506120d18185602086016128fa565b9290920192915050565b60006120e6826128ac565b6120f081856128b0565b93506121008185602086016128fa565b61210981612926565b9093019392505050565b611f5d816128e3565b60006121296014836128b0565b7f436f6e7472616374206e6f74207061757365642e000000000000000000000000815260200192915050565b6000612162601c836128b9565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152601c0192915050565b600061219b600f836128b0565b7f5472616e73666572206661696c65640000000000000000000000000000000000815260200192915050565b60006121d4600a836128b9565b7f646563696d616c732829000000000000000000000000000000000000000000008152600a0192915050565b600061220d6029836128b0565b7f454f412063616e6e6f742073656e6420657468657220746f207072696d61727981527f2066616c6c6261636b0000000000000000000000000000000000000000000000602082015260400192915050565b600061226c6011836128b0565b7f496e76616c6964207369676e6174757265000000000000000000000000000000815260200192915050565b60006122a56012836128b0565b7f47617320707269636520746f6f20686967680000000000000000000000000000815260200192915050565b60006122de601d836128b0565b7f4d696e696d756d2065786368616e67652072617465206e6f74206d6574000000815260200192915050565b6000612317601d836128b0565b7f4661696c656420746f2067657420746f6b656e7320666f722073776170000000815260200192915050565b60006123506026836128b0565b7f476f74206c657373207468616e206d696e696d756d44657374696e6174696f6e81527f416d6f756e740000000000000000000000000000000000000000000000000000602082015260400192915050565b60006123af6013836128b0565b7f436f6e7472616374206973207061757365642e00000000000000000000000000815260200192915050565b60006123e8601d836128b0565b7f4e6f7420656e6f7567682064657374696e6174696f6e20616d6f756e74000000815260200192915050565b60006124216007836128b0565b7f4578706972656400000000000000000000000000000000000000000000000000815260200192915050565b805160009060808401906124618582611f54565b506020830151848203602086015261247982826120db565b915050604083015161248e6040860182612092565b5060608301516124a16060860182612092565b509392505050565b8051610100808452600091908401906124c2828261202b565b91505060208301516124d76020860182612092565b5060408301516124ea6040860182612092565b5060608301516124fd6060860182612092565b5060808301516125106080860182612092565b5060a083015161252360a0860182612089565b5060c083015161253660c0860182611f54565b5060e08301516124a160e0860182612089565b805160009060a084019061255d8582611f54565b5060208301516125706020860182611f54565b5060408301516125836040860182612092565b5060608301516125966060860182612089565b50608083015184820360808601526114938282611f63565b611f5d816128dd565b6000610f0882846120ac565b60006125ce82612155565b91506125da828461209b565b50602001919050565b60006107e1826121c7565b602081016107e18284611f54565b6080810161260a8287611f54565b6126176020830186611f54565b6126246040830185611f54565b6114936060830184612092565b60c0810161263f8289611f54565b61264c6020830188611f54565b6126596040830187612092565b6126666060830186612092565b6126736080830185611f54565b61268060a0830184612092565b979650505050505050565b604081016126998285611f54565b610f086020830184612092565b60c080825281016126b78189611fcd565b90506126c66020830188611f54565b6126d36040830187612092565b6126e06060830186612092565b6126ed6080830185612092565b61268060a0830184611f54565b602081016107e18284612089565b608081016127168287612092565b61272360208301866125ae565b6126246040830185612092565b6080808252810161274181876120db565b90506127506020830186612092565b61275d6040830185612092565b6114936060830184612089565b602081016107e18284612113565b602080825281016107e18161211c565b602080825281016107e18161218e565b602080825281016107e181612200565b602080825281016107e18161225f565b602080825281016107e181612298565b602080825281016107e1816122d1565b602080825281016107e18161230a565b602080825281016107e181612343565b602080825281016107e1816123a2565b602080825281016107e1816123db565b602080825281016107e181612414565b602081016107e18284612092565b60405181810167ffffffffffffffff8111828210171561285557600080fd5b604052919050565b600067ffffffffffffffff82111561287457600080fd5b5060209081020190565b600067ffffffffffffffff82111561289557600080fd5b506020601f91909101601f19160190565b60200190565b5190565b90815260200190565b919050565b60006107e1826128d1565b151590565b90565b6001600160a01b031690565b60ff1690565b60006107e1826128be565b82818337506000910152565b60005b838110156129155781810151838201526020016128fd565b83811115610cd95750506000910152565b601f01601f19169056fea265627a7a72305820d09795012e055d1cfd702eaaeb55e806c72224a35210229d4f10c77970a156036c6578706572696d656e74616cf50037

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

00000000000000000000000074758acfce059f503a7e6b0fc2c8737600f9f2c4000000000000000000000000c2d7cf95645d33006175b78989035c7c9061d3f9

-----Decoded View---------------
Arg [0] : _tokenTransferProxy (address): 0x74758AcFcE059f503a7E6B0fC2c8737600f9F2c4
Arg [1] : _signer (address): 0xC2D7CF95645D33006175B78989035C7c9061d3F9

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 00000000000000000000000074758acfce059f503a7e6b0fc2c8737600f9f2c4
Arg [1] : 000000000000000000000000c2d7cf95645d33006175b78989035c7c9061d3f9


Deployed Bytecode Sourcemap

26728:18831:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4818:7;;-1:-1:-1;;;4818:7:0;;;;4817:8;4809:40;;;;-1:-1:-1;;;;;4809:40:0;;;;;;;;;;;;;;;;;45363:10;45416:19;;;45460:9;45456:93;;45486:51;;-1:-1:-1;;;;;45486:51:0;;;;;;;;45456:93;4856:1;;26728:18831;31707:97;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;31707:97:0;;;;;;;;:::i;:::-;;26934:44;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26934:44:0;;;:::i;:::-;;;;;;;;;;;;;;;;30154:1078;;;;;;;;;:::i;5314:97::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5314:97:0;;;:::i;4599:72::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4599:72:0;;;:::i;:::-;;;;;;;;1080:114;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1080:114:0;;;:::i;26985:39::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;26985:39:0;;;;;;;;:::i;27031:49::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27031:49:0;;;:::i;:::-;;;;;;;;5132:95;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5132:95:0;;;:::i;26828:99::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26828:99:0;;;:::i;277:28::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;277:28:0;;;:::i;:::-;;;;;;;;3767:170;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;3767:170:0;;;;;;;;:::i;31812:167::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;31812:167:0;;;;;;;;:::i;31600:99::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;31600:99:0;;;;;;;;:::i;4188:::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;4188:99:0;;;;;;;;:::i;1362:113::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1362:113:0;;;;;;;;:::i;31707:97::-;788:5;;-1:-1:-1;;;;;788:5:0;774:10;:19;766:28;;;;;;-1:-1:-1;;;;;31773:15:0;31791:5;31773:15;;;:7;:15;;;;;:23;;-1:-1:-1;;31773:23:0;;;31707:97::o;26934:44::-;;;-1:-1:-1;;;;;26934:44:0;;:::o;30154:1078::-;4818:7;;-1:-1:-1;;;4818:7:0;;;;4817:8;4809:40;;;;-1:-1:-1;;;;;4809:40:0;;;;;;;;;30290:5;29127:12;29103:5;:21;;;:36;29095:56;;;;-1:-1:-1;;;;;29095:56:0;;;;;;;;;30321:5;29243:12;29311:5;:11;;;29341:5;:21;;;29381:5;:21;;;29421:5;:8;;;29448:5;:17;;;29484:10;29282:227;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;29282:227:0;;;29258:262;;;;;;29243:277;;29553:7;:239;29561:230;29674:4;29621:58;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;29621:58:0;;;29589:109;;;;;;29717:5;:7;;;29743:5;:7;;;29769:5;:7;;;29561:230;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;29561:230:0;;;-1:-1:-1;;29561:230:0;;-1:-1:-1;;;;;29553:239:0;;;29561:230;29553:239;;;;;;-1:-1:-1;29553:239:0;-1:-1:-1;29553:239:0;;;;29531:306;;;;-1:-1:-1;;;;;29531:306:0;;;;;;;;;30352:5;29952;:17;;;29937:11;:32;;29929:63;;;;-1:-1:-1;;;;;29929:63:0;;;;;;;;;30428:20;;30375:19;;30413:11;:35;30409:91;;30479:9;30465:23;;30409:91;30514:52;;:::i;:::-;30591:110;;;;;;;;30646:19;:17;:19::i;:::-;-1:-1:-1;;;;;30591:110:0;;;30681:9;30591:110;;;;;30577:124;;-1:-1:-1;30712:311:0;30779:11;;:18;30767:30;;30712:311;;;30850:161;30880:5;:8;;;30907:5;:11;;;30919:9;30907:22;;;;;;;;;;;;;;30948:8;30975:5;:21;;;30850:11;:161::i;:::-;30812:11;;30712:311;;;-1:-1:-1;31066:21:0;;;;31056:8;;;;31038:62;;31089:10;;-1:-1:-1;;;;;31038:62:0;;31056:8;31038:62;;;;;31111:33;31135:8;31111:23;:33::i;:::-;31159:15;;31155:70;;31191:22;31201:11;31191:9;:22::i;:::-;30003:1;;29848;29162;;4856;30154:1078;:::o;5314:97::-;788:5;;-1:-1:-1;;;;;788:5:0;774:10;:19;766:28;;;;;;5002:7;;-1:-1:-1;;;5002:7:0;;;;4994:40;;;;-1:-1:-1;;;;;4994:40:0;;;;;;;;;5378:5;5368:15;;-1:-1:-1;;5368:15:0;;;5395:10;;;;5378:5;5395:10;5314:97::o;4599:72::-;4638:4;4658:7;-1:-1:-1;;;4658:7:0;;;;;4599:72::o;1080:114::-;788:5;;-1:-1:-1;;;;;788:5:0;774:10;:19;766:28;;;;;;1157:5;;;1138:25;;-1:-1:-1;;;;;1157:5:0;;;;1138:25;;;1186:1;1170:18;;-1:-1:-1;;1170:18:0;;;1080:114::o;26985:39::-;;;;;;;;;;;;;;;:::o;27031:49::-;;;;:::o;5132:95::-;788:5;;-1:-1:-1;;;;;788:5:0;774:10;:19;766:28;;;;;;4818:7;;-1:-1:-1;;;4818:7:0;;;;4817:8;4809:40;;;;-1:-1:-1;;;;;4809:40:0;;;;;;;;;5187:7;:14;;-1:-1:-1;;5187:14:0;-1:-1:-1;;;5187:14:0;;;5213:8;;;;5187:7;5213:8;5132:95::o;26828:99::-;26878:42;26828:99;:::o;277:28::-;;;-1:-1:-1;;;;;277:28:0;;:::o;3767:170::-;3851:4;788:5;;-1:-1:-1;;;;;788:5:0;774:10;:19;766:28;;;;;;3914:5;;3875:54;;3906:6;;-1:-1:-1;;;;;3914:5:0;3921:7;3875:30;:54::i;:::-;3868:61;;801:1;3767:170;;;;:::o;31812:167::-;788:5;;-1:-1:-1;;;;;788:5:0;774:10;:19;766:28;;;;;;31928:20;:43;31812:167::o;31600:99::-;788:5;;-1:-1:-1;;;;;788:5:0;774:10;:19;766:28;;;;;;-1:-1:-1;;;;;31666:18:0;;;;;:7;:18;;;;;:25;;-1:-1:-1;;31666:25:0;31687:4;31666:25;;;31600:99::o;4188:::-;788:5;;-1:-1:-1;;;;;788:5:0;774:10;:19;766:28;;;;;;4256:5;;;:23;;-1:-1:-1;;;;;4256:5:0;;;;:23;;;;;4271:7;;4256:23;:5;:23;4271:7;4256:5;:23;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;4256:23:0;4188:99;:::o;1362:113::-;788:5;;-1:-1:-1;;;;;788:5:0;774:10;:19;766:28;;;;;;1440:29;1459:9;1440:18;:29::i;:::-;1362:113;:::o;10848:78::-;10894:7;10848:78;:::o;32035:4467::-;32269:151;32316:8;32343:4;:11;;;32355:1;32343:14;;;;;;;;;;;;;;:26;;;32388:4;:17;;;32269:28;:151::i;:::-;32250:348;;32451:4;:13;;;32447:140;;;32485:39;;-1:-1:-1;;;;;32485:39:0;;;;;;;;32447:140;32565:7;;32447:140;32608:29;;;;32721:1980;32790:11;;:18;32777:31;;32721:1980;;;32898:4;:23;;;32884:10;:37;:63;;;;;32925:4;:22;;;32884:63;32862:376;;;32994:228;33024:8;33055:4;:11;;;33067:10;33055:23;;;;;;;;;;;;;;:35;;;33113:15;33151:10;33165:1;33151:15;:52;;33189:14;33151:52;;;33169:4;:17;;;33151:52;32994:7;:228::i;:::-;32982:240;;32862:376;33252:17;33314:434;33345:4;:11;;;33357:10;33345:23;;;;;;;;;;;;;;33387:8;33414:319;33446:10;33460:1;33446:15;:52;;33484:14;33446:52;;;33464:4;:17;;;33446:52;33521:8;33530:149;33586:8;33621:4;:11;;;33633:10;33621:23;;;;;;;;;;;;;;:35;;;33530:29;:149::i;:::-;33521:159;;;;;;;;;;;:193;;;33414:9;:319::i;:::-;33314:12;:434::i;:::-;33786:11;;:23;;33284:464;;-1:-1:-1;33284:464:0;;-1:-1:-1;33798:10:0;;33786:23;;;;;;;;;;;;:38;;;33785:39;:107;;;;-1:-1:-1;33862:11:0;;:23;;33874:10;;33862:23;;;;;;;;;;;;:30;;;33845:14;:47;33785:107;33763:305;;;33931:4;:13;;;33927:101;;;33969:39;;-1:-1:-1;;;;;33969:39:0;;;;;;;;33927:101;34046:7;;;;;;;33763:305;34086:15;34082:204;;34146:9;-1:-1:-1;34146:9:0;34178:14;;34174:97;;34217:34;;;;34174:97;34336:4;:23;;;34322:10;:37;:64;;;;;34364:4;:22;;;34363:23;34322:64;34300:390;;;34433:195;34463:8;34494:4;:11;;;34506:10;34494:23;;;;;;;;;;;;;;:40;;;34557:15;34595:14;34433:7;:195::i;:::-;34421:207;;34665:9;34647:27;;;;34300:390;-1:-1:-1;32823:12:0;;32721:1980;;;;34738:16;34716:424;34769:4;:11;;;34781:1;34769:14;;;;;;;;;;;;;;;;;;:26;34810:11;;34822:18;;-1:-1:-1;;34822:22:0;;;34810:35;;;;;;;;;;;;:52;;;34877:21;34913:14;34942:4;:22;;;:163;;35052:11;;35064:23;;;;35052:36;;;;;;;;;;;;;;:53;;;34942:163;;;34984:11;;34996:23;;;;34984:36;;;;;;;;;;;;;;:48;;;34942:163;35120:9;34716:424;;;;;;;;;;;;;;;;;;;;35174:4;:29;;;35157:14;:46;35153:489;;;35220:48;;-1:-1:-1;;;;;35220:48:0;;;;;;;;35153:489;35304:260;35340:4;:11;;;35352:1;35340:14;;;;;;;;;;;;;;;;;;:26;35385:11;;35397:18;;-1:-1:-1;;35397:22:0;;;35385:35;;;;;;;;;;;;:52;;;35456:4;:17;;;35492:14;35525:4;:24;;;35304:17;:260::i;:::-;35286:356;;;35591:39;;-1:-1:-1;;;;;35591:39:0;;;;;;;;35286:356;35670:20;;;;-1:-1:-1;;;;;35670:34:0;35694:10;35670:34;;;;:87;;-1:-1:-1;35721:20:0;;;;-1:-1:-1;;;;;35721:36:0;;;35670:87;35652:843;;;35891:11;;35903:18;;35784:29;;35816:142;;35864:8;;35891:11;-1:-1:-1;;35903:22:0;;;35891:35;;;;;;;;;;;;:52;;;35816:29;:142::i;:::-;35784:174;;35973:20;35996:114;36023:14;36056:8;36065:21;36056:31;;;;;;35996:114;35973:137;;36125:166;36158:8;36185:21;36225:4;:20;;;36264:12;36125:14;:166::i;:::-;36385:11;;36397:18;;36306:177;;36358:8;;-1:-1:-1;;36397:22:0;;;36385:35;;;;;;;;;;;;:52;;;36456:12;36306:33;:177::i;:::-;35652:843;;32035:4467;;;;;;;;:::o;43187:633::-;43329:20;43310:503;43383:15;43368:12;:30;43310:503;;;43476:17;;;;;:89;;-1:-1:-1;43561:3:0;43514:8;43523:12;43514:22;;;;;;;;;;;:35;-1:-1:-1;;;;;43514:51:0;;43476:89;43454:168;;;43600:7;;;43454:168;43636:165;43669:8;43696:12;43727:10;43756:8;43765:12;43756:22;;;;;;;;;;;:30;;;43636:14;:165::i;:::-;43413:14;;43310:503;;31240:352;31300:20;31323:9;31300:32;-1:-1:-1;31362:26:0;;;31343:16;31422:119;31466:5;31457;31446:16;;31445:26;31512:17;-1:-1:-1;;31487:20:0;;31486:44;31422:8;:119::i;:::-;31552:32;;;;;31399:142;;-1:-1:-1;26878:42:0;;31552:18;;:32;;31399:142;;31552:32;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31552:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;31552:32:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;31552:32:0;;;;;;;;;;31240:352;;;;:::o;1839:306::-;1931:12;1969:13;-1:-1:-1;;;;;1969:18:0;2041:3;2046:6;1988:65;;;;;;;;;;;;;;-1:-1:-1;;26:21;;;22:32;6:49;;1988:65:0;;;49:4:-1;25:18;;61:17;;1988:65:0;182:15:-1;1988:65:0;179:29:-1;160:49;;1969:85:0;;;1988:65;1969:85;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;1956:98:0;;;;;2073:7;2065:35;;;;-1:-1:-1;;;;;2065:35:0;;;;;;;;;2120:17;:15;:17::i;:::-;2113:24;;1839:306;;;;;;:::o;1616:183::-;-1:-1:-1;;;;;1695:23:0;;1687:32;;;;;;1752:5;;;1731:38;;-1:-1:-1;;;;;1731:38:0;;;;1752:5;;;1731:38;;;1776:5;:17;;-1:-1:-1;;1776:17:0;-1:-1:-1;;;;;1776:17:0;;;;;;;;;;1616:183::o;42069:1110::-;42250:4;42280:19;:17;:19::i;:::-;-1:-1:-1;;;;;42271:28:0;:5;-1:-1:-1;;;;;42271:28:0;;42267:173;;;42335:11;;;:19;;42320:34;;42316:87;;;-1:-1:-1;42382:5:0;42375:12;;42316:87;-1:-1:-1;42424:4:0;42417:11;;42267:173;42452:18;42473:46;42503:8;42513:5;42473:29;:46::i;:::-;42452:67;;42549:8;42558:10;42549:20;;;;;;;;;;;:28;;;42534:12;:43;42530:620;;;42643:18;;42594:12;;-1:-1:-1;;;;;42643:18:0;42802:5;42830:10;42871:4;42914:8;42923:10;42914:20;;;;;;;;;;;:28;;;42899:12;:43;42686:275;;;;;;;;;;;;;;;;-1:-1:-1;;26:21;;;22:32;6:49;;42686:275:0;;;49:4:-1;25:18;;61:17;;42686:275:0;182:15:-1;42686:275:0;179:29:-1;160:49;;42635:341:0;;;42686:275;42635:341;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;-1:-1;42621:355:0;;-1:-1:-1;;42991:121:0;;;;43054:12;43023:8;43032:10;43023:20;;;;;;;;;;;:28;;:43;;;;;43092:4;43085:11;;;;;;42991:121;43133:5;43126:12;;;;;;42530:620;-1:-1:-1;43167:4:0;;42069:1110;-1:-1:-1;;;;42069:1110:0:o;41285:776::-;41487:17;41517:15;41543;41517:42;;41570:21;41594:7;-1:-1:-1;;;;;41594:29:0;;:31;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41594:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41594:31:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;41594:31:0;;;;;;;;;41570:55;;41648:41;41661:12;41675:13;41648:12;:41::i;:::-;41636:53;;41700:163;41729:8;41752:46;41782:8;41792:5;41752:29;:46::i;:::-;41813:15;41843:9;41700:14;:163::i;:::-;41874:152;41922:8;41945:46;41975:8;41985:5;41945:29;:46::i;:::-;42006:9;41874:33;:152::i;:::-;-1:-1:-1;;41285:776:0;;;;;;;:::o;24484:532::-;24602:7;;24627:382;24659:15;24651:5;:23;24627:382;;;24736:5;-1:-1:-1;;;;;24704:37:0;:8;24713:5;24704:15;;;;;;;;;;;:28;-1:-1:-1;;;;;24704:37:0;;24700:298;;;24769:5;-1:-1:-1;24762:12:0;;24700:298;24818:10;;;;;:58;;-1:-1:-1;24872:3:0;24832:8;24841:5;24832:15;;;;;;;;;;;:28;-1:-1:-1;;;;;24832:44:0;;24818:58;24796:202;;;24929:22;;;;;;;;24942:5;-1:-1:-1;;;;;24929:22:0;;;;;24949:1;24929:22;;;24911:8;24920:5;24911:15;;;;;;;;;;:40;24977:5;-1:-1:-1;24970:12:0;;24796:202;24676:7;;24627:382;;;;24484:532;;;;:::o;16236:106::-;16294:7;16325:1;16321;:5;:13;;16333:1;16321:13;;;-1:-1:-1;16329:1:0;;16236:106;-1:-1:-1;16236:106:0:o;36510:2028::-;36684:18;;;;;;36992:21;37007:5;36992:14;:21::i;:::-;36961:52;-1:-1:-1;37043:18:0;37024:1232;37093:5;:12;;;:19;37080:10;:32;37024:1232;;;37212:16;37190:10;37171:16;:29;37204:5;37170:39;:58;37166:205;;;37249:5;;37166:205;37280:5;:20;;;:49;;;;;37317:5;:12;;;37304:9;:25;37280:49;37276:95;;;37350:5;;37276:95;37385:19;37407:203;37440:5;:12;;;37453:10;37440:24;;;;;;;;;;;;;;:40;;;37499:5;:12;;;37512:10;37499:24;;;;;;;;;;;;;;:40;;;37558:20;37597:12;37407:14;:203::i;:::-;37385:225;;37653:220;37684:5;:12;;;37697:10;37684:24;;;;;;;;;;;;;;37746:10;37727:16;:29;37775:5;:20;;;37814:5;:17;;;37850:8;37653:12;:220::i;:::-;37625:248;;;;;;;;37973:5;:12;;;37986:10;37973:24;;;;;;;;;;;;;;:40;;;37913:5;:12;;;37926:10;37913:24;;;;;;;;;;;;;;:40;;;:100;37888:126;;;;38045:5;:12;;;38058:10;38045:24;;;;;;;;;;;;;;:40;;;38033:9;:52;38029:134;;;38137:9;38123:11;:23;38106:41;;;;38029:134;-1:-1:-1;38177:23:0;;;;38215:29;;;;37127:12;;37024:1232;;;;38266:129;38311:8;38334:5;:22;;;38371:13;38266:30;:129::i;:::-;38406:124;38454:8;38477:5;:17;;;38509:10;38406:33;:124::i;:::-;36510:2028;;;;;;;;;;:::o;40521:756::-;40743:11;40767:22;40807:19;:17;:19::i;:::-;-1:-1:-1;;;;;40792:34:0;:11;-1:-1:-1;;;;;40792:34:0;;:98;;40860:30;40878:11;40860:17;:30::i;:::-;40792:98;;;40842:2;40792:98;40767:123;;40901:27;40951:19;:17;:19::i;:::-;-1:-1:-1;;;;;40931:39:0;:16;-1:-1:-1;;;;;40931:39:0;;:108;;41004:35;41022:16;41004:17;:35::i;:::-;40931:108;;;40986:2;40931:108;40901:138;;41050:15;41068:154;41104:12;41131:17;41163:14;41192:19;41068:21;:154::i;:::-;41240:29;-1:-1:-1;41240:29:0;-1:-1:-1;;;;40521:756:0;;;;;;;;:::o;43828:714::-;44043:15;;44039:496;;44116:19;:17;:19::i;:::-;-1:-1:-1;;;;;44079:56:0;:8;44088:10;44079:20;;;;;;;;;;;:33;-1:-1:-1;;;;;44079:56:0;;44075:449;;;44156:33;;-1:-1:-1;;;;;44156:20:0;;;:33;;;;;44177:11;;44156:33;;;;44177:11;44156:20;:33;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44156:33:0;44075:449;;;44260:189;44317:8;44326:10;44317:20;;;;;;;;;;;:33;44377:11;44415;44260:30;:189::i;:::-;44230:278;;;;-1:-1:-1;;;;;44230:278:0;;;;;;;;25523:286;25685:18;25706:33;25716:8;25726:12;25706:9;:33::i;:::-;25685:54;;25750:51;25764:8;25774:10;25786:14;25750:13;:51::i;2832:391::-;2882:12;2937:16;2967:53;;;;3039:2;3034:103;;;;3188:1;3185;3178:12;2967:53;3004:1;2993:12;;2967:53;;3034:103;3082:2;3079:1;3076;3061:24;3120:1;3114:8;3103:19;;2930:275;;2915:301;:::o;44765:189::-;44866:7;44898:48;44911:25;44924:6;44932:3;44911:12;:25::i;:::-;44938:7;44898:12;:48::i;25817:218::-;26013:14;25979:8;25988:12;25979:22;;;;;;;;;;;:30;;:48;;;;;;;;;;;25817:218;;;:::o;40151:362::-;40231:19;;40268:209;40298:5;:12;;;:19;40290:5;:27;;;40268:209;;;40430:5;:12;;;40443:5;40430:19;;;;;;;;;;;;;;;;:35;;;40375:5;:12;;;40388:5;40375:19;;;;;;;;;;;;;;;;:35;;;:90;40343:122;;;;40319:7;;;;;;;40268:209;;;-1:-1:-1;40151:362:0;;;:::o;39665:478::-;39850:19;39886:17;;;:53;;;39925:14;39907;:32;39886:53;39882:254;;;-1:-1:-1;39963:14:0;39956:21;;39882:254;40104:20;40071:12;40053:14;40036;:31;40035:48;40034:90;;;;;;40010:114;;;;38546:1111;38777:13;38792:16;38841:19;:17;:19::i;:::-;-1:-1:-1;;;;;38825:35:0;:12;-1:-1:-1;;;;;38825:35:0;;38821:829;;;38913:21;;39023:20;;;;38897:256;;;;;-1:-1:-1;;;;;38897:69:0;;;;;;38991:12;;38897:256;;39023:20;38991:12;;;;39124:14;;38897:256;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38897:256:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38897:256:0;;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;38897:256:0;;;;;;;;;38877:276;;-1:-1:-1;38877:276:0;-1:-1:-1;38821:829:0;;;39186:199;39219:8;39246:53;39276:8;39286:12;39246:29;:53::i;:::-;39318:21;;39358:12;39186:14;:199::i;:::-;39436:21;;39508:20;;;;39420:218;;;;;-1:-1:-1;;;;;39420:69:0;;;;;;:218;;39547:12;;;;39609:14;;39420:218;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39420:218:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39420:218:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;39420:218:0;;;;;;;;;39400:238;;-1:-1:-1;39400:238:0;-1:-1:-1;38821:829:0;38546:1111;;;;;;;;:::o;25024:274::-;25180:18;25201:33;25211:8;25221:12;25201:9;:33::i;:::-;25180:54;;25245:45;25256:8;25266:10;25278:11;25245:10;:45::i;11311:1531::-;11383:16;11417:18;11445:23;;;;;;;;;;;;;;;11805;;;11445;-1:-1:-1;11867:4:0;11903;;11445:23;11867:4;11445:23;12091:1;12032:5;11977:3;11938:497;12458:7;12479:122;;;;12620:1;12615:104;;;;12451:268;;12479:122;12517:1;12505:13;;12479:122;;12615:104;12659:3;12653:10;12641:22;;12451:268;-1:-1:-1;;;;12753:4:0;12745:13;12740:4;12733:26;-1:-1:-1;11655:1180:0;;-1:-1:-1;11655:1180:0:o;15488:628::-;15614:4;9925:6;15644:9;:20;;15636:29;;;;;;9925:6;15684:10;:21;;15676:30;;;;;;15738:11;15723;:26;15719:390;;10085:2;15789:11;15775;:25;15774:43;;15766:52;;;;;;15905:9;15889:11;15875;:25;15868:2;:33;15867:47;9872:6;15841:10;:22;:74;;;;15719:390;10085:2;15972:11;15958;:25;15957:43;;15949:52;;;;;;16087:9;16071:11;16057;:25;16050:2;:33;9872:6;16024:10;:22;:60;:72;;;;16536:400;16596:7;16824;16820:38;;-1:-1:-1;16849:1:0;16842:8;;16820:38;16878:7;;;16883:2;16878;:7;:2;16900:6;;;;;:12;16892:21;;;;;17051:285;17111:7;17140:1;17135:2;:6;17127:15;;;;;;17207:9;17224:2;17219;:7;;;;;;;17051:285;-1:-1:-1;;;;17051:285:0:o;25306:209::-;25496:11;25462:8;25471:12;25462:22;;;;;;;;;;;:30;;:45;;;;;;;;;;;25306:209;;;:::o;26728:18831::-;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;-1:-1:-1;26728:18831:0;;;;;;;;:::o;5:118:-1:-;;72:46;110:6;97:20;72:46;;307:727;;439:3;432:4;424:6;420:17;416:27;406:2;;457:1;454;447:12;406:2;494:6;481:20;516:95;531:79;603:6;531:79;;;516:95;;;639:21;;;683:4;671:17;;;;507:104;;-1:-1;696:14;;671:17;791:1;776:252;801:6;798:1;795:13;776:252;;;884:3;871:17;863:6;859:30;908:56;960:3;948:10;908:56;;;896:69;;-1:-1;988:4;979:14;;;;1007;;;;;823:1;816:9;776:252;;;780:14;399:635;;;;;;;;1077:724;;1208:3;1201:4;1193:6;1189:17;1185:27;1175:2;;1226:1;1223;1216:12;1175:2;1263:6;1250:20;1285:94;1300:78;1371:6;1300:78;;1285:94;1407:21;;;1451:4;1439:17;;;;1276:103;;-1:-1;1464:14;;1439:17;1559:1;1544:251;1569:6;1566:1;1563:13;1544:251;;;1652:3;1639:17;1631:6;1627:30;1676:55;1727:3;1715:10;1676:55;;;1664:68;;-1:-1;1755:4;1746:14;;;;1774;;;;;1591:1;1584:9;1544:251;;1845:727;;1977:3;1970:4;1962:6;1958:17;1954:27;1944:2;;1995:1;1992;1985:12;1944:2;2032:6;2019:20;2054:95;2069:79;2141:6;2069:79;;2054:95;2177:21;;;2221:4;2209:17;;;;2045:104;;-1:-1;2234:14;;2209:17;2329:1;2314:252;2339:6;2336:1;2333:13;2314:252;;;2422:3;2409:17;2401:6;2397:30;2446:56;2498:3;2486:10;2446:56;;;2434:69;;-1:-1;2526:4;2517:14;;;;2545;;;;;2361:1;2354:9;2314:252;;2580:112;;2644:43;2679:6;2666:20;2644:43;;2699:118;;2766:46;2804:6;2791:20;2766:46;;2825:432;;2922:3;2915:4;2907:6;2903:17;2899:27;2889:2;;2940:1;2937;2930:12;2889:2;2977:6;2964:20;2999:60;3014:44;3051:6;3014:44;;2999:60;2990:69;;3079:6;3072:5;3065:21;3115:4;3107:6;3103:17;3148:4;3141:5;3137:16;3183:3;3174:6;3169:3;3165:16;3162:25;3159:2;;;3200:1;3197;3190:12;3159:2;3210:41;3244:6;3239:3;3234;3210:41;;;2882:375;;;;;;;;3297:890;;3405:4;3393:9;3388:3;3384:19;3380:30;3377:2;;;3423:1;3420;3413:12;3377:2;3441:20;3456:4;3441:20;;;3432:29;-1:-1;3522:1;3553:57;3606:3;3586:9;3553:57;;;3529:82;;-1:-1;3710:2;3695:18;;3682:32;3734:18;3723:30;;3720:2;;;3766:1;3763;3756:12;3720:2;3801:54;3851:3;3842:6;3831:9;3827:22;3801:54;;;3794:4;3787:5;3783:16;3776:80;3632:235;3928:2;3961:49;4006:3;3997:6;3986:9;3982:22;3961:49;;;3954:4;3947:5;3943:16;3936:75;3877:145;4083:2;4116:49;4161:3;4152:6;4141:9;4137:22;4116:49;;;4109:4;4102:5;4098:16;4091:75;4032:145;3371:816;;;;;4235:1493;;4356:5;4344:9;4339:3;4335:19;4331:31;4328:2;;;4375:1;4372;4365:12;4328:2;4393:21;4408:5;4393:21;;;4384:30;-1:-1;4465:31;;4516:18;4505:30;;4502:2;;;4548:1;4545;4538:12;4502:2;4582:88;4666:3;4657:6;4646:9;4642:22;4582:88;;;4558:113;;-1:-1;4743:2;4776:57;4829:3;4805:22;;;4776:57;;;4769:4;4762:5;4758:16;4751:83;4692:153;4906:2;4939:49;4984:3;4975:6;4964:9;4960:22;4939:49;;;4932:4;4925:5;4921:16;4914:75;4855:145;5048:2;5081:49;5126:3;5117:6;5106:9;5102:22;5081:49;;;5074:4;5067:5;5063:16;5056:75;5010:132;5199:3;5233:49;5278:3;5269:6;5258:9;5254:22;5233:49;;;5226:4;5219:5;5215:16;5208:75;5152:142;5341:3;5375:47;5418:3;5409:6;5398:9;5394:22;5375:47;;;5368:4;5361:5;5357:16;5350:73;5304:130;5481:3;5515:49;5560:3;5551:6;5540:9;5536:22;5515:49;;;5508:4;5501:5;5497:16;5490:75;5444:132;5623:3;5657:49;5702:3;5693:6;5682:9;5678:22;5657:49;;;5650:4;5643:5;5639:16;5632:75;5586:132;4322:1406;;;;;5766:1544;;5873:5;5861:9;5856:3;5852:19;5848:31;5845:2;;;5892:1;5889;5882:12;5845:2;5910:21;5925:5;5910:21;;;5901:30;-1:-1;5983:31;;6034:18;6023:30;;6020:2;;;6066:1;6063;6056:12;6020:2;6100:89;6185:3;6176:6;6165:9;6161:22;6100:89;;;6076:114;;-1:-1;6266:2;6299:49;6344:3;6320:22;;;6299:49;;;6292:4;6285:5;6281:16;6274:75;6211:149;6430:2;6463:49;6508:3;6499:6;6488:9;6484:22;6463:49;;;6456:4;6449:5;6445:16;6438:75;6370:154;6582:2;6615:49;6660:3;6651:6;6640:9;6636:22;6615:49;;;6608:4;6601:5;6597:16;6590:75;6534:142;6740:3;6774:49;6819:3;6810:6;6799:9;6795:22;6774:49;;;6767:4;6760:5;6756:16;6749:75;6686:149;6898:3;6932:46;6974:3;6965:6;6954:9;6950:22;6932:46;;;6925:4;6918:5;6914:16;6907:72;6845:145;7051:3;7085:57;7138:3;7129:6;7118:9;7114:22;7085:57;;;7078:4;7071:5;7067:16;7060:83;7000:154;7208:3;7242:46;7284:3;7275:6;7264:9;7260:22;7242:46;;7349:1049;;7457:4;7445:9;7440:3;7436:19;7432:30;7429:2;;;7475:1;7472;7465:12;7429:2;7493:20;7508:4;7493:20;;;7484:29;-1:-1;7570:1;7601:49;7646:3;7626:9;7601:49;;;7577:74;;-1:-1;7724:2;7757:49;7802:3;7778:22;;;7757:49;;;7750:4;7743:5;7739:16;7732:75;7672:146;7870:2;7903:49;7948:3;7939:6;7928:9;7924:22;7903:49;;;7896:4;7889:5;7885:16;7878:75;7828:136;8024:2;8057:46;8099:3;8090:6;8079:9;8075:22;8057:46;;;8050:4;8043:5;8039:16;8032:72;7974:141;8195:3;8184:9;8180:19;8167:33;8220:18;8212:6;8209:30;8206:2;;;8252:1;8249;8242:12;8206:2;8287:89;8372:3;8363:6;8352:9;8348:22;8287:89;;;8280:4;8273:5;8269:16;8262:115;8125:263;7423:975;;;;;8530:122;;8608:39;8639:6;8633:13;8608:39;;8659:114;;8724:44;8760:6;8747:20;8724:44;;8780:241;;8884:2;8872:9;8863:7;8859:23;8855:32;8852:2;;;8900:1;8897;8890:12;8852:2;8935:1;8952:53;8997:7;8977:9;8952:53;;9292:366;;;9413:2;9401:9;9392:7;9388:23;9384:32;9381:2;;;9429:1;9426;9419:12;9381:2;9464:1;9481:53;9526:7;9506:9;9481:53;;;9471:63;;9443:97;9571:2;9589:53;9634:7;9625:6;9614:9;9610:22;9589:53;;;9579:63;;9550:98;9375:283;;;;;;9665:391;;9801:2;9789:9;9780:7;9776:23;9772:32;9769:2;;;9817:1;9814;9807:12;9769:2;9852:31;;9903:18;9892:30;;9889:2;;;9935:1;9932;9925:12;9889:2;9955:85;10032:7;10023:6;10012:9;10008:22;9955:85;;10063:241;;10167:2;10155:9;10146:7;10142:23;10138:32;10135:2;;;10183:1;10180;10173:12;10135:2;10218:1;10235:53;10280:7;10260:9;10235:53;;10311:263;;10426:2;10414:9;10405:7;10401:23;10397:32;10394:2;;;10442:1;10439;10432:12;10394:2;10477:1;10494:64;10550:7;10530:9;10494:64;;10581:399;;;10713:2;10701:9;10692:7;10688:23;10684:32;10681:2;;;10729:1;10726;10719:12;10681:2;10764:1;10781:64;10837:7;10817:9;10781:64;;;10771:74;;10743:108;10882:2;10900:64;10956:7;10947:6;10936:9;10932:22;10900:64;;10988:233;;11127:88;11211:3;11203:6;11127:88;;11230:229;;11367:86;11449:3;11441:6;11367:86;;11468:233;;11607:88;11691:3;11683:6;11607:88;;11709:134;11798:39;11831:5;11798:39;;;11793:3;11786:52;11780:63;;;12312:895;;12481:69;12544:5;12481:69;;;12563:95;12651:6;12646:3;12563:95;;;12556:102;;12681:3;12723:4;12715:6;12711:17;12706:3;12702:27;12749:71;12814:5;12749:71;;;12841:1;12826:342;12851:6;12848:1;12845:13;12826:342;;;12913:9;12907:4;12903:20;12898:3;12891:33;12939:102;13036:4;13027:6;13021:13;12939:102;;;12931:110;;13058:75;13126:6;13058:75;;;13156:4;13147:14;;;;;13048:85;-1:-1;12873:1;12866:9;12826:342;;;-1:-1;13181:4;;12460:747;-1:-1;;;;;;12460:747;13280:907;;13457:68;13519:5;13457:68;;;13538:104;13635:6;13630:3;13538:104;;;13531:111;;13665:3;13707:4;13699:6;13695:17;13690:3;13686:27;13733:70;13797:5;13733:70;;;13824:1;13809:339;13834:6;13831:1;13828:13;13809:339;;;13896:9;13890:4;13886:20;13881:3;13874:33;13922:100;14017:4;14008:6;14002:13;13922:100;;;13914:108;;14039:74;14106:6;14039:74;;;14136:4;14127:14;;;;;14029:84;-1:-1;13856:1;13849:9;13809:339;;14262:895;;14431:69;14494:5;14431:69;;;14513:95;14601:6;14596:3;14513:95;;;14506:102;;14631:3;14673:4;14665:6;14661:17;14656:3;14652:27;14699:71;14764:5;14699:71;;;14791:1;14776:342;14801:6;14798:1;14795:13;14776:342;;;14863:9;14857:4;14853:20;14848:3;14841:33;14889:102;14986:4;14977:6;14971:13;14889:102;;;14881:110;;15008:75;15076:6;15008:75;;;15106:4;15097:14;;;;;14998:85;-1:-1;14823:1;14816:9;14776:342;;15165:101;15232:28;15254:5;15232:28;;15391:120;15474:31;15499:5;15474:31;;15518:159;15619:52;15639:31;15664:5;15639:31;;;15619:52;;15684:356;;15812:38;15844:5;15812:38;;;15862:88;15943:6;15938:3;15862:88;;;15855:95;;15955:52;16000:6;15995:3;15988:4;15981:5;15977:16;15955:52;;;16019:16;;;;;15792:248;-1:-1;;15792:248;16047:315;;16143:34;16171:5;16143:34;;;16189:60;16242:6;16237:3;16189:60;;;16182:67;;16254:52;16299:6;16294:3;16287:4;16280:5;16276:16;16254:52;;;16327:29;16349:6;16327:29;;;16318:39;;;;16123:239;-1:-1;;;16123:239;16711:154;16808:51;16853:5;16808:51;;17058:364;;17218:67;17282:2;17277:3;17218:67;;;17318:66;17298:87;;17413:2;17404:12;;17204:218;-1:-1;;17204:218;17431:400;;17609:85;17691:2;17686:3;17609:85;;;17727:66;17707:87;;17822:2;17813:12;;17595:236;-1:-1;;17595:236;17840:364;;18000:67;18064:2;18059:3;18000:67;;;18100:66;18080:87;;18195:2;18186:12;;17986:218;-1:-1;;17986:218;18213:400;;18391:85;18473:2;18468:3;18391:85;;;18509:66;18489:87;;18604:2;18595:12;;18377:236;-1:-1;;18377:236;18622:465;;18782:67;18846:2;18841:3;18782:67;;;18882:66;18862:87;;18983:66;18978:2;18969:12;;18962:88;19078:2;19069:12;;18768:319;-1:-1;;18768:319;19096:364;;19256:67;19320:2;19315:3;19256:67;;;19356:66;19336:87;;19451:2;19442:12;;19242:218;-1:-1;;19242:218;19469:364;;19629:67;19693:2;19688:3;19629:67;;;19729:66;19709:87;;19824:2;19815:12;;19615:218;-1:-1;;19615:218;19842:364;;20002:67;20066:2;20061:3;20002:67;;;20102:66;20082:87;;20197:2;20188:12;;19988:218;-1:-1;;19988:218;20215:364;;20375:67;20439:2;20434:3;20375:67;;;20475:66;20455:87;;20570:2;20561:12;;20361:218;-1:-1;;20361:218;20588:465;;20748:67;20812:2;20807:3;20748:67;;;20848:66;20828:87;;20949:66;20944:2;20935:12;;20928:88;21044:2;21035:12;;20734:319;-1:-1;;20734:319;21062:364;;21222:67;21286:2;21281:3;21222:67;;;21322:66;21302:87;;21417:2;21408:12;;21208:218;-1:-1;;21208:218;21435:364;;21595:67;21659:2;21654:3;21595:67;;;21695:66;21675:87;;21790:2;21781:12;;21581:218;-1:-1;;21581:218;21808:363;;21968:66;22032:1;22027:3;21968:66;;;22067;22047:87;;22162:2;22153:12;;21954:217;-1:-1;;21954:217;22240:904;22449:22;;22240:904;;22373:4;22364:14;;;22477:77;22368:3;22449:22;22477:77;;;22393:167;22642:4;22635:5;22631:16;22625:23;22694:3;22688:4;22684:14;22677:4;22672:3;22668:14;22661:38;22714:66;22775:4;22762:11;22714:66;;;22706:74;;22570:222;22875:4;22868:5;22864:16;22858:23;22887:62;22943:4;22938:3;22934:14;22921:11;22887:62;;;22802:153;23038:4;23031:5;23027:16;23021:23;23050:62;23106:4;23101:3;23097:14;23084:11;23050:62;;;-1:-1;23135:4;22346:798;-1:-1;;;22346:798;23210:1613;23409:22;;23341:5;23444:37;;;23210:1613;;23332:15;;;;23496:136;23332:15;23409:22;23496:136;;;23488:144;;23362:282;23731:4;23724:5;23720:16;23714:23;23743:62;23799:4;23794:3;23790:14;23777:11;23743:62;;;23654:157;23903:4;23896:5;23892:16;23886:23;23915:62;23971:4;23966:3;23962:14;23949:11;23915:62;;;23821:162;24063:4;24056:5;24052:16;24046:23;24075:62;24131:4;24126:3;24122:14;24109:11;24075:62;;;23993:150;24229:4;24222:5;24218:16;24212:23;24241:62;24297:4;24292:3;24288:14;24275:11;24241:62;;;24153:156;24394:4;24387:5;24383:16;24377:23;24406:56;24456:4;24451:3;24447:14;24434:11;24406:56;;;24319:149;24551:4;24544:5;24540:16;24534:23;24563:78;24635:4;24630:3;24626:14;24613:11;24563:78;;;24478:169;24723:4;24716:5;24712:16;24706:23;24735:56;24785:4;24780:3;24776:14;24763:11;24735:56;;24891:1094;25096:22;;24891:1094;;25024:4;25015:14;;;25124:61;25019:3;25096:22;25124:61;;;25044:147;25275:4;25268:5;25264:16;25258:23;25287:62;25343:4;25338:3;25334:14;25321:11;25287:62;;;25201:154;25429:4;25422:5;25418:16;25412:23;25441:62;25497:4;25492:3;25488:14;25475:11;25441:62;;;25365:144;25591:4;25584:5;25580:16;25574:23;25603:56;25653:4;25648:3;25644:14;25631:11;25603:56;;;25519:146;25739:4;25732:5;25728:16;25722:23;25791:3;25785:4;25781:14;25774:4;25769:3;25765:14;25758:38;25811:136;25942:4;25929:11;25811:136;;26236:114;26315:29;26338:5;26315:29;;26357:262;;26501:93;26590:3;26581:6;26501:93;;26626:511;;26853:148;26997:3;26853:148;;;26846:155;;27012:75;27083:3;27074:6;27012:75;;;-1:-1;27109:2;27100:12;;26834:303;-1:-1;26834:303;27144:372;;27343:148;27487:3;27343:148;;27523:245;27657:2;27642:18;;27671:87;27646:9;27731:6;27671:87;;27775:611;28009:3;27994:19;;28024:71;27998:9;28068:6;28024:71;;;28106:88;28190:2;28179:9;28175:18;28166:6;28106:88;;;28205;28289:2;28278:9;28274:18;28265:6;28205:88;;;28304:72;28372:2;28361:9;28357:18;28348:6;28304:72;;28393:771;28651:3;28636:19;;28666:71;28640:9;28710:6;28666:71;;;28748:72;28816:2;28805:9;28801:18;28792:6;28748:72;;;28831;28899:2;28888:9;28884:18;28875:6;28831:72;;;28914;28982:2;28971:9;28967:18;28958:6;28914:72;;;28997:73;29065:3;29054:9;29050:19;29041:6;28997:73;;;29081;29149:3;29138:9;29134:19;29125:6;29081:73;;;28622:542;;;;;;;;;;29171:324;29317:2;29302:18;;29331:71;29306:9;29375:6;29331:71;;;29413:72;29481:2;29470:9;29466:18;29457:6;29413:72;;29502:1047;29874:3;29889:47;;;29859:19;;29950:140;29859:19;30076:6;29950:140;;;29942:148;;30101:88;30185:2;30174:9;30170:18;30161:6;30101:88;;;30200:72;30268:2;30257:9;30253:18;30244:6;30200:72;;;30283;30351:2;30340:9;30336:18;30327:6;30283:72;;;30366:73;30434:3;30423:9;30419:19;30410:6;30366:73;;;30450:89;30534:3;30523:9;30519:19;30510:6;30450:89;;30556:201;30668:2;30653:18;;30682:65;30657:9;30720:6;30682:65;;30764:539;30962:3;30947:19;;30977:71;30951:9;31021:6;30977:71;;;31059:68;31123:2;31112:9;31108:18;31099:6;31059:68;;;31138:72;31206:2;31195:9;31191:18;31182:6;31138:72;;31310:611;31520:3;31535:47;;;31505:19;;31596:72;31505:19;31654:6;31596:72;;;31588:80;;31679:72;31747:2;31736:9;31732:18;31723:6;31679:72;;;31762;31830:2;31819:9;31815:18;31806:6;31762:72;;;31845:66;31907:2;31896:9;31892:18;31883:6;31845:66;;31928:241;32060:2;32045:18;;32074:85;32049:9;32132:6;32074:85;;32448:407;32639:2;32653:47;;;32624:18;;32714:131;32624:18;32714:131;;32862:407;33053:2;33067:47;;;33038:18;;33128:131;33038:18;33128:131;;33276:407;33467:2;33481:47;;;33452:18;;33542:131;33452:18;33542:131;;33690:407;33881:2;33895:47;;;33866:18;;33956:131;33866:18;33956:131;;34104:407;34295:2;34309:47;;;34280:18;;34370:131;34280:18;34370:131;;34518:407;34709:2;34723:47;;;34694:18;;34784:131;34694:18;34784:131;;34932:407;35123:2;35137:47;;;35108:18;;35198:131;35108:18;35198:131;;35346:407;35537:2;35551:47;;;35522:18;;35612:131;35522:18;35612:131;;35760:407;35951:2;35965:47;;;35936:18;;36026:131;35936:18;36026:131;;36174:407;36365:2;36379:47;;;36350:18;;36440:131;36350:18;36440:131;;36588:407;36779:2;36793:47;;;36764:18;;36854:131;36764:18;36854:131;;37002:213;37120:2;37105:18;;37134:71;37109:9;37178:6;37134:71;;37222:256;37284:2;37278:9;37310:17;;;37385:18;37370:34;;37406:22;;;37367:62;37364:2;;;37442:1;37439;37432:12;37364:2;37458;37451:22;37262:216;;-1:-1;37262:216;37485:273;;37659:18;37651:6;37648:30;37645:2;;;37691:1;37688;37681:12;37645:2;-1:-1;37720:4;37708:17;;;37738:15;;37582:176;38324:254;;38463:18;38455:6;38452:30;38449:2;;;38495:1;38492;38485:12;38449:2;-1:-1;38568:4;38539;38516:17;;;;-1:-1;;38512:33;38558:15;;38386:192;38587:136;38711:4;38699:17;;38680:43;39025:122;39130:12;;39114:33;40041:187;40168:19;;;40217:4;40208:14;;40161:67;40970:144;41105:3;41083:31;-1:-1;41083:31;41448:105;;41517:31;41542:5;41517:31;;41680:92;41753:13;41746:21;;41729:43;41779:79;41848:5;41831:27;41865:128;-1:-1;;;;;41934:54;;41917:76;42086:88;42164:4;42153:16;;42136:38;42914:149;;43007:51;43052:5;43007:51;;43535:145;43616:6;43611:3;43606;43593:30;-1:-1;43672:1;43654:16;;43647:27;43586:94;43689:268;43754:1;43761:101;43775:6;43772:1;43769:13;43761:101;;;43842:11;;;43836:18;43823:11;;;43816:39;43797:2;43790:10;43761:101;;;43877:6;43874:1;43871:13;43868:2;;;-1:-1;;43942:1;43924:16;;43917:27;43738:219;44046:97;44134:2;44114:14;-1:-1;;44110:28;;44094:49

Swarm Source

bzzr://d09795012e055d1cfd702eaaeb55e806c72224a35210229d4f10c77970a15603

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.