ETH Price: $3,312.33 (+3.16%)

Contract

0x9A315BdF513367C0377FB36545857d12e85813Ef
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
0x68747470139235622022-01-02 3:18:501114 days ago1641093530IN
0x9A315BdF...2e85813Ef
0 ETH0.0019613186
0x68747470139235622022-01-02 3:18:501114 days ago1641093530IN
0x9A315BdF...2e85813Ef
0 ETH0.0019613186
0x68747470139235622022-01-02 3:18:501114 days ago1641093530IN
0x9A315BdF...2e85813Ef
0 ETH0.0019613186
0x68747470139235622022-01-02 3:18:501114 days ago1641093530IN
0x9A315BdF...2e85813Ef
0 ETH0.0019613186
0x68747470139235622022-01-02 3:18:501114 days ago1641093530IN
0x9A315BdF...2e85813Ef
0 ETH0.0019613186
0x68747470139235622022-01-02 3:18:501114 days ago1641093530IN
0x9A315BdF...2e85813Ef
0 ETH0.0019613186
0x68747470139235622022-01-02 3:18:501114 days ago1641093530IN
0x9A315BdF...2e85813Ef
0 ETH0.0019613186
0x68747470139235622022-01-02 3:18:501114 days ago1641093530IN
0x9A315BdF...2e85813Ef
0 ETH0.0019613186
0x68747470139235622022-01-02 3:18:501114 days ago1641093530IN
0x9A315BdF...2e85813Ef
0 ETH0.0019613186
0x68747470139235622022-01-02 3:18:501114 days ago1641093530IN
0x9A315BdF...2e85813Ef
0 ETH0.0019613186
0x68747470139235622022-01-02 3:18:501114 days ago1641093530IN
0x9A315BdF...2e85813Ef
0 ETH0.0019613186
0x68747470139235622022-01-02 3:18:501114 days ago1641093530IN
0x9A315BdF...2e85813Ef
0 ETH0.0019613186
0x68747470139235622022-01-02 3:18:501114 days ago1641093530IN
0x9A315BdF...2e85813Ef
0 ETH0.0019613186
0x68747470139235622022-01-02 3:18:501114 days ago1641093530IN
0x9A315BdF...2e85813Ef
0 ETH0.0019613186
0x68747470139235622022-01-02 3:18:501114 days ago1641093530IN
0x9A315BdF...2e85813Ef
0 ETH0.0019613186
0x68747470139235612022-01-02 3:18:491114 days ago1641093529IN
0x9A315BdF...2e85813Ef
0 ETH0.0019613186
0x68747470139235612022-01-02 3:18:491114 days ago1641093529IN
0x9A315BdF...2e85813Ef
0 ETH0.0019613186
0x68747470139235512022-01-02 3:16:141114 days ago1641093374IN
0x9A315BdF...2e85813Ef
0 ETH0.0019613186
0x68747470139235512022-01-02 3:16:141114 days ago1641093374IN
0x9A315BdF...2e85813Ef
0 ETH0.0019613186
0x68747470139235512022-01-02 3:16:141114 days ago1641093374IN
0x9A315BdF...2e85813Ef
0 ETH0.0019613186
0x68747470139235512022-01-02 3:16:141114 days ago1641093374IN
0x9A315BdF...2e85813Ef
0 ETH0.0019613186
0x68747470139235512022-01-02 3:16:141114 days ago1641093374IN
0x9A315BdF...2e85813Ef
0 ETH0.0019613186
0x68747470139235512022-01-02 3:16:141114 days ago1641093374IN
0x9A315BdF...2e85813Ef
0 ETH0.0019613186
0x68747470139235512022-01-02 3:16:141114 days ago1641093374IN
0x9A315BdF...2e85813Ef
0 ETH0.0019613186
0x68747470139235512022-01-02 3:16:141114 days ago1641093374IN
0x9A315BdF...2e85813Ef
0 ETH0.0019613186
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
OlympusTreasury

Compiler Version
v0.7.5+commit.eb77ed08

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, GNU AGPLv3 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-12-11
*/

// SPDX-License-Identifier: AGPL-3.0-or-later

// File: interfaces/IOlympusAuthority.sol


pragma solidity =0.7.5;

interface IOlympusAuthority {
    /* ========== EVENTS ========== */
    
    event GovernorPushed(address indexed from, address indexed to, bool _effectiveImmediately);
    event GuardianPushed(address indexed from, address indexed to, bool _effectiveImmediately);    
    event PolicyPushed(address indexed from, address indexed to, bool _effectiveImmediately);    
    event VaultPushed(address indexed from, address indexed to, bool _effectiveImmediately);    

    event GovernorPulled(address indexed from, address indexed to);
    event GuardianPulled(address indexed from, address indexed to);
    event PolicyPulled(address indexed from, address indexed to);
    event VaultPulled(address indexed from, address indexed to);

    /* ========== VIEW ========== */
    
    function governor() external view returns (address);
    function guardian() external view returns (address);
    function policy() external view returns (address);
    function vault() external view returns (address);
}
// File: types/OlympusAccessControlled.sol


pragma solidity >=0.7.5;


abstract contract OlympusAccessControlled {

    /* ========== EVENTS ========== */

    event AuthorityUpdated(IOlympusAuthority indexed authority);

    string UNAUTHORIZED = "UNAUTHORIZED"; // save gas

    /* ========== STATE VARIABLES ========== */

    IOlympusAuthority public authority;


    /* ========== Constructor ========== */

    constructor(IOlympusAuthority _authority) {
        authority = _authority;
        emit AuthorityUpdated(_authority);
    }
    

    /* ========== MODIFIERS ========== */
    
    modifier onlyGovernor() {
        require(msg.sender == authority.governor(), UNAUTHORIZED);
        _;
    }
    
    modifier onlyGuardian() {
        require(msg.sender == authority.guardian(), UNAUTHORIZED);
        _;
    }
    
    modifier onlyPolicy() {
        require(msg.sender == authority.policy(), UNAUTHORIZED);
        _;
    }

    modifier onlyVault() {
        require(msg.sender == authority.vault(), UNAUTHORIZED);
        _;
    }
    
    /* ========== GOV ONLY ========== */
    
    function setAuthority(IOlympusAuthority _newAuthority) external onlyGovernor {
        authority = _newAuthority;
        emit AuthorityUpdated(_newAuthority);
    }
}

// File: interfaces/ITreasury.sol


pragma solidity >=0.7.5;

interface ITreasury {
    function deposit(
        uint256 _amount,
        address _token,
        uint256 _profit
    ) external returns (uint256);

    function withdraw(uint256 _amount, address _token) external;

    function tokenValue(address _token, uint256 _amount) external view returns (uint256 value_);

    function mint(address _recipient, uint256 _amount) external;

    function manage(address _token, uint256 _amount) external;

    function incurDebt(uint256 amount_, address token_) external;

    function repayDebtWithReserve(uint256 amount_, address token_) external;

    function excessReserves() external view returns (uint256);

    function baseSupply() external view returns (uint256);
}

// File: interfaces/IBondingCalculator.sol


pragma solidity >=0.7.5;

interface IBondingCalculator {
    function markdown( address _LP ) external view returns ( uint );

    function valuation( address pair_, uint amount_ ) external view returns ( uint _value );
}
// File: interfaces/IOwnable.sol


pragma solidity >=0.7.5;


interface IOwnable {
  function owner() external view returns (address);

  function renounceManagement() external;
  
  function pushManagement( address newOwner_ ) external;
  
  function pullManagement() external;
}
// File: interfaces/IERC20.sol


pragma solidity >=0.7.5;

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: interfaces/IsOHM.sol


pragma solidity >=0.7.5;


interface IsOHM is IERC20 {
    function rebase( uint256 ohmProfit_, uint epoch_) external returns (uint256);

    function circulatingSupply() external view returns (uint256);

    function gonsForBalance( uint amount ) external view returns ( uint );

    function balanceForGons( uint gons ) external view returns ( uint );

    function index() external view returns ( uint );

    function toG(uint amount) external view returns (uint);

    function fromG(uint amount) external view returns (uint);

     function changeDebt(
        uint256 amount,
        address debtor,
        bool add
    ) external;

    function debtBalances(address _address) external view returns (uint256);

}

// File: interfaces/IOHM.sol


pragma solidity >=0.7.5;


interface IOHM is IERC20 {
  function mint(address account_, uint256 amount_) external;

  function burn(uint256 amount) external;

  function burnFrom(address account_, uint256 amount_) external;
}

// File: interfaces/IERC20Metadata.sol


pragma solidity >=0.7.5;


interface IERC20Metadata is IERC20 {

    function name() external view returns (string memory);

    function symbol() external view returns (string memory);

    function decimals() external view returns (uint8);
}
// File: libraries/SafeERC20.sol


pragma solidity >=0.7.5;


/// @notice Safe IERC20 and ETH transfer library that safely handles missing return values.
/// @author Modified from Uniswap (https://github.com/Uniswap/uniswap-v3-periphery/blob/main/contracts/libraries/TransferHelper.sol)
/// Taken from Solmate
library SafeERC20 {
    function safeTransferFrom(
        IERC20 token,
        address from,
        address to,
        uint256 amount
    ) internal {
        (bool success, bytes memory data) = address(token).call(
            abi.encodeWithSelector(IERC20.transferFrom.selector, from, to, amount)
        );

        require(success && (data.length == 0 || abi.decode(data, (bool))), "TRANSFER_FROM_FAILED");
    }

    function safeTransfer(
        IERC20 token,
        address to,
        uint256 amount
    ) internal {
        (bool success, bytes memory data) = address(token).call(
            abi.encodeWithSelector(IERC20.transfer.selector, to, amount)
        );

        require(success && (data.length == 0 || abi.decode(data, (bool))), "TRANSFER_FAILED");
    }

    function safeApprove(
        IERC20 token,
        address to,
        uint256 amount
    ) internal {
        (bool success, bytes memory data) = address(token).call(
            abi.encodeWithSelector(IERC20.approve.selector, to, amount)
        );

        require(success && (data.length == 0 || abi.decode(data, (bool))), "APPROVE_FAILED");
    }

    function safeTransferETH(address to, uint256 amount) internal {
        (bool success, ) = to.call{value: amount}(new bytes(0));

        require(success, "ETH_TRANSFER_FAILED");
    }
}
// File: libraries/SafeMath.sol


pragma solidity ^0.7.5;


// TODO(zx): Replace all instances of SafeMath with OZ implementation
library SafeMath {

    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

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

        return c;
    }

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        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;
    }

    // Only used in the  BondingCalculator.sol
    function sqrrt(uint256 a) internal pure returns (uint c) {
        if (a > 3) {
            c = a;
            uint b = add( div( a, 2), 1 );
            while (b < c) {
                c = b;
                b = div( add( div( a, b ), b), 2 );
            }
        } else if (a != 0) {
            c = 1;
        }
    }

}
// File: Treasury.sol


pragma solidity ^0.7.5;











