ETH Price: $3,257.88 (-2.91%)

Contract

0xca2097908669F8b33Ad8510994baF32ED618C39B
 
Transaction Hash
Method
Block
From
To
Transfer128055372021-07-11 10:39:561260 days ago1625999996IN
0xca209790...ED618C39B
0 ETH0.0003661210
Transfer127602492021-07-04 9:30:491267 days ago1625391049IN
0xca209790...ED618C39B
0 ETH0.000292998
Transfer127602342021-07-04 9:26:571267 days ago1625390817IN
0xca209790...ED618C39B
0 ETH0.0004612416
Withdraw127602232021-07-04 9:25:311267 days ago1625390731IN
0xca209790...ED618C39B
0 ETH0.0003686714
Release Tokens127602052021-07-04 9:19:321267 days ago1625390372IN
0xca209790...ED618C39B
0 ETH0.0007420612
Withdraw126272252021-06-13 16:33:401288 days ago1623602020IN
0xca209790...ED618C39B
0 ETH0.0008841615.5
Withdraw122781892021-04-20 16:46:111342 days ago1618937171IN
0xca209790...ED618C39B
0 ETH0.01003563270.00000145
Release Tokens122781782021-04-20 16:44:091342 days ago1618937049IN
0xca209790...ED618C39B
0 ETH0.01285303273.9
Withdraw122136332021-04-10 17:52:331352 days ago1618077153IN
0xca209790...ED618C39B
0 ETH0.00406659110
Withdraw122036502021-04-09 5:04:151353 days ago1617944655IN
0xca209790...ED618C39B
0 ETH0.0023212395
Withdraw122025452021-04-09 0:48:231353 days ago1617929303IN
0xca209790...ED618C39B
0 ETH0.0029565680
Withdraw121812592021-04-05 18:24:311357 days ago1617647071IN
0xca209790...ED618C39B
0 ETH0.00779535150
Withdraw121812222021-04-05 18:16:581357 days ago1617646618IN
0xca209790...ED618C39B
0 ETH0.0080978156
Transfer121732882021-04-04 13:05:531358 days ago1617541553IN
0xca209790...ED618C39B
0 ETH0.00545369150.97142857
Withdraw121556012021-04-01 19:57:431361 days ago1617307063IN
0xca209790...ED618C39B
0 ETH0.00408693167.1
Withdraw121517332021-04-01 5:26:421361 days ago1617254802IN
0xca209790...ED618C39B
0 ETH0.00425151174
Withdraw121473782021-03-31 13:24:441362 days ago1617197084IN
0xca209790...ED618C39B
0 ETH0.00542577197
Withdraw121473592021-03-31 13:22:061362 days ago1617196926IN
0xca209790...ED618C39B
0 ETH0.00476463195
Release Tokens121473522021-03-31 13:20:391362 days ago1617196839IN
0xca209790...ED618C39B
0 ETH0.00583822178
Release Tokens121473512021-03-31 13:20:201362 days ago1617196820IN
0xca209790...ED618C39B
0 ETH0.00564142172
Release Tokens121473492021-03-31 13:19:571362 days ago1617196797IN
0xca209790...ED618C39B
0 ETH0.00874591169
Withdraw121426242021-03-30 19:52:551363 days ago1617133975IN
0xca209790...ED618C39B
0 ETH0.0090426174
Withdraw121406132021-03-30 12:32:141363 days ago1617107534IN
0xca209790...ED618C39B
0 ETH0.00547318148
Withdraw121403702021-03-30 11:33:061363 days ago1617103986IN
0xca209790...ED618C39B
0 ETH0.00295796121
Withdraw121364602021-03-29 21:07:451363 days ago1617052065IN
0xca209790...ED618C39B
0 ETH0.00471576193
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block
From
To
127602232021-07-04 9:25:311267 days ago1625390731
0xca209790...ED618C39B
7.5 ETH
122036502021-04-09 5:04:151353 days ago1617944655
0xca209790...ED618C39B
0.1 ETH
121556012021-04-01 19:57:431361 days ago1617307063
0xca209790...ED618C39B
3.04 ETH
121517332021-04-01 5:26:421361 days ago1617254802
0xca209790...ED618C39B
2.06 ETH
121473592021-03-31 13:22:061362 days ago1617196926
0xca209790...ED618C39B
0.2 ETH
121403702021-03-30 11:33:061363 days ago1617103986
0xca209790...ED618C39B
19.97 ETH
121364602021-03-29 21:07:451363 days ago1617052065
0xca209790...ED618C39B
0.48 ETH
121326252021-03-29 6:52:421364 days ago1617000762
0xca209790...ED618C39B
77.56 ETH
121298002021-03-28 20:25:541365 days ago1616963154
0xca209790...ED618C39B
6.93 ETH
121297992021-03-28 20:25:511365 days ago1616963151
0xca209790...ED618C39B
5 ETH
121297992021-03-28 20:25:511365 days ago1616963151
0xca209790...ED618C39B
2.35 ETH
121296842021-03-28 19:57:531365 days ago1616961473
0xca209790...ED618C39B
10.12 ETH
121272082021-03-28 10:56:201365 days ago1616928980
0xca209790...ED618C39B
20.16 ETH
121269542021-03-28 9:56:031365 days ago1616925363
0xca209790...ED618C39B
1 ETH
121267242021-03-28 9:04:241365 days ago1616922264
0xca209790...ED618C39B
2 ETH
121242902021-03-28 0:04:271365 days ago1616889867
0xca209790...ED618C39B
100 ETH
121237162021-03-27 22:07:221365 days ago1616882842
0xca209790...ED618C39B
1.09999999 ETH
121231292021-03-27 19:54:401366 days ago1616874880
0xca209790...ED618C39B
2 ETH
121228992021-03-27 19:06:591366 days ago1616872019
0xca209790...ED618C39B
10 ETH
121226682021-03-27 18:17:371366 days ago1616869057
0xca209790...ED618C39B
1.57 ETH
121226412021-03-27 18:09:431366 days ago1616868583
0xca209790...ED618C39B
0.03 ETH
121226382021-03-27 18:09:011366 days ago1616868541
0xca209790...ED618C39B
0.22 ETH
121219992021-03-27 15:50:351366 days ago1616860235
0xca209790...ED618C39B
299.95 ETH
121165752021-03-26 19:35:431367 days ago1616787343
0xca209790...ED618C39B
423.34499999 ETH
121163912021-03-26 18:53:401367 days ago1616784820
0xca209790...ED618C39B
149.99999999 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
InDefiEcoPreMining

Compiler Version
v0.5.17+commit.d19bba13

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2020-12-16
*/

// File: @openzeppelin\upgrades\contracts\Initializable.sol

pragma solidity >=0.4.24 <0.7.0;


/**
 * @title Initializable
 *
 * @dev Helper contract to support initializer functions. To use it, replace
 * the constructor with a function that has the `initializer` modifier.
 * WARNING: Unlike constructors, initializer functions must be manually
 * invoked. This applies both to deploying an Initializable contract, as well
 * as extending an Initializable contract via inheritance.
 * WARNING: When used with inheritance, manual care must be taken to not invoke
 * a parent initializer twice, or ensure that all initializers are idempotent,
 * because this is not dealt with automatically as with constructors.
 */
contract Initializable {

  /**
   * @dev Indicates that the contract has been initialized.
   */
  bool private initialized;

  /**
   * @dev Indicates that the contract is in the process of being initialized.
   */
  bool private initializing;

  /**
   * @dev Modifier to use in the initializer function of a contract.
   */
  modifier initializer() {
    require(initializing || isConstructor() || !initialized, "Contract instance has already been initialized");

    bool isTopLevelCall = !initializing;
    if (isTopLevelCall) {
      initializing = true;
      initialized = true;
    }

    _;

    if (isTopLevelCall) {
      initializing = false;
    }
  }

  /// @dev Returns true if and only if the function is running in the constructor
  function isConstructor() private view returns (bool) {
    // extcodesize checks the size of the code stored in an address, and
    // address returns the current address. Since the code is still not
    // deployed when running a constructor, any checks on its code size will
    // yield zero, making it an effective way to detect if a contract is
    // under construction or not.
    address self = address(this);
    uint256 cs;
    assembly { cs := extcodesize(self) }
    return cs == 0;
  }

  // Reserved storage space to allow for layout changes in the future.
  uint256[50] private ______gap;
}

// File: contracts\interfaces\IERC20.sol

pragma solidity ^0.5.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP. Does not include
 * the optional functions; to access them see {ERC20Detailed}.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

// File: contracts\token\ERC20\ERC20Detailed.sol

pragma solidity ^0.5.0;




/**
 * @dev Optional functions from the ERC20 standard.
 */
contract ERC20Detailed is Initializable, IERC20 {
    string private _name;
    string private _symbol;
    uint8 private _decimals;

    /**
     * @dev Sets the values for `name`, `symbol`, and `decimals`. All three of
     * these values are immutable: they can only be set once during
     * construction.
     */
    function initialize(string memory name, string memory symbol, uint8 decimals) public initializer {
        _name = name;
        _symbol = symbol;
        _decimals = decimals;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5,05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei.
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view returns (uint8) {
        return _decimals;
    }

    uint256[50] private ______gap;
}

// File: contracts\nonupgradable\Ownable.sol

pragma solidity ^0.5.16;

contract Ownable {
    address payable public owner;
    address payable internal newOwnerCandidate;

    constructor() public {
        owner = msg.sender;
    }

    modifier onlyOwner {
        require(msg.sender == owner, "Permission denied");
        _;
    }

    function changeOwner(address payable newOwner) public onlyOwner {
        newOwnerCandidate = newOwner;
    }

    function acceptOwner() public {
        require(msg.sender == newOwnerCandidate, "Permission denied");
        owner = newOwnerCandidate;
    }
}

// File: contracts\interfaces\IToken.sol

pragma solidity ^0.5.16;

interface IToken {
    function decimals() external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);
    function balanceOf(address account) external view returns (uint);
    function approve(address spender, uint value) external;
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint value) external returns (bool);
    function deposit() external payable;
    function mint(address, uint256) external;
    function withdraw(uint amount) external;
    function totalSupply() view external returns (uint256);
    function burnFrom(address account, uint256 amount) external;
    function symbol() external view returns (string memory);
}

// File: contracts\utils\SafeMath.sol

pragma solidity ^0.5.0;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     * - Subtraction cannot overflow.
     *
     * _Available since v2.4.0._
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     * - Multiplication cannot 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-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     *
     * _Available since v2.4.0._
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     *
     * _Available since v2.4.0._
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

// File: contracts\token\ERC20\ERC20.sol

pragma solidity ^0.5.0;





/**
 * @dev Implementation of the {IERC20} interface.
 */