contract OlympusTreasury is OlympusAccessControlled, ITreasury {
    /* ========== DEPENDENCIES ========== */

    using SafeMath for uint256;
    using SafeERC20 for IERC20;

    /* ========== EVENTS ========== */

    event Deposit(address indexed token, uint256 amount, uint256 value);
    event Withdrawal(address indexed token, uint256 amount, uint256 value);
    event CreateDebt(address indexed debtor, address indexed token, uint256 amount, uint256 value);
    event RepayDebt(address indexed debtor, address indexed token, uint256 amount, uint256 value);
    event Managed(address indexed token, uint256 amount);
    event ReservesAudited(uint256 indexed totalReserves);
    event Minted(address indexed caller, address indexed recipient, uint256 amount);
    event PermissionQueued(STATUS indexed status, address queued);
    event Permissioned(address addr, STATUS indexed status, bool result);

    /* ========== DATA STRUCTURES ========== */

    enum STATUS {
        RESERVEDEPOSITOR,
        RESERVESPENDER,
        RESERVETOKEN,
        RESERVEMANAGER,
        LIQUIDITYDEPOSITOR,
        LIQUIDITYTOKEN,
        LIQUIDITYMANAGER,
        RESERVEDEBTOR,
        REWARDMANAGER,
        SOHM,
        OHMDEBTOR
    }

    struct Queue {
        STATUS managing;
        address toPermit;
        address calculator;
        uint256 timelockEnd;
        bool nullify;
        bool executed;
    }

    /* ========== STATE VARIABLES ========== */

    IOHM public immutable OHM;
    IsOHM public sOHM;

    mapping(STATUS => address[]) public registry;
    mapping(STATUS => mapping(address => bool)) public permissions;
    mapping(address => address) public bondCalculator;

    mapping(address => uint256) public debtLimit;

    uint256 public totalReserves;
    uint256 public totalDebt;
    uint256 public ohmDebt;

    Queue[] public permissionQueue;
    uint256 public immutable blocksNeededForQueue;

    bool public timelockEnabled;
    bool public initialized;

    uint256 public onChainGovernanceTimelock;

    string internal notAccepted = "Treasury: not accepted";
    string internal notApproved = "Treasury: not approved";
    string internal invalidToken = "Treasury: invalid token";
    string internal insufficientReserves = "Treasury: insufficient reserves";

    /* ========== CONSTRUCTOR ========== */

    constructor(
        address _ohm,
        uint256 _timelock,
        address _authority
    ) OlympusAccessControlled(IOlympusAuthority(_authority)) {
        require(_ohm != address(0), "Zero address: OHM");
        OHM = IOHM(_ohm);

        timelockEnabled = false;
        initialized = false;
        blocksNeededForQueue = _timelock;
    }

    /* ========== MUTATIVE FUNCTIONS ========== */

    /**
     * @notice allow approved address to deposit an asset for OHM
     * @param _amount uint256
     * @param _token address
     * @param _profit uint256
     * @return send_ uint256
     */
    function deposit(
        uint256 _amount,
        address _token,
        uint256 _profit
    ) external override returns (uint256 send_) {
        if (permissions[STATUS.RESERVETOKEN][_token]) {
            require(permissions[STATUS.RESERVEDEPOSITOR][msg.sender], notApproved);
        } else if (permissions[STATUS.LIQUIDITYTOKEN][_token]) {
            require(permissions[STATUS.LIQUIDITYDEPOSITOR][msg.sender], notApproved);
        } else {
            revert(invalidToken);
        }

        IERC20(_token).safeTransferFrom(msg.sender, address(this), _amount);

        uint256 value = tokenValue(_token, _amount);
        // mint OHM needed and store amount of rewards for distribution
        send_ = value.sub(_profit);
        OHM.mint(msg.sender, send_);

        totalReserves = totalReserves.add(value);

        emit Deposit(_token, _amount, value);
    }

    /**
     * @notice allow approved address to burn OHM for reserves
     * @param _amount uint256
     * @param _token address
     */
    function withdraw(uint256 _amount, address _token) external override {
        require(permissions[STATUS.RESERVETOKEN][_token], notAccepted); // Only reserves can be used for redemptions
        require(permissions[STATUS.RESERVESPENDER][msg.sender], notApproved);

        uint256 value = tokenValue(_token, _amount);
        OHM.burnFrom(msg.sender, value);

        totalReserves = totalReserves.sub(value);

        IERC20(_token).safeTransfer(msg.sender, _amount);

        emit Withdrawal(_token, _amount, value);
    }

    /**
     * @notice allow approved address to withdraw assets
     * @param _token address
     * @param _amount uint256
     */
    function manage(address _token, uint256 _amount) external override {
        if (permissions[STATUS.LIQUIDITYTOKEN][_token]) {
            require(permissions[STATUS.LIQUIDITYMANAGER][msg.sender], notApproved);
        } else {
            require(permissions[STATUS.RESERVEMANAGER][msg.sender], notApproved);
        }
        if (permissions[STATUS.RESERVETOKEN][_token] || permissions[STATUS.LIQUIDITYTOKEN][_token]) {
            uint256 value = tokenValue(_token, _amount);
            require(value <= excessReserves(), insufficientReserves);
            totalReserves = totalReserves.sub(value);
        }
        IERC20(_token).safeTransfer(msg.sender, _amount);
        emit Managed(_token, _amount);
    }

    /**
     * @notice mint new OHM using excess reserves
     * @param _recipient address
     * @param _amount uint256
     */
    function mint(address _recipient, uint256 _amount) external override {
        require(permissions[STATUS.REWARDMANAGER][msg.sender], notApproved);
        require(_amount <= excessReserves(), insufficientReserves);
        OHM.mint(_recipient, _amount);
        emit Minted(msg.sender, _recipient, _amount);
    }

    /**
     * DEBT: The debt functions allow approved addresses to borrow treasury assets
     * or OHM from the treasury, using sOHM as collateral. This might allow an
     * sOHM holder to provide OHM liquidity without taking on the opportunity cost
     * of unstaking, or alter their backing without imposing risk onto the treasury.
     * Many of these use cases are yet to be defined, but they appear promising.
     * However, we urge the community to think critically and move slowly upon
     * proposals to acquire these permissions.
     */

    /**
     * @notice allow approved address to borrow reserves
     * @param _amount uint256
     * @param _token address
     */
    function incurDebt(uint256 _amount, address _token) external override {
        uint256 value;
        if (_token == address(OHM)) {
            require(permissions[STATUS.OHMDEBTOR][msg.sender], notApproved);
            value = _amount;
        } else {
            require(permissions[STATUS.RESERVEDEBTOR][msg.sender], notApproved);
            require(permissions[STATUS.RESERVETOKEN][_token], notAccepted);
            value = tokenValue(_token, _amount);
        }
        require(value != 0, invalidToken);

        sOHM.changeDebt(value, msg.sender, true);
        require(sOHM.debtBalances(msg.sender) <= debtLimit[msg.sender], "Treasury: exceeds limit");
        totalDebt = totalDebt.add(value);

        if (_token == address(OHM)) {
            OHM.mint(msg.sender, value);
            ohmDebt = ohmDebt.add(value);
        } else {
            totalReserves = totalReserves.sub(value);
            IERC20(_token).safeTransfer(msg.sender, _amount);
        }
        emit CreateDebt(msg.sender, _token, _amount, value);
    }

    /**
     * @notice allow approved address to repay borrowed reserves with reserves
     * @param _amount uint256
     * @param _token address
     */
    function repayDebtWithReserve(uint256 _amount, address _token) external override {
        require(permissions[STATUS.RESERVEDEBTOR][msg.sender], notApproved);
        require(permissions[STATUS.RESERVETOKEN][_token], notAccepted);
        IERC20(_token).safeTransferFrom(msg.sender, address(this), _amount);
        uint256 value = tokenValue(_token, _amount);
        sOHM.changeDebt(value, msg.sender, false);
        totalDebt = totalDebt.sub(value);
        totalReserves = totalReserves.add(value);
        emit RepayDebt(msg.sender, _token, _amount, value);
    }

    /**
     * @notice allow approved address to repay borrowed reserves with OHM
     * @param _amount uint256
     */
    function repayDebtWithOHM(uint256 _amount) external {
        require(permissions[STATUS.RESERVEDEBTOR][msg.sender] || permissions[STATUS.OHMDEBTOR][msg.sender], notApproved);
        OHM.burnFrom(msg.sender, _amount);
        sOHM.changeDebt(_amount, msg.sender, false);
        totalDebt = totalDebt.sub(_amount);
        ohmDebt = ohmDebt.sub(_amount);
        emit RepayDebt(msg.sender, address(OHM), _amount, _amount);
    }

    /* ========== MANAGERIAL FUNCTIONS ========== */

    /**
     * @notice takes inventory of all tracked assets
     * @notice always consolidate to recognized reserves before audit
     */
    function auditReserves() external onlyGovernor {
        uint256 reserves;
        address[] memory reserveToken = registry[STATUS.RESERVETOKEN];
        for (uint256 i = 0; i < reserveToken.length; i++) {
            if (permissions[STATUS.RESERVETOKEN][reserveToken[i]]) {
                reserves = reserves.add(tokenValue(reserveToken[i], IERC20(reserveToken[i]).balanceOf(address(this))));
            }
        }
        address[] memory liquidityToken = registry[STATUS.LIQUIDITYTOKEN];
        for (uint256 i = 0; i < liquidityToken.length; i++) {
            if (permissions[STATUS.LIQUIDITYTOKEN][liquidityToken[i]]) {
                reserves = reserves.add(tokenValue(liquidityToken[i], IERC20(liquidityToken[i]).balanceOf(address(this))));
            }
        }
        totalReserves = reserves;
        emit ReservesAudited(reserves);
    }

    /**
     * @notice set max debt for address
     * @param _address address
     * @param _limit uint256
     */
    function setDebtLimit(address _address, uint256 _limit) external onlyGovernor {
        debtLimit[_address] = _limit;
    }

    /**
     * @notice enable permission from queue
     * @param _status STATUS
     * @param _address address
     * @param _calculator address
     */
    function enable(
        STATUS _status,
        address _address,
        address _calculator
    ) external onlyGovernor {
        require(timelockEnabled == false, "Use queueTimelock");
        if (_status == STATUS.SOHM) {
            sOHM = IsOHM(_address);
        } else {
            permissions[_status][_address] = true;

            if (_status == STATUS.LIQUIDITYTOKEN) {
                bondCalculator[_address] = _calculator;
            }

            (bool registered, ) = indexInRegistry(_address, _status);
            if (!registered) {
                registry[_status].push(_address);

                if (_status == STATUS.LIQUIDITYTOKEN || _status == STATUS.RESERVETOKEN) {
                    (bool reg, uint256 index) = indexInRegistry(_address, _status);
                    if (reg) {
                        delete registry[_status][index];
                    }
                }
            }
        }
        emit Permissioned(_address, _status, true);
    }

    /**
     *  @notice disable permission from address
     *  @param _status STATUS
     *  @param _toDisable address
     */
    function disable(STATUS _status, address _toDisable) external {
        require(msg.sender == authority.governor() || msg.sender == authority.guardian(), "Only governor or guardian");
        permissions[_status][_toDisable] = false;
        emit Permissioned(_toDisable, _status, false);
    }

    /**
     * @notice check if registry contains address
     * @return (bool, uint256)
     */
    function indexInRegistry(address _address, STATUS _status) public view returns (bool, uint256) {
        address[] memory entries = registry[_status];
        for (uint256 i = 0; i < entries.length; i++) {
            if (_address == entries[i]) {
                return (true, i);
            }
        }
        return (false, 0);
    }

    /* ========== TIMELOCKED FUNCTIONS ========== */

    // functions are used prior to enabling on-chain governance

    /**
     * @notice queue address to receive permission
     * @param _status STATUS
     * @param _address address
     * @param _calculator address
     */
    function queueTimelock(
        STATUS _status,
        address _address,
        address _calculator
    ) external onlyGovernor {
        require(_address != address(0));
        require(timelockEnabled == true, "Timelock is disabled, use enable");

        uint256 timelock = block.number.add(blocksNeededForQueue);
        if (_status == STATUS.RESERVEMANAGER || _status == STATUS.LIQUIDITYMANAGER) {
            timelock = block.number.add(blocksNeededForQueue.mul(2));
        }
        permissionQueue.push(
            Queue({managing: _status, toPermit: _address, calculator: _calculator, timelockEnd: timelock, nullify: false, executed: false})
        );
        emit PermissionQueued(_status, _address);
    }

    /**
     *  @notice enable queued permission
     *  @param _index uint256
     */
    function execute(uint256 _index) external {
        require(timelockEnabled == true, "Timelock is disabled, use enable");

        Queue memory info = permissionQueue[_index];

        require(!info.nullify, "Action has been nullified");
        require(!info.executed, "Action has already been executed");
        require(block.number >= info.timelockEnd, "Timelock not complete");

        if (info.managing == STATUS.SOHM) {
            // 9
            sOHM = IsOHM(info.toPermit);
        } else {
            permissions[info.managing][info.toPermit] = true;

            if (info.managing == STATUS.LIQUIDITYTOKEN) {
                bondCalculator[info.toPermit] = info.calculator;
            }
            (bool registered, ) = indexInRegistry(info.toPermit, info.managing);
            if (!registered) {
                registry[info.managing].push(info.toPermit);

                if (info.managing == STATUS.LIQUIDITYTOKEN) {
                    (bool reg, uint256 index) = indexInRegistry(info.toPermit, STATUS.RESERVETOKEN);
                    if (reg) {
                        delete registry[STATUS.RESERVETOKEN][index];
                    }
                } else if (info.managing == STATUS.RESERVETOKEN) {
                    (bool reg, uint256 index) = indexInRegistry(info.toPermit, STATUS.LIQUIDITYTOKEN);
                    if (reg) {
                        delete registry[STATUS.LIQUIDITYTOKEN][index];
                    }
                }
            }
        }
        permissionQueue[_index].executed = true;
        emit Permissioned(info.toPermit, info.managing, true);
    }

    /**
     * @notice cancel timelocked action
     * @param _index uint256
     */
    function nullify(uint256 _index) external onlyGovernor {
        permissionQueue[_index].nullify = true;
    }

    /**
     * @notice disables timelocked functions
     */
    function disableTimelock() external onlyGovernor {
        require(timelockEnabled == true, "timelock already disabled");
        if (onChainGovernanceTimelock != 0 && onChainGovernanceTimelock <= block.number) {
            timelockEnabled = false;
        } else {
            onChainGovernanceTimelock = block.number.add(blocksNeededForQueue.mul(7)); // 7-day timelock
        }
    }

    /**
     * @notice enables timelocks after initilization
     */
    function initialize() external onlyGovernor {
        require(initialized == false, "Already initialized");
        timelockEnabled = true;
        initialized = true;
    }

    /* ========== VIEW FUNCTIONS ========== */

    /**
     * @notice returns excess reserves not backing tokens
     * @return uint
     */
    function excessReserves() public view override returns (uint256) {
        return totalReserves.sub(OHM.totalSupply().sub(totalDebt));
    }

    /**
     * @notice returns OHM valuation of asset
     * @param _token address
     * @param _amount uint256
     * @return value_ uint256
     */
    function tokenValue(address _token, uint256 _amount) public view override returns (uint256 value_) {
        value_ = _amount.mul(10**IERC20Metadata(address(OHM)).decimals()).div(10**IERC20Metadata(_token).decimals());

        if (permissions[STATUS.LIQUIDITYTOKEN][_token]) {
            value_ = IBondingCalculator(bondCalculator[_token]).valuation(_token, _amount);
        }
    }

    /**
     * @notice returns supply metric that cannot be manipulated by debt
     * @dev use this any time you need to query supply
     * @return uint256
     */
    function baseSupply() external view override returns (uint256) {
        return OHM.totalSupply() - ohmDebt;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_ohm","type":"address"},{"internalType":"uint256","name":"_timelock","type":"uint256"},{"internalType":"address","name":"_authority","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract IOlympusAuthority","name":"authority","type":"address"}],"name":"AuthorityUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"debtor","type":"address"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"CreateDebt","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Managed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Minted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"enum OlympusTreasury.STATUS","name":"status","type":"uint8"},{"indexed":false,"internalType":"address","name":"queued","type":"address"}],"name":"PermissionQueued","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"addr","type":"address"},{"indexed":true,"internalType":"enum OlympusTreasury.STATUS","name":"status","type":"uint8"},{"indexed":false,"internalType":"bool","name":"result","type":"bool"}],"name":"Permissioned","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"debtor","type":"address"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"RepayDebt","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"totalReserves","type":"uint256"}],"name":"ReservesAudited","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Withdrawal","type":"event"},{"inputs":[],"name":"OHM","outputs":[{"internalType":"contract IOHM","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"auditReserves","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"authority","outputs":[{"internalType":"contract IOlympusAuthority","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"blocksNeededForQueue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"bondCalculator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"debtLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_profit","type":"uint256"}],"name":"deposit","outputs":[{"internalType":"uint256","name":"send_","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum OlympusTreasury.STATUS","name":"_status","type":"uint8"},{"internalType":"address","name":"_toDisable","type":"address"}],"name":"disable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disableTimelock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum OlympusTreasury.STATUS","name":"_status","type":"uint8"},{"internalType":"address","name":"_address","type":"address"},{"internalType":"address","name":"_calculator","type":"address"}],"name":"enable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"excessReserves","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"execute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_token","type":"address"}],"name":"incurDebt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"enum OlympusTreasury.STATUS","name":"_status","type":"uint8"}],"name":"indexInRegistry","outputs":[{"internalType":"bool","name":"","type":"bool"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initialized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"manage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"nullify","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"ohmDebt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"onChainGovernanceTimelock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"permissionQueue","outputs":[{"internalType":"enum OlympusTreasury.STATUS","name":"managing","type":"uint8"},{"internalType":"address","name":"toPermit","type":"address"},{"internalType":"address","name":"calculator","type":"address"},{"internalType":"uint256","name":"timelockEnd","type":"uint256"},{"internalType":"bool","name":"nullify","type":"bool"},{"internalType":"bool","name":"executed","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum OlympusTreasury.STATUS","name":"","type":"uint8"},{"internalType":"address","name":"","type":"address"}],"name":"permissions","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum OlympusTreasury.STATUS","name":"_status","type":"uint8"},{"internalType":"address","name":"_address","type":"address"},{"internalType":"address","name":"_calculator","type":"address"}],"name":"queueTimelock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum OlympusTreasury.STATUS","name":"","type":"uint8"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"registry","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"repayDebtWithOHM","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_token","type":"address"}],"name":"repayDebtWithReserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sOHM","outputs":[{"internalType":"contract IsOHM","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IOlympusAuthority","name":"_newAuthority","type":"address"}],"name":"setAuthority","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"uint256","name":"_limit","type":"uint256"}],"name":"setDebtLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"timelockEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"tokenValue","outputs":[{"internalType":"uint256","name":"value_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalDebt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalReserves","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_token","type":"address"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

610100604052600c60c08190526b15539055551213d49256915160a21b60e090815262000030916000919062000255565b506040805180820190915260168082527f54726561737572793a206e6f742061636365707465640000000000000000000060209092019182526200007791600d9162000255565b506040805180820190915260168082527f54726561737572793a206e6f7420617070726f766564000000000000000000006020909201918252620000be91600e9162000255565b506040805180820190915260178082527f54726561737572793a20696e76616c696420746f6b656e00000000000000000060209092019182526200010591600f9162000255565b5060408051808201909152601f8082527f54726561737572793a20696e73756666696369656e742072657365727665730060209092019182526200014c9160109162000255565b503480156200015a57600080fd5b506040516200406638038062004066833981810160405260608110156200018057600080fd5b5080516020820151604092830151600180546001600160a01b0319166001600160a01b038316908117909155935192939192909182917f2f658b440c35314f52658ea8a740e05b284cdc84dc9ae01e891f21b8933e7cad90600090a2506001600160a01b0383166200022d576040805162461bcd60e51b81526020600482015260116024820152705a65726f20616464726573733a204f484d60781b604482015290519081900360640190fd5b5060609190911b6001600160601b031916608052600b805461ffff1916905560a05262000301565b828054600181600116156101000203166002900490600052602060002090601f0160209004810192826200028d5760008555620002d8565b82601f10620002a857805160ff1916838001178555620002d8565b82800160010185558215620002d8579182015b82811115620002d8578251825591602001919060010190620002bb565b50620002e6929150620002ea565b5090565b5b80821115620002e65760008155600101620002eb565b60805160601c60a051613cf86200036e6000398061158b52806115e3528061237f5280612a855250806108315280610be55280610d755280610e7e5280610ed352806112ab528061130a5280611c70528061250b52806127c4528061298b52806130b75250613cf86000f3fe608060405234801561001057600080fd5b506004361061021b5760003560e01c80637d921af011610125578063b39df88e116100ad578063d796ffb81161007c578063d796ffb81461060a578063e4e33ef814610636578063f18217831461066d578063fc7b9c1814610699578063fe0d94c1146106a15761021b565b8063b39df88e146105c0578063bc157ac1146105c8578063bf7e214f146105fa578063d07f390f146106025761021b565b806393988b53116100f457806393988b53146105145780639edd8d431461055e578063a44b82871461058a578063a6c41fec146105b0578063b320f6a9146105b85761021b565b80637d921af0146104f45780638129fc1c146104fc578063860f5048146105045780638f840ddd1461050c5761021b565b80632b7ce500116101a8578063503edcf011610177578063503edcf0146103e5578063529918311461045c5780635619004b1461048b57806371a45c95146104b15780637a9e5e4b146104ce5761021b565b80632b7ce5001461037a578063330dd34514610382578063341f9688146103b157806340c10f19146103b95761021b565b806312422d23116101ef57806312422d23146102b157806315079925146102dd578063158ef93e146103015780631af4da701461031d5780631d6d5f05146103435761021b565b8062f714ce146102205780630b0eee301461024e5780630c3513a81461027a5780630f70431f14610294575b600080fd5b61024c6004803603604081101561023657600080fd5b50803590602001356001600160a01b03166106be565b005b61024c6004803603604081101561026457600080fd5b506001600160a01b03813516906020013561092b565b610282610bd8565b60408051918252519081900360200190f35b61024c600480360360208110156102aa57600080fd5b5035610c7c565b61024c600480360360408110156102c757600080fd5b50803590602001356001600160a01b0316610ecf565b6102e56113f0565b604080516001600160a01b039092168252519081900360200190f35b6103096113ff565b604080519115158252519081900360200190f35b6102e56004803603602081101561033357600080fd5b50356001600160a01b031661140d565b61024c6004803603606081101561035957600080fd5b5060ff813516906001600160a01b0360208201358116916040013516611428565b61024c611763565b6103096004803603604081101561039857600080fd5b50803560ff1690602001356001600160a01b0316611b3d565b610282611b5d565b61024c600480360360408110156103cf57600080fd5b506001600160a01b038135169060200135611b63565b610402600480360360208110156103fb57600080fd5b5035611d41565b6040518087600a81111561041257fe5b8152602001866001600160a01b03168152602001856001600160a01b0316815260200184815260200183151581526020018215158152602001965050505050505060405180910390f35b61024c6004803603604081101561047257600080fd5b50803560ff1690602001356001600160a01b0316611d98565b610282600480360360208110156104a157600080fd5b50356001600160a01b0316611fa0565b61024c600480360360208110156104c757600080fd5b5035611fb2565b61024c600480360360208110156104e457600080fd5b50356001600160a01b03166120d2565b61024c612208565b61024c6123ab565b610282612504565b610282612594565b6105436004803603604081101561052a57600080fd5b5080356001600160a01b0316906020013560ff1661259a565b60408051921515835260208301919091528051918290030190f35b61024c6004803603604081101561057457600080fd5b506001600160a01b038135169060200135612682565b6102e5600480360360408110156105a057600080fd5b5060ff813516906020013561278a565b6102e56127c2565b6103096127e6565b6102826127ef565b610282600480360360608110156105de57600080fd5b508035906001600160a01b0360208201351690604001356127f5565b6102e5612a74565b610282612a83565b61024c6004803603604081101561062057600080fd5b50803590602001356001600160a01b0316612aa7565b61024c6004803603606081101561064c57600080fd5b5060ff813516906001600160a01b0360208201358116916040013516612cd2565b6102826004803603604081101561068357600080fd5b506001600160a01b038135169060200135613026565b610282613204565b61024c600480360360208110156106b757600080fd5b503561320a565b6001600160a01b0381166000908152600080516020613ca38339815191526020526040902054600d9060ff166107875760405162461bcd60e51b81526020600482019081528254600260001961010060018416150201909116046024830181905290918291604490910190849080156107785780601f1061074d57610100808354040283529160200191610778565b820191906000526020600020905b81548152906001019060200180831161075b57829003601f168201915b50509250505060405180910390fd5b503360009081527fabd6e7cb50984ff9c2f3e18a2660c3353dadf4e3291deeb275dae2cd1e44fe056020526040902054600e9060ff166108205760405162461bcd60e51b81526020600482019081528254600260001961010060018416150201909116046024830181905290918291604490910190849080156107785780601f1061074d57610100808354040283529160200191610778565b50600061082d8284613026565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166379cc679033836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b1580156108a657600080fd5b505af11580156108ba573d6000803e3d6000fd5b50506007546108cc9250905082613713565b6007556108e36001600160a01b038316338561375c565b604080518481526020810183905281516001600160a01b038516927fdf273cb619d95419a9cd0ec88123a0538c85064229baa6363788f743fff90deb928290030190a2505050565b6001600160a01b0382166000908152600080516020613c62833981519152602052604090205460ff16156109f7573360009081527fc59312466997bb42aaaf719ece141047820e6b34531e1670dc1852a453648f0f6020526040902054600e9060ff166109f15760405162461bcd60e51b81526020600482019081528254600260001961010060018416150201909116046024830181905290918291604490910190849080156107785780601f1061074d57610100808354040283529160200191610778565b50610a91565b3360009081527f2e174c10e159ea99b867ce3205125c24a42d128804e4070ed6fcc8cc98166aa06020526040902054600e9060ff16610a8f5760405162461bcd60e51b81526020600482019081528254600260001961010060018416150201909116046024830181905290918291604490910190849080156107785780601f1061074d57610100808354040283529160200191610778565b505b6001600160a01b0382166000908152600080516020613ca3833981519152602052604090205460ff1680610aea57506001600160a01b0382166000908152600080516020613c62833981519152602052604090205460ff165b15610b81576000610afb8383613026565b9050610b05610bd8565b811115601090610b6e5760405162461bcd60e51b81526020600482019081528254600260001961010060018416150201909116046024830181905290918291604490910190849080156107785780601f1061074d57610100808354040283529160200191610778565b50600754610b7c9082613713565b600755505b610b956001600160a01b038316338361375c565b6040805182815290516001600160a01b038416917fb4460e34f1e91c4fa28eb7fac4cbd88cf530ef54a67e1978cd5edd9f77033ead919081900360200190a25050565b6000610c77610c6e6008547f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015610c3c57600080fd5b505afa158015610c50573d6000803e3d6000fd5b505050506040513d6020811015610c6657600080fd5b505190613713565b60075490613713565b905090565b3360009081527fbeb3bad75134cb432e5707980e3245c52c5998a1125ee30f2f0dbf3925b1e551602052604090205460ff1680610ce757503360009081527f5c6b02db8b672415ffad906d7ccee10bd53dbad7d0b29e2bc0e50c93d5f31093602052604090205460ff165b600e90610d4d5760405162461bcd60e51b81526020600482019081528254600260001961010060018416150201909116046024830181905290918291604490910190849080156107785780601f1061074d57610100808354040283529160200191610778565b506040805163079cc67960e41b81523360048201526024810183905290516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016916379cc679091604480830192600092919082900301818387803b158015610dbc57600080fd5b505af1158015610dd0573d6000803e3d6000fd5b50506002546040805163ae5c6cd360e01b81526004810186905233602482015260006044820181905291516001600160a01b03909316945063ae5c6cd393506064808201939182900301818387803b158015610e2b57600080fd5b505af1158015610e3f573d6000803e3d6000fd5b5050600854610e519250905082613713565b600855600954610e619082613713565b600955604080518281526020810183905281516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169233927fc6d98eecfc9c78ab62c89a82950079b54874749f1f6f24090f7acc758bc2f309929081900390910190a350565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415610fac573360009081527f5c6b02db8b672415ffad906d7ccee10bd53dbad7d0b29e2bc0e50c93d5f310936020526040902054600e9060ff16610fa35760405162461bcd60e51b81526020600482019081528254600260001961010060018416150201909116046024830181905290918291604490910190849080156107785780601f1061074d57610100808354040283529160200191610778565b508290506110e2565b3360009081527fbeb3bad75134cb432e5707980e3245c52c5998a1125ee30f2f0dbf3925b1e5516020526040902054600e9060ff166110445760405162461bcd60e51b81526020600482019081528254600260001961010060018416150201909116046024830181905290918291604490910190849080156107785780601f1061074d57610100808354040283529160200191610778565b506001600160a01b0382166000908152600080516020613ca38339815191526020526040902054600d9060ff166110d45760405162461bcd60e51b81526020600482019081528254600260001961010060018416150201909116046024830181905290918291604490910190849080156107785780601f1061074d57610100808354040283529160200191610778565b506110df8284613026565b90505b600f816111485760405162461bcd60e51b81526020600482019081528254600260001961010060018416150201909116046024830181905290918291604490910190849080156107785780601f1061074d57610100808354040283529160200191610778565b506002546040805163ae5c6cd360e01b8152600481018490523360248201526001604482015290516001600160a01b039092169163ae5c6cd39160648082019260009290919082900301818387803b1580156111a357600080fd5b505af11580156111b7573d6000803e3d6000fd5b50503360008181526006602090815260409182902054600254835163313bc71360e21b8152600481019590955292519095506001600160a01b03909216935063c4ef1c4c9260248082019391829003018186803b15801561121757600080fd5b505afa15801561122b573d6000803e3d6000fd5b505050506040513d602081101561124157600080fd5b50511115611296576040805162461bcd60e51b815260206004820152601760248201527f54726561737572793a2065786365656473206c696d6974000000000000000000604482015290519081900360640190fd5b6008546112a390826138b8565b6008819055507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561137f57604080516340c10f1960e01b81523360048201526024810183905290516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016916340c10f1991604480830192600092919082900301818387803b15801561135157600080fd5b505af1158015611365573d6000803e3d6000fd5b505060095461137792509050826138b8565b6009556113a3565b60075461138c9082613713565b6007556113a36001600160a01b038316338561375c565b604080518481526020810183905281516001600160a01b0385169233927f7e1a939bed137a819b5d2979822c67f877689f7a863d5e4cb57cdca97b2977d6929081900390910190a3505050565b6002546001600160a01b031681565b600b54610100900460ff1681565b6005602052600090815260409020546001600160a01b031681565b600160009054906101000a90046001600160a01b03166001600160a01b0316630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b15801561147657600080fd5b505afa15801561148a573d6000803e3d6000fd5b505050506040513d60208110156114a057600080fd5b50516000906001600160a01b031633146115135760405162461bcd60e51b81526020600482019081528254600260001961010060018416150201909116046024830181905290918291604490910190849080156107785780601f1061074d57610100808354040283529160200191610778565b506001600160a01b03821661152757600080fd5b600b5460ff161515600114611583576040805162461bcd60e51b815260206004820181905260248201527f54696d656c6f636b2069732064697361626c65642c2075736520656e61626c65604482015290519081900360640190fd5b60006115af437f00000000000000000000000000000000000000000000000000000000000000006138b8565b9050600384600a8111156115bf57fe5b14806115d65750600684600a8111156115d457fe5b145b15611613576116106116097f00000000000000000000000000000000000000000000000000000000000000006002613912565b43906138b8565b90505b600a6040518060c0016040528086600a81111561162c57fe5b81526001600160a01b0380871660208084019190915290861660408301526060820185905260006080830181905260a090920182905283546001818101865594835291208251600490920201805492939092839160ff199091169083600a81111561169357fe5b021790555060208201518154610100600160a81b0319166101006001600160a01b03928316810291909117835560408401516001840180546001600160a01b03191691909316179091556060830151600283015560808301516003909201805460a09094015160ff199094169215159290921761ff0019169215150291909117905583600a81111561172157fe5b604080516001600160a01b038616815290517fc822ff41836a6dc998393c71843db8adcbbf01721f41b32389f6838ecb1ea9c89181900360200190a250505050565b600160009054906101000a90046001600160a01b03166001600160a01b0316630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b1580156117b157600080fd5b505afa1580156117c5573d6000803e3d6000fd5b505050506040513d60208110156117db57600080fd5b50516000906001600160a01b0316331461184e5760405162461bcd60e51b81526020600482019081528254600260001961010060018416150201909116046024830181905290918291604490910190849080156107785780601f1061074d57610100808354040283529160200191610778565b5060026000908152600360209081527fc3a24b0501bd2c13a7e57f2db4369ec4c223447539fc0724a9d55ac4a06ebd4d80546040805182850281018501909152818152606093909291908301828280156118d157602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116118b3575b5050505050905060005b81518110156119f8576002600090815260046020528251600080516020613ca3833981519152919084908490811061190f57fe5b6020908102919091018101516001600160a01b031682528101919091526040016000205460ff16156119f0576119ed6119e683838151811061194d57fe5b602002602001015184848151811061196157fe5b60200260200101516001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156119b557600080fd5b505afa1580156119c9573d6000803e3d6000fd5b505050506040513d60208110156119df57600080fd5b5051613026565b84906138b8565b92505b6001016118db565b506005600052600360209081527f405aad32e1adbac89bb7f176e338b8fc6e994ca210c9bb7bdca249b4659422508054604080518285028101850190915281815260609390929190830182828015611a7957602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611a5b575b5050505050905060005b8151811015611b07576005600090815260046020528251600080516020613c628339815191529190849084908110611ab757fe5b6020908102919091018101516001600160a01b031682528101919091526040016000205460ff1615611aff57611afc611af583838151811061194d57fe5b85906138b8565b93505b600101611a83565b50600783905560405183907fec691f09f6924b27932253f85caf99bacc30360cc0e50a1cc4d2acc24601446690600090a2505050565b600460209081526000928352604080842090915290825290205460ff1681565b60095481565b3360009081527f2645749a946633740611cfc8178319f0958659d6922e4bf7e3a08b44789f53a46020526040902054600e9060ff16611bfb5760405162461bcd60e51b81526020600482019081528254600260001961010060018416150201909116046024830181905290918291604490910190849080156107785780601f1061074d57610100808354040283529160200191610778565b50611c04610bd8565b811115601090611c6d5760405162461bcd60e51b81526020600482019081528254600260001961010060018416150201909116046024830181905290918291604490910190849080156107785780601f1061074d57610100808354040283529160200191610778565b507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166340c10f1983836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b158015611ce557600080fd5b505af1158015611cf9573d6000803e3d6000fd5b50506040805184815290516001600160a01b03861693503392507f9d228d69b5fdb8d273a2336f8fb8612d039631024ea9bf09c424a9503aa078f09181900360200190a35050565b600a8181548110611d5157600080fd5b6000918252602090912060049091020180546001820154600283015460039093015460ff80841695506001600160a01b036101009485900481169593169382821692041686565b600160009054906101000a90046001600160a01b03166001600160a01b0316630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b158015611de657600080fd5b505afa158015611dfa573d6000803e3d6000fd5b505050506040513d6020811015611e1057600080fd5b50516001600160a01b0316331480611ea95750600160009054906101000a90046001600160a01b03166001600160a01b031663452a93206040518163ffffffff1660e01b815260040160206040518083038186803b158015611e7157600080fd5b505afa158015611e85573d6000803e3d6000fd5b505050506040513d6020811015611e9b57600080fd5b50516001600160a01b031633145b611efa576040805162461bcd60e51b815260206004820152601960248201527f4f6e6c7920676f7665726e6f72206f7220677561726469616e00000000000000604482015290519081900360640190fd5b60006004600084600a811115611f0c57fe5b600a811115611f1757fe5b8152602080820192909252604090810160009081206001600160a01b03861682529092529020805460ff191691151591909117905581600a811115611f5857fe5b604080516001600160a01b03841681526000602082015281517f7531a7aefe3985500c4dec2dcb6049a708f14c6a8a9022b435b8841bdb8e1713929181900390910190a25050565b60066020526000908152604090205481565b600160009054906101000a90046001600160a01b03166001600160a01b0316630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b15801561200057600080fd5b505afa158015612014573d6000803e3d6000fd5b505050506040513d602081101561202a57600080fd5b50516000906001600160a01b0316331461209d5760405162461bcd60e51b81526020600482019081528254600260001961010060018416150201909116046024830181905290918291604490910190849080156107785780601f1061074d57610100808354040283529160200191610778565b506001600a82815481106120ad57fe5b60009182526020909120600490910201600301805460ff191691151591909117905550565b600160009054906101000a90046001600160a01b03166001600160a01b0316630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b15801561212057600080fd5b505afa158015612134573d6000803e3d6000fd5b505050506040513d602081101561214a57600080fd5b50516000906001600160a01b031633146121bd5760405162461bcd60e51b81526020600482019081528254600260001961010060018416150201909116046024830181905290918291604490910190849080156107785780601f1061074d57610100808354040283529160200191610778565b50600180546001600160a01b0319166001600160a01b0383169081179091556040517f2f658b440c35314f52658ea8a740e05b284cdc84dc9ae01e891f21b8933e7cad90600090a250565b600160009054906101000a90046001600160a01b03166001600160a01b0316630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b15801561225657600080fd5b505afa15801561226a573d6000803e3d6000fd5b505050506040513d602081101561228057600080fd5b50516000906001600160a01b031633146122f35760405162461bcd60e51b81526020600482019081528254600260001961010060018416150201909116046024830181905290918291604490910190849080156107785780601f1061074d57610100808354040283529160200191610778565b50600b5460ff161515600114612350576040805162461bcd60e51b815260206004820152601960248201527f74696d656c6f636b20616c72656164792064697361626c656400000000000000604482015290519081900360640190fd5b600c5415801590612363575043600c5411155b1561237757600b805460ff191690556123a9565b6123a56116097f00000000000000000000000000000000000000000000000000000000000000006007613912565b600c555b565b600160009054906101000a90046001600160a01b03166001600160a01b0316630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b1580156123f957600080fd5b505afa15801561240d573d6000803e3d6000fd5b505050506040513d602081101561242357600080fd5b50516000906001600160a01b031633146124965760405162461bcd60e51b81526020600482019081528254600260001961010060018416150201909116046024830181905290918291604490910190849080156107785780601f1061074d57610100808354040283529160200191610778565b50600b54610100900460ff16156124ea576040805162461bcd60e51b8152602060048201526013602482015272105b1c9958591e481a5b9a5d1a585b1a5e9959606a1b604482015290519081900360640190fd5b600b805461ff001960ff1990911660011716610100179055565b60006009547f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561256257600080fd5b505afa158015612576573d6000803e3d6000fd5b505050506040513d602081101561258c57600080fd5b505103905090565b60075481565b60008060606003600085600a8111156125af57fe5b600a8111156125ba57fe5b815260200190815260200160002080548060200260200160405190810160405280929190818152602001828054801561261c57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116125fe575b5050505050905060005b81518110156126715781818151811061263b57fe5b60200260200101516001600160a01b0316866001600160a01b031614156126695760019350915061267b9050565b600101612626565b5060008092509250505b9250929050565b600160009054906101000a90046001600160a01b03166001600160a01b0316630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b1580156126d057600080fd5b505afa1580156126e4573d6000803e3d6000fd5b505050506040513d60208110156126fa57600080fd5b50516000906001600160a01b0316331461276d5760405162461bcd60e51b81526020600482019081528254600260001961010060018416150201909116046024830181905290918291604490910190849080156107785780601f1061074d57610100808354040283529160200191610778565b506001600160a01b03909116600090815260066020526040902055565b600360205281600052604060002081815481106127a657600080fd5b6000918252602090912001546001600160a01b03169150829050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600b5460ff1681565b600c5481565b6001600160a01b0382166000908152600080516020613ca3833981519152602052604081205460ff16156128c15760046000805b600a81111561283457fe5b815260208082019290925260409081016000908120338252909252902054600e9060ff166128bb5760405162461bcd60e51b81526020600482019081528254600260001961010060018416150201909116046024830181905290918291604490910190849080156107785780601f1061074d57610100808354040283529160200191610778565b5061295a565b6001600160a01b0383166000908152600080516020613c62833981519152602052604090205460ff16156128f9576004600081612829565b60405162461bcd60e51b8152602060048201908152600f8054600260001961010060018416150201909116046024840181905290928291604490910190849080156107785780601f1061074d57610100808354040283529160200191610778565b61296f6001600160a01b03841633308761396b565b600061297b8486613026565b90506129878184613713565b91507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166340c10f1933846040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b158015612a0057600080fd5b505af1158015612a14573d6000803e3d6000fd5b5050600754612a2692509050826138b8565b600755604080518681526020810183905281516001600160a01b038716927f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a15928290030190a2509392505050565b6001546001600160a01b031681565b7f000000000000000000000000000000000000000000000000000000000000000081565b3360009081527fbeb3bad75134cb432e5707980e3245c52c5998a1125ee30f2f0dbf3925b1e5516020526040902054600e9060ff16612b3f5760405162461bcd60e51b81526020600482019081528254600260001961010060018416150201909116046024830181905290918291604490910190849080156107785780601f1061074d57610100808354040283529160200191610778565b506001600160a01b0381166000908152600080516020613ca38339815191526020526040902054600d9060ff16612bcf5760405162461bcd60e51b81526020600482019081528254600260001961010060018416150201909116046024830181905290918291604490910190849080156107785780601f1061074d57610100808354040283529160200191610778565b50612be56001600160a01b03821633308561396b565b6000612bf18284613026565b6002546040805163ae5c6cd360e01b81526004810184905233602482015260006044820181905291519394506001600160a01b039092169263ae5c6cd392606480820193929182900301818387803b158015612c4c57600080fd5b505af1158015612c60573d6000803e3d6000fd5b5050600854612c729250905082613713565b600855600754612c8290826138b8565b600755604080518481526020810183905281516001600160a01b0385169233927fc6d98eecfc9c78ab62c89a82950079b54874749f1f6f24090f7acc758bc2f309929081900390910190a3505050565b600160009054906101000a90046001600160a01b03166001600160a01b0316630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b158015612d2057600080fd5b505afa158015612d34573d6000803e3d6000fd5b505050506040513d6020811015612d4a57600080fd5b50516000906001600160a01b03163314612dbd5760405162461bcd60e51b81526020600482019081528254600260001961010060018416150201909116046024830181905290918291604490910190849080156107785780601f1061074d57610100808354040283529160200191610778565b50600b5460ff1615612e0a576040805162461bcd60e51b815260206004820152601160248201527055736520717565756554696d656c6f636b60781b604482015290519081900360640190fd5b600983600a811115612e1857fe5b1415612e3e57600280546001600160a01b0319166001600160a01b038416179055612fd1565b60016004600085600a811115612e5057fe5b600a811115612e5b57fe5b8152602080820192909252604090810160009081206001600160a01b03871682529092529020805460ff1916911515919091179055600583600a811115612e9e57fe5b1415612ed3576001600160a01b03828116600090815260056020526040902080546001600160a01b0319169183169190911790555b6000612edf838561259a565b50905080612fcf576003600085600a811115612ef757fe5b600a811115612f0257fe5b8152602080820192909252604001600090812080546001810182559082529190200180546001600160a01b0319166001600160a01b038516179055600584600a811115612f4b57fe5b1480612f625750600284600a811115612f6057fe5b145b15612fcf57600080612f74858761259a565b915091508115612fcc576003600087600a811115612f8e57fe5b600a811115612f9957fe5b81526020019081526020016000208181548110612fb257fe5b600091825260209091200180546001600160a01b03191690555b50505b505b82600a811115612fdd57fe5b604080516001600160a01b03851681526001602082015281517f7531a7aefe3985500c4dec2dcb6049a708f14c6a8a9022b435b8841bdb8e1713929181900390910190a2505050565b600061313d836001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561306457600080fd5b505afa158015613078573d6000803e3d6000fd5b505050506040513d602081101561308e57600080fd5b50516040805163313ce56760e01b8152905160ff909216600a0a91613137916001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169163313ce56791600480820192602092909190829003018186803b1580156130fe57600080fd5b505afa158015613112573d6000803e3d6000fd5b505050506040513d602081101561312857600080fd5b5051859060ff16600a0a613912565b90613ad5565b6001600160a01b0384166000908152600080516020613c62833981519152602052604090205490915060ff16156131fe576001600160a01b03808416600081815260056020908152604091829020548251634249719f60e01b815260048101949094526024840187905291519190931692634249719f9260448082019391829003018186803b1580156131cf57600080fd5b505afa1580156131e3573d6000803e3d6000fd5b505050506040513d60208110156131f957600080fd5b505190505b92915050565b60085481565b600b5460ff161515600114613266576040805162461bcd60e51b815260206004820181905260248201527f54696d656c6f636b2069732064697361626c65642c2075736520656e61626c65604482015290519081900360640190fd5b61326e613c2a565b600a828154811061327b57fe5b600091825260209091206040805160c081019091526004909202018054829060ff16600a8111156132a857fe5b600a8111156132b357fe5b815281546001600160a01b03610100918290048116602084015260018401541660408301526002830154606083015260039092015460ff80821615156080808501919091529390910416151560a0909101528101519091501561335d576040805162461bcd60e51b815260206004820152601960248201527f416374696f6e20686173206265656e206e756c6c696669656400000000000000604482015290519081900360640190fd5b8060a00151156133b4576040805162461bcd60e51b815260206004820181905260248201527f416374696f6e2068617320616c7265616479206265656e206578656375746564604482015290519081900360640190fd5b8060600151431015613405576040805162461bcd60e51b815260206004820152601560248201527454696d656c6f636b206e6f7420636f6d706c65746560581b604482015290519081900360640190fd5b60098151600a81111561341457fe5b1415613443576020810151600280546001600160a01b0319166001600160a01b0390921691909117905561367b565b6001600460008360000151600a81111561345957fe5b600a81111561346457fe5b815260208082019290925260409081016000908120858401516001600160a01b031682529092529020805460ff191691151591909117905560058151600a8111156134ab57fe5b14156134ec576040818101516020808401516001600160a01b039081166000908152600590925292902080546001600160a01b031916929091169190911790555b60006135008260200151836000015161259a565b5090508061367957600360008360000151600a81111561351c57fe5b600a81111561352757fe5b81526020808201929092526040016000908120848301518154600181018355918352929091200180546001600160a01b0319166001600160a01b0390921691909117905560058251600a81111561357a57fe5b14156135f4576000806135928460200151600261259a565b9150915081156135ed57600260005260036020527fc3a24b0501bd2c13a7e57f2db4369ec4c223447539fc0724a9d55ac4a06ebd4d8054829081106135d357fe5b600091825260209091200180546001600160a01b03191690555b5050613679565b60028251600a81111561360357fe5b14156136795760008061361b8460200151600561259a565b91509150811561367657600560005260036020527f405aad32e1adbac89bb7f176e338b8fc6e994ca210c9bb7bdca249b46594225080548290811061365c57fe5b600091825260209091200180546001600160a01b03191690555b50505b505b6001600a838154811061368a57fe5b6000918252602090912060036004909202010180549115156101000261ff00199092169190911790558051600a8111156136c057fe5b7f7531a7aefe3985500c4dec2dcb6049a708f14c6a8a9022b435b8841bdb8e17138260200151600160405180836001600160a01b0316815260200182151581526020019250505060405180910390a25050565b600061375583836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613b17565b9392505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b178152925182516000946060949389169392918291908083835b602083106137d95780518252601f1990920191602091820191016137ba565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d806000811461383b576040519150601f19603f3d011682016040523d82523d6000602084013e613840565b606091505b509150915081801561386e57508051158061386e575080806020019051602081101561386b57600080fd5b50515b6138b1576040805162461bcd60e51b815260206004820152600f60248201526e1514905394d1915497d19052531151608a1b604482015290519081900360640190fd5b5050505050565b600082820183811015613755576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600082613921575060006131fe565b8282028284828161392e57fe5b04146137555760405162461bcd60e51b8152600401808060200182810382526021815260200180613c826021913960400191505060405180910390fd5b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17815292518251600094606094938a169392918291908083835b602083106139f05780518252601f1990920191602091820191016139d1565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613a52576040519150601f19603f3d011682016040523d82523d6000602084013e613a57565b606091505b5091509150818015613a85575080511580613a855750808060200190516020811015613a8257600080fd5b50515b613acd576040805162461bcd60e51b81526020600482015260146024820152731514905394d1915497d19493d357d1905253115160621b604482015290519081900360640190fd5b505050505050565b600061375583836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613bae565b60008184841115613ba65760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613b6b578181015183820152602001613b53565b50505050905090810190601f168015613b985780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60008183613bfd5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315613b6b578181015183820152602001613b53565b506000838581613c0957fe5b049050838581613c1557fe5b06818502018514613c2257fe5b949350505050565b6040805160c08101909152806000815260006020820181905260408201819052606082018190526080820181905260a0909101529056fe04cde762ef08b6b6c5ded8e8c4c0b3f4e5c9ad7342c88fcc93681b4588b73f05536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7791da3fd0782e51c6b3986e9e672fd566868e71f3dbc2d6c2cd6fbb3e361af2a7a264697066735822122066aa62093962779da8f389172be79978b48d4f17837919e8f4a03dd1d4274cc664736f6c6343000705003300000000000000000000000064aa3364f17a4d01c6f1751fd97c2bd3d7e7f1d500000000000000000000000000000000000000000000000000000000000019c80000000000000000000000001c21f8ea7e39e2ba00bc12d2968d63f4acb38b7a

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061021b5760003560e01c80637d921af011610125578063b39df88e116100ad578063d796ffb81161007c578063d796ffb81461060a578063e4e33ef814610636578063f18217831461066d578063fc7b9c1814610699578063fe0d94c1146106a15761021b565b8063b39df88e146105c0578063bc157ac1146105c8578063bf7e214f146105fa578063d07f390f146106025761021b565b806393988b53116100f457806393988b53146105145780639edd8d431461055e578063a44b82871461058a578063a6c41fec146105b0578063b320f6a9146105b85761021b565b80637d921af0146104f45780638129fc1c146104fc578063860f5048146105045780638f840ddd1461050c5761021b565b80632b7ce500116101a8578063503edcf011610177578063503edcf0146103e5578063529918311461045c5780635619004b1461048b57806371a45c95146104b15780637a9e5e4b146104ce5761021b565b80632b7ce5001461037a578063330dd34514610382578063341f9688146103b157806340c10f19146103b95761021b565b806312422d23116101ef57806312422d23146102b157806315079925146102dd578063158ef93e146103015780631af4da701461031d5780631d6d5f05146103435761021b565b8062f714ce146102205780630b0eee301461024e5780630c3513a81461027a5780630f70431f14610294575b600080fd5b61024c6004803603604081101561023657600080fd5b50803590602001356001600160a01b03166106be565b005b61024c6004803603604081101561026457600080fd5b506001600160a01b03813516906020013561092b565b610282610bd8565b60408051918252519081900360200190f35b61024c600480360360208110156102aa57600080fd5b5035610c7c565b61024c600480360360408110156102c757600080fd5b50803590602001356001600160a01b0316610ecf565b6102e56113f0565b604080516001600160a01b039092168252519081900360200190f35b6103096113ff565b604080519115158252519081900360200190f35b6102e56004803603602081101561033357600080fd5b50356001600160a01b031661140d565b61024c6004803603606081101561035957600080fd5b5060ff813516906001600160a01b0360208201358116916040013516611428565b61024c611763565b6103096004803603604081101561039857600080fd5b50803560ff1690602001356001600160a01b0316611b3d565b610282611b5d565b61024c600480360360408110156103cf57600080fd5b506001600160a01b038135169060200135611b63565b610402600480360360208110156103fb57600080fd5b5035611d41565b6040518087600a81111561041257fe5b8152602001866001600160a01b03168152602001856001600160a01b0316815260200184815260200183151581526020018215158152602001965050505050505060405180910390f35b61024c6004803603604081101561047257600080fd5b50803560ff1690602001356001600160a01b0316611d98565b610282600480360360208110156104a157600080fd5b50356001600160a01b0316611fa0565b61024c600480360360208110156104c757600080fd5b5035611fb2565b61024c600480360360208110156104e457600080fd5b50356001600160a01b03166120d2565b61024c612208565b61024c6123ab565b610282612504565b610282612594565b6105436004803603604081101561052a57600080fd5b5080356001600160a01b0316906020013560ff1661259a565b60408051921515835260208301919091528051918290030190f35b61024c6004803603604081101561057457600080fd5b506001600160a01b038135169060200135612682565b6102e5600480360360408110156105a057600080fd5b5060ff813516906020013561278a565b6102e56127c2565b6103096127e6565b6102826127ef565b610282600480360360608110156105de57600080fd5b508035906001600160a01b0360208201351690604001356127f5565b6102e5612a74565b610282612a83565b61024c6004803603604081101561062057600080fd5b50803590602001356001600160a01b0316612aa7565b61024c6004803603606081101561064c57600080fd5b5060ff813516906001600160a01b0360208201358116916040013516612cd2565b6102826004803603604081101561068357600080fd5b506001600160a01b038135169060200135613026565b610282613204565b61024c600480360360208110156106b757600080fd5b503561320a565b6001600160a01b0381166000908152600080516020613ca38339815191526020526040902054600d9060ff166107875760405162461bcd60e51b81526020600482019081528254600260001961010060018416150201909116046024830181905290918291604490910190849080156107785780601f1061074d57610100808354040283529160200191610778565b820191906000526020600020905b81548152906001019060200180831161075b57829003601f168201915b50509250505060405180910390fd5b503360009081527fabd6e7cb50984ff9c2f3e18a2660c3353dadf4e3291deeb275dae2cd1e44fe056020526040902054600e9060ff166108205760405162461bcd60e51b81526020600482019081528254600260001961010060018416150201909116046024830181905290918291604490910190849080156107785780601f1061074d57610100808354040283529160200191610778565b50600061082d8284613026565b90507f00000000000000000000000064aa3364f17a4d01c6f1751fd97c2bd3d7e7f1d56001600160a01b03166379cc679033836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b1580156108a657600080fd5b505af11580156108ba573d6000803e3d6000fd5b50506007546108cc9250905082613713565b6007556108e36001600160a01b038316338561375c565b604080518481526020810183905281516001600160a01b038516927fdf273cb619d95419a9cd0ec88123a0538c85064229baa6363788f743fff90deb928290030190a2505050565b6001600160a01b0382166000908152600080516020613c62833981519152602052604090205460ff16156109f7573360009081527fc59312466997bb42aaaf719ece141047820e6b34531e1670dc1852a453648f0f6020526040902054600e9060ff166109f15760405162461bcd60e51b81526020600482019081528254600260001961010060018416150201909116046024830181905290918291604490910190849080156107785780601f1061074d57610100808354040283529160200191610778565b50610a91565b3360009081527f2e174c10e159ea99b867ce3205125c24a42d128804e4070ed6fcc8cc98166aa06020526040902054600e9060ff16610a8f5760405162461bcd60e51b81526020600482019081528254600260001961010060018416150201909116046024830181905290918291604490910190849080156107785780601f1061074d57610100808354040283529160200191610778565b505b6001600160a01b0382166000908152600080516020613ca3833981519152602052604090205460ff1680610aea57506001600160a01b0382166000908152600080516020613c62833981519152602052604090205460ff165b15610b81576000610afb8383613026565b9050610b05610bd8565b811115601090610b6e5760405162461bcd60e51b81526020600482019081528254600260001961010060018416150201909116046024830181905290918291604490910190849080156107785780601f1061074d57610100808354040283529160200191610778565b50600754610b7c9082613713565b600755505b610b956001600160a01b038316338361375c565b6040805182815290516001600160a01b038416917fb4460e34f1e91c4fa28eb7fac4cbd88cf530ef54a67e1978cd5edd9f77033ead919081900360200190a25050565b6000610c77610c6e6008547f00000000000000000000000064aa3364f17a4d01c6f1751fd97c2bd3d7e7f1d56001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015610c3c57600080fd5b505afa158015610c50573d6000803e3d6000fd5b505050506040513d6020811015610c6657600080fd5b505190613713565b60075490613713565b905090565b3360009081527fbeb3bad75134cb432e5707980e3245c52c5998a1125ee30f2f0dbf3925b1e551602052604090205460ff1680610ce757503360009081527f5c6b02db8b672415ffad906d7ccee10bd53dbad7d0b29e2bc0e50c93d5f31093602052604090205460ff165b600e90610d4d5760405162461bcd60e51b81526020600482019081528254600260001961010060018416150201909116046024830181905290918291604490910190849080156107785780601f1061074d57610100808354040283529160200191610778565b506040805163079cc67960e41b81523360048201526024810183905290516001600160a01b037f00000000000000000000000064aa3364f17a4d01c6f1751fd97c2bd3d7e7f1d516916379cc679091604480830192600092919082900301818387803b158015610dbc57600080fd5b505af1158015610dd0573d6000803e3d6000fd5b50506002546040805163ae5c6cd360e01b81526004810186905233602482015260006044820181905291516001600160a01b03909316945063ae5c6cd393506064808201939182900301818387803b158015610e2b57600080fd5b505af1158015610e3f573d6000803e3d6000fd5b5050600854610e519250905082613713565b600855600954610e619082613713565b600955604080518281526020810183905281516001600160a01b037f00000000000000000000000064aa3364f17a4d01c6f1751fd97c2bd3d7e7f1d5169233927fc6d98eecfc9c78ab62c89a82950079b54874749f1f6f24090f7acc758bc2f309929081900390910190a350565b60007f00000000000000000000000064aa3364f17a4d01c6f1751fd97c2bd3d7e7f1d56001600160a01b0316826001600160a01b03161415610fac573360009081527f5c6b02db8b672415ffad906d7ccee10bd53dbad7d0b29e2bc0e50c93d5f310936020526040902054600e9060ff16610fa35760405162461bcd60e51b81526020600482019081528254600260001961010060018416150201909116046024830181905290918291604490910190849080156107785780601f1061074d57610100808354040283529160200191610778565b508290506110e2565b3360009081527fbeb3bad75134cb432e5707980e3245c52c5998a1125ee30f2f0dbf3925b1e5516020526040902054600e9060ff166110445760405162461bcd60e51b81526020600482019081528254600260001961010060018416150201909116046024830181905290918291604490910190849080156107785780601f1061074d57610100808354040283529160200191610778565b506001600160a01b0382166000908152600080516020613ca38339815191526020526040902054600d9060ff166110d45760405162461bcd60e51b81526020600482019081528254600260001961010060018416150201909116046024830181905290918291604490910190849080156107785780601f1061074d57610100808354040283529160200191610778565b506110df8284613026565b90505b600f816111485760405162461bcd60e51b81526020600482019081528254600260001961010060018416150201909116046024830181905290918291604490910190849080156107785780601f1061074d57610100808354040283529160200191610778565b506002546040805163ae5c6cd360e01b8152600481018490523360248201526001604482015290516001600160a01b039092169163ae5c6cd39160648082019260009290919082900301818387803b1580156111a357600080fd5b505af11580156111b7573d6000803e3d6000fd5b50503360008181526006602090815260409182902054600254835163313bc71360e21b8152600481019590955292519095506001600160a01b03909216935063c4ef1c4c9260248082019391829003018186803b15801561121757600080fd5b505afa15801561122b573d6000803e3d6000fd5b505050506040513d602081101561124157600080fd5b50511115611296576040805162461bcd60e51b815260206004820152601760248201527f54726561737572793a2065786365656473206c696d6974000000000000000000604482015290519081900360640190fd5b6008546112a390826138b8565b6008819055507f00000000000000000000000064aa3364f17a4d01c6f1751fd97c2bd3d7e7f1d56001600160a01b0316826001600160a01b0316141561137f57604080516340c10f1960e01b81523360048201526024810183905290516001600160a01b037f00000000000000000000000064aa3364f17a4d01c6f1751fd97c2bd3d7e7f1d516916340c10f1991604480830192600092919082900301818387803b15801561135157600080fd5b505af1158015611365573d6000803e3d6000fd5b505060095461137792509050826138b8565b6009556113a3565b60075461138c9082613713565b6007556113a36001600160a01b038316338561375c565b604080518481526020810183905281516001600160a01b0385169233927f7e1a939bed137a819b5d2979822c67f877689f7a863d5e4cb57cdca97b2977d6929081900390910190a3505050565b6002546001600160a01b031681565b600b54610100900460ff1681565b6005602052600090815260409020546001600160a01b031681565b600160009054906101000a90046001600160a01b03166001600160a01b0316630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b15801561147657600080fd5b505afa15801561148a573d6000803e3d6000fd5b505050506040513d60208110156114a057600080fd5b50516000906001600160a01b031633146115135760405162461bcd60e51b81526020600482019081528254600260001961010060018416150201909116046024830181905290918291604490910190849080156107785780601f1061074d57610100808354040283529160200191610778565b506001600160a01b03821661152757600080fd5b600b5460ff161515600114611583576040805162461bcd60e51b815260206004820181905260248201527f54696d656c6f636b2069732064697361626c65642c2075736520656e61626c65604482015290519081900360640190fd5b60006115af437f00000000000000000000000000000000000000000000000000000000000019c86138b8565b9050600384600a8111156115bf57fe5b14806115d65750600684600a8111156115d457fe5b145b15611613576116106116097f00000000000000000000000000000000000000000000000000000000000019c86002613912565b43906138b8565b90505b600a6040518060c0016040528086600a81111561162c57fe5b81526001600160a01b0380871660208084019190915290861660408301526060820185905260006080830181905260a090920182905283546001818101865594835291208251600490920201805492939092839160ff199091169083600a81111561169357fe5b021790555060208201518154610100600160a81b0319166101006001600160a01b03928316810291909117835560408401516001840180546001600160a01b03191691909316179091556060830151600283015560808301516003909201805460a09094015160ff199094169215159290921761ff0019169215150291909117905583600a81111561172157fe5b604080516001600160a01b038616815290517fc822ff41836a6dc998393c71843db8adcbbf01721f41b32389f6838ecb1ea9c89181900360200190a250505050565b600160009054906101000a90046001600160a01b03166001600160a01b0316630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b1580156117b157600080fd5b505afa1580156117c5573d6000803e3d6000fd5b505050506040513d60208110156117db57600080fd5b50516000906001600160a01b0316331461184e5760405162461bcd60e51b81526020600482019081528254600260001961010060018416150201909116046024830181905290918291604490910190849080156107785780601f1061074d57610100808354040283529160200191610778565b5060026000908152600360209081527fc3a24b0501bd2c13a7e57f2db4369ec4c223447539fc0724a9d55ac4a06ebd4d80546040805182850281018501909152818152606093909291908301828280156118d157602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116118b3575b5050505050905060005b81518110156119f8576002600090815260046020528251600080516020613ca3833981519152919084908490811061190f57fe5b6020908102919091018101516001600160a01b031682528101919091526040016000205460ff16156119f0576119ed6119e683838151811061194d57fe5b602002602001015184848151811061196157fe5b60200260200101516001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156119b557600080fd5b505afa1580156119c9573d6000803e3d6000fd5b505050506040513d60208110156119df57600080fd5b5051613026565b84906138b8565b92505b6001016118db565b506005600052600360209081527f405aad32e1adbac89bb7f176e338b8fc6e994ca210c9bb7bdca249b4659422508054604080518285028101850190915281815260609390929190830182828015611a7957602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611a5b575b5050505050905060005b8151811015611b07576005600090815260046020528251600080516020613c628339815191529190849084908110611ab757fe5b6020908102919091018101516001600160a01b031682528101919091526040016000205460ff1615611aff57611afc611af583838151811061194d57fe5b85906138b8565b93505b600101611a83565b50600783905560405183907fec691f09f6924b27932253f85caf99bacc30360cc0e50a1cc4d2acc24601446690600090a2505050565b600460209081526000928352604080842090915290825290205460ff1681565b60095481565b3360009081527f2645749a946633740611cfc8178319f0958659d6922e4bf7e3a08b44789f53a46020526040902054600e9060ff16611bfb5760405162461bcd60e51b81526020600482019081528254600260001961010060018416150201909116046024830181905290918291604490910190849080156107785780601f1061074d57610100808354040283529160200191610778565b50611c04610bd8565b811115601090611c6d5760405162461bcd60e51b81526020600482019081528254600260001961010060018416150201909116046024830181905290918291604490910190849080156107785780601f1061074d57610100808354040283529160200191610778565b507f00000000000000000000000064aa3364f17a4d01c6f1751fd97c2bd3d7e7f1d56001600160a01b03166340c10f1983836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b158015611ce557600080fd5b505af1158015611cf9573d6000803e3d6000fd5b50506040805184815290516001600160a01b03861693503392507f9d228d69b5fdb8d273a2336f8fb8612d039631024ea9bf09c424a9503aa078f09181900360200190a35050565b600a8181548110611d5157600080fd5b6000918252602090912060049091020180546001820154600283015460039093015460ff80841695506001600160a01b036101009485900481169593169382821692041686565b600160009054906101000a90046001600160a01b03166001600160a01b0316630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b158015611de657600080fd5b505afa158015611dfa573d6000803e3d6000fd5b505050506040513d6020811015611e1057600080fd5b50516001600160a01b0316331480611ea95750600160009054906101000a90046001600160a01b03166001600160a01b031663452a93206040518163ffffffff1660e01b815260040160206040518083038186803b158015611e7157600080fd5b505afa158015611e85573d6000803e3d6000fd5b505050506040513d6020811015611e9b57600080fd5b50516001600160a01b031633145b611efa576040805162461bcd60e51b815260206004820152601960248201527f4f6e6c7920676f7665726e6f72206f7220677561726469616e00000000000000604482015290519081900360640190fd5b60006004600084600a811115611f0c57fe5b600a811115611f1757fe5b8152602080820192909252604090810160009081206001600160a01b03861682529092529020805460ff191691151591909117905581600a811115611f5857fe5b604080516001600160a01b03841681526000602082015281517f7531a7aefe3985500c4dec2dcb6049a708f14c6a8a9022b435b8841bdb8e1713929181900390910190a25050565b60066020526000908152604090205481565b600160009054906101000a90046001600160a01b03166001600160a01b0316630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b15801561200057600080fd5b505afa158015612014573d6000803e3d6000fd5b505050506040513d602081101561202a57600080fd5b50516000906001600160a01b0316331461209d5760405162461bcd60e51b81526020600482019081528254600260001961010060018416150201909116046024830181905290918291604490910190849080156107785780601f1061074d57610100808354040283529160200191610778565b506001600a82815481106120ad57fe5b60009182526020909120600490910201600301805460ff191691151591909117905550565b600160009054906101000a90046001600160a01b03166001600160a01b0316630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b15801561212057600080fd5b505afa158015612134573d6000803e3d6000fd5b505050506040513d602081101561214a57600080fd5b50516000906001600160a01b031633146121bd5760405162461bcd60e51b81526020600482019081528254600260001961010060018416150201909116046024830181905290918291604490910190849080156107785780601f1061074d57610100808354040283529160200191610778565b50600180546001600160a01b0319166001600160a01b0383169081179091556040517f2f658b440c35314f52658ea8a740e05b284cdc84dc9ae01e891f21b8933e7cad90600090a250565b600160009054906101000a90046001600160a01b03166001600160a01b0316630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b15801561225657600080fd5b505afa15801561226a573d6000803e3d6000fd5b505050506040513d602081101561228057600080fd5b50516000906001600160a01b031633146122f35760405162461bcd60e51b81526020600482019081528254600260001961010060018416150201909116046024830181905290918291604490910190849080156107785780601f1061074d57610100808354040283529160200191610778565b50600b5460ff161515600114612350576040805162461bcd60e51b815260206004820152601960248201527f74696d656c6f636b20616c72656164792064697361626c656400000000000000604482015290519081900360640190fd5b600c5415801590612363575043600c5411155b1561237757600b805460ff191690556123a9565b6123a56116097f00000000000000000000000000000000000000000000000000000000000019c86007613912565b600c555b565b600160009054906101000a90046001600160a01b03166001600160a01b0316630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b1580156123f957600080fd5b505afa15801561240d573d6000803e3d6000fd5b505050506040513d602081101561242357600080fd5b50516000906001600160a01b031633146124965760405162461bcd60e51b81526020600482019081528254600260001961010060018416150201909116046024830181905290918291604490910190849080156107785780601f1061074d57610100808354040283529160200191610778565b50600b54610100900460ff16156124ea576040805162461bcd60e51b8152602060048201526013602482015272105b1c9958591e481a5b9a5d1a585b1a5e9959606a1b604482015290519081900360640190fd5b600b805461ff001960ff1990911660011716610100179055565b60006009547f00000000000000000000000064aa3364f17a4d01c6f1751fd97c2bd3d7e7f1d56001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561256257600080fd5b505afa158015612576573d6000803e3d6000fd5b505050506040513d602081101561258c57600080fd5b505103905090565b60075481565b60008060606003600085600a8111156125af57fe5b600a8111156125ba57fe5b815260200190815260200160002080548060200260200160405190810160405280929190818152602001828054801561261c57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116125fe575b5050505050905060005b81518110156126715781818151811061263b57fe5b60200260200101516001600160a01b0316866001600160a01b031614156126695760019350915061267b9050565b600101612626565b5060008092509250505b9250929050565b600160009054906101000a90046001600160a01b03166001600160a01b0316630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b1580156126d057600080fd5b505afa1580156126e4573d6000803e3d6000fd5b505050506040513d60208110156126fa57600080fd5b50516000906001600160a01b0316331461276d5760405162461bcd60e51b81526020600482019081528254600260001961010060018416150201909116046024830181905290918291604490910190849080156107785780601f1061074d57610100808354040283529160200191610778565b506001600160a01b03909116600090815260066020526040902055565b600360205281600052604060002081815481106127a657600080fd5b6000918252602090912001546001600160a01b03169150829050565b7f00000000000000000000000064aa3364f17a4d01c6f1751fd97c2bd3d7e7f1d581565b600b5460ff1681565b600c5481565b6001600160a01b0382166000908152600080516020613ca3833981519152602052604081205460ff16156128c15760046000805b600a81111561283457fe5b815260208082019290925260409081016000908120338252909252902054600e9060ff166128bb5760405162461bcd60e51b81526020600482019081528254600260001961010060018416150201909116046024830181905290918291604490910190849080156107785780601f1061074d57610100808354040283529160200191610778565b5061295a565b6001600160a01b0383166000908152600080516020613c62833981519152602052604090205460ff16156128f9576004600081612829565b60405162461bcd60e51b8152602060048201908152600f8054600260001961010060018416150201909116046024840181905290928291604490910190849080156107785780601f1061074d57610100808354040283529160200191610778565b61296f6001600160a01b03841633308761396b565b600061297b8486613026565b90506129878184613713565b91507f00000000000000000000000064aa3364f17a4d01c6f1751fd97c2bd3d7e7f1d56001600160a01b03166340c10f1933846040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b158015612a0057600080fd5b505af1158015612a14573d6000803e3d6000fd5b5050600754612a2692509050826138b8565b600755604080518681526020810183905281516001600160a01b038716927f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a15928290030190a2509392505050565b6001546001600160a01b031681565b7f00000000000000000000000000000000000000000000000000000000000019c881565b3360009081527fbeb3bad75134cb432e5707980e3245c52c5998a1125ee30f2f0dbf3925b1e5516020526040902054600e9060ff16612b3f5760405162461bcd60e51b81526020600482019081528254600260001961010060018416150201909116046024830181905290918291604490910190849080156107785780601f1061074d57610100808354040283529160200191610778565b506001600160a01b0381166000908152600080516020613ca38339815191526020526040902054600d9060ff16612bcf5760405162461bcd60e51b81526020600482019081528254600260001961010060018416150201909116046024830181905290918291604490910190849080156107785780601f1061074d57610100808354040283529160200191610778565b50612be56001600160a01b03821633308561396b565b6000612bf18284613026565b6002546040805163ae5c6cd360e01b81526004810184905233602482015260006044820181905291519394506001600160a01b039092169263ae5c6cd392606480820193929182900301818387803b158015612c4c57600080fd5b505af1158015612c60573d6000803e3d6000fd5b5050600854612c729250905082613713565b600855600754612c8290826138b8565b600755604080518481526020810183905281516001600160a01b0385169233927fc6d98eecfc9c78ab62c89a82950079b54874749f1f6f24090f7acc758bc2f309929081900390910190a3505050565b600160009054906101000a90046001600160a01b03166001600160a01b0316630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b158015612d2057600080fd5b505afa158015612d34573d6000803e3d6000fd5b505050506040513d6020811015612d4a57600080fd5b50516000906001600160a01b03163314612dbd5760405162461bcd60e51b81526020600482019081528254600260001961010060018416150201909116046024830181905290918291604490910190849080156107785780601f1061074d57610100808354040283529160200191610778565b50600b5460ff1615612e0a576040805162461bcd60e51b815260206004820152601160248201527055736520717565756554696d656c6f636b60781b604482015290519081900360640190fd5b600983600a811115612e1857fe5b1415612e3e57600280546001600160a01b0319166001600160a01b038416179055612fd1565b60016004600085600a811115612e5057fe5b600a811115612e5b57fe5b8152602080820192909252604090810160009081206001600160a01b03871682529092529020805460ff1916911515919091179055600583600a811115612e9e57fe5b1415612ed3576001600160a01b03828116600090815260056020526040902080546001600160a01b0319169183169190911790555b6000612edf838561259a565b50905080612fcf576003600085600a811115612ef757fe5b600a811115612f0257fe5b8152602080820192909252604001600090812080546001810182559082529190200180546001600160a01b0319166001600160a01b038516179055600584600a811115612f4b57fe5b1480612f625750600284600a811115612f6057fe5b145b15612fcf57600080612f74858761259a565b915091508115612fcc576003600087600a811115612f8e57fe5b600a811115612f9957fe5b81526020019081526020016000208181548110612fb257fe5b600091825260209091200180546001600160a01b03191690555b50505b505b82600a811115612fdd57fe5b604080516001600160a01b03851681526001602082015281517f7531a7aefe3985500c4dec2dcb6049a708f14c6a8a9022b435b8841bdb8e1713929181900390910190a2505050565b600061313d836001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561306457600080fd5b505afa158015613078573d6000803e3d6000fd5b505050506040513d602081101561308e57600080fd5b50516040805163313ce56760e01b8152905160ff909216600a0a91613137916001600160a01b037f00000000000000000000000064aa3364f17a4d01c6f1751fd97c2bd3d7e7f1d5169163313ce56791600480820192602092909190829003018186803b1580156130fe57600080fd5b505afa158015613112573d6000803e3d6000fd5b505050506040513d602081101561312857600080fd5b5051859060ff16600a0a613912565b90613ad5565b6001600160a01b0384166000908152600080516020613c62833981519152602052604090205490915060ff16156131fe576001600160a01b03808416600081815260056020908152604091829020548251634249719f60e01b815260048101949094526024840187905291519190931692634249719f9260448082019391829003018186803b1580156131cf57600080fd5b505afa1580156131e3573d6000803e3d6000fd5b505050506040513d60208110156131f957600080fd5b505190505b92915050565b60085481565b600b5460ff161515600114613266576040805162461bcd60e51b815260206004820181905260248201527f54696d656c6f636b2069732064697361626c65642c2075736520656e61626c65604482015290519081900360640190fd5b61326e613c2a565b600a828154811061327b57fe5b600091825260209091206040805160c081019091526004909202018054829060ff16600a8111156132a857fe5b600a8111156132b357fe5b815281546001600160a01b03610100918290048116602084015260018401541660408301526002830154606083015260039092015460ff80821615156080808501919091529390910416151560a0909101528101519091501561335d576040805162461bcd60e51b815260206004820152601960248201527f416374696f6e20686173206265656e206e756c6c696669656400000000000000604482015290519081900360640190fd5b8060a00151156133b4576040805162461bcd60e51b815260206004820181905260248201527f416374696f6e2068617320616c7265616479206265656e206578656375746564604482015290519081900360640190fd5b8060600151431015613405576040805162461bcd60e51b815260206004820152601560248201527454696d656c6f636b206e6f7420636f6d706c65746560581b604482015290519081900360640190fd5b60098151600a81111561341457fe5b1415613443576020810151600280546001600160a01b0319166001600160a01b0390921691909117905561367b565b6001600460008360000151600a81111561345957fe5b600a81111561346457fe5b815260208082019290925260409081016000908120858401516001600160a01b031682529092529020805460ff191691151591909117905560058151600a8111156134ab57fe5b14156134ec576040818101516020808401516001600160a01b039081166000908152600590925292902080546001600160a01b031916929091169190911790555b60006135008260200151836000015161259a565b5090508061367957600360008360000151600a81111561351c57fe5b600a81111561352757fe5b81526020808201929092526040016000908120848301518154600181018355918352929091200180546001600160a01b0319166001600160a01b0390921691909117905560058251600a81111561357a57fe5b14156135f4576000806135928460200151600261259a565b9150915081156135ed57600260005260036020527fc3a24b0501bd2c13a7e57f2db4369ec4c223447539fc0724a9d55ac4a06ebd4d8054829081106135d357fe5b600091825260209091200180546001600160a01b03191690555b5050613679565b60028251600a81111561360357fe5b14156136795760008061361b8460200151600561259a565b91509150811561367657600560005260036020527f405aad32e1adbac89bb7f176e338b8fc6e994ca210c9bb7bdca249b46594225080548290811061365c57fe5b600091825260209091200180546001600160a01b03191690555b50505b505b6001600a838154811061368a57fe5b6000918252602090912060036004909202010180549115156101000261ff00199092169190911790558051600a8111156136c057fe5b7f7531a7aefe3985500c4dec2dcb6049a708f14c6a8a9022b435b8841bdb8e17138260200151600160405180836001600160a01b0316815260200182151581526020019250505060405180910390a25050565b600061375583836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613b17565b9392505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b178152925182516000946060949389169392918291908083835b602083106137d95780518252601f1990920191602091820191016137ba565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d806000811461383b576040519150601f19603f3d011682016040523d82523d6000602084013e613840565b606091505b509150915081801561386e57508051158061386e575080806020019051602081101561386b57600080fd5b50515b6138b1576040805162461bcd60e51b815260206004820152600f60248201526e1514905394d1915497d19052531151608a1b604482015290519081900360640190fd5b5050505050565b600082820183811015613755576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600082613921575060006131fe565b8282028284828161392e57fe5b04146137555760405162461bcd60e51b8152600401808060200182810382526021815260200180613c826021913960400191505060405180910390fd5b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17815292518251600094606094938a169392918291908083835b602083106139f05780518252601f1990920191602091820191016139d1565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613a52576040519150601f19603f3d011682016040523d82523d6000602084013e613a57565b606091505b5091509150818015613a85575080511580613a855750808060200190516020811015613a8257600080fd5b50515b613acd576040805162461bcd60e51b81526020600482015260146024820152731514905394d1915497d19493d357d1905253115160621b604482015290519081900360640190fd5b505050505050565b600061375583836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613bae565b60008184841115613ba65760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613b6b578181015183820152602001613b53565b50505050905090810190601f168015613b985780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60008183613bfd5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315613b6b578181015183820152602001613b53565b506000838581613c0957fe5b049050838581613c1557fe5b06818502018514613c2257fe5b949350505050565b6040805160c08101909152806000815260006020820181905260408201819052606082018190526080820181905260a0909101529056fe04cde762ef08b6b6c5ded8e8c4c0b3f4e5c9ad7342c88fcc93681b4588b73f05536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7791da3fd0782e51c6b3986e9e672fd566868e71f3dbc2d6c2cd6fbb3e361af2a7a264697066735822122066aa62093962779da8f389172be79978b48d4f17837919e8f4a03dd1d4274cc664736f6c63430007050033

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

00000000000000000000000064aa3364f17a4d01c6f1751fd97c2bd3d7e7f1d500000000000000000000000000000000000000000000000000000000000019c80000000000000000000000001c21f8ea7e39e2ba00bc12d2968d63f4acb38b7a

-----Decoded View---------------
Arg [0] : _ohm (address): 0x64aa3364F17a4D01c6f1751Fd97C2BD3D7e7f1D5
Arg [1] : _timelock (uint256): 6600
Arg [2] : _authority (address): 0x1c21F8EA7e39E2BA00BC12d2968D63F4acb38b7A

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 00000000000000000000000064aa3364f17a4d01c6f1751fd97c2bd3d7e7f1d5
Arg [1] : 00000000000000000000000000000000000000000000000000000000000019c8
Arg [2] : 0000000000000000000000001c21f8ea7e39e2ba00bc12d2968d63f4acb38b7a


Deployed Bytecode Sourcemap

11330:17329:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15418:538;;;;;;;;;;;;;;;;-1:-1:-1;15418:538:0;;;;;;-1:-1:-1;;;;;15418:538:0;;:::i;:::-;;16101:728;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;16101:728:0;;;;;;;;:::i;27663:142::-;;;:::i;:::-;;;;;;;;;;;;;;;;19940:436;;;;;;;;;;;;;;;;-1:-1:-1;19940:436:0;;:::i;17999:1063::-;;;;;;;;;;;;;;;;-1:-1:-1;17999:1063:0;;;;;;-1:-1:-1;;;;;17999:1063:0;;:::i;12872:17::-;;;:::i;:::-;;;;-1:-1:-1;;;;;12872:17:0;;;;;;;;;;;;;;13351:23;;;:::i;:::-;;;;;;;;;;;;;;;;;;13018:49;;;;;;;;;;;;;;;;-1:-1:-1;13018:49:0;-1:-1:-1;;;;;13018:49:0;;:::i;24087:737::-;;;;;;;;;;;;;;;;-1:-1:-1;24087:737:0;;;;;-1:-1:-1;;;;;24087:737:0;;;;;;;;;;;;:::i;20583:872::-;;;:::i;12949:62::-;;;;;;;;;;;;;;;;-1:-1:-1;12949:62:0;;;;;;;;-1:-1:-1;;;;;12949:62:0;;:::i;13195:22::-;;;:::i;16971:319::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;16971:319:0;;;;;;;;:::i;13226:30::-;;;;;;;;;;;;;;;;-1:-1:-1;13226:30:0;;:::i;:::-;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;13226:30:0;;;;;;-1:-1:-1;;;;;13226:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23036:298;;;;;;;;;;;;;;;;-1:-1:-1;23036:298:0;;;;;;;;-1:-1:-1;;;;;23036:298:0;;:::i;13076:44::-;;;;;;;;;;;;;;;;-1:-1:-1;13076:44:0;-1:-1:-1;;;;;13076:44:0;;:::i;26672:112::-;;;;;;;;;;;;;;;;-1:-1:-1;26672:112:0;;:::i;2303:168::-;;;;;;;;;;;;;;;;-1:-1:-1;2303:168:0;-1:-1:-1;;;;;2303:168:0;;:::i;26856:394::-;;;:::i;27330:177::-;;;:::i;28540:116::-;;;:::i;13129:28::-;;;:::i;23443:346::-;;;;;;;;;;;;;;;;-1:-1:-1;23443:346:0;;-1:-1:-1;;;;;23443:346:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;21584:125;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;21584:125:0;;;;;;;;:::i;12898:44::-;;;;;;;;;;;;;;;;-1:-1:-1;12898:44:0;;;;;;;;;:::i;12840:25::-;;;:::i;13317:27::-;;;:::i;13383:40::-;;;:::i;14371:896::-;;;;;;;;;;;;;;;;-1:-1:-1;14371:896:0;;;-1:-1:-1;;;;;14371:896:0;;;;;;;;;;:::i;1491:34::-;;;:::i;13263:45::-;;;:::i;19229:579::-;;;;;;;;;;;;;;;;-1:-1:-1;19229:579:0;;;;;;-1:-1:-1;;;;;19229:579:0;;:::i;21877:1018::-;;;;;;;;;;;;;;;;-1:-1:-1;21877:1018:0;;;;;-1:-1:-1;;;;;21877:1018:0;;;;;;;;;;;;:::i;27970:391::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;27970:391:0;;;;;;;;:::i;13164:24::-;;;:::i;24923:1652::-;;;;;;;;;;;;;;;;-1:-1:-1;24923:1652:0;;:::i;15418:538::-;-1:-1:-1;;;;;15506:40:0;;:32;:40;;;-1:-1:-1;;;;;;;;;;;15506:32:0;:40;:32;:40;;;15548:11;;15506:40;;15498:62;;;;-1:-1:-1;;;15498:62:0;;;;;;;;;;;;-1:-1:-1;;15498:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;15659:10:0;15624:34;:46;;;:34;;:46;:34;:46;;;15672:11;;15624:46;;15616:68;;;;-1:-1:-1;;;15616:68:0;;;;;;;;;;;;-1:-1:-1;;15616:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15697:13;15713:27;15724:6;15732:7;15713:10;:27::i;:::-;15697:43;;15751:3;-1:-1:-1;;;;;15751:12:0;;15764:10;15776:5;15751:31;;;;;;;;;;;;;-1:-1:-1;;;;;15751:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;15811:13:0;;:24;;-1:-1:-1;15811:13:0;-1:-1:-1;15829:5:0;15811:17;:24::i;:::-;15795:13;:40;15848:48;-1:-1:-1;;;;;15848:27:0;;15876:10;15888:7;15848:27;:48::i;:::-;15914:34;;;;;;;;;;;;;;-1:-1:-1;;;;;15914:34:0;;;;;;;;;;;15418:538;;;:::o;16101:728::-;-1:-1:-1;;;;;16183:42:0;;:34;:42;;;-1:-1:-1;;;;;;;;;;;16183:34:0;:42;:34;:42;;;;;16179:246;;;16287:10;16250:36;:48;;;:36;;:48;:36;:48;;;16300:11;;16250:48;;16242:70;;;;-1:-1:-1;;;16242:70:0;;;;;;;;;;;;-1:-1:-1;;16242:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16179:246;;;16388:10;16353:34;:46;;;:34;;:46;:34;:46;;;16401:11;;16353:46;;16345:68;;;;-1:-1:-1;;;16345:68:0;;;;;;;;;;;;-1:-1:-1;;16345:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16179:246;-1:-1:-1;;;;;16439:40:0;;:32;:40;;;-1:-1:-1;;;;;;;;;;;16439:32:0;:40;:32;:40;;;;;;:86;;-1:-1:-1;;;;;;16483:42:0;;:34;:42;;;-1:-1:-1;;;;;;;;;;;16483:34:0;:42;:34;:42;;;;;16439:86;16435:288;;;16542:13;16558:27;16569:6;16577:7;16558:10;:27::i;:::-;16542:43;;16617:16;:14;:16::i;:::-;16608:5;:25;;16635:20;16600:56;;;;;-1:-1:-1;;;16600:56:0;;;;;;;;;;;;-1:-1:-1;;16600:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16687:13:0;;:24;;16705:5;16687:17;:24::i;:::-;16671:13;:40;-1:-1:-1;16435:288:0;16733:48;-1:-1:-1;;;;;16733:27:0;;16761:10;16773:7;16733:27;:48::i;:::-;16797:24;;;;;;;;-1:-1:-1;;;;;16797:24:0;;;;;;;;;;;;;16101:728;;:::o;27663:142::-;27719:7;27746:51;27764:32;27786:9;;27764:3;-1:-1:-1;;;;;27764:15:0;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27764:17:0;;:21;:32::i;:::-;27746:13;;;:17;:51::i;:::-;27739:58;;27663:142;:::o;19940:436::-;20045:10;20011:33;:45;;;:33;;:45;:33;:45;;;;;;:90;;-1:-1:-1;20090:10:0;20060:29;:41;;;:29;;:41;:29;:41;;;;;20011:90;20103:11;20003:112;;;;;-1:-1:-1;;;20003:112:0;;;;;;;;;;;;-1:-1:-1;;20003:112:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20126:33:0;;;-1:-1:-1;;;20126:33:0;;20139:10;20126:33;;;;;;;;;;;;-1:-1:-1;;;;;20126:3:0;:12;;;;:33;;;;;-1:-1:-1;;20126:33:0;;;;;;;-1:-1:-1;20126:12:0;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;20170:4:0;;:43;;;-1:-1:-1;;;20170:43:0;;;;;;;;20195:10;20170:43;;;;:4;:43;;;;;;;;-1:-1:-1;;;;;20170:4:0;;;;-1:-1:-1;20170:15:0;;-1:-1:-1;20170:43:0;;;;;;;;;;;:4;;:43;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;20236:9:0;;:22;;-1:-1:-1;20236:9:0;-1:-1:-1;20250:7:0;20236:13;:22::i;:::-;20224:9;:34;20279:7;;:20;;20291:7;20279:11;:20::i;:::-;20269:7;:30;20315:53;;;;;;;;;;;;;;-1:-1:-1;;;;;20345:3:0;20315:53;;20325:10;;20315:53;;;;;;;;;;;19940:436;:::o;17999:1063::-;18080:13;18126:3;-1:-1:-1;;;;;18108:22:0;:6;-1:-1:-1;;;;;18108:22:0;;18104:375;;;18185:10;18155:29;:41;;;:29;;:41;:29;:41;;;18198:11;;18155:41;;18147:63;;;;-1:-1:-1;;;18147:63:0;;;;;;;;;;;;-1:-1:-1;;18147:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18233:7;18225:15;;18104:375;;;18315:10;18281:33;:45;;;:33;;:45;:33;:45;;;18328:11;;18281:45;;18273:67;;;;-1:-1:-1;;;18273:67:0;;;;;;;;;;;;-1:-1:-1;;18273:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;18363:40:0;;:32;:40;;;-1:-1:-1;;;;;;;;;;;18363:32:0;:40;:32;:40;;;18405:11;;18363:40;;18355:62;;;;-1:-1:-1;;;18355:62:0;;;;;;;;;;;;-1:-1:-1;;18355:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18440:27;18451:6;18459:7;18440:10;:27::i;:::-;18432:35;;18104:375;18509:12;18497:10;18489:33;;;;-1:-1:-1;;;18489:33:0;;;;;;;;;;;;-1:-1:-1;;18489:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18535:4:0;;:40;;;-1:-1:-1;;;18535:40:0;;;;;;;;18558:10;18535:40;;;;:4;:40;;;;;;-1:-1:-1;;;;;18535:4:0;;;;:15;;:40;;;;;:4;;:40;;;;;;;;:4;;:40;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;18637:10:0;18627:21;;;;:9;:21;;;;;;;;;;18594:4;;:29;;-1:-1:-1;;;18594:29:0;;;;;;;;;;;18627:21;;-1:-1:-1;;;;;;18594:4:0;;;;-1:-1:-1;18594:17:0;;:29;;;;;;;;;;;:4;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18594:29:0;:54;;18586:90;;;;;-1:-1:-1;;;18586:90:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;18699:9;;:20;;18713:5;18699:13;:20::i;:::-;18687:9;:32;;;;18754:3;-1:-1:-1;;;;;18736:22:0;:6;-1:-1:-1;;;;;18736:22:0;;18732:261;;;18775:27;;;-1:-1:-1;;;18775:27:0;;18784:10;18775:27;;;;;;;;;;;;-1:-1:-1;;;;;18775:3:0;:8;;;;:27;;;;;-1:-1:-1;;18775:27:0;;;;;;;-1:-1:-1;18775:8:0;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;18827:7:0;;:18;;-1:-1:-1;18827:7:0;-1:-1:-1;18839:5:0;18827:11;:18::i;:::-;18817:7;:28;18732:261;;;18894:13;;:24;;18912:5;18894:17;:24::i;:::-;18878:13;:40;18933:48;-1:-1:-1;;;;;18933:27:0;;18961:10;18973:7;18933:27;:48::i;:::-;19008:46;;;;;;;;;;;;;;-1:-1:-1;;;;;19008:46:0;;;19019:10;;19008:46;;;;;;;;;;;17999:1063;;;:::o;12872:17::-;;;-1:-1:-1;;;;;12872:17:0;;:::o;13351:23::-;;;;;;;;;:::o;13018:49::-;;;;;;;;;;;;-1:-1:-1;;;;;13018:49:0;;:::o;24087:737::-;1830:9;;;;;;;;;-1:-1:-1;;;;;1830:9:0;-1:-1:-1;;;;;1830:18:0;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1830:20:0;1852:12;;-1:-1:-1;;;;;1816:34:0;:10;:34;1808:57;;;;-1:-1:-1;;;1808:57:0;;;;;;;;;;;;-1:-1:-1;;1808:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;24240:22:0;::::1;24232:31;;;::::0;::::1;;24282:15;::::0;::::1;;:23;;:15:::0;:23:::1;24274:68;;;::::0;;-1:-1:-1;;;24274:68:0;;::::1;;::::0;::::1;::::0;;;;;;;::::1;::::0;;;;;;;;;;;;;::::1;;24355:16;24374:38;:12;24391:20;24374:16;:38::i;:::-;24355:57:::0;-1:-1:-1;24438:21:0::1;24427:7;:32;;;;;;;;;:70;;;-1:-1:-1::0;24474:23:0::1;24463:7;:34;;;;;;;;;24427:70;24423:159;;;24525:45;24542:27;:20;24567:1;24542:24;:27::i;:::-;24525:12;::::0;:16:::1;:45::i;:::-;24514:56;;24423:159;24592:15;24627:127;;;;;;;;24644:7;24627:127;;;;;;;;::::0;;-1:-1:-1;;;;;24627:127:0;;::::1;;::::0;;::::1;::::0;;;;;;::::1;::::0;;;;;;;;;;-1:-1:-1;24627:127:0;;;;;;;;;;;;;24592:173;;24627:127;24592:173;;::::1;::::0;;;;;;;;;::::1;::::0;;::::1;;::::0;;;;;;;;-1:-1:-1;;24592:173:0;;::::1;::::0;;::::1;::::0;::::1;;;;;;;;::::0;;-1:-1:-1;24592:173:0::1;::::0;::::1;::::0;;;-1:-1:-1;;;;;;24592:173:0::1;;-1:-1:-1::0;;;;;24592:173:0;;::::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;::::0;-1:-1:-1;24592:173:0;::::1;::::0;;-1:-1:-1;;;;;;24592:173:0::1;::::0;;;::::1;;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;;::::1;::::0;;::::1;::::0;-1:-1:-1;;24592:173:0;;::::1;::::0;::::1;;::::0;;;::::1;-1:-1:-1::0;;24592:173:0::1;::::0;::::1;;;::::0;;;::::1;::::0;;24798:7;24781:35:::1;::::0;::::1;;;;;;;::::0;;-1:-1:-1;;;;;24781:35:0;::::1;::::0;;;;::::1;::::0;;;;::::1;::::0;;::::1;1876:1;24087:737:::0;;;:::o;20583:872::-;1830:9;;;;;;;;;-1:-1:-1;;;;;1830:9:0;-1:-1:-1;;;;;1830:18:0;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1830:20:0;1852:12;;-1:-1:-1;;;;;1816:34:0;:10;:34;1808:57;;;;-1:-1:-1;;;1808:57:0;;;;;;;;;;;;-1:-1:-1;;1808:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20709:19:0::1;20641:16;20700:29:::0;;;:8:::1;:29;::::0;;;;20668:61;;20700:29;20668:61;;;;::::1;::::0;;;;;;;;;;:29:::1;::::0;:61;;20700:29;20668:61;;::::1;20700:29:::0;20668:61;;::::1;;;;;;;;;;;;;;;;::::0;;-1:-1:-1;;;;;20668:61:0::1;::::0;;;;;::::1;::::0;::::1;;::::0;;::::1;;;;;;;;;;;20745:9;20740:268;20764:12;:19;20760:1;:23;20740:268;;;20821:19;20809:32;::::0;;;:11:::1;:32;::::0;20842:15;;-1:-1:-1;;;;;;;;;;;20809:32:0;;20842:12;;20855:1;;20842:15;::::1;;;;;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;20809:49:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;20809:49:0;;::::1;;20805:192;;;20890:91;20903:77;20914:12;20927:1;20914:15;;;;;;;;;;;;;;20938:12;20951:1;20938:15;;;;;;;;;;;;;;-1:-1:-1::0;;;;;20931:33:0::1;;20973:4;20931:48;;;;;;;;;;;;;-1:-1:-1::0;;;;;20931:48:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;20931:48:0;20903:10:::1;:77::i;:::-;20890:8:::0;;:12:::1;:91::i;:::-;20879:102;;20805:192;20785:3;;20740:268;;;-1:-1:-1::0;21061:21:0::1;21052:31;::::0;:8:::1;:31;::::0;;;;21018:65;;21052:31;21018:65;;;;::::1;::::0;;;;;;;;;;:31:::1;::::0;:65;;21052:31;21018:65;;::::1;21052:31:::0;21018:65;;::::1;;;;;;;;;;;;;;;;::::0;;-1:-1:-1;;;;;21018:65:0::1;::::0;;;;;::::1;::::0;::::1;;::::0;;::::1;;;;;;;;;;;21099:9;21094:278;21118:14;:21;21114:1;:25;21094:278;;;21177:21;21165:34;::::0;;;:11:::1;:34;::::0;21200:17;;-1:-1:-1;;;;;;;;;;;21165:34:0;;21200:14;;21215:1;;21200:17;::::1;;;;;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;21165:53:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;21165:53:0;;::::1;;21161:200;;;21250:95;21263:81;21274:14;21289:1;21274:17;;;;;;;21263:81;21250:8:::0;;:12:::1;:95::i;:::-;21239:106;;21161:200;21141:3;;21094:278;;;-1:-1:-1::0;21382:13:0::1;:24:::0;;;21422:25:::1;::::0;21398:8;;21422:25:::1;::::0;;;::::1;1876:1;;;20583:872::o:0;12949:62::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;13195:22::-;;;;:::o;16971:319::-;17093:10;17059:33;:45;;;:33;;:45;:33;:45;;;17106:11;;17059:45;;17051:67;;;;-1:-1:-1;;;17051:67:0;;;;;;;;;;;;-1:-1:-1;;17051:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17148:16;:14;:16::i;:::-;17137:7;:27;;17166:20;17129:58;;;;;-1:-1:-1;;;17129:58:0;;;;;;;;;;;;-1:-1:-1;;17129:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17198:3;-1:-1:-1;;;;;17198:8:0;;17207:10;17219:7;17198:29;;;;;;;;;;;;;-1:-1:-1;;;;;17198:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;17243:39:0;;;;;;;;-1:-1:-1;;;;;17243:39:0;;;-1:-1:-1;17250:10:0;;-1:-1:-1;17243:39:0;;;;;;;;;16971:319;;:::o;13226:30::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;13226:30:0;;;;;;;;;;;;;;;;;;:::o;23036:298::-;23131:9;;;;;;;;;-1:-1:-1;;;;;23131:9:0;-1:-1:-1;;;;;23131:18:0;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23131:20:0;-1:-1:-1;;;;;23117:34:0;:10;:34;;:72;;;23169:9;;;;;;;;;-1:-1:-1;;;;;23169:9:0;-1:-1:-1;;;;;23169:18:0;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23169:20:0;-1:-1:-1;;;;;23155:34:0;:10;:34;23117:72;23109:110;;;;;-1:-1:-1;;;23109:110:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;23265:5;23230:11;:20;23242:7;23230:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23230:20:0;;;-1:-1:-1;;;;;23230:32:0;;;;;;;;;:40;;-1:-1:-1;;23230:40:0;;;;;;;;;;23311:7;23286:40;;;;;;;;;;;-1:-1:-1;;;;;23286:40:0;;;;23320:5;23286:40;;;;;;;;;;;;;;;;;23036:298;;:::o;13076:44::-;;;;;;;;;;;;;:::o;26672:112::-;1830:9;;;;;;;;;-1:-1:-1;;;;;1830:9:0;-1:-1:-1;;;;;1830:18:0;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1830:20:0;1852:12;;-1:-1:-1;;;;;1816:34:0;:10;:34;1808:57;;;;-1:-1:-1;;;1808:57:0;;;;;;;;;;;;-1:-1:-1;;1808:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26772:4:::1;26738:15;26754:6;26738:23;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;:31;;:38:::0;;-1:-1:-1;;26738:38:0::1;::::0;::::1;;::::0;;;::::1;::::0;;-1:-1:-1;26672:112:0:o;2303:168::-;1830:9;;;;;;;;;-1:-1:-1;;;;;1830:9:0;-1:-1:-1;;;;;1830:18:0;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1830:20:0;1852:12;;-1:-1:-1;;;;;1816:34:0;:10;:34;1808:57;;;;-1:-1:-1;;;1808:57:0;;;;;;;;;;;;-1:-1:-1;;1808:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2391:9:0::1;:25:::0;;-1:-1:-1;;;;;;2391:25:0::1;-1:-1:-1::0;;;;;2391:25:0;::::1;::::0;;::::1;::::0;;;2432:31:::1;::::0;::::1;::::0;-1:-1:-1;;2432:31:0::1;2303:168:::0;:::o;26856:394::-;1830:9;;;;;;;;;-1:-1:-1;;;;;1830:9:0;-1:-1:-1;;;;;1830:18:0;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1830:20:0;1852:12;;-1:-1:-1;;;;;1816:34:0;:10;:34;1808:57;;;;-1:-1:-1;;;1808:57:0;;;;;;;;;;;;-1:-1:-1;;1808:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26924:15:0::1;::::0;::::1;;:23;;:15:::0;:23:::1;26916:61;;;::::0;;-1:-1:-1;;;26916:61:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;26992:25;::::0;:30;;::::1;::::0;:75:::1;;;27055:12;27026:25;;:41;;26992:75;26988:255;;;27084:15;:23:::0;;-1:-1:-1;;27084:23:0::1;::::0;;26988:255:::1;;;27168:45;27185:27;:20;27210:1;27185:24;:27::i;27168:45::-;27140:25;:73:::0;26988:255:::1;26856:394::o:0;27330:177::-;1830:9;;;;;;;;;-1:-1:-1;;;;;1830:9:0;-1:-1:-1;;;;;1830:18:0;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1830:20:0;1852:12;;-1:-1:-1;;;;;1816:34:0;:10;:34;1808:57;;;;-1:-1:-1;;;1808:57:0;;;;;;;;;;;;-1:-1:-1;;1808:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27393:11:0::1;::::0;::::1;::::0;::::1;;;:20;27385:52;;;::::0;;-1:-1:-1;;;27385:52:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;27385:52:0;;;;;;;;;;;;;::::1;;27448:15;:22:::0;;-1:-1:-1;;;;27448:22:0;;::::1;27466:4;27448:22;27481:18;27448:22;27481:18;::::0;;27330:177::o;28540:116::-;28594:7;28641;;28621:3;-1:-1:-1;;;;;28621:15:0;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28621:17:0;:27;;-1:-1:-1;28540:116:0;:::o;13129:28::-;;;;:::o;23443:346::-;23523:4;23529:7;23549:24;23576:8;:17;23585:7;23576:17;;;;;;;;;;;;;;;;;;;;;;;;;;;23549:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;23549:44:0;;;;;;;;;;;;;;;;;;;;;;;23609:9;23604:150;23628:7;:14;23624:1;:18;23604:150;;;23680:7;23688:1;23680:10;;;;;;;;;;;;;;-1:-1:-1;;;;;23668:22:0;:8;-1:-1:-1;;;;;23668:22:0;;23664:79;;;23719:4;;-1:-1:-1;23725:1:0;-1:-1:-1;23711:16:0;;-1:-1:-1;23711:16:0;23664:79;23644:3;;23604:150;;;;23772:5;23779:1;23764:17;;;;;23443:346;;;;;;:::o;21584:125::-;1830:9;;;;;;;;;-1:-1:-1;;;;;1830:9:0;-1:-1:-1;;;;;1830:18:0;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1830:20:0;1852:12;;-1:-1:-1;;;;;1816:34:0;:10;:34;1808:57;;;;-1:-1:-1;;;1808:57:0;;;;;;;;;;;;-1:-1:-1;;1808:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;21673:19:0;;::::1;;::::0;;;:9:::1;:19;::::0;;;;:28;21584:125::o;12898:44::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;12898:44:0;;-1:-1:-1;12898:44:0;;-1:-1:-1;12898:44:0:o;12840:25::-;;;:::o;13317:27::-;;;;;;:::o;13383:40::-;;;;:::o;14371:896::-;-1:-1:-1;;;;;14529:40:0;;14499:13;14529:40;;;-1:-1:-1;;;;;;;;;;;14529:32:0;:40;:32;:40;;;;;14525:349;;;14594:11;:36;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14594:36:0;;;14631:10;14594:48;;;;;;;;14644:11;;14594:48;;14586:70;;;;-1:-1:-1;;;14586:70:0;;;;;;;;;;;;-1:-1:-1;;14586:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14525:349;;;-1:-1:-1;;;;;14678:42:0;;:34;:42;;;-1:-1:-1;;;;;;;;;;;14678:34:0;:42;:34;:42;;;;;14674:200;;;14745:11;:38;:11;:38;;14674:200;14842:20;;-1:-1:-1;;;14842:20:0;;;;;;;;;14849:12;14842:20;;;-1:-1:-1;;14842:20:0;;;;;;;;;;;;;;;;;14849:12;;14842:20;;;;;;;14849:12;;14842:20;;;;;;;;;;;;;;;;;;;;;;;14674:200;14886:67;-1:-1:-1;;;;;14886:31:0;;14918:10;14938:4;14945:7;14886:31;:67::i;:::-;14966:13;14982:27;14993:6;15001:7;14982:10;:27::i;:::-;14966:43;-1:-1:-1;15101:18:0;14966:43;15111:7;15101:9;:18::i;:::-;15093:26;;15130:3;-1:-1:-1;;;;;15130:8:0;;15139:10;15151:5;15130:27;;;;;;;;;;;;;-1:-1:-1;;;;;15130:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;15186:13:0;;:24;;-1:-1:-1;15186:13:0;-1:-1:-1;15204:5:0;15186:17;:24::i;:::-;15170:13;:40;15228:31;;;;;;;;;;;;;;-1:-1:-1;;;;;15228:31:0;;;;;;;;;;;14371:896;;;;;;:::o;1491:34::-;;;-1:-1:-1;;;;;1491:34:0;;:::o;13263:45::-;;;:::o;19229:579::-;19363:10;19329:33;:45;;;:33;;:45;:33;:45;;;19376:11;;19329:45;;19321:67;;;;-1:-1:-1;;;19321:67:0;;;;;;;;;;;;-1:-1:-1;;19321:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;19407:40:0;;:32;:40;;;-1:-1:-1;;;;;;;;;;;19407:32:0;:40;:32;:40;;;19449:11;;19407:40;;19399:62;;;;-1:-1:-1;;;19399:62:0;;;;;;;;;;;;-1:-1:-1;;19399:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19472:67:0;-1:-1:-1;;;;;19472:31:0;;19504:10;19524:4;19531:7;19472:31;:67::i;:::-;19550:13;19566:27;19577:6;19585:7;19566:10;:27::i;:::-;19604:4;;:41;;;-1:-1:-1;;;19604:41:0;;;;;;;;19627:10;19604:41;;;;:4;:41;;;;;;;;19550:43;;-1:-1:-1;;;;;;19604:4:0;;;;:15;;:41;;;;;:4;:41;;;;;;:4;;:41;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;19668:9:0;;:20;;-1:-1:-1;19668:9:0;-1:-1:-1;19682:5:0;19668:13;:20::i;:::-;19656:9;:32;19715:13;;:24;;19733:5;19715:17;:24::i;:::-;19699:13;:40;19755:45;;;;;;;;;;;;;;-1:-1:-1;;;;;19755:45:0;;;19765:10;;19755:45;;;;;;;;;;;19229:579;;;:::o;21877:1018::-;1830:9;;;;;;;;;-1:-1:-1;;;;;1830:9:0;-1:-1:-1;;;;;1830:18:0;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1830:20:0;1852:12;;-1:-1:-1;;;;;1816:34:0;:10;:34;1808:57;;;;-1:-1:-1;;;1808:57:0;;;;;;;;;;;;-1:-1:-1;;1808:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22023:15:0::1;::::0;::::1;;:24;22015:54;;;::::0;;-1:-1:-1;;;22015:54:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;22015:54:0;;;;;;;;;;;;;::::1;;22095:11;22084:7;:22;;;;;;;;;22080:755;;;22123:4;:22:::0;;-1:-1:-1;;;;;;22123:22:0::1;-1:-1:-1::0;;;;;22123:22:0;::::1;;::::0;;22080:755:::1;;;22211:4;22178:11;:20;22190:7;22178:20;;;;;;;;;;;;;;;;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;-1:-1:-1;22178:20:0;;;-1:-1:-1;;;;;22178:30:0;::::1;::::0;;;;;;;:37;;-1:-1:-1;;22178:37:0::1;::::0;::::1;;::::0;;;::::1;::::0;;22247:21:::1;22236:7;:32;;;;;;;;;22232:111;;;-1:-1:-1::0;;;;;22289:24:0;;::::1;;::::0;;;:14:::1;:24;::::0;;;;:38;;-1:-1:-1;;;;;;22289:38:0::1;::::0;;::::1;::::0;;;::::1;::::0;;22232:111:::1;22360:15;22381:34;22397:8;22407:7;22381:15;:34::i;:::-;22359:56;;;22435:10;22430:394;;22466:8;:17;22475:7;22466:17;;;;;;;;;;;;;;;;::::0;;::::1;::::0;;::::1;::::0;;;;;;-1:-1:-1;22466:17:0;;;:32;;::::1;::::0;::::1;::::0;;;;;;;;::::1;::::0;;-1:-1:-1;;;;;;22466:32:0::1;-1:-1:-1::0;;;;;22466:32:0;::::1;;::::0;;22534:21:::1;22523:7;:32;;;;;;;;;:66;;;-1:-1:-1::0;22570:19:0::1;22559:7;:30;;;;;;;;;22523:66;22519:290;;;22615:8;22625:13:::0;22642:34:::1;22658:8;22668:7;22642:15;:34::i;:::-;22614:62;;;;22703:3;22699:91;;;22742:8;:17;22751:7;22742:17;;;;;;;;;;;;;;;;;;;;;;;;;;;22760:5;22742:24;;;;;;;;;::::0;;;::::1;::::0;;;::::1;22735:31:::0;;-1:-1:-1;;;;;;22735:31:0::1;::::0;;22699:91:::1;22519:290;;;22080:755;;22873:7;22850:37;;;;;;;;;::::0;;-1:-1:-1;;;;;22850:37:0;::::1;::::0;;22882:4:::1;22850:37;::::0;::::1;::::0;;;::::1;::::0;;;;;;;;;::::1;21877:1018:::0;;;:::o;27970:391::-;28053:14;28089:99;28169:6;-1:-1:-1;;;;;28154:31:0;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28154:33:0;28105:39;;;-1:-1:-1;;;28105:39:0;;;;28150:37;;;;:2;:37;;28089:56;;-1:-1:-1;;;;;28128:3:0;28105:37;;;;:39;;;;;28154:33;;28105:39;;;;;;;;:37;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28105:39:0;28089:7;;28101:43;;:2;:43;28089:11;:56::i;:::-;:60;;:99::i;:::-;-1:-1:-1;;;;;28205:42:0;;:34;:42;;;-1:-1:-1;;;;;;;;;;;28205:34:0;:42;:34;:42;;;28080:108;;-1:-1:-1;28205:42:0;;28201:153;;;-1:-1:-1;;;;;28292:22:0;;;;;;;:14;:22;;;;;;;;;;28273:69;;-1:-1:-1;;;28273:69:0;;;;;;;;;;;;;;;;;28292:22;;;;;28273:52;;:69;;;;;;;;;;;28292:22;28273:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28273:69:0;;-1:-1:-1;28201:153:0;27970:391;;;;:::o;13164:24::-;;;;:::o;24923:1652::-;24984:15;;;;:23;;:15;:23;24976:68;;;;;-1:-1:-1;;;24976:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25057:17;;:::i;:::-;25077:15;25093:6;25077:23;;;;;;;;;;;;;;;;25057:43;;;;;;;;;25077:23;;;;;25057:43;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25057:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25122:12;;;25057:43;;-1:-1:-1;25121:13:0;25113:51;;;;;-1:-1:-1;;;25113:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;25184:4;:13;;;25183:14;25175:59;;;;;-1:-1:-1;;;25175:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25269:4;:16;;;25253:12;:32;;25245:66;;;;;-1:-1:-1;;;25245:66:0;;;;;;;;;;;;-1:-1:-1;;;25245:66:0;;;;;;;;;;;;;;;25345:11;25328:13;;:28;;;;;;;;;25324:1130;;;25404:13;;;;25391:4;:27;;-1:-1:-1;;;;;;25391:27:0;-1:-1:-1;;;;;25391:27:0;;;;;;;;;25324:1130;;;25495:4;25451:11;:26;25463:4;:13;;;25451:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25451:26:0;;;25478:13;;;;-1:-1:-1;;;;;25451:41:0;;;;;;;;:48;;-1:-1:-1;;25451:48:0;;;;;;;;;;25537:21;25520:13;;:38;;;;;;;;;25516:126;;;25611:15;;;;;25594:13;;;;;-1:-1:-1;;;;;25579:29:0;;;;;;;:14;:29;;;;;;:47;;-1:-1:-1;;;;;;25579:47:0;;;;;;;;;;;25516:126;25657:15;25678:45;25694:4;:13;;;25709:4;:13;;;25678:15;:45::i;:::-;25656:67;;;25743:10;25738:705;;25774:8;:23;25783:4;:13;;;25774:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25774:23:0;;;25803:13;;;;25774:43;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;25774:43:0;-1:-1:-1;;;;;25774:43:0;;;;;;;;;25859:21;25842:13;;:38;;;;;;;;;25838:590;;;25906:8;25916:13;25933:51;25949:4;:13;;;25964:19;25933:15;:51::i;:::-;25905:79;;;;26011:3;26007:103;;;26059:19;26050:29;;:8;:29;;;:36;;26080:5;;26050:36;;;;;;;;;;;;;;;26043:43;;-1:-1:-1;;;;;;26043:43:0;;;26007:103;25838:590;;;;;26156:19;26139:13;;:36;;;;;;;;;26135:293;;;26201:8;26211:13;26228:53;26244:4;:13;;;26259:21;26228:15;:53::i;:::-;26200:81;;;;26308:3;26304:105;;;26356:21;26347:31;;:8;:31;;;:38;;26379:5;;26347:38;;;;;;;;;;;;;;;26340:45;;-1:-1:-1;;;;;;26340:45:0;;;26304:105;26135:293;;;25324:1130;;26499:4;26464:15;26480:6;26464:23;;;;;;;;;;;;;;;;:32;:23;;;;;:32;:39;;;;;;;-1:-1:-1;;26464:39:0;;;;;;;;;26547:13;;26519:48;;;;;;;;;26532:4;:13;;;26562:4;26519:48;;;;-1:-1:-1;;;;;26519:48:0;;;;;;;;;;;;;;;;;;;;;;;24923:1652;;:::o;9843:136::-;9901:7;9928:43;9932:1;9935;9928:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;9921:50;9843:136;-1:-1:-1;;;9843:136:0:o;8555:365::-;8743:60;;;-1:-1:-1;;;;;8743:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;8743:60:0;-1:-1:-1;;;8743:60:0;;;8709:105;;;;8674:12;;8688:17;;8709:19;;;;8743:60;8709:105;;;8743:60;8709:105;;8743:60;8709:105;;;;;;;;;;-1:-1:-1;;8709:105:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8673:141;;;;8835:7;:57;;;;-1:-1:-1;8847:11:0;;:16;;:44;;;8878:4;8867:24;;;;;;;;;;;;;;;-1:-1:-1;8867:24:0;8847:44;8827:85;;;;;-1:-1:-1;;;8827:85:0;;;;;;;;;;;;-1:-1:-1;;;8827:85:0;;;;;;;;;;;;;;;8555:365;;;;;:::o;9654:181::-;9712:7;9744:5;;;9768:6;;;;9760:46;;;;;-1:-1:-1;;;9760:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;10187:250;10245:7;10269:6;10265:47;;-1:-1:-1;10299:1:0;10292:8;;10265:47;10336:5;;;10340:1;10336;:5;:1;10360:5;;;;;:10;10352:56;;;;-1:-1:-1;;;10352:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8140:407;8355:70;;;-1:-1:-1;;;;;8355:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;8355:70:0;-1:-1:-1;;;8355:70:0;;;8321:115;;;;8286:12;;8300:17;;8321:19;;;;8355:70;8321:115;;;8355:70;8321:115;;8355:70;8321:115;;;;;;;;;;-1:-1:-1;;8321:115:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8285:151;;;;8457:7;:57;;;;-1:-1:-1;8469:11:0;;:16;;:44;;;8500:4;8489:24;;;;;;;;;;;;;;;-1:-1:-1;8489:24:0;8469:44;8449:90;;;;;-1:-1:-1;;;8449:90:0;;;;;;;;;;;;-1:-1:-1;;;8449:90:0;;;;;;;;;;;;;;;8140:407;;;;;;:::o;10445:132::-;10503:7;10530:39;10534:1;10537;10530:39;;;;;;;;;;;;;;;;;:3;:39::i;9987:192::-;10073:7;10109:12;10101:6;;;;10093:29;;;;-1:-1:-1;;;10093:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;10145:5:0;;;9987:192::o;10585:275::-;10671:7;10706:12;10699:5;10691:28;;;;-1:-1:-1;;;10691:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10730:9;10746:1;10742;:5;;;;;;10730:17;;10782:1;10778;:5;;;;;;10774:1;10770;:5;:13;10765:1;:18;10758:26;;;;10851:1;10585:275;-1:-1:-1;;;;10585:275:0:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o

Swarm Source

ipfs://66aa62093962779da8f389172be79978b48d4f17837919e8f4a03dd1d4274cc6

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  ]

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.