contract ERC20 is Initializable, IERC20 {
    using SafeMath for uint256;

    mapping (address => uint256) internal _balances;

    mapping (address => mapping (address => uint256)) internal _allowances;

    uint256 internal _totalSupply;

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `recipient` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address recipient, uint256 amount) public returns (bool) {
        _transfer(msg.sender, recipient, amount);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public returns (bool) {
        _approve(msg.sender, spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20};
     *
     * Requirements:
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     * - the caller must have allowance for `sender`'s tokens of at least
     * `amount`.
     */
    function transferFrom(address sender, address recipient, uint256 amount) public returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(sender, msg.sender, _allowances[sender][msg.sender].sub(amount, "ERC20: transfer amount exceeds allowance"));
        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public returns (bool) {
        _approve(msg.sender, spender, _allowances[msg.sender][spender].add(addedValue));
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public returns (bool) {
        _approve(msg.sender, spender, _allowances[msg.sender][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
        return true;
    }

    /**
     * @dev Moves tokens `amount` from `sender` to `recipient`.
     *
     * This is internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `sender` cannot be the zero address.
     * - `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     */
    function _transfer(address sender, address recipient, uint256 amount) internal {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance");
        _balances[recipient] = _balances[recipient].add(amount);
        emit Transfer(sender, recipient, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements
     *
     * - `to` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal {
        require(account != address(0), "ERC20: mint to the zero address");

        _totalSupply = _totalSupply.add(amount);
        _balances[account] = _balances[account].add(amount);
        emit Transfer(address(0), account, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal {
        require(account != address(0), "ERC20: burn from the zero address");

        _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance");
        _totalSupply = _totalSupply.sub(amount);
        emit Transfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner`s tokens.
     *
     * This is internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(address owner, address spender, uint256 amount) internal {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`.`amount` is then deducted
     * from the caller's allowance.
     *
     * See {_burn} and {_approve}.
     */
    function _burnFrom(address account, uint256 amount) internal {
        _burn(account, amount);
        _approve(account, msg.sender, _allowances[account][msg.sender].sub(amount, "ERC20: burn amount exceeds allowance"));
    }

    uint256[50] private ______gap;
}

// File: contracts\interfaces\IPriceOracle.sol

pragma solidity ^0.5.17;

interface IPriceOracle {
    function price(string calldata symbol) external view returns (uint);
}

// File: contracts\utils\DSMath.sol

pragma solidity ^0.5.0;

contract DSMath {
    function add(uint x, uint y) internal pure returns (uint z) {
        require((z = x + y) >= x);
    }
    function sub(uint x, uint y) internal pure returns (uint z) {
        require((z = x - y) <= x);
    }
    function mul(uint x, uint y) internal pure returns (uint z) {
        require(y == 0 || (z = x * y) / y == x);
    }

//    function min(uint x, uint y) internal pure returns (uint z) {
//        return x <= y ? x : y;
//    }
//    function max(uint x, uint y) internal pure returns (uint z) {
//        return x >= y ? x : y;
//    }
//    function imin(int x, int y) internal pure returns (int z) {
//        return x <= y ? x : y;
//    }
//    function imax(int x, int y) internal pure returns (int z) {
//        return x >= y ? x : y;
//    }

    uint constant WAD = 10 ** 18;
//    uint constant RAY = 10 ** 27;

    function wmul(uint x, uint y, uint base) internal pure returns (uint z) {
        z = add(mul(x, y), base / 2) / base;
    }

    function wmul(uint x, uint y) internal pure returns (uint z) {
        z = add(mul(x, y), WAD / 2) / WAD;
    }
//    function rmul(uint x, uint y) internal pure returns (uint z) {
//        z = add(mul(x, y), RAY / 2) / RAY;
//    }
    function wdiv(uint x, uint y) internal pure returns (uint z) {
        z = add(mul(x, WAD), y / 2) / y;
    }
//    function rdiv(uint x, uint y) internal pure returns (uint z) {
//        z = add(mul(x, RAY), y / 2) / y;
//    }

}

// File: contracts\utils\Address.sol

pragma solidity ^0.5.5;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * This test is non-exhaustive, and there may be false-negatives: during the
     * execution of a contract's constructor, its address will be reported as
     * not containing a contract.
     *
     * IMPORTANT: It is unsafe to assume that an address for which this
     * function returns false is an externally-owned account (EOA) and not a
     * contract.
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies in extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        // According to EIP-1052, 0x0 is the value returned for not-yet created accounts
        // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
        // for accounts without code, i.e. `keccak256('')`
        bytes32 codehash;
        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        // solhint-disable-next-line no-inline-assembly
        assembly { codehash := extcodehash(account) }
        return (codehash != 0x0 && codehash != accountHash);
    }

    /**
     * @dev Converts an `address` into `address payable`. Note that this is
     * simply a type cast: the actual underlying value is not changed.
     *
     * _Available since v2.4.0._
     */
    function toPayable(address account) internal pure returns (address payable) {
        return address(uint160(account));
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     *
     * _Available since v2.4.0._
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        // solhint-disable-next-line avoid-call-value
        (bool success, ) = recipient.call.value(amount)("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }
}

// File: contracts\utils\SafeERC20.sol

pragma solidity ^0.5.16;

// import "@openzeppelin/contracts-ethereum-package/contracts/math/SafeMath.sol";

// import "@openzeppelin/contracts-ethereum-package/contracts/utils/Address.sol";



/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for ERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {

    using SafeMath for uint256;
    using Address for address;

    function safeTransfer(IToken token, address to, uint256 value) internal {
        callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(IToken token, address from, address to, uint256 value) internal {
        callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    function safeApprove(IToken token, address spender, uint256 value) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        // solhint-disable-next-line max-line-length
        require((value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(IToken token, address spender, uint256 value) internal {
        uint256 newAllowance = token.allowance(address(this), spender).add(value);
        callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(IToken token, address spender, uint256 value) internal {
        uint256 newAllowance = token.allowance(address(this), spender).sub(value);
        callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function callOptionalReturn(IToken token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves.

        // A Solidity high level call has three parts:
        //  1. The target address is checked to verify it contains contract code
        //  2. The call itself is made, and success asserted
        //  3. The return value is decoded, which in turn checks the size of the returned data.
        // solhint-disable-next-line max-line-length
        require(address(token).isContract(), "SafeERC20: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = address(token).call(data);
        require(success, "SafeERC20: low-level call failed");

        if (returndata.length > 0) { // Return data is optional
            // solhint-disable-next-line max-line-length
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

// File: contracts\utils\UniversalERC20.sol

pragma solidity ^0.5.16;

// import "@openzeppelin/contracts-ethereum-package/contracts/math/SafeMath.sol";
// import "./SafeMath.sol";



library UniversalERC20 {

    using SafeMath for uint256;
    using SafeERC20 for IToken;

    IToken private constant ZERO_ADDRESS = IToken(0x0000000000000000000000000000000000000000);
    IToken private constant ETH_ADDRESS = IToken(0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE);

    function universalTransfer(IToken token, address to, uint256 amount) internal {
        universalTransfer(token, to, amount, false);
    }

    function universalSymbol(IToken token) internal view returns (string memory) {
        if (token == ETH_ADDRESS) return "ETH";
        return token.symbol();
    }

    function universalDecimals(IToken token) internal view returns (uint) {
        if (token == ETH_ADDRESS) return 18;
        return token.decimals();
    }

    function universalTransfer(IToken token, address to, uint256 amount, bool mayFail) internal returns(bool) {
        if (amount == 0) {
            return true;
        }

        if (token == ZERO_ADDRESS || token == ETH_ADDRESS) {
            if (mayFail) {
                return address(uint160(to)).send(amount);
            } else {
                address(uint160(to)).transfer(amount);
                return true;
            }
        } else {
            token.safeTransfer(to, amount);
            return true;
        }
    }

    function universalApprove(IToken token, address to, uint256 amount) internal {
        if (token != ZERO_ADDRESS && token != ETH_ADDRESS) {
            token.safeApprove(to, amount);
        }
    }

    function universalTransferFrom(IToken token, address from, address to, uint256 amount) internal {
        if (amount == 0) {
            return;
        }

        if (token == ZERO_ADDRESS || token == ETH_ADDRESS) {
            require(from == msg.sender && msg.value >= amount, "msg.value is zero");
            if (to != address(this)) {
                address(uint160(to)).transfer(amount);
            }
            if (msg.value > amount) {
                msg.sender.transfer(uint256(msg.value).sub(amount));
            }
        } else {
            token.safeTransferFrom(from, to, amount);
        }
    }

    function universalBalanceOf(IToken token, address who) internal view returns (uint256) {
        if (token == ZERO_ADDRESS || token == ETH_ADDRESS) {
            return who.balance;
        } else {
            return token.balanceOf(who);
        }
    }
}

// File: contracts\deposits_v3\Indefieco.sol

pragma solidity ^0.5.16;









interface TokenizedStrategy {
    function deposit(uint256 amountDAI, uint256 amountUSDC, address flashloanFromAddress) external payable;
    function burnTokens(uint256 amountDAI, uint256 amountUSDC, uint256 amountETH, address flashLoanFromAddress) external;
    function userClaimProfit(uint64 max) external;
    function burnTokens(uint256 amount, bool withFlashloan) external; // function from old TokenizedStrategy, work just for DAI
}

interface IDfFinanceDeposits {
    enum FlashloanProvider {
        DYDX,
        AAVE,
        ADDRESS
    }

    function deposit(
        address dfWallet,
        uint256 amountDAI,
        uint256 amountUSDC,
        uint256 amountWBTC,
        uint256 flashloanDAI,
        uint256 flashloanUSDC,
        FlashloanProvider flashloanType,
        address flashloanFromAddress
    ) external payable returns (address);
}

interface IComptroller {
    function oracle() external view returns (IPriceOracle);
    function getAccountLiquidity(address) external view returns (uint, uint, uint);
}

contract InDefiEcoPreMining is
    Initializable,
    Ownable,
    ERC20Detailed,
    ERC20,
    DSMath
{
    using UniversalERC20 for IToken;

//    address public constant ETH_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; // Kovan
//    address public constant DAI_ADDRESS = 0x4F96Fe3b7A6Cf9725f59d353F723c1bDb64CA6Aa; // Kovan
//    address public constant USDC_ADDRESS = 0xb7a4F3E9097C08dA09517b5aB877F7a917224ede; // Kovan
//    address public constant WBTC_ADDRESS = 0xd3A691C852CDB01E281545A27064741F0B7f6825; // Kovan
//    address public constant COMPTROLLER = 0x5eAe89DC1C671724A672ff0630122ee834098657; // Kovan

    address public constant ETH_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;
    address public constant DAI_ADDRESS = 0x6B175474E89094C44Da98b954EedeAC495271d0F; // Mainnet
    address public constant USDC_ADDRESS = 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48; // Mainnet
    address public constant WBTC_ADDRESS = 0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599; // Mainnet
    address public constant COMPTROLLER = 0x3d9819210A31b4961b30EF54bE2aeD79B9c9Cd3B; // Mainnet

    TokenizedStrategy public constant dfTokenizedStrategy = TokenizedStrategy(0xb942ca22e0eb0f2524F53f999aE33fD3B2D58E3E); // Mainnet
    address public constant dfDeposits = 0xFff9D7b0B6312ead0a1A993BF32f373449006F2F; // Mainnet

    function initialize() public initializer {
        owner = 0xdAE0aca4B9B38199408ffaB32562Bf7B3B0495fE;
        ERC20Detailed.initialize('XInDefiEco', 'XIDF', 18);
        maxDateDeposits = 1609016400;
        dateFundsUnlocked = maxDateDeposits + 90 days;
        maxDelayUntilClaimTokens = 3 days;
        enableToken(DAI_ADDRESS);
        enableToken(ETH_ADDRESS);
        enableToken(WBTC_ADDRESS);
        enableToken(USDC_ADDRESS);
    }

    // TODO: remove in production
//    function setDebugDates(uint256 _new_maxDateDeposits, uint256 _new_dateFundsUnlocked) public onlyOwner {
//        maxDateDeposits = _new_maxDateDeposits;
//        dateFundsUnlocked = _new_dateFundsUnlocked;
//    }

    mapping(address => bool) tokens;

    struct Deposit  {
        uint256 amount;
        uint256 avgPrice;
        uint256 tokensToMint;
        uint128 lastDeposit;
    }
    mapping(address => mapping(address => Deposit)) userDeposits;

    uint256 public maxDateDeposits;
    uint256 public dateFundsUnlocked;
    uint256 public maxDelayUntilClaimTokens;
    address flashloanFromAddress;
    uint256 public constant totalMaxTokens = 20000000 * 1e18; // 20 mil
    uint256 public totalCurrentTokens;

    // emergency tokens withdrawal status
    mapping(address => bool) public isEmergencyWithdrawalActive;

    event EmergencyWithdrawalActivated(address indexed token);

    function getInfo(address userAddress, address tokenAddress) view public returns ( uint256 amount, uint256 avgPrice,uint256 tokensToMint, uint256 price, uint256 balance, uint128 lastDeposit) {
        IPriceOracle compOracle = IComptroller(COMPTROLLER).oracle();
        string memory symbol = IToken(tokenAddress).universalSymbol();
        if (tokenAddress == WBTC_ADDRESS) symbol = "BTC";
        price = compOracle.price(symbol);
        balance = IToken(tokenAddress).universalBalanceOf(address(this));

        Deposit memory d = userDeposits[userAddress][tokenAddress];
        amount = d.amount;
        avgPrice = d.avgPrice;
        tokensToMint = d.tokensToMint;
        lastDeposit = d.lastDeposit;
    }

    function enableToken(address tokenAddress) public onlyOwner {
        tokens[tokenAddress] = true; // can't remove tokens, just add
    }

    // Emergency Withdrawal logic
    function activateEmergencyWithdrawal(address token) public onlyOwner {
        isEmergencyWithdrawalActive[token] = true;
        emit EmergencyWithdrawalActivated(token);
    }

    function fundsToTokensUsePrice(IToken token, uint256 price, uint256 amount) view public returns (uint256 ret) {
        // oracle price always in $ (6 decimals)
        uint256 decimals = token.universalDecimals();
        ret = mul(price, amount) / 1e6;
        if (decimals < 18) ret = mul(ret, 10 ** (18 - decimals));
    }

    function deposit(IToken token, uint256 amount) payable public returns (uint256) {
        require(now < maxDateDeposits);
        require(tokens[address(token)]);
        IPriceOracle compOracle = IComptroller(COMPTROLLER).oracle();
        string memory symbol = token.universalSymbol();
        if (address(token) == WBTC_ADDRESS) symbol = "BTC";
        uint256 _price = compOracle.price(symbol);
        require(_price > 0);

        token.universalTransferFrom(msg.sender, address(this), amount);

        uint256 tokensToMint = fundsToTokensUsePrice(token, _price, amount);
        totalCurrentTokens = add(totalCurrentTokens, tokensToMint);
        require(totalCurrentTokens <= totalMaxTokens);

        Deposit storage depo = userDeposits[msg.sender][address(token)];
        uint256 totalAmount = depo.amount;
        uint256 newAvgPrice = add(totalAmount * depo.avgPrice, _price * amount) / (totalAmount + amount);
        depo.amount = totalAmount + amount;
        depo.avgPrice = newAvgPrice;
        depo.tokensToMint = add(depo.tokensToMint, tokensToMint);
        depo.lastDeposit = uint128(now);

        return tokensToMint;
    }

    function releaseTokens(address userAddress, address[] memory tokenList) public returns (uint256 tokensToMint) {
        if (userAddress == address(0)) userAddress = msg.sender;
        uint256 len = tokenList.length;

        uint256 _maxDelayUntilClaimTokens = maxDelayUntilClaimTokens;

        for(uint256 i = 0; i < len;i++) {
            Deposit storage depo = userDeposits[userAddress][tokenList[i]];
            if (now > depo.lastDeposit + _maxDelayUntilClaimTokens) {
                uint256 _tMint = depo.tokensToMint;
                if (_tMint > 0) {
                    tokensToMint = add(tokensToMint, _tMint);
                    depo.tokensToMint = 0;
                }
            }
        }
        if (tokensToMint > 0) {
            _mint(userAddress, tokensToMint);
        }
    }

    function emergencyWithdraw(address token) public {
        require(tokens[token] && isEmergencyWithdrawalActive[token]); // token enabled

        Deposit storage depo = userDeposits[msg.sender][token];

        uint256 amount = depo.amount;

        // update storage user's deposit
        depo.amount = 0;
        depo.avgPrice = 0;
        depo.tokensToMint = 0;
        depo.lastDeposit = 0;

        withdrawToken(IToken(token), amount, msg.sender);
    }

    function withdraw(address token, uint256 amount) public returns (uint256 tokensToBurn) {
        require(tokens[token]); // token enabled

        Deposit storage depo = userDeposits[msg.sender][token];
        require(depo.tokensToMint == 0);
        // до dateFundsUnlocked необходимо вернуть токены для возврата средств
        if (now < dateFundsUnlocked) {
            tokensToBurn = fundsToTokensUsePrice(IToken(token), depo.avgPrice, amount);
            _burn(msg.sender, tokensToBurn);
        }

        depo.amount = sub(depo.amount, amount);

        withdrawToken(IToken(token), amount, msg.sender);

        return tokensToBurn;
    }

    function approveTokens(address[] memory listTokens) public onlyOwner {
        for(uint256 i = 0; i < listTokens.length; i++) {
            IToken token = IToken(listTokens[i]);
            if (token.allowance(address(this), address(dfTokenizedStrategy)) != uint256(-1)) {
                token.universalApprove(address(dfTokenizedStrategy), uint256(-1));
            }
            if (token.allowance(address(this), address(dfDeposits)) != uint256(-1)) {
                token.universalApprove(address(dfDeposits), uint256(-1));
            }
        }
    }

    function externalCallToTokenizedStrategy(address payable target, bytes memory data, uint256 ethAmount) public onlyOwner returns(bytes32 response) {
        // external calls allowed only for 2 contracts
        require(target == dfDeposits || target == address(dfTokenizedStrategy));
        assembly {
            let succeeded := call(sub(gas, 5000), target, ethAmount, add(data, 0x20), mload(data), 0, 32)
            response := mload(0)
            switch iszero(succeeded)
            case 1 {
                revert(0, 0)
            }
        }
    }

    function depositWBTC(address dfWallet, uint256 amountWBTC) public onlyOwner {
        require(dfWallet != address(0));

        IToken(WBTC_ADDRESS).universalTransfer(dfWallet, amountWBTC);

        IDfFinanceDeposits(dfDeposits).deposit(
            dfWallet,
            0,      // amountDAI
            0,      // amountUSDC
            amountWBTC,
            0,      // flashloanDAI
            0,      // flashloanUSDC
            IDfFinanceDeposits.FlashloanProvider.DYDX,  // default
            address(0)  // flashloanFromAddress – default
        );
    }

    function withdrawToken(IToken token, uint256 amount, address receiver) internal {
        if (receiver != address(this)) {
            if (token.universalBalanceOf(address(this)) >= amount) {
                token.universalTransfer(receiver, amount);
                return;
            }
        }

        if (address(token) == DAI_ADDRESS) {
//            dfTokenizedStrategy.burnTokens(amount, 0, 0, flashloanFromAddress);
            dfTokenizedStrategy.burnTokens(amount, true);
        } else if (address(token) == ETH_ADDRESS) {
            dfTokenizedStrategy.burnTokens(0, 0, amount, flashloanFromAddress);
        } else if (address(token) == USDC_ADDRESS) {
            dfTokenizedStrategy.burnTokens(0, amount, 0, flashloanFromAddress);
        } else {
            require(false);
        }

        if (receiver != address(this)) token.universalTransfer(receiver, amount);
    }

    // allow to claim profit from tokenized startegy (in new version)
    function defiController() view external returns(address) {
        return owner;
    }

    function() external payable {}
}

Contract Security Audit

Contract ABI

[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"}],"name":"EmergencyWithdrawalActivated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"constant":true,"inputs":[],"name":"COMPTROLLER","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"DAI_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"ETH_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"USDC_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"WBTC_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"acceptOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"activateEmergencyWithdrawal","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address[]","name":"listTokens","type":"address[]"}],"name":"approveTokens","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address payable","name":"newOwner","type":"address"}],"name":"changeOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"dateFundsUnlocked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"defiController","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"contract IToken","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"deposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"dfWallet","type":"address"},{"internalType":"uint256","name":"amountWBTC","type":"uint256"}],"name":"depositWBTC","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"dfDeposits","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"dfTokenizedStrategy","outputs":[{"internalType":"contract TokenizedStrategy","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"emergencyWithdraw","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"enableToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address payable","name":"target","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"uint256","name":"ethAmount","type":"uint256"}],"name":"externalCallToTokenizedStrategy","outputs":[{"internalType":"bytes32","name":"response","type":"bytes32"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"contract IToken","name":"token","type":"address"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"fundsToTokensUsePrice","outputs":[{"internalType":"uint256","name":"ret","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"userAddress","type":"address"},{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"getInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"avgPrice","type":"uint256"},{"internalType":"uint256","name":"tokensToMint","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint128","name":"lastDeposit","type":"uint128"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint8","name":"decimals","type":"uint8"}],"name":"initialize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"initialize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isEmergencyWithdrawalActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"maxDateDeposits","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"maxDelayUntilClaimTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"internalType":"address payable","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"userAddress","type":"address"},{"internalType":"address[]","name":"tokenList","type":"address[]"}],"name":"releaseTokens","outputs":[{"internalType":"uint256","name":"tokensToMint","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalCurrentTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalMaxTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[{"internalType":"uint256","name":"tokensToBurn","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"}]

6080604052603380546001600160a01b031916331790556133bc806100256000396000f3fe6080604052600436106102465760003560e01c806395d89b4111610139578063b9b8cc96116100b6578063c690908a1161007a578063c690908a14610b01578063d24e567a14610b34578063dd62ed3e14610b6d578063eb3112b514610ba8578063ebbc496514610bbd578063f3fef3a314610bd257610246565b8063b9b8cc9614610a18578063ba1de6c714610a4b578063bb09d9b714610a60578063bdd5915f14610a75578063c686554e14610a8a57610246565b8063a9059cbb116100fd578063a9059cbb1461082b578063ac43070b14610864578063b0cf77d314610912578063b2ae48f0146109d0578063b3537893146109e557610246565b806395d89b41146107805780639b9e98be14610795578063a457c2d7146107aa578063a6f9dae1146107e3578063a734f06e1461081657610246565b806346144c8f116101c757806370a082311161018b57806370a082311461064b578063734622811461067e5780637b24715d146107415780638129fc1c146107565780638da5cb5b1461076b57610246565b806346144c8f1461058357806347e7ef24146105985780634ce56141146105c45780635f82c67e146106035780636ff1c9bc1461061857610246565b806323b872dd1161020e57806323b872dd146104965780632a4c0a1a146104d9578063313ce5671461050a57806334fe2c7514610535578063395093511461054a57610246565b806306fdde0314610248578063095ea7b3146102d2578063152165391461031f5780631624f6c61461034657806318160ddd14610481575b005b34801561025457600080fd5b5061025d610c0b565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561029757818101518382015260200161027f565b50505050905090810190601f1680156102c45780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156102de57600080fd5b5061030b600480360360408110156102f557600080fd5b506001600160a01b038135169060200135610ca2565b604080519115158252519081900360200190f35b34801561032b57600080fd5b50610334610cb9565b60408051918252519081900360200190f35b34801561035257600080fd5b506102466004803603606081101561036957600080fd5b810190602081018135600160201b81111561038357600080fd5b82018360208201111561039557600080fd5b803590602001918460018302840111600160201b831117156103b657600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b81111561040857600080fd5b82018360208201111561041a57600080fd5b803590602001918460018302840111600160201b8311171561043b57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295505050903560ff169150610cbf9050565b34801561048d57600080fd5b50610334610d9b565b3480156104a257600080fd5b5061030b600480360360608110156104b957600080fd5b506001600160a01b03813581169160208101359091169060400135610da1565b3480156104e557600080fd5b506104ee610e10565b604080516001600160a01b039092168252519081900360200190f35b34801561051657600080fd5b5061051f610e28565b6040805160ff9092168252519081900360200190f35b34801561054157600080fd5b50610334610e31565b34801561055657600080fd5b5061030b6004803603604081101561056d57600080fd5b506001600160a01b038135169060200135610e40565b34801561058f57600080fd5b506104ee610e7c565b610334600480360360408110156105ae57600080fd5b506001600160a01b038135169060200135610e8b565b3480156105d057600080fd5b50610334600480360360608110156105e757600080fd5b506001600160a01b038135169060208101359060400135611159565b34801561060f57600080fd5b506104ee6111ac565b34801561062457600080fd5b506102466004803603602081101561063b57600080fd5b50356001600160a01b03166111c4565b34801561065757600080fd5b506103346004803603602081101561066e57600080fd5b50356001600160a01b0316611269565b34801561068a57600080fd5b50610334600480360360608110156106a157600080fd5b6001600160a01b038235169190810190604081016020820135600160201b8111156106cb57600080fd5b8201836020820111156106dd57600080fd5b803590602001918460018302840111600160201b831117156106fe57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295505091359250611288915050565b34801561074d57600080fd5b50610334611362565b34801561076257600080fd5b50610246611368565b34801561077757600080fd5b506104ee611502565b34801561078c57600080fd5b5061025d611511565b3480156107a157600080fd5b506104ee611572565b3480156107b657600080fd5b5061030b600480360360408110156107cd57600080fd5b506001600160a01b03813516906020013561158a565b3480156107ef57600080fd5b506102466004803603602081101561080657600080fd5b50356001600160a01b03166115df565b34801561082257600080fd5b506104ee611654565b34801561083757600080fd5b5061030b6004803603604081101561084e57600080fd5b506001600160a01b03813516906020013561166c565b34801561087057600080fd5b506102466004803603602081101561088757600080fd5b810190602081018135600160201b8111156108a157600080fd5b8201836020820111156108b357600080fd5b803590602001918460208302840111600160201b831117156108d457600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611679945050505050565b34801561091e57600080fd5b506103346004803603604081101561093557600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561095f57600080fd5b82018360208201111561097157600080fd5b803590602001918460208302840111600160201b8311171561099257600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955061188a945050505050565b3480156109dc57600080fd5b506104ee611956565b3480156109f157600080fd5b5061030b60048036036020811015610a0857600080fd5b50356001600160a01b031661196e565b348015610a2457600080fd5b5061024660048036036020811015610a3b57600080fd5b50356001600160a01b0316611983565b348015610a5757600080fd5b50610334611a22565b348015610a6c57600080fd5b506104ee611a28565b348015610a8157600080fd5b506104ee611a40565b348015610a9657600080fd5b50610ac560048036036040811015610aad57600080fd5b506001600160a01b0381358116916020013516611a58565b60408051968752602087019590955285850193909352606085019190915260808401526001600160801b031660a0830152519081900360c00190f35b348015610b0d57600080fd5b5061024660048036036020811015610b2457600080fd5b50356001600160a01b0316611c9f565b348015610b4057600080fd5b5061024660048036036040811015610b5757600080fd5b506001600160a01b038135169060200135611d16565b348015610b7957600080fd5b5061033460048036036040811015610b9057600080fd5b506001600160a01b0381358116916020013516611e92565b348015610bb457600080fd5b50610334611ebd565b348015610bc957600080fd5b50610246611ec3565b348015610bde57600080fd5b5061033460048036036040811015610bf557600080fd5b506001600160a01b038135169060200135611f3a565b60358054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610c975780601f10610c6c57610100808354040283529160200191610c97565b820191906000526020600020905b815481529060010190602001808311610c7a57829003601f168201915b505050505090505b90565b6000610caf338484611fd6565b5060015b92915050565b60a15481565b600054610100900460ff1680610cd85750610cd86120c2565b80610ce6575060005460ff16155b610d215760405162461bcd60e51b815260040180806020018281038252602e81526020018061326b602e913960400191505060405180910390fd5b600054610100900460ff16158015610d4c576000805460ff1961ff0019909116610100171660011790555b8351610d5f9060359060208701906130ec565b508251610d739060369060208601906130ec565b506037805460ff191660ff84161790558015610d95576000805461ff00191690555b50505050565b606c5490565b6000610dae8484846120c8565b610e068433610e0185604051806060016040528060288152602001613243602891396001600160a01b038a166000908152606b60209081526040808320338452909152902054919063ffffffff61222616565b611fd6565b5060019392505050565b736b175474e89094c44da98b954eedeac495271d0f81565b60375460ff1690565b6a108b2a2c2802909400000081565b336000818152606b602090815260408083206001600160a01b03871684529091528120549091610caf918590610e01908663ffffffff6122bd16565b6033546001600160a01b031690565b600060a1544210610e9b57600080fd5b6001600160a01b0383166000908152609f602052604090205460ff16610ec057600080fd5b6000733d9819210a31b4961b30ef54be2aed79b9c9cd3b6001600160a01b0316637dc0d1d06040518163ffffffff1660e01b815260040160206040518083038186803b158015610f0f57600080fd5b505afa158015610f23573d6000803e3d6000fd5b505050506040513d6020811015610f3957600080fd5b505190506060610f516001600160a01b03861661231e565b90506001600160a01b038516732260fac5e5542a773aa44fbcfedf7c193bc2c5991415610f94575060408051808201909152600381526242544360e81b60208201525b6000826001600160a01b031663fe2c6198836040518263ffffffff1660e01b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015610ff2578181015183820152602001610fda565b50505050905090810190601f16801561101f5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561103c57600080fd5b505afa158015611050573d6000803e3d6000fd5b505050506040513d602081101561106657600080fd5b505190508061107457600080fd5b61108f6001600160a01b03871633308863ffffffff61249016565b600061109c878388611159565b90506110aa60a554826125dc565b60a58190556a108b2a2c2802909400000010156110c657600080fd5b33600090815260a0602090815260408083206001600160a01b038b1684529091528120805460018201549192909189830190611106908402878c026125dc565b8161110d57fe5b838b0185550460018401819055600284015490915061112c90856125dc565b6002840155505060030180546001600160801b031916426001600160801b03161790559695505050505050565b60008061116e856001600160a01b03166125ec565b9050620f424061117e8585612686565b8161118557fe5b04915060128110156111a4576111a18282601203600a0a612686565b91505b509392505050565b733d9819210a31b4961b30ef54be2aed79b9c9cd3b81565b6001600160a01b0381166000908152609f602052604090205460ff16801561120457506001600160a01b038116600090815260a6602052604090205460ff165b61120d57600080fd5b33600081815260a0602090815260408083206001600160a01b0386168452909152812080548282556001820183905560028201929092556003810180546001600160801b03191690559161126490849083906126aa565b505050565b6001600160a01b0381166000908152606a60205260409020545b919050565b6033546000906001600160a01b031633146112de576040805162461bcd60e51b815260206004820152601160248201527014195c9b5a5cdcda5bdb8819195b9a5959607a1b604482015290519081900360640190fd5b6001600160a01b03841673fff9d7b0b6312ead0a1a993bf32f373449006f2f148061132557506001600160a01b03841673b942ca22e0eb0f2524f53f999ae33fd3b2d58e3e145b61132e57600080fd5b6020600084516020860185886113885a03f1600051915080156001811461135457611359565b600080fd5b50509392505050565b60a25481565b600054610100900460ff168061138157506113816120c2565b8061138f575060005460ff16155b6113ca5760405162461bcd60e51b815260040180806020018281038252602e81526020018061326b602e913960400191505060405180910390fd5b600054610100900460ff161580156113f5576000805460ff1961ff0019909116610100171660011790555b603380546001600160a01b03191673dae0aca4b9b38199408ffab32562bf7b3b0495fe179055604080518082018252600a81526958496e4465666945636f60b01b602080830191909152825180840190935260048352632c24a22360e11b90830152611462916012610cbf565b635fe7a45060a15563605e4b5060a2556203f48060a355611496736b175474e89094c44da98b954eedeac495271d0f611c9f565b6114b373eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee611c9f565b6114d0732260fac5e5542a773aa44fbcfedf7c193bc2c599611c9f565b6114ed73a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48611c9f565b80156114ff576000805461ff00191690555b50565b6033546001600160a01b031681565b60368054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610c975780601f10610c6c57610100808354040283529160200191610c97565b73fff9d7b0b6312ead0a1a993bf32f373449006f2f81565b6000610caf3384610e018560405180606001604052806025815260200161336360259139336000908152606b602090815260408083206001600160a01b038d168452909152902054919063ffffffff61222616565b6033546001600160a01b03163314611632576040805162461bcd60e51b815260206004820152601160248201527014195c9b5a5cdcda5bdb8819195b9a5959607a1b604482015290519081900360640190fd5b603480546001600160a01b0319166001600160a01b0392909216919091179055565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee81565b6000610caf3384846120c8565b6033546001600160a01b031633146116cc576040805162461bcd60e51b815260206004820152601160248201527014195c9b5a5cdcda5bdb8819195b9a5959607a1b604482015290519081900360640190fd5b60005b81518110156118865760008282815181106116e657fe5b60209081029190910181015160408051636eb1769f60e11b815230600482015273b942ca22e0eb0f2524f53f999ae33fd3b2d58e3e60248201529051919350600019926001600160a01b0385169263dd62ed3e926044808201939291829003018186803b15801561175657600080fd5b505afa15801561176a573d6000803e3d6000fd5b505050506040513d602081101561178057600080fd5b5051146117b7576117b76001600160a01b03821673b942ca22e0eb0f2524f53f999ae33fd3b2d58e3e60001963ffffffff6128ec16565b60408051636eb1769f60e11b815230600482015273fff9d7b0b6312ead0a1a993bf32f373449006f2f60248201529051600019916001600160a01b0384169163dd62ed3e91604480820192602092909190829003018186803b15801561181c57600080fd5b505afa158015611830573d6000803e3d6000fd5b505050506040513d602081101561184657600080fd5b50511461187d5761187d6001600160a01b03821673fff9d7b0b6312ead0a1a993bf32f373449006f2f60001963ffffffff6128ec16565b506001016116cf565b5050565b60006001600160a01b03831661189e573392505b815160a35460005b8281101561193d576001600160a01b038616600090815260a060205260408120865182908890859081106118d657fe5b6020908102919091018101516001600160a01b0316825281019190915260400160002060038101549091506001600160801b0316830142111561193457600281015480156119325761192886826125dc565b6000600284015595505b505b506001016118a6565b50821561194e5761194e8584612940565b505092915050565b73b942ca22e0eb0f2524f53f999ae33fd3b2d58e3e81565b60a66020526000908152604090205460ff1681565b6033546001600160a01b031633146119d6576040805162461bcd60e51b815260206004820152601160248201527014195c9b5a5cdcda5bdb8819195b9a5959607a1b604482015290519081900360640190fd5b6001600160a01b038116600081815260a66020526040808220805460ff19166001179055517f24b15cbf29b47201cb0e3a93d054342041ffe497a74d4e1be287bffc6f3de9159190a250565b60a55481565b73a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4881565b732260fac5e5542a773aa44fbcfedf7c193bc2c59981565b6000806000806000806000733d9819210a31b4961b30ef54be2aed79b9c9cd3b6001600160a01b0316637dc0d1d06040518163ffffffff1660e01b815260040160206040518083038186803b158015611ab057600080fd5b505afa158015611ac4573d6000803e3d6000fd5b505050506040513d6020811015611ada57600080fd5b505190506060611af26001600160a01b038a1661231e565b90506001600160a01b038916732260fac5e5542a773aa44fbcfedf7c193bc2c5991415611b35575060408051808201909152600381526242544360e81b60208201525b604051631fc58c3360e31b81526020600482018181528351602484015283516001600160a01b0386169363fe2c61989386939283926044019185019080838360005b83811015611b8f578181015183820152602001611b77565b50505050905090810190601f168015611bbc5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b158015611bd957600080fd5b505afa158015611bed573d6000803e3d6000fd5b505050506040513d6020811015611c0357600080fd5b50519450611c206001600160a01b038a163063ffffffff612a3216565b9350611c2a61316a565b505050506001600160a01b03968716600090815260a06020908152604080832098909916825296875287902087516080810189528154808252600183015498820189905260028301549982018a90526003909201546001600160801b0316606090910181905290989697969295509093509150565b6033546001600160a01b03163314611cf2576040805162461bcd60e51b815260206004820152601160248201527014195c9b5a5cdcda5bdb8819195b9a5959607a1b604482015290519081900360640190fd5b6001600160a01b03166000908152609f60205260409020805460ff19166001179055565b6033546001600160a01b03163314611d69576040805162461bcd60e51b815260206004820152601160248201527014195c9b5a5cdcda5bdb8819195b9a5959607a1b604482015290519081900360640190fd5b6001600160a01b038216611d7c57600080fd5b611da1732260fac5e5542a773aa44fbcfedf7c193bc2c599838363ffffffff612b0516565b73fff9d7b0b6312ead0a1a993bf32f373449006f2f6001600160a01b03166303db86a383600080856000806000806040518963ffffffff1660e01b815260040180896001600160a01b03166001600160a01b03168152602001888152602001878152602001868152602001858152602001848152602001836002811115611e2457fe5b60ff168152602001826001600160a01b03166001600160a01b0316815260200198505050505050505050602060405180830381600087803b158015611e6857600080fd5b505af1158015611e7c573d6000803e3d6000fd5b505050506040513d6020811015610d9557600080fd5b6001600160a01b039182166000908152606b6020908152604080832093909416825291909152205490565b60a35481565b6034546001600160a01b03163314611f16576040805162461bcd60e51b815260206004820152601160248201527014195c9b5a5cdcda5bdb8819195b9a5959607a1b604482015290519081900360640190fd5b603454603380546001600160a01b0319166001600160a01b03909216919091179055565b6001600160a01b0382166000908152609f602052604081205460ff16611f5f57600080fd5b33600090815260a0602090815260408083206001600160a01b03871684529091529020600281015415611f9157600080fd5b60a254421015611fb657611faa84826001015485611159565b9150611fb63383612b12565b8054611fc29084612c0e565b8155611fcf8484336126aa565b5092915050565b6001600160a01b03831661201b5760405162461bcd60e51b81526004018080602001828103825260248152602001806132df6024913960400191505060405180910390fd5b6001600160a01b0382166120605760405162461bcd60e51b81526004018080602001828103825260228152602001806131fb6022913960400191505060405180910390fd5b6001600160a01b038084166000818152606b6020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b303b1590565b6001600160a01b03831661210d5760405162461bcd60e51b81526004018080602001828103825260258152602001806132ba6025913960400191505060405180910390fd5b6001600160a01b0382166121525760405162461bcd60e51b81526004018080602001828103825260238152602001806131b66023913960400191505060405180910390fd5b6121958160405180606001604052806026815260200161321d602691396001600160a01b0386166000908152606a6020526040902054919063ffffffff61222616565b6001600160a01b038085166000908152606a602052604080822093909355908416815220546121ca908263ffffffff6122bd16565b6001600160a01b038084166000818152606a602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b600081848411156122b55760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561227a578181015183820152602001612262565b50505050905090810190601f1680156122a75780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600082820183811015612317576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b60606001600160a01b03821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1415612365575060408051808201909152600381526208aa8960eb1b6020820152611283565b816001600160a01b03166395d89b416040518163ffffffff1660e01b815260040160006040518083038186803b15801561239e57600080fd5b505afa1580156123b2573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156123db57600080fd5b8101908080516040519392919084600160201b8211156123fa57600080fd5b90830190602082018581111561240f57600080fd5b8251600160201b81118282018810171561242857600080fd5b82525081516020918201929091019080838360005b8381101561245557818101518382015260200161243d565b50505050905090810190601f1680156124825780820380516001836020036101000a031916815260200191505b506040525050509050919050565b8061249a57610d95565b6001600160a01b03841615806124cc57506001600160a01b03841673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee145b156125c1576001600160a01b038316331480156124e95750803410155b61252e576040805162461bcd60e51b81526020600482015260116024820152706d73672e76616c7565206973207a65726f60781b604482015290519081900360640190fd5b6001600160a01b0382163014612576576040516001600160a01b0383169082156108fc029083906000818181858888f19350505050158015612574573d6000803e3d6000fd5b505b803411156125bc57336108fc612592348463ffffffff612c1e16565b6040518115909202916000818181858888f193505050501580156125ba573d6000803e3d6000fd5b505b610d95565b610d956001600160a01b03851684848463ffffffff612c6016565b80820182811015610cb357600080fd5b60006001600160a01b03821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee141561261b57506012611283565b816001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561265457600080fd5b505afa158015612668573d6000803e3d6000fd5b505050506040513d602081101561267e57600080fd5b505192915050565b60008115806126a15750508082028282828161269e57fe5b04145b610cb357600080fd5b6001600160a01b03811630146126f857816126d46001600160a01b0385163063ffffffff612a3216565b106126f8576126f36001600160a01b038416828463ffffffff612b0516565b611264565b6001600160a01b038316736b175474e89094c44da98b954eedeac495271d0f1415612794576040805163869ee0f960e01b81526004810184905260016024820152905173b942ca22e0eb0f2524f53f999ae33fd3b2d58e3e9163869ee0f991604480830192600092919082900301818387803b15801561277757600080fd5b505af115801561278b573d6000803e3d6000fd5b505050506128c2565b6001600160a01b03831673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee141561282b5760a4546040805163030f41c760e41b815260006004820181905260248201819052604482018690526001600160a01b039093166064820152905173b942ca22e0eb0f2524f53f999ae33fd3b2d58e3e926330f41c70926084808201939182900301818387803b15801561277757600080fd5b6001600160a01b03831673a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4814156113545760a4546040805163030f41c760e41b815260006004820181905260248201869052604482018190526001600160a01b039093166064820152905173b942ca22e0eb0f2524f53f999ae33fd3b2d58e3e926330f41c70926084808201939182900301818387803b15801561277757600080fd5b6001600160a01b0381163014611264576112646001600160a01b038416828463ffffffff612b0516565b6001600160a01b0383161580159061292157506001600160a01b03831673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14155b15611264576112646001600160a01b038416838363ffffffff612cba16565b6001600160a01b03821661299b576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b606c546129ae908263ffffffff6122bd16565b606c556001600160a01b0382166000908152606a60205260409020546129da908263ffffffff6122bd16565b6001600160a01b0383166000818152606a602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b60006001600160a01b0383161580612a6657506001600160a01b03831673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee145b15612a7c57506001600160a01b03811631610cb3565b826001600160a01b03166370a08231836040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015612ad257600080fd5b505afa158015612ae6573d6000803e3d6000fd5b505050506040513d6020811015612afc57600080fd5b50519050610cb3565b610d958383836000612dcd565b6001600160a01b038216612b575760405162461bcd60e51b81526004018080602001828103825260218152602001806132996021913960400191505060405180910390fd5b612b9a816040518060600160405280602281526020016131d9602291396001600160a01b0385166000908152606a6020526040902054919063ffffffff61222616565b6001600160a01b0383166000908152606a6020526040902055606c54612bc6908263ffffffff612c1e16565b606c556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b80820382811115610cb357600080fd5b600061231783836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612226565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610d95908590612eab565b801580612d40575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b158015612d1257600080fd5b505afa158015612d26573d6000803e3d6000fd5b505050506040513d6020811015612d3c57600080fd5b5051155b612d7b5760405162461bcd60e51b815260040180806020018281038252603681526020018061332d6036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052611264908490612eab565b600082612ddc57506001612ea3565b6001600160a01b0385161580612e0e57506001600160a01b03851673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee145b15612e85578115612e45576040516001600160a01b0385169084156108fc029085906000818181858888f193505050509050612ea3565b6040516001600160a01b0385169084156108fc029085906000818181858888f19350505050158015612e7b573d6000803e3d6000fd5b5060019050612ea3565b612e9f6001600160a01b038616858563ffffffff61306316565b5060015b949350505050565b612ebd826001600160a01b03166130b5565b612f0e576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b60208310612f4c5780518252601f199092019160209182019101612f2d565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114612fae576040519150601f19603f3d011682016040523d82523d6000602084013e612fb3565b606091505b50915091508161300a576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b805115610d955780806020019051602081101561302657600080fd5b5051610d955760405162461bcd60e51b815260040180806020018281038252602a815260200180613303602a913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052611264908490612eab565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708115801590612ea35750141592915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061312d57805160ff191683800117855561315a565b8280016001018555821561315a579182015b8281111561315a57825182559160200191906001019061313f565b5061316692915061319b565b5090565b604051806080016040528060008152602001600081526020016000815260200160006001600160801b031681525090565b610c9f91905b8082111561316657600081556001016131a156fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365436f6e747261637420696e7374616e63652068617320616c7265616479206265656e20696e697469616c697a656445524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f20616464726573735361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa265627a7a7231582046c29e4c5592f1255d425f4fcc6d5d76dcd4264cf1ccd25f1276c9f63e9acbe364736f6c63430005110032

Deployed Bytecode

0x6080604052600436106102465760003560e01c806395d89b4111610139578063b9b8cc96116100b6578063c690908a1161007a578063c690908a14610b01578063d24e567a14610b34578063dd62ed3e14610b6d578063eb3112b514610ba8578063ebbc496514610bbd578063f3fef3a314610bd257610246565b8063b9b8cc9614610a18578063ba1de6c714610a4b578063bb09d9b714610a60578063bdd5915f14610a75578063c686554e14610a8a57610246565b8063a9059cbb116100fd578063a9059cbb1461082b578063ac43070b14610864578063b0cf77d314610912578063b2ae48f0146109d0578063b3537893146109e557610246565b806395d89b41146107805780639b9e98be14610795578063a457c2d7146107aa578063a6f9dae1146107e3578063a734f06e1461081657610246565b806346144c8f116101c757806370a082311161018b57806370a082311461064b578063734622811461067e5780637b24715d146107415780638129fc1c146107565780638da5cb5b1461076b57610246565b806346144c8f1461058357806347e7ef24146105985780634ce56141146105c45780635f82c67e146106035780636ff1c9bc1461061857610246565b806323b872dd1161020e57806323b872dd146104965780632a4c0a1a146104d9578063313ce5671461050a57806334fe2c7514610535578063395093511461054a57610246565b806306fdde0314610248578063095ea7b3146102d2578063152165391461031f5780631624f6c61461034657806318160ddd14610481575b005b34801561025457600080fd5b5061025d610c0b565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561029757818101518382015260200161027f565b50505050905090810190601f1680156102c45780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156102de57600080fd5b5061030b600480360360408110156102f557600080fd5b506001600160a01b038135169060200135610ca2565b604080519115158252519081900360200190f35b34801561032b57600080fd5b50610334610cb9565b60408051918252519081900360200190f35b34801561035257600080fd5b506102466004803603606081101561036957600080fd5b810190602081018135600160201b81111561038357600080fd5b82018360208201111561039557600080fd5b803590602001918460018302840111600160201b831117156103b657600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b81111561040857600080fd5b82018360208201111561041a57600080fd5b803590602001918460018302840111600160201b8311171561043b57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295505050903560ff169150610cbf9050565b34801561048d57600080fd5b50610334610d9b565b3480156104a257600080fd5b5061030b600480360360608110156104b957600080fd5b506001600160a01b03813581169160208101359091169060400135610da1565b3480156104e557600080fd5b506104ee610e10565b604080516001600160a01b039092168252519081900360200190f35b34801561051657600080fd5b5061051f610e28565b6040805160ff9092168252519081900360200190f35b34801561054157600080fd5b50610334610e31565b34801561055657600080fd5b5061030b6004803603604081101561056d57600080fd5b506001600160a01b038135169060200135610e40565b34801561058f57600080fd5b506104ee610e7c565b610334600480360360408110156105ae57600080fd5b506001600160a01b038135169060200135610e8b565b3480156105d057600080fd5b50610334600480360360608110156105e757600080fd5b506001600160a01b038135169060208101359060400135611159565b34801561060f57600080fd5b506104ee6111ac565b34801561062457600080fd5b506102466004803603602081101561063b57600080fd5b50356001600160a01b03166111c4565b34801561065757600080fd5b506103346004803603602081101561066e57600080fd5b50356001600160a01b0316611269565b34801561068a57600080fd5b50610334600480360360608110156106a157600080fd5b6001600160a01b038235169190810190604081016020820135600160201b8111156106cb57600080fd5b8201836020820111156106dd57600080fd5b803590602001918460018302840111600160201b831117156106fe57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295505091359250611288915050565b34801561074d57600080fd5b50610334611362565b34801561076257600080fd5b50610246611368565b34801561077757600080fd5b506104ee611502565b34801561078c57600080fd5b5061025d611511565b3480156107a157600080fd5b506104ee611572565b3480156107b657600080fd5b5061030b600480360360408110156107cd57600080fd5b506001600160a01b03813516906020013561158a565b3480156107ef57600080fd5b506102466004803603602081101561080657600080fd5b50356001600160a01b03166115df565b34801561082257600080fd5b506104ee611654565b34801561083757600080fd5b5061030b6004803603604081101561084e57600080fd5b506001600160a01b03813516906020013561166c565b34801561087057600080fd5b506102466004803603602081101561088757600080fd5b810190602081018135600160201b8111156108a157600080fd5b8201836020820111156108b357600080fd5b803590602001918460208302840111600160201b831117156108d457600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611679945050505050565b34801561091e57600080fd5b506103346004803603604081101561093557600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561095f57600080fd5b82018360208201111561097157600080fd5b803590602001918460208302840111600160201b8311171561099257600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955061188a945050505050565b3480156109dc57600080fd5b506104ee611956565b3480156109f157600080fd5b5061030b60048036036020811015610a0857600080fd5b50356001600160a01b031661196e565b348015610a2457600080fd5b5061024660048036036020811015610a3b57600080fd5b50356001600160a01b0316611983565b348015610a5757600080fd5b50610334611a22565b348015610a6c57600080fd5b506104ee611a28565b348015610a8157600080fd5b506104ee611a40565b348015610a9657600080fd5b50610ac560048036036040811015610aad57600080fd5b506001600160a01b0381358116916020013516611a58565b60408051968752602087019590955285850193909352606085019190915260808401526001600160801b031660a0830152519081900360c00190f35b348015610b0d57600080fd5b5061024660048036036020811015610b2457600080fd5b50356001600160a01b0316611c9f565b348015610b4057600080fd5b5061024660048036036040811015610b5757600080fd5b506001600160a01b038135169060200135611d16565b348015610b7957600080fd5b5061033460048036036040811015610b9057600080fd5b506001600160a01b0381358116916020013516611e92565b348015610bb457600080fd5b50610334611ebd565b348015610bc957600080fd5b50610246611ec3565b348015610bde57600080fd5b5061033460048036036040811015610bf557600080fd5b506001600160a01b038135169060200135611f3a565b60358054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610c975780601f10610c6c57610100808354040283529160200191610c97565b820191906000526020600020905b815481529060010190602001808311610c7a57829003601f168201915b505050505090505b90565b6000610caf338484611fd6565b5060015b92915050565b60a15481565b600054610100900460ff1680610cd85750610cd86120c2565b80610ce6575060005460ff16155b610d215760405162461bcd60e51b815260040180806020018281038252602e81526020018061326b602e913960400191505060405180910390fd5b600054610100900460ff16158015610d4c576000805460ff1961ff0019909116610100171660011790555b8351610d5f9060359060208701906130ec565b508251610d739060369060208601906130ec565b506037805460ff191660ff84161790558015610d95576000805461ff00191690555b50505050565b606c5490565b6000610dae8484846120c8565b610e068433610e0185604051806060016040528060288152602001613243602891396001600160a01b038a166000908152606b60209081526040808320338452909152902054919063ffffffff61222616565b611fd6565b5060019392505050565b736b175474e89094c44da98b954eedeac495271d0f81565b60375460ff1690565b6a108b2a2c2802909400000081565b336000818152606b602090815260408083206001600160a01b03871684529091528120549091610caf918590610e01908663ffffffff6122bd16565b6033546001600160a01b031690565b600060a1544210610e9b57600080fd5b6001600160a01b0383166000908152609f602052604090205460ff16610ec057600080fd5b6000733d9819210a31b4961b30ef54be2aed79b9c9cd3b6001600160a01b0316637dc0d1d06040518163ffffffff1660e01b815260040160206040518083038186803b158015610f0f57600080fd5b505afa158015610f23573d6000803e3d6000fd5b505050506040513d6020811015610f3957600080fd5b505190506060610f516001600160a01b03861661231e565b90506001600160a01b038516732260fac5e5542a773aa44fbcfedf7c193bc2c5991415610f94575060408051808201909152600381526242544360e81b60208201525b6000826001600160a01b031663fe2c6198836040518263ffffffff1660e01b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015610ff2578181015183820152602001610fda565b50505050905090810190601f16801561101f5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561103c57600080fd5b505afa158015611050573d6000803e3d6000fd5b505050506040513d602081101561106657600080fd5b505190508061107457600080fd5b61108f6001600160a01b03871633308863ffffffff61249016565b600061109c878388611159565b90506110aa60a554826125dc565b60a58190556a108b2a2c2802909400000010156110c657600080fd5b33600090815260a0602090815260408083206001600160a01b038b1684529091528120805460018201549192909189830190611106908402878c026125dc565b8161110d57fe5b838b0185550460018401819055600284015490915061112c90856125dc565b6002840155505060030180546001600160801b031916426001600160801b03161790559695505050505050565b60008061116e856001600160a01b03166125ec565b9050620f424061117e8585612686565b8161118557fe5b04915060128110156111a4576111a18282601203600a0a612686565b91505b509392505050565b733d9819210a31b4961b30ef54be2aed79b9c9cd3b81565b6001600160a01b0381166000908152609f602052604090205460ff16801561120457506001600160a01b038116600090815260a6602052604090205460ff165b61120d57600080fd5b33600081815260a0602090815260408083206001600160a01b0386168452909152812080548282556001820183905560028201929092556003810180546001600160801b03191690559161126490849083906126aa565b505050565b6001600160a01b0381166000908152606a60205260409020545b919050565b6033546000906001600160a01b031633146112de576040805162461bcd60e51b815260206004820152601160248201527014195c9b5a5cdcda5bdb8819195b9a5959607a1b604482015290519081900360640190fd5b6001600160a01b03841673fff9d7b0b6312ead0a1a993bf32f373449006f2f148061132557506001600160a01b03841673b942ca22e0eb0f2524f53f999ae33fd3b2d58e3e145b61132e57600080fd5b6020600084516020860185886113885a03f1600051915080156001811461135457611359565b600080fd5b50509392505050565b60a25481565b600054610100900460ff168061138157506113816120c2565b8061138f575060005460ff16155b6113ca5760405162461bcd60e51b815260040180806020018281038252602e81526020018061326b602e913960400191505060405180910390fd5b600054610100900460ff161580156113f5576000805460ff1961ff0019909116610100171660011790555b603380546001600160a01b03191673dae0aca4b9b38199408ffab32562bf7b3b0495fe179055604080518082018252600a81526958496e4465666945636f60b01b602080830191909152825180840190935260048352632c24a22360e11b90830152611462916012610cbf565b635fe7a45060a15563605e4b5060a2556203f48060a355611496736b175474e89094c44da98b954eedeac495271d0f611c9f565b6114b373eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee611c9f565b6114d0732260fac5e5542a773aa44fbcfedf7c193bc2c599611c9f565b6114ed73a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48611c9f565b80156114ff576000805461ff00191690555b50565b6033546001600160a01b031681565b60368054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610c975780601f10610c6c57610100808354040283529160200191610c97565b73fff9d7b0b6312ead0a1a993bf32f373449006f2f81565b6000610caf3384610e018560405180606001604052806025815260200161336360259139336000908152606b602090815260408083206001600160a01b038d168452909152902054919063ffffffff61222616565b6033546001600160a01b03163314611632576040805162461bcd60e51b815260206004820152601160248201527014195c9b5a5cdcda5bdb8819195b9a5959607a1b604482015290519081900360640190fd5b603480546001600160a01b0319166001600160a01b0392909216919091179055565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee81565b6000610caf3384846120c8565b6033546001600160a01b031633146116cc576040805162461bcd60e51b815260206004820152601160248201527014195c9b5a5cdcda5bdb8819195b9a5959607a1b604482015290519081900360640190fd5b60005b81518110156118865760008282815181106116e657fe5b60209081029190910181015160408051636eb1769f60e11b815230600482015273b942ca22e0eb0f2524f53f999ae33fd3b2d58e3e60248201529051919350600019926001600160a01b0385169263dd62ed3e926044808201939291829003018186803b15801561175657600080fd5b505afa15801561176a573d6000803e3d6000fd5b505050506040513d602081101561178057600080fd5b5051146117b7576117b76001600160a01b03821673b942ca22e0eb0f2524f53f999ae33fd3b2d58e3e60001963ffffffff6128ec16565b60408051636eb1769f60e11b815230600482015273fff9d7b0b6312ead0a1a993bf32f373449006f2f60248201529051600019916001600160a01b0384169163dd62ed3e91604480820192602092909190829003018186803b15801561181c57600080fd5b505afa158015611830573d6000803e3d6000fd5b505050506040513d602081101561184657600080fd5b50511461187d5761187d6001600160a01b03821673fff9d7b0b6312ead0a1a993bf32f373449006f2f60001963ffffffff6128ec16565b506001016116cf565b5050565b60006001600160a01b03831661189e573392505b815160a35460005b8281101561193d576001600160a01b038616600090815260a060205260408120865182908890859081106118d657fe5b6020908102919091018101516001600160a01b0316825281019190915260400160002060038101549091506001600160801b0316830142111561193457600281015480156119325761192886826125dc565b6000600284015595505b505b506001016118a6565b50821561194e5761194e8584612940565b505092915050565b73b942ca22e0eb0f2524f53f999ae33fd3b2d58e3e81565b60a66020526000908152604090205460ff1681565b6033546001600160a01b031633146119d6576040805162461bcd60e51b815260206004820152601160248201527014195c9b5a5cdcda5bdb8819195b9a5959607a1b604482015290519081900360640190fd5b6001600160a01b038116600081815260a66020526040808220805460ff19166001179055517f24b15cbf29b47201cb0e3a93d054342041ffe497a74d4e1be287bffc6f3de9159190a250565b60a55481565b73a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4881565b732260fac5e5542a773aa44fbcfedf7c193bc2c59981565b6000806000806000806000733d9819210a31b4961b30ef54be2aed79b9c9cd3b6001600160a01b0316637dc0d1d06040518163ffffffff1660e01b815260040160206040518083038186803b158015611ab057600080fd5b505afa158015611ac4573d6000803e3d6000fd5b505050506040513d6020811015611ada57600080fd5b505190506060611af26001600160a01b038a1661231e565b90506001600160a01b038916732260fac5e5542a773aa44fbcfedf7c193bc2c5991415611b35575060408051808201909152600381526242544360e81b60208201525b604051631fc58c3360e31b81526020600482018181528351602484015283516001600160a01b0386169363fe2c61989386939283926044019185019080838360005b83811015611b8f578181015183820152602001611b77565b50505050905090810190601f168015611bbc5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b158015611bd957600080fd5b505afa158015611bed573d6000803e3d6000fd5b505050506040513d6020811015611c0357600080fd5b50519450611c206001600160a01b038a163063ffffffff612a3216565b9350611c2a61316a565b505050506001600160a01b03968716600090815260a06020908152604080832098909916825296875287902087516080810189528154808252600183015498820189905260028301549982018a90526003909201546001600160801b0316606090910181905290989697969295509093509150565b6033546001600160a01b03163314611cf2576040805162461bcd60e51b815260206004820152601160248201527014195c9b5a5cdcda5bdb8819195b9a5959607a1b604482015290519081900360640190fd5b6001600160a01b03166000908152609f60205260409020805460ff19166001179055565b6033546001600160a01b03163314611d69576040805162461bcd60e51b815260206004820152601160248201527014195c9b5a5cdcda5bdb8819195b9a5959607a1b604482015290519081900360640190fd5b6001600160a01b038216611d7c57600080fd5b611da1732260fac5e5542a773aa44fbcfedf7c193bc2c599838363ffffffff612b0516565b73fff9d7b0b6312ead0a1a993bf32f373449006f2f6001600160a01b03166303db86a383600080856000806000806040518963ffffffff1660e01b815260040180896001600160a01b03166001600160a01b03168152602001888152602001878152602001868152602001858152602001848152602001836002811115611e2457fe5b60ff168152602001826001600160a01b03166001600160a01b0316815260200198505050505050505050602060405180830381600087803b158015611e6857600080fd5b505af1158015611e7c573d6000803e3d6000fd5b505050506040513d6020811015610d9557600080fd5b6001600160a01b039182166000908152606b6020908152604080832093909416825291909152205490565b60a35481565b6034546001600160a01b03163314611f16576040805162461bcd60e51b815260206004820152601160248201527014195c9b5a5cdcda5bdb8819195b9a5959607a1b604482015290519081900360640190fd5b603454603380546001600160a01b0319166001600160a01b03909216919091179055565b6001600160a01b0382166000908152609f602052604081205460ff16611f5f57600080fd5b33600090815260a0602090815260408083206001600160a01b03871684529091529020600281015415611f9157600080fd5b60a254421015611fb657611faa84826001015485611159565b9150611fb63383612b12565b8054611fc29084612c0e565b8155611fcf8484336126aa565b5092915050565b6001600160a01b03831661201b5760405162461bcd60e51b81526004018080602001828103825260248152602001806132df6024913960400191505060405180910390fd5b6001600160a01b0382166120605760405162461bcd60e51b81526004018080602001828103825260228152602001806131fb6022913960400191505060405180910390fd5b6001600160a01b038084166000818152606b6020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b303b1590565b6001600160a01b03831661210d5760405162461bcd60e51b81526004018080602001828103825260258152602001806132ba6025913960400191505060405180910390fd5b6001600160a01b0382166121525760405162461bcd60e51b81526004018080602001828103825260238152602001806131b66023913960400191505060405180910390fd5b6121958160405180606001604052806026815260200161321d602691396001600160a01b0386166000908152606a6020526040902054919063ffffffff61222616565b6001600160a01b038085166000908152606a602052604080822093909355908416815220546121ca908263ffffffff6122bd16565b6001600160a01b038084166000818152606a602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b600081848411156122b55760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561227a578181015183820152602001612262565b50505050905090810190601f1680156122a75780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600082820183811015612317576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b60606001600160a01b03821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1415612365575060408051808201909152600381526208aa8960eb1b6020820152611283565b816001600160a01b03166395d89b416040518163ffffffff1660e01b815260040160006040518083038186803b15801561239e57600080fd5b505afa1580156123b2573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156123db57600080fd5b8101908080516040519392919084600160201b8211156123fa57600080fd5b90830190602082018581111561240f57600080fd5b8251600160201b81118282018810171561242857600080fd5b82525081516020918201929091019080838360005b8381101561245557818101518382015260200161243d565b50505050905090810190601f1680156124825780820380516001836020036101000a031916815260200191505b506040525050509050919050565b8061249a57610d95565b6001600160a01b03841615806124cc57506001600160a01b03841673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee145b156125c1576001600160a01b038316331480156124e95750803410155b61252e576040805162461bcd60e51b81526020600482015260116024820152706d73672e76616c7565206973207a65726f60781b604482015290519081900360640190fd5b6001600160a01b0382163014612576576040516001600160a01b0383169082156108fc029083906000818181858888f19350505050158015612574573d6000803e3d6000fd5b505b803411156125bc57336108fc612592348463ffffffff612c1e16565b6040518115909202916000818181858888f193505050501580156125ba573d6000803e3d6000fd5b505b610d95565b610d956001600160a01b03851684848463ffffffff612c6016565b80820182811015610cb357600080fd5b60006001600160a01b03821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee141561261b57506012611283565b816001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561265457600080fd5b505afa158015612668573d6000803e3d6000fd5b505050506040513d602081101561267e57600080fd5b505192915050565b60008115806126a15750508082028282828161269e57fe5b04145b610cb357600080fd5b6001600160a01b03811630146126f857816126d46001600160a01b0385163063ffffffff612a3216565b106126f8576126f36001600160a01b038416828463ffffffff612b0516565b611264565b6001600160a01b038316736b175474e89094c44da98b954eedeac495271d0f1415612794576040805163869ee0f960e01b81526004810184905260016024820152905173b942ca22e0eb0f2524f53f999ae33fd3b2d58e3e9163869ee0f991604480830192600092919082900301818387803b15801561277757600080fd5b505af115801561278b573d6000803e3d6000fd5b505050506128c2565b6001600160a01b03831673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee141561282b5760a4546040805163030f41c760e41b815260006004820181905260248201819052604482018690526001600160a01b039093166064820152905173b942ca22e0eb0f2524f53f999ae33fd3b2d58e3e926330f41c70926084808201939182900301818387803b15801561277757600080fd5b6001600160a01b03831673a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4814156113545760a4546040805163030f41c760e41b815260006004820181905260248201869052604482018190526001600160a01b039093166064820152905173b942ca22e0eb0f2524f53f999ae33fd3b2d58e3e926330f41c70926084808201939182900301818387803b15801561277757600080fd5b6001600160a01b0381163014611264576112646001600160a01b038416828463ffffffff612b0516565b6001600160a01b0383161580159061292157506001600160a01b03831673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14155b15611264576112646001600160a01b038416838363ffffffff612cba16565b6001600160a01b03821661299b576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b606c546129ae908263ffffffff6122bd16565b606c556001600160a01b0382166000908152606a60205260409020546129da908263ffffffff6122bd16565b6001600160a01b0383166000818152606a602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b60006001600160a01b0383161580612a6657506001600160a01b03831673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee145b15612a7c57506001600160a01b03811631610cb3565b826001600160a01b03166370a08231836040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015612ad257600080fd5b505afa158015612ae6573d6000803e3d6000fd5b505050506040513d6020811015612afc57600080fd5b50519050610cb3565b610d958383836000612dcd565b6001600160a01b038216612b575760405162461bcd60e51b81526004018080602001828103825260218152602001806132996021913960400191505060405180910390fd5b612b9a816040518060600160405280602281526020016131d9602291396001600160a01b0385166000908152606a6020526040902054919063ffffffff61222616565b6001600160a01b0383166000908152606a6020526040902055606c54612bc6908263ffffffff612c1e16565b606c556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b80820382811115610cb357600080fd5b600061231783836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612226565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610d95908590612eab565b801580612d40575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b158015612d1257600080fd5b505afa158015612d26573d6000803e3d6000fd5b505050506040513d6020811015612d3c57600080fd5b5051155b612d7b5760405162461bcd60e51b815260040180806020018281038252603681526020018061332d6036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052611264908490612eab565b600082612ddc57506001612ea3565b6001600160a01b0385161580612e0e57506001600160a01b03851673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee145b15612e85578115612e45576040516001600160a01b0385169084156108fc029085906000818181858888f193505050509050612ea3565b6040516001600160a01b0385169084156108fc029085906000818181858888f19350505050158015612e7b573d6000803e3d6000fd5b5060019050612ea3565b612e9f6001600160a01b038616858563ffffffff61306316565b5060015b949350505050565b612ebd826001600160a01b03166130b5565b612f0e576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b60208310612f4c5780518252601f199092019160209182019101612f2d565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114612fae576040519150601f19603f3d011682016040523d82523d6000602084013e612fb3565b606091505b50915091508161300a576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b805115610d955780806020019051602081101561302657600080fd5b5051610d955760405162461bcd60e51b815260040180806020018281038252602a815260200180613303602a913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052611264908490612eab565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708115801590612ea35750141592915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061312d57805160ff191683800117855561315a565b8280016001018555821561315a579182015b8281111561315a57825182559160200191906001019061313f565b5061316692915061319b565b5090565b604051806080016040528060008152602001600081526020016000815260200160006001600160801b031681525090565b610c9f91905b8082111561316657600081556001016131a156fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365436f6e747261637420696e7374616e63652068617320616c7265616479206265656e20696e697469616c697a656445524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f20616464726573735361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa265627a7a7231582046c29e4c5592f1255d425f4fcc6d5d76dcd4264cf1ccd25f1276c9f63e9acbe364736f6c63430005110032

Deployed Bytecode Sourcemap

33518:10311:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5743:83;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5743:83:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;5743:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15136:150;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15136:150:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;15136:150:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;35861:30;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35861:30:0;;;:::i;:::-;;;;;;;;;;;;;;;;5487:186;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5487:186:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;5487:186:0;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;5487:186:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;5487:186:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;5487:186:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;5487:186:0;;;;;;;;-1:-1:-1;5487:186:0;;-1:-1:-1;;;;;5:28;;2:2;;;46:1;43;36:12;2:2;5487:186:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;5487:186:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;5487:186:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;5487:186:0;;-1:-1:-1;;;5487:186:0;;;;;-1:-1:-1;5487:186:0;;-1:-1:-1;5487:186:0:i;14159:91::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14159:91:0;;;:::i;15758:300::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15758:300:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;15758:300:0;;;;;;;;;;;;;;;;;:::i;34256:80::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34256:80:0;;;:::i;:::-;;;;-1:-1:-1;;;;;34256:80:0;;;;;;;;;;;;;;6595:83;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6595:83:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;36018:56;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36018:56:0;;;:::i;16467:206::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16467:206:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;16467:206:0;;;;;;;;:::i;43700:88::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43700:88:0;;;:::i;37754:1173::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;37754:1173:0;;;;;;;;:::i;37415:331::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37415:331:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;37415:331:0;;;;;;;;;;;;;:::i;34552:80::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34552:80:0;;;:::i;39765:475::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39765:475:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;39765:475:0;-1:-1:-1;;;;;39765:475:0;;:::i;14313:110::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14313:110:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;14313:110:0;-1:-1:-1;;;;;14313:110:0;;:::i;41540:569::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41540:569:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;41540:569:0;;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;41540:569:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;41540:569:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;41540:569:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;41540:569:0;;-1:-1:-1;;41540:569:0;;;-1:-1:-1;41540:569:0;;-1:-1:-1;;41540:569:0:i;35898:32::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35898:32:0;;;:::i;34886:452::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34886:452:0;;;:::i;6823:28::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6823:28:0;;;:::i;5945:87::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5945:87:0;;;:::i;34787:79::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34787:79:0;;;:::i;17176:257::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17176:257:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;17176:257:0;;;;;;;;:::i;7082:111::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7082:111:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;7082:111:0;-1:-1:-1;;;;;7082:111:0;;:::i;34169:80::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34169:80:0;;;:::i;14636:156::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14636:156:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;14636:156:0;;;;;;;;:::i;40963:569::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40963:569:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;40963:569:0;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;40963:569:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;40963:569:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;40963:569:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;40963:569:0;;-1:-1:-1;40963:569:0;;-1:-1:-1;;;;;40963:569:0:i;38935:822::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38935:822:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;38935:822:0;;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;38935:822:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;38935:822:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;38935:822:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;38935:822:0;;-1:-1:-1;38935:822:0;;-1:-1:-1;;;;;38935:822:0:i;34652:117::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34652:117:0;;;:::i;36176:59::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36176:59:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;36176:59:0;-1:-1:-1;;;;;36176:59:0;;:::i;37227:180::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37227:180:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37227:180:0;-1:-1:-1;;;;;37227:180:0;;:::i;36091:33::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36091:33:0;;;:::i;34354:81::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34354:81:0;;;:::i;34453:::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34453:81:0;;;:::i;36310:727::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36310:727:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;36310:727:0;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;36310:727:0;;;;;;;;;;;;;;37045:139;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37045:139:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37045:139:0;-1:-1:-1;;;;;37045:139:0;;:::i;42117:583::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42117:583:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;42117:583:0;;;;;;;;:::i;14855:134::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14855:134:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;14855:134:0;;;;;;;;;;:::i;35937:39::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35937:39:0;;;:::i;7201:146::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7201:146:0;;;:::i;40248:707::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40248:707:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;40248:707:0;;;;;;;;:::i;5743:83::-;5813:5;5806:12;;;;;;;;-1:-1:-1;;5806:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5780:13;;5806:12;;5813:5;;5806:12;;5813:5;5806:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5743:83;;:::o;15136:150::-;15202:4;15219:37;15228:10;15240:7;15249:6;15219:8;:37::i;:::-;-1:-1:-1;15274:4:0;15136:150;;;;;:::o;35861:30::-;;;;:::o;5487:186::-;1118:12;;;;;;;;:31;;;1134:15;:13;:15::i;:::-;1118:47;;;-1:-1:-1;1154:11:0;;;;1153:12;1118:47;1110:106;;;;-1:-1:-1;;;1110:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1225:19;1248:12;;;;;;1247:13;1267:83;;;;1296:12;:19;;-1:-1:-1;;;;1296:19:0;;;;;1324:18;1311:4;1324:18;;;1267:83;5595:12;;;;:5;;:12;;;;;:::i;:::-;-1:-1:-1;5618:16:0;;;;:7;;:16;;;;;:::i;:::-;-1:-1:-1;5645:9:0;:20;;-1:-1:-1;;5645:20:0;;;;;;;1368:57;;;;1412:5;1397:20;;-1:-1:-1;;1397:20:0;;;1368:57;5487:186;;;;:::o;14159:91::-;14230:12;;14159:91;:::o;15758:300::-;15847:4;15864:36;15874:6;15882:9;15893:6;15864:9;:36::i;:::-;15911:117;15920:6;15928:10;15940:87;15976:6;15940:87;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;15940:19:0;;;;;;:11;:19;;;;;;;;15960:10;15940:31;;;;;;;;;:87;;:35;:87;:::i;:::-;15911:8;:117::i;:::-;-1:-1:-1;16046:4:0;15758:300;;;;;:::o;34256:80::-;34294:42;34256:80;:::o;6595:83::-;6661:9;;;;6595:83;:::o;36018:56::-;36059:15;36018:56;:::o;16467:206::-;16573:10;16547:4;16594:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;16594:32:0;;;;;;;;;;16547:4;;16564:79;;16585:7;;16594:48;;16631:10;16594:48;:36;:48;:::i;43700:88::-;43775:5;;-1:-1:-1;;;;;43775:5:0;43700:88;:::o;37754:1173::-;37825:7;37859:15;;37853:3;:21;37845:30;;;;;;-1:-1:-1;;;;;37894:22:0;;;;;;:6;:22;;;;;;;;37886:31;;;;;;37928:23;34590:42;-1:-1:-1;;;;;37954:32:0;;:34;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37954:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37954:34:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37954:34:0;;-1:-1:-1;37999:20:0;38022:23;-1:-1:-1;;;;;38022:21:0;;;:23::i;:::-;37999:46;-1:-1:-1;;;;;;38060:30:0;;34492:42;38060:30;38056:50;;;-1:-1:-1;38092:14:0;;;;;;;;;;;;-1:-1:-1;;;38092:14:0;;;;38056:50;38117:14;38134:10;-1:-1:-1;;;;;38134:16:0;;38151:6;38134:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;38134:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38134:24:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38134:24:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38134:24:0;;-1:-1:-1;38177:10:0;38169:19;;;;;;38201:62;-1:-1:-1;;;;;38201:27:0;;38229:10;38249:4;38256:6;38201:62;:27;:62;:::i;:::-;38276:20;38299:44;38321:5;38328:6;38336;38299:21;:44::i;:::-;38276:67;;38375:37;38379:18;;38399:12;38375:3;:37::i;:::-;38354:18;:58;;;36059:15;-1:-1:-1;38431:36:0;38423:45;;;;;;38517:10;38481:20;38504:24;;;:12;:24;;;;;;;;-1:-1:-1;;;;;38504:40:0;;;;;;;;;38577:11;;38639:13;;;;38504:40;;38577:11;;38674:20;;;;38621:49;;38625:27;;38654:15;;;38621:3;:49::i;:::-;:74;;;;;38720:20;;;38706:34;;38621:74;38751:13;;;:27;;;38813:17;;;;38621:74;;-1:-1:-1;38809:36:0;;38832:12;38809:3;:36::i;:::-;38789:17;;;:56;-1:-1:-1;;38856:16:0;;:31;;-1:-1:-1;;;;;;38856:31:0;38883:3;-1:-1:-1;;;;;38856:31:0;;;;38907:12;37754:1173;-1:-1:-1;;;;;;37754:1173:0:o;37415:331::-;37512:11;37586:16;37605:25;:5;-1:-1:-1;;;;;37605:23:0;;:25::i;:::-;37586:44;;37668:3;37647:18;37651:5;37658:6;37647:3;:18::i;:::-;:24;;;;;;37641:30;;37697:2;37686:8;:13;37682:56;;;37707:31;37711:3;37728:8;37723:2;:13;37716:2;:21;37707:3;:31::i;:::-;37701:37;;37682:56;37415:331;;;;;;:::o;34552:80::-;34590:42;34552:80;:::o;39765:475::-;-1:-1:-1;;;;;39833:13:0;;;;;;:6;:13;;;;;;;;:51;;;;-1:-1:-1;;;;;;39850:34:0;;;;;;:27;:34;;;;;;;;39833:51;39825:60;;;;;;39951:10;39915:20;39938:24;;;:12;:24;;;;;;;;-1:-1:-1;;;;;39938:31:0;;;;;;;;;39999:11;;40065:15;;;-1:-1:-1;40091:13:0;;:17;;;40119;;;:21;;;;40151:16;;;:20;;-1:-1:-1;;;;;;40151:20:0;;;39938:31;40184:48;;39963:5;;39999:11;;40184:13;:48::i;:::-;39765:475;;;:::o;14313:110::-;-1:-1:-1;;;;;14397:18:0;;14370:7;14397:18;;;:9;:18;;;;;;14313:110;;;;:::o;41540:569::-;7027:5;;41668:16;;-1:-1:-1;;;;;7027:5:0;7013:10;:19;7005:49;;;;;-1:-1:-1;;;7005:49:0;;;;;;;;;;;;-1:-1:-1;;;7005:49:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;41761:20:0;;34824:42;41761:20;;:62;;-1:-1:-1;;;;;;41785:38:0;;34726:42;41785:38;41761:62;41753:71;;;;;;41949:2;41946:1;41939:4;41933:11;41926:4;41920;41916:15;41905:9;41897:6;41890:4;41885:3;41881:14;41876:76;41984:1;41978:8;41966:20;;42014:9;42007:17;42043:1;42038:53;;;;42000:91;;42038:53;42074:1;42071;42064:12;42000:91;;41844:258;41540:569;;;;;:::o;35898:32::-;;;;:::o;34886:452::-;1118:12;;;;;;;;:31;;;1134:15;:13;:15::i;:::-;1118:47;;;-1:-1:-1;1154:11:0;;;;1153:12;1118:47;1110:106;;;;-1:-1:-1;;;1110:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1225:19;1248:12;;;;;;1247:13;1267:83;;;;1296:12;:19;;-1:-1:-1;;;;1296:19:0;;;;;1324:18;1311:4;1324:18;;;1267:83;34938:5;:50;;-1:-1:-1;;;;;;34938:50:0;34946:42;34938:50;;;34999;;;;;;;;;;;-1:-1:-1;;;34999:50:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;34999:50:0;;;;;;35046:2;34999:24;:50::i;:::-;35078:10;35060:15;:28;35119:25;35099:17;:45;35182:6;35155:24;:33;35199:24;34294:42;35199:11;:24::i;:::-;35234;34207:42;35234:11;:24::i;:::-;35269:25;34492:42;35269:11;:25::i;:::-;35305;34393:42;35305:11;:25::i;:::-;1372:14;1368:57;;;1412:5;1397:20;;-1:-1:-1;;1397:20:0;;;1368:57;34886:452;:::o;6823:28::-;;;-1:-1:-1;;;;;6823:28:0;;:::o;5945:87::-;6017:7;6010:14;;;;;;;;-1:-1:-1;;6010:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5984:13;;6010:14;;6017:7;;6010:14;;6017:7;6010:14;;;;;;;;;;;;;;;;;;;;;;;;34787:79;34824:42;34787:79;:::o;17176:257::-;17261:4;17278:125;17287:10;17299:7;17308:94;17345:15;17308:94;;;;;;;;;;;;;;;;;17320:10;17308:23;;;;:11;:23;;;;;;;;-1:-1:-1;;;;;17308:32:0;;;;;;;;;;;:94;;:36;:94;:::i;7082:111::-;7027:5;;-1:-1:-1;;;;;7027:5:0;7013:10;:19;7005:49;;;;;-1:-1:-1;;;7005:49:0;;;;;;;;;;;;-1:-1:-1;;;7005:49:0;;;;;;;;;;;;;;;7157:17;:28;;-1:-1:-1;;;;;;7157:28:0;-1:-1:-1;;;;;7157:28:0;;;;;;;;;;7082:111::o;34169:80::-;34207:42;34169:80;:::o;14636:156::-;14705:4;14722:40;14732:10;14744:9;14755:6;14722:9;:40::i;40963:569::-;7027:5;;-1:-1:-1;;;;;7027:5:0;7013:10;:19;7005:49;;;;;-1:-1:-1;;;7005:49:0;;;;;;;;;;;;-1:-1:-1;;;7005:49:0;;;;;;;;;;;;;;;41047:9;41043:482;41066:10;:17;41062:1;:21;41043:482;;;41105:12;41127:10;41138:1;41127:13;;;;;;;;;;;;;;;;;;;41160:60;;;-1:-1:-1;;;41160:60:0;;41184:4;41160:60;;;;34726:42;41160:60;;;;;;41127:13;;-1:-1:-1;;;41232:2:0;-1:-1:-1;;;;;41160:15:0;;;;;:60;;;;;41127:13;41160:60;;;;;;:15;:60;;;5:2:-1;;;;30:1;27;20:12;5:2;41160:60:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41160:60:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41160:60:0;:75;41156:181;;41256:65;-1:-1:-1;;;;;41256:22:0;;34726:42;-1:-1:-1;;41256:65:0;:22;:65;:::i;:::-;41355:51;;;-1:-1:-1;;;41355:51:0;;41379:4;41355:51;;;;34824:42;41355:51;;;;;;-1:-1:-1;;41418:2:0;-1:-1:-1;;;;;41355:15:0;;;;;:51;;;;;;;;;;;;;;;:15;:51;;;5:2:-1;;;;30:1;27;20:12;5:2;41355:51:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41355:51:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41355:51:0;:66;41351:163;;41442:56;-1:-1:-1;;;;;41442:22:0;;34824:42;-1:-1:-1;;41442:56:0;:22;:56;:::i;:::-;-1:-1:-1;41085:3:0;;41043:482;;;;40963:569;:::o;38935:822::-;39023:20;-1:-1:-1;;;;;39060:25:0;;39056:55;;39101:10;39087:24;;39056:55;39136:16;;39201:24;;39122:11;39238:421;39261:3;39257:1;:7;39238:421;;;-1:-1:-1;;;;;39308:25:0;;39285:20;39308:25;;;:12;:25;;;;;39334:12;;39285:20;;39334:9;;39344:1;;39334:12;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;39308:39:0;;;;;;;;;;;-1:-1:-1;39308:39:0;39372:16;;;;39308:39;;-1:-1:-1;;;;;;39372:16:0;:44;;39366:3;:50;39362:286;;;39454:17;;;;39494:10;;39490:143;;39544:25;39548:12;39562:6;39544:3;:25::i;:::-;39612:1;39592:17;;;:21;39529:40;-1:-1:-1;39490:143:0;39362:286;;-1:-1:-1;39265:3:0;;39238:421;;;-1:-1:-1;39673:16:0;;39669:81;;39706:32;39712:11;39725:12;39706:5;:32::i;:::-;38935:822;;;;;;:::o;34652:117::-;34726:42;34652:117;:::o;36176:59::-;;;;;;;;;;;;;;;:::o;37227:180::-;7027:5;;-1:-1:-1;;;;;7027:5:0;7013:10;:19;7005:49;;;;;-1:-1:-1;;;7005:49:0;;;;;;;;;;;;-1:-1:-1;;;7005:49:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;37307:34:0;;;;;;:27;:34;;;;;;:41;;-1:-1:-1;;37307:41:0;37344:4;37307:41;;;37364:35;;;37307:34;37364:35;37227:180;:::o;36091:33::-;;;;:::o;34354:81::-;34393:42;34354:81;:::o;34453:::-;34492:42;34453:81;:::o;36310:727::-;36392:14;36408:16;36425:20;36447:13;36462:15;36479:19;36511:23;34590:42;-1:-1:-1;;;;;36537:32:0;;:34;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36537:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;36537:34:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;36537:34:0;;-1:-1:-1;36582:20:0;36605:38;-1:-1:-1;;;;;36605:36:0;;;:38::i;:::-;36582:61;-1:-1:-1;;;;;;36658:28:0;;34492:42;36658:28;36654:48;;;-1:-1:-1;36688:14:0;;;;;;;;;;;;-1:-1:-1;;;36688:14:0;;;;36654:48;36721:24;;-1:-1:-1;;;36721:24:0;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;36721:16:0;;;;;36738:6;;36721:24;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;36721:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36721:24:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;36721:24:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;36721:24:0;;-1:-1:-1;36766:54:0;-1:-1:-1;;;;;36766:39:0;;36814:4;36766:54;:39;:54;:::i;:::-;36756:64;;36833:16;;:::i;:::-;-1:-1:-1;;;;;;;;;36852:25:0;;;;;;;:12;:25;;;;;;;;:39;;;;;;;;;;;;36833:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;36833:58:0;;;;;;;;;;;;;36310:727;;-1:-1:-1;36310:727:0;;-1:-1:-1;36833:58:0;-1:-1:-1;36310:727:0:o;37045:139::-;7027:5;;-1:-1:-1;;;;;7027:5:0;7013:10;:19;7005:49;;;;;-1:-1:-1;;;7005:49:0;;;;;;;;;;;;-1:-1:-1;;;7005:49:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;37116:20:0;;;;;:6;:20;;;;;:27;;-1:-1:-1;;37116:27:0;37139:4;37116:27;;;37045:139::o;42117:583::-;7027:5;;-1:-1:-1;;;;;7027:5:0;7013:10;:19;7005:49;;;;;-1:-1:-1;;;7005:49:0;;;;;;;;;;;;-1:-1:-1;;;7005:49:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;42212:22:0;;42204:31;;;;;;42248:60;34492:42;42287:8;42297:10;42248:60;:38;:60;:::i;:::-;34824:42;-1:-1:-1;;;;;42321:38:0;;42374:8;42397:1;42431;42466:10;42491:1;42528;42566:41;42642:1;42321:371;;;;;;;;;;;;;-1:-1:-1;;;;;42321:371:0;-1:-1:-1;;;;;42321:371:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;42321:371:0;-1:-1:-1;;;;;42321:371:0;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42321:371:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;42321:371:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;14855:134:0;-1:-1:-1;;;;;14954:18:0;;;14927:7;14954:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;14855:134::o;35937:39::-;;;;:::o;7201:146::-;7264:17;;-1:-1:-1;;;;;7264:17:0;7250:10;:31;7242:61;;;;;-1:-1:-1;;;7242:61:0;;;;;;;;;;;;-1:-1:-1;;;7242:61:0;;;;;;;;;;;;;;;7322:17;;7314:5;:25;;-1:-1:-1;;;;;;7314:25:0;-1:-1:-1;;;;;7322:17:0;;;7314:25;;;;;;7201:146::o;40248:707::-;-1:-1:-1;;;;;40354:13:0;;40313:20;40354:13;;;:6;:13;;;;;;;;40346:22;;;;;;40434:10;40398:20;40421:24;;;:12;:24;;;;;;;;-1:-1:-1;;;;;40421:31:0;;;;;;;;;40471:17;;;;:22;40463:31;;;;;;40638:17;;40632:3;:23;40628:176;;;40687:59;40716:5;40724:4;:13;;;40739:6;40687:21;:59::i;:::-;40672:74;;40761:31;40767:10;40779:12;40761:5;:31::i;:::-;40834:11;;40830:24;;40847:6;40830:3;:24::i;:::-;40816:38;;40867:48;40888:5;40896:6;40904:10;40867:13;:48::i;:::-;-1:-1:-1;40248:707:0;;;;:::o;20103:338::-;-1:-1:-1;;;;;20197:19:0;;20189:68;;;;-1:-1:-1;;;20189:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20276:21:0;;20268:68;;;;-1:-1:-1;;;20268:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20349:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;20401:32;;;;;;;;;;;;;;;;;20103:338;;;:::o;1519:508::-;1936:4;1982:17;2014:7;1519:508;:::o;17923:471::-;-1:-1:-1;;;;;18021:20:0;;18013:70;;;;-1:-1:-1;;;18013:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18102:23:0;;18094:71;;;;-1:-1:-1;;;18094:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18198;18220:6;18198:71;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18198:17:0;;;;;;:9;:17;;;;;;;:71;;:21;:71;:::i;:::-;-1:-1:-1;;;;;18178:17:0;;;;;;;:9;:17;;;;;;:91;;;;18303:20;;;;;;;:32;;18328:6;18303:32;:24;:32;:::i;:::-;-1:-1:-1;;;;;18280:20:0;;;;;;;:9;:20;;;;;;;;;:55;;;;18351:35;;;;;;;18280:20;;18351:35;;;;;;;;;;;;;17923:471;;;:::o;10039:192::-;10125:7;10161:12;10153:6;;;;10145:29;;;;-1:-1:-1;;;10145:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;10145:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;10197:5:0;;;10039:192::o;9110:181::-;9168:7;9200:5;;;9224:6;;;;9216:46;;;;;-1:-1:-1;;;9216:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;9282:1;9110:181;-1:-1:-1;;;9110:181:0:o;30335:166::-;30397:13;-1:-1:-1;;;;;30427:20:0;;30135:42;30427:20;30423:38;;;-1:-1:-1;30449:12:0;;;;;;;;;;;;-1:-1:-1;;;30449:12:0;;;;;;30423:38;30479:5;-1:-1:-1;;;;;30479:12:0;;:14;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30479:14:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30479:14:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;30479:14:0;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;13:2;5:11;;2:2;;;29:1;26;19:12;2:2;30479:14:0;;;;;;;;;;;;;-1:-1:-1;;;14:3;11:20;8:2;;;44:1;41;34:12;8:2;62:21;;;;123:4;114:14;;138:31;;;135:2;;;182:1;179;172:12;135:2;213:10;;-1:-1;;;244:29;;285:43;;;282:58;-1:-1;233:115;230:2;;;361:1;358;351:12;230:2;372:25;;-1:-1;30479:14:0;;420:4:-1;411:14;;;;30479::0;;;;;411::-1;30479::0;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;30479::0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30472:21;;30335:166;;;:::o;31446:633::-;31557:11;31553:50;;31585:7;;31553:50;-1:-1:-1;;;;;31619:21:0;;;;:45;;-1:-1:-1;;;;;;31644:20:0;;30135:42;31644:20;31619:45;31615:457;;;-1:-1:-1;;;;;31689:18:0;;31697:10;31689:18;:41;;;;;31724:6;31711:9;:19;;31689:41;31681:71;;;;;-1:-1:-1;;;31681:71:0;;;;;;;;;;;;-1:-1:-1;;;31681:71:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;31771:19:0;;31785:4;31771:19;31767:97;;31811:37;;-1:-1:-1;;;;;31811:29:0;;;:37;;;;;31841:6;;31811:37;;;;31841:6;31811:29;:37;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;31811:37:0;31767:97;31894:6;31882:9;:18;31878:110;;;31921:10;:51;31941:30;31949:9;31964:6;31941:30;:22;:30;:::i;:::-;31921:51;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;31921:51:0;31878:110;31615:457;;;32020:40;-1:-1:-1;;;;;32020:22:0;;32043:4;32049:2;32053:6;32020:40;:22;:40;:::i;21172:104::-;21256:5;;;21251:16;;;;21243:25;;;;;30509:158;30573:4;-1:-1:-1;;;;;30594:20:0;;30135:42;30594:20;30590:35;;;-1:-1:-1;30623:2:0;30616:9;;30590:35;30643:5;-1:-1:-1;;;;;30643:14:0;;:16;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30643:16:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30643:16:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;30643:16:0;;30509:158;-1:-1:-1;;30509:158:0:o;21392:118::-;21444:6;21471;;;:30;;-1:-1:-1;;21486:5:0;;;21500:1;21495;21486:5;21495:1;21481:15;;;;;:20;21471:30;21463:39;;;;;42708:913;-1:-1:-1;;;;;42803:25:0;;42823:4;42803:25;42799:213;;42892:6;42849:39;-1:-1:-1;;;;;42849:24:0;;42882:4;42849:39;:24;:39;:::i;:::-;:49;42845:156;;42919:41;-1:-1:-1;;;;;42919:23:0;;42943:8;42953:6;42919:41;:23;:41;:::i;:::-;42979:7;;42845:156;-1:-1:-1;;;;;43028:29:0;;34294:42;43028:29;43024:505;;;43157:44;;;-1:-1:-1;;;43157:44:0;;;;;;;;43196:4;43157:44;;;;;;34726:42;;43157:30;;:44;;;;;-1:-1:-1;;43157:44:0;;;;;;;-1:-1:-1;34726:42:0;43157:44;;;5:2:-1;;;;30:1;27;20:12;5:2;43157:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;43157:44:0;;;;43024:505;;;-1:-1:-1;;;;;43223:29:0;;34207:42;43223:29;43219:310;;;43314:20;;43269:66;;;-1:-1:-1;;;43269:66:0;;43300:1;43269:66;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;43314:20:0;;;43269:66;;;;;;34726:42;;43269:30;;:66;;;;;;;;;;;43300:1;34726:42;43269:66;;;5:2:-1;;;;30:1;27;20:12;43219:310:0;-1:-1:-1;;;;;43357:30:0;;34393:42;43357:30;43353:176;;;43449:20;;43404:66;;;-1:-1:-1;;;43404:66:0;;43435:1;43404:66;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;43449:20:0;;;43404:66;;;;;;34726:42;;43404:30;;:66;;;;;;;;;;;43435:1;34726:42;43404:66;;;5:2:-1;;;;30:1;27;20:12;43503:14:0;-1:-1:-1;;;;;43545:25:0;;43565:4;43545:25;43541:72;;43572:41;-1:-1:-1;;;;;43572:23:0;;43596:8;43606:6;43572:41;:23;:41;:::i;31236:202::-;-1:-1:-1;;;;;31328:21:0;;;;;;:45;;-1:-1:-1;;;;;;31353:20:0;;30135:42;31353:20;;31328:45;31324:107;;;31390:29;-1:-1:-1;;;;;31390:17:0;;31408:2;31412:6;31390:29;:17;:29;:::i;18675:308::-;-1:-1:-1;;;;;18751:21:0;;18743:65;;;;;-1:-1:-1;;;18743:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;18836:12;;:24;;18853:6;18836:24;:16;:24;:::i;:::-;18821:12;:39;-1:-1:-1;;;;;18892:18:0;;;;;;:9;:18;;;;;;:30;;18915:6;18892:30;:22;:30;:::i;:::-;-1:-1:-1;;;;;18871:18:0;;;;;;:9;:18;;;;;;;;:51;;;;18938:37;;;;;;;18871:18;;;;18938:37;;;;;;;;;;18675:308;;:::o;32087:261::-;32165:7;-1:-1:-1;;;;;32189:21:0;;;;:45;;-1:-1:-1;;;;;;32214:20:0;;30135:42;32214:20;32189:45;32185:156;;;-1:-1:-1;;;;;;32258:11:0;;;32251:18;;32185:156;32309:5;-1:-1:-1;;;;;32309:15:0;;32325:3;32309:20;;;;;;;;;;;;;-1:-1:-1;;;;;32309:20:0;-1:-1:-1;;;;;32309:20:0;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32309:20:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32309:20:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;32309:20:0;;-1:-1:-1;32302:27:0;;30187:140;30276:43;30294:5;30301:2;30305:6;30313:5;30276:17;:43::i;19315:348::-;-1:-1:-1;;;;;19391:21:0;;19383:67;;;;-1:-1:-1;;;19383:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19484:68;19507:6;19484:68;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;19484:18:0;;;;;;:9;:18;;;;;;;:68;;:22;:68;:::i;:::-;-1:-1:-1;;;;;19463:18:0;;;;;;:9;:18;;;;;:89;19578:12;;:24;;19595:6;19578:24;:16;:24;:::i;:::-;19563:12;:39;19618:37;;;;;;;;19644:1;;-1:-1:-1;;;;;19618:37:0;;;;;;;;;;;;19315:348;;:::o;21282:104::-;21366:5;;;21361:16;;;;21353:25;;;;;9566:136;9624:7;9651:43;9655:1;9658;9651:43;;;;;;;;;;;;;;;;;:3;:43::i;26770:204::-;26897:68;;;-1:-1:-1;;;;;26897:68:0;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;26897:68:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;26871:95:0;;26890:5;;26871:18;:95::i;26982:621::-;27352:10;;;27351:62;;-1:-1:-1;27368:39:0;;;-1:-1:-1;;;27368:39:0;;27392:4;27368:39;;;;-1:-1:-1;;;;;27368:39:0;;;;;;;;;:15;;;;;;:39;;;;;;;;;;;;;;;:15;:39;;;5:2:-1;;;;30:1;27;20:12;5:2;27368:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;27368:39:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;27368:39:0;:44;27351:62;27343:152;;;;-1:-1:-1;;;27343:152:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27532:62;;;-1:-1:-1;;;;;27532:62:0;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;27532:62:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;27506:89:0;;27525:5;;27506:18;:89::i;30675:553::-;30775:4;30796:11;30792:55;;-1:-1:-1;30831:4:0;30824:11;;30792:55;-1:-1:-1;;;;;30863:21:0;;;;:45;;-1:-1:-1;;;;;;30888:20:0;;30135:42;30888:20;30863:45;30859:362;;;30929:7;30925:196;;;30964:33;;-1:-1:-1;;;;;30964:25:0;;;:33;;;;;30990:6;;30964:33;;;;30990:6;30964:25;:33;;;;;;;30957:40;;;;30925:196;31038:37;;-1:-1:-1;;;;;31038:29:0;;;:37;;;;;31068:6;;31038:37;;;;31068:6;31038:29;:37;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;31038:37:0;31101:4;31094:11;;;;30859:362;31153:30;-1:-1:-1;;;;;31153:18:0;;31172:2;31176:6;31153:30;:18;:30;:::i;:::-;-1:-1:-1;31205:4:0;30859:362;30675:553;;;;;;:::o;28580:1114::-;29184:27;29192:5;-1:-1:-1;;;;;29184:25:0;;:27::i;:::-;29176:71;;;;;-1:-1:-1;;;29176:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;29321:12;29335:23;29370:5;-1:-1:-1;;;;;29362:19:0;29382:4;29362:25;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;29362:25:0;;;;;;;;;;;;;;;;;;;;;;;;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;;29320:67:0;;;;29406:7;29398:52;;;;;-1:-1:-1;;;29398:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29467:17;;:21;29463:224;;29609:10;29598:30;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29598:30:0;29590:85;;;;-1:-1:-1;;;29590:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26586:176;26695:58;;;-1:-1:-1;;;;;26695:58:0;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;26695:58:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;26669:85:0;;26688:5;;26669:18;:85::i;23273:810::-;23333:4;23992:20;;23835:66;24032:15;;;;;:42;;-1:-1:-1;24051:23:0;;;24024:51;-1:-1:-1;;23273:810:0:o;33518:10311::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33518:10311:0;;;-1:-1:-1;33518:10311:0;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;33518:10311:0;;;;;:::o;:::-;;;;;;;;;;;;;;;;;

Swarm Source

bzzr://46c29e4c5592f1255d425f4fcc6d5d76dcd4264cf1ccd25f1276c9f63e9acbe3

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